

# 使用应用程序跟踪数据来识别 Amazon ECS 的优化机会
<a name="trace-data"></a>

Amazon ECS 与 AWS Distro for OpenTelemetry 集成，以从应用程序中收集跟踪数据。Amazon ECS 使用 AWS Distro for OpenTelemetry 附加容器，以收集跟踪数据并将其路由到 AWS X-Ray。有关更多信息，请参阅[在 Amazon ECS 中设置 AWS Distro for OpenTelemetry Collector](https://aws-otel.github.io/docs/setup/ecs)。然后，您可以使用 AWS X-Ray 来识别错误和异常、分析性能瓶颈和响应时间。

要使 AWS Distro for OpenTelemetry Collector 将跟踪数据发送到 AWS X-Ray，必须将您的应用程序配置为创建跟踪数据。有关更多信息，请参阅 *AWS X-Ray 开发人员指南*中的[分析 AWS X-Ray 的应用程序](https://docs.aws.amazon.com/xray/latest/devguide/xray-instrumenting-your-app.html)。

## AWS Distro for OpenTelemetry 与 AWS X-Ray 集成所需的 IAM 权限
<a name="trace-data-iam"></a>

Amazon ECS 与 AWS Distro for OpenTelemetry 集成要求您创建任务角色并在任务定义中指定角色。我们建议您为配置 AWS Distro for OpenTelemetry sidecar，以将容器日志路由到 CloudWatch Logs。

**重要**  
如果您还要使用 AWS Distro for OpenTelemetry 集成收集应用程序指标，请确保您的任务 IAM 角色还包含该集成所需的权限。有关更多信息，请参阅 [使用应用程序指标关联 Amazon ECS 应用程序性能](metrics-data.md)。

创建角色后，请创建一个具有以下权限的策略，然后将其附加到该角色。
+ `logs:PutLogEvents`
+ `logs:CreateLogGroup`
+ `logs:CreateLogStream`
+ `logs:DescribeLogStreams`
+ `logs:DescribeLogGroups`
+ `logs:PutRetentionPolicy`
+ `xray:PutTraceSegments`
+ `xray:PutTelemetryRecords`
+ `xray:GetSamplingRules`
+ `xray:GetSamplingTargets`
+ `xray:GetSamplingStatisticSummaries`
+ `ssm:GetParameters`

# 指定 AWS Distro for OpenTelemetry 附加，用于任务定义中的 AWS X-Ray 集成
<a name="trace-data-containerdefinitions"></a>

Amazon ECS 控制台通过使用**使用跟踪收集**选项简化创建 AWS Distro for OpenTelemetry 附加容器的过程。有关更多信息，请参阅 [使用控制台创建 Amazon ECS 任务定义](create-task-definition.md)。

如果您没有使用 Amazon ECS 控制台，则可以添加 AWS Distro for OpenTelemetry 附加容器到您的任务定义中。以下任务定义片段显示了用于添加 AWS Distro for OpenTelemetry 附加以进行 AWS X-Ray 集成的容器定义。

```
{
	"family": "otel-using-xray",
	"taskRoleArn": "arn:aws:iam::111122223333:role/AmazonECS_OpenTelemetryXrayRole",
	"executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",
	"containerDefinitions": [{
			"name": "aws-otel-emitter",
			"image": "application-image",
			"logConfiguration": {
				"logDriver": "awslogs",
				"options": {
					"awslogs-create-group": "true",
					"awslogs-group": "/ecs/aws-otel-emitter",
					"awslogs-region": "us-east-1",
					"awslogs-stream-prefix": "ecs"
				}
			},
			"dependsOn": [{
				"containerName": "aws-otel-collector",
				"condition": "START"
			}]
		},
		{
			"name": "aws-otel-collector",
			"image": "public.ecr.aws/aws-observability/aws-otel-collector:v0.30.0",
			"essential": true,
			"command": [
				"--config=/etc/ecs/otel-instance-metrics-config.yaml"
			],
			"logConfiguration": {
				"logDriver": "awslogs",
				"options": {
					"awslogs-create-group": "True",
					"awslogs-group": "/ecs/ecs-aws-otel-sidecar-collector",
					"awslogs-region": "us-east-1",
					"awslogs-stream-prefix": "ecs"
				}
			}
		}
	],
	"networkMode": "awsvpc",
	"requiresCompatibilities": [
		"FARGATE"
	],
	"cpu": "1024",
	"memory": "3072"
}
```