使用进程守护程序策略进行部署
步骤 1:在账户中启用 Application Signals
必须先在账户中启用 Application Signals。如果还没有,请参阅在账户中启用 Application Signals。
步骤 2:创建 IAM 角色
您必须创建一个 IAM 角色。如果您已创建此角色,则可能需要向其添加权限。
- 
            ECS 任务角色 – 容器使用此角色运行。权限应是您的应用程序所需的任何权限,以及 CloudWatchAgentServerPolicy。 
有关创建 IAM 角色的更多信息,请参阅创建 IAM 角色。
步骤 3:准备 CloudWatch 代理配置
首先,在启用 Application Signals 的情况下准备代理配置。为此,请创建一个名为 /tmp/ecs-cwagent.json 的本地文件。
{ "traces": { "traces_collected": { "application_signals": {} } }, "logs": { "metrics_collected": { "application_signals": {} } } }
然后,将此配置上传到 SSM 参数仓库中。要执行此操作,请输入以下命令。在该文件中,将 $REGION 替换为您的实际区域名称。
aws ssm put-parameter \ --name "ecs-cwagent" \ --type "String" \ --value "`cat /tmp/ecs-cwagent.json`" \ --region "$REGION"
步骤 4:部署 CloudWatch 代理进程守护程序服务
创建以下任务定义并部署到您的应用程序集群中。将 $REGION 替换为您的实际区域名称。请将 $TASK_ROLE_ARN 和 $EXECUTION_ROLE_ARN 替换为您在 步骤 2:创建 IAM 角色 中准备的 IAM 角色。将 $IMAGE 替换为 Amazon Elastic Container Registry 上最新 CloudWatch 容器映像的路径。有关更多信息,请参阅 Amazon ECR 上的 cloudwatch-agent
注意
进程守护程序服务会公开主机上的两个端口,其中端口 4316 用作接收指标和跟踪的端点,端口 2000 用作 CloudWatch 跟踪采样器端点。此设置将允许代理从在主机上运行的所有应用程序任务收集和传输遥测数据。确保主机上的其他服务不使用这些端口,以免发生冲突。
{ "family": "ecs-cwagent-daemon", "taskRoleArn": "$TASK_ROLE_ARN", "executionRoleArn": "$EXECUTION_ROLE_ARN", "networkMode": "bridge", "containerDefinitions": [ { "name": "ecs-cwagent", "image": "$IMAGE", "essential": true, "portMappings": [ { "containerPort": 4316, "hostPort": 4316 }, { "containerPort": 2000, "hostPort": 2000 } ], "secrets": [ { "name": "CW_CONFIG_CONTENT", "valueFrom": "ecs-cwagent" } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-create-group": "true", "awslogs-group": "/ecs/ecs-cwagent", "awslogs-region": "$REGION", "awslogs-stream-prefix": "ecs" } } } ], "requiresCompatibilities": [ "EC2" ], "cpu": "128", "memory": "64" }
步骤 5:检测您的应用程序
下一步是为 Application Signals 检测您的应用程序。
- Java
- 
              使用 CloudWatch 代理检测您在 Amazon ECS 上的应用程序- 首先,指定绑定挂载。在接下来的步骤中,该卷将用于跨容器共享文件。您将在此过程的稍后部分使用此绑定挂载。 - "volumes": [ { "name": "opentelemetry-auto-instrumentation" } ]
- 在应用程序的任务定义中添加一个新容器 - init。将- $IMAGE替换为 Amazon Distro for OpenTelemetry Amazon ECR 映像存储库- 中的最新映像。 - { "name": "init", "image": "- $IMAGE", "essential": false, "command": [ "cp", "/javaagent.jar", "/otel-auto-instrumentation/javaagent.jar" ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation", "containerPath": "/otel-auto-instrumentation", "readOnly": false } ] }
- 在 - init容器上添加依赖项,以确保此容器在应用程序容器启动之前完成。- "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ]
- 将以下环境变量添加到您的应用程序容器中。您必须使用适用于 OpenTelemetry 的 Amazon Distro Java 自动仪表化代理 - 版本 1.32.2 或更高版本。 - 环境变量 - 启用 Application Signals 的设置 - OTEL_RESOURCE_ATTRIBUTES- 将以下信息指定为键值对: - service.name设置服务的名称。这将作为应用程序的服务名称显示在 Application Signals 控制面板中。如果您不提供此键的值,将使用默认值- UnknownService。
- deployment.environment设置应用程序运行所在的环境。这将作为应用程序的托管环境显示在 Application Signals 控制面板中。如果您未指定此项,则使用默认值- generic:default。
 - 此属性键仅供 Application Signals 使用,并转换为 X-Ray 跟踪注释和 CloudWatch 指标维度。 - (可选)要启用 Application Signals 的日志关联,请将其他环境变量 - aws.log.group.names设置为应用程序日志的日志组名称。这样,应用程序的跟踪和指标便可与该特定日志组的相关日志条目相关联。对于此变量,将- $YOUR_APPLICATION_LOG_GROUP替换为应用程序的日志组名称。如果您有多个日志组,则可以使用和号(- &)分隔它们,如以下示例所示:- aws.log.group.names=log-group-1&log-group-2。要启用指标与日志关联的功能,设置此当前环境变量已足够。有关更多信息,请参阅 启用指标与日志关联。要启用跟踪与日志关联,您还需要更改应用程序中的日志记录配置。有关更多信息,请参阅 启用跟踪与日志关联。- OTEL_AWS_APPLICATION_SIGNALS_ENABLED- 设置为 - true可使您的容器开始向 Application Signals 发送 X-Ray 跟踪和 CloudWatch 指标。- OTEL_METRICS_EXPORTER- 设置为 - none可禁用其他指标导出程序。- OTEL_LOGS_EXPORTER- 设置为 - none以禁用其他日志导出程序。- OTEL_EXPORTER_OTLP_PROTOCOL- 设置为 - http/protobuf以使用 HTTP 将指标和跟踪发送到 Application Signals。- OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT- 向 CloudWatch 进程守护程序容器发送指标。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:4316/v1/metrics。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为 http://- CW_CONTAINER_IP:4316/v1/metrics,其中- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT- 向 CloudWatch 进程守护程序容器发送跟踪。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:4316/v1/traces。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为 http://- CW_CONTAINER_IP:4316/v1/traces,其中- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_TRACES_SAMPLER- 将此项设置为 - xray以将 X-Ray 设置为跟踪取样器。- OTEL_PROPAGATORS- 将 - xray设置为传播器之一。- JAVA_TOOL_OPTIONS- 设置为 - " -javaagent:$。将- AWS_ADOT_JAVA_INSTRUMENTATION_PATH"- AWS_ADOT_JAVA_INSTRUMENTATION_PATH替换为存储 Amazon Distro for OpenTelemetry Java 自动检测代理的路径。例如,- /otel-auto-instrumentation/javaagent.jar
- 挂载您在此过程的步骤 1 中定义的卷 - opentelemetry-auto-instrumentation。如果您不需要启用与指标和跟踪的日志关联,请使用以下 Java 应用程序示例。如果要启用日志关联,请改为参阅下一步。- { "name": "- my-app", ... "environment": [ { "name": "OTEL_RESOURCE_ATTRIBUTES", "value": "service.name=- $SVC_NAME" }, { "name": "OTEL_LOGS_EXPORTER", "value": "none" }, { "name": "OTEL_METRICS_EXPORTER", "value": "none" }, { "name": "OTEL_EXPORTER_OTLP_PROTOCOL", "value": "http/protobuf" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED", "value": "true" }, { "name": "JAVA_TOOL_OPTIONS", "value": " -javaagent:/otel-auto-instrumentation/javaagent.jar" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/metrics" }, { "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/traces" }, { "name": "OTEL_TRACES_SAMPLER", "value": "xray" }, { "name": "OTEL_PROPAGATORS", "value": "tracecontext,baggage,b3,xray" } ], "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation", "containerPath": "/otel-auto-instrumentation", "readOnly": false } ] }
 
- Python
- 
              在为 Python 应用程序启用 Application Signals 之前,请注意以下注意事项。 - 在某些容器化应用程序中,缺少 - PYTHONPATH环境变量有时可能会导致应用程序无法启动。要解决此问题,请确保将- PYTHONPATH环境变量设置为应用程序工作目录的位置。这是由于 OpenTelemetry 自动检测的已知问题造成的。有关此问题的更多信息,请参阅 Python autoinstrumentation setting of PYTHONPATH is not compliant- (PYTHONPATH 的 Python 自动检测设置不兼容)。 
- 对于 Django 应用程序,还有其他必需的配置,这些配置在 OpenTelemetry Python 文档 - 中进行了概述。 - 使用 - --noreload标志可防止自动重新加载。
- 将 - DJANGO_SETTINGS_MODULE环境变量设置为 Django 应用程序- settings.py文件的位置。这样可确保 OpenTelemetry 能够正确访问您的 Django 设置,并与之集成。
 
- 如果您在 Python 应用程序中使用 WSGI 服务器,则除了本节中的以下步骤之外,还可以参阅使用 WSGI 服务器的 Python 应用程序没有 Application Signals 数据以获取有关使 Application Signals 起作用的信息。 
 使用 CloudWatch 代理检测您在 Amazon ECS 上的 Python 应用程序- 首先,指定绑定挂载。在接下来的步骤中,该卷将用于跨容器共享文件。您将在此过程的稍后部分使用此绑定挂载。 - "volumes": [ { "name": "opentelemetry-auto-instrumentation-python" } ]
- 在应用程序的任务定义中添加一个新容器 - init。将- $IMAGE替换为 Amazon Distro for OpenTelemetry Amazon ECR 映像存储库- 中的最新映像。 - { "name": "init", "image": "$IMAGE", "essential": false, "command": [ "cp", "-a", "/autoinstrumentation/.", "/otel-auto-instrumentation-python" ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation-python", "containerPath": "/otel-auto-instrumentation-python", "readOnly": false } ] }
- 在 - init容器上添加依赖项,以确保此容器在应用程序容器启动之前完成。- "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ]
- 将以下环境变量添加到您的应用程序容器中。 - 环境变量 - 启用 Application Signals 的设置 - OTEL_RESOURCE_ATTRIBUTES- 将以下信息指定为键值对: - service.name设置服务的名称。这将作为应用程序的服务名称显示在 Application Signals 控制面板中。如果您不提供此键的值,将使用默认值- UnknownService。
- deployment.environment设置应用程序运行所在的环境。这将作为应用程序的托管环境显示在 Application Signals 控制面板中。如果您未指定此项,则使用默认值- generic:default。
 - 此属性键仅供 Application Signals 使用,并转换为 X-Ray 跟踪注释和 CloudWatch 指标维度。 - (可选)要启用 Application Signals 的日志关联,请将其他环境变量 - aws.log.group.names设置为应用程序日志的日志组名称。这样,应用程序的跟踪和指标便可与该特定日志组的相关日志条目相关联。对于此变量,将- $YOUR_APPLICATION_LOG_GROUP替换为应用程序的日志组名称。如果您有多个日志组,则可以使用和号(- &)分隔它们,如以下示例所示:- aws.log.group.names=log-group-1&log-group-2。要启用指标与日志关联的功能,设置此当前环境变量已足够。有关更多信息,请参阅 启用指标与日志关联。要启用跟踪与日志关联,您还需要更改应用程序中的日志记录配置。有关更多信息,请参阅 启用跟踪与日志关联。- OTEL_AWS_APPLICATION_SIGNALS_ENABLED- 设置为 - true可使您的容器开始向 Application Signals 发送 X-Ray 跟踪和 CloudWatch 指标。- OTEL_METRICS_EXPORTER- 设置为 - none可禁用其他指标导出程序。- OTEL_EXPORTER_OTLP_PROTOCOL- 设置为 - http/protobuf以使用 HTTP 向 CloudWatch 发送指标和跟踪。- OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT- 向 CloudWatch 进程守护程序容器发送指标。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:4316/v1/metrics。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为 http://- CW_CONTAINER_IP:4316/v1/metrics,其中- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT- 向 CloudWatch 进程守护程序容器发送跟踪。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:4316/v1/traces。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为 http://- CW_CONTAINER_IP:4316/v1/traces,其中- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_TRACES_SAMPLER- 将此项设置为 - xray以将 X-Ray 设置为跟踪取样器。- OTEL_TRACES_SAMPLER_ARG- 设置跟踪采样器端点。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:2000。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为- http://,其中- CW_CONTAINER_IP:2000- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_PROPAGATORS- 将 - xray添加为传播器之一。- OTEL_PYTHON_DISTRO- 设置为 - aws_distro以使用 ADOT Python 工具。- OTEL_PYTHON_CONFIGURATOR- 设置为 - aws_configuration以使用 ADOT Python 配置。- PYTHONPATH- 将 - $APP_PATH替换为容器中应用程序工作目录的位置。Python 解释器查找您的应用程序模块需要执行此操作。- DJANGO_SETTINGS_MODULE- 仅 Django 应用程序需要。将其设置为 Django 应用程序 - settings.py文件的位置。替换- $PATH_TO_SETTINGS。
- 挂载您在此过程的步骤 1 中定义的卷 - opentelemetry-auto-instrumentation-python。如果您不需要启用与指标和跟踪的日志关联,请使用以下 Python 应用程序示例。如果要启用日志关联,请改为参阅下一步。- { "name": "- my-app", ... "environment": [ { "name": "PYTHONPATH", "value": "/otel-auto-instrumentation-python/opentelemetry/instrumentation/auto_instrumentation:$APP_PATH:/otel-auto-instrumentation-python" }, { "name": "OTEL_EXPORTER_OTLP_PROTOCOL", "value": "http/protobuf" }, { "name": "OTEL_TRACES_SAMPLER", "value": "xray" }, { "name": "OTEL_TRACES_SAMPLER_ARG", "value": "endpoint=http://- CW_CONTAINER_IP:2000" }, { "name": "OTEL_LOGS_EXPORTER", "value": "none" }, { "name": "OTEL_PYTHON_DISTRO", "value": "aws_distro" }, { "name": "OTEL_PYTHON_CONFIGURATOR", "value": "aws_configurator" }, { "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/traces" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/metrics" }, { "name": "OTEL_METRICS_EXPORTER", "value": "none" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED", "value": "true" }, { "name": "OTEL_RESOURCE_ATTRIBUTES", "value": "service.name=- $SVC_NAME" }, { "name": "DJANGO_SETTINGS_MODULE", "value": "- $PATH_TO_SETTINGS.settings" } ], "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation-python", "containerPath": "/otel-auto-instrumentation-python", "readOnly": false } ] }
- (可选)要启用日志关联,请在挂载卷之前执行以下操作。在 - OTEL_RESOURCE_ATTRIBUTES中,为应用程序的日志组设置其他环境变量- aws.log.group.names。这样,应用程序的跟踪和指标便可与这些特定日志组的相关日志条目相关联。对于此变量,将- $YOUR_APPLICATION_LOG_GROUP替换为应用程序的日志组名称。如果您有多个日志组,则可以使用和号(- &)分隔它们,如以下示例所示:- aws.log.group.names=log-group-1&log-group-2。要启用指标与日志关联的功能,设置此当前环境变量已足够。有关更多信息,请参阅 启用指标与日志关联。要启用跟踪与日志关联,您还需要更改应用程序中的日志记录配置。有关更多信息,请参阅 启用跟踪与日志关联。- 示例如下:要启用日志关联,请在挂载您于此过程的步骤 1 中定义的卷 - opentelemetry-auto-instrumentation-python时使用此示例。- { "name": "- my-app", ... "environment": [ { "name": "PYTHONPATH", "value": "/otel-auto-instrumentation-python/opentelemetry/instrumentation/auto_instrumentation:$APP_PATH:/otel-auto-instrumentation-python" }, { "name": "OTEL_EXPORTER_OTLP_PROTOCOL", "value": "http/protobuf" }, { "name": "OTEL_TRACES_SAMPLER", "value": "xray" }, { "name": "OTEL_TRACES_SAMPLER_ARG", "value": "endpoint=http://- CW_CONTAINER_IP:2000" }, { "name": "OTEL_LOGS_EXPORTER", "value": "none" }, { "name": "OTEL_PYTHON_DISTRO", "value": "aws_distro" }, { "name": "OTEL_PYTHON_CONFIGURATOR", "value": "aws_configurator" }, { "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/traces" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/metrics" }, { "name": "OTEL_METRICS_EXPORTER", "value": "none" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED", "value": "true" }, { "name": "OTEL_RESOURCE_ATTRIBUTES", "value": "aws.log.group.names=- $YOUR_APPLICATION_LOG_GROUP,service.name=- $SVC_NAME" }, { "name": "DJANGO_SETTINGS_MODULE", "value": "- $PATH_TO_SETTINGS.settings" } ], "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation-python", "containerPath": "/otel-auto-instrumentation-python", "readOnly": false } ] }
 
- .NET
- 
              使用 CloudWatch 代理检测您在 Amazon ECS 上的应用程序- 首先,指定绑定挂载。在接下来的步骤中,该卷将用于跨容器共享文件。您将在此过程的稍后部分使用此绑定挂载。 - "volumes": [ { "name": "opentelemetry-auto-instrumentation" } ]
- 在应用程序的任务定义中添加一个新容器 - init。将- $IMAGE替换为 Amazon Distro for OpenTelemetry Amazon ECR 映像存储库- 中的最新映像。 - 对于 Linux 容器实例,请使用以下代码。 - { "name": "init", "image": "- $IMAGE", "essential": false, "command": [ "cp", "-a", "autoinstrumentation/.", "/otel-auto-instrumentation" ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation", "containerPath": "/otel-auto-instrumentation", "readOnly": false } ] }- 对于 Windows Server 容器实例,请使用以下代码。 - { "name": "init", "image": "- $IMAGE", "essential": false, "command": [ "CMD", "/c", "xcopy", "/e", "C:\\autoinstrumentation\\*", "C:\\otel-auto-instrumentation", "&&", "icacls", "C:\\otel-auto-instrumentation", "/grant", "*S-1-1-0:R", "/T" ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation", "containerPath": "C:\\otel-auto-instrumentation", "readOnly": false } ] }
- 在 - init容器上添加依赖项,以确保容器在应用程序容器启动之前完成。- "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ]
- 将以下环境变量添加到您的应用程序容器中。您必须使用适用于 OpenTelemetry 的 Amazon Distro .NET 自动仪表化代理 - 版本 1.1.0 或更高版本。 - 环境变量 - 启用 Application Signals 的设置 - OTEL_RESOURCE_ATTRIBUTES- 将以下信息指定为键值对: - service.name设置服务的名称。这将作为应用程序的服务名称显示在 Application Signals 控制面板中。如果您不提供此键的值,将使用默认值- UnknownService。
- deployment.environment设置应用程序运行所在的环境。这将作为应用程序的托管环境显示在 Application Signals 控制面板中。如果您未指定此项,则使用默认值- generic:default。
 - 此属性键仅供 Application Signals 使用,并转换为 X-Ray 跟踪注释和 CloudWatch 指标维度。 - OTEL_AWS_APPLICATION_SIGNALS_ENABLED- 设置为 - true可使您的容器开始向 Application Signals 发送 X-Ray 跟踪和 CloudWatch 指标。- OTEL_METRICS_EXPORTER- 设置为 - none可禁用其他指标导出程序。- OTEL_LOGS_EXPORTER- 设置为 - none以禁用其他日志导出程序。- OTEL_EXPORTER_OTLP_PROTOCOL- 设置为 - http/protobuf以使用 HTTP 将指标和跟踪发送到 Application Signals。- OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT- 向 CloudWatch 进程守护程序容器发送指标。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:4316/v1/metrics。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为 http://- CW_CONTAINER_IP:4316/v1/metrics,其中- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_EXPORTER_OTLP_ENDPOINT- 向 CloudWatch 进程守护程序容器发送跟踪。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:4316。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为 http://- CW_CONTAINER_IP:4316,其中- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT- 向 CloudWatch 进程守护程序容器发送跟踪。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:4316/v1/traces。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为 http://- CW_CONTAINER_IP:4316/v1/traces,其中- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_TRACES_SAMPLER_ARG- 设置跟踪采样器端点。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:2000。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为- http://,其中- CW_CONTAINER_IP:2000- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_DOTNET_AUTO_HOME- 设置为 ADOT .NET 自动仪表化工具的安装位置。 - OTEL_DOTNET_AUTO_PLUGINS- 设置为 - AWS.Distro.OpenTelemetry.AutoInstrumentation.Plugin, AWS.Distro.OpenTelemetry.AutoInstrumentation以启用 Application Signals 插件。- CORECLR_ENABLE_PROFILING- 设置为 - 1以启用分析器。- CORECLR_PROFILER- 设置为 - {918728DD-259F-4A6A-AC2B-B85E1B658318}以作为分析器的 CLSID。- CORECLR_PROFILER_PATH- 将此设置为分析器的路径。 - 在 Linux 上,将其设置为 - ${OTEL_DOTNET_AUTO_HOME}/linux-x64/OpenTelemetry.AutoInstrumentation.Native.so- 在 Windows Server 上,将其设置为 - ${OTEL_DOTNET_AUTO_HOME}/win-x64/OpenTelemetry.AutoInstrumentation.Native.dll- DOTNET_ADDITIONAL_DEPS- 将此设置为 - ${OTEL_DOTNET_AUTO_HOME}/AdditionalDeps的文件夹路径。- DOTNET_SHARED_STORE- 将此设置为 - ${OTEL_DOTNET_AUTO_HOME}/store的文件夹路径。- DOTNET_STARTUP_HOOKS- 将此设置为要在主应用程序入口点之前运行的托管程序集 - ${OTEL_DOTNET_AUTO_HOME}/net/OpenTelemetry.AutoInstrumentation.StartupHook.dll的路径。
- 挂载您在此过程的步骤 1 中定义的卷 - opentelemetry-auto-instrumentation。对于 Linux,请使用以下代码。- { "name": "- my-app", ... "environment": [ { "name": "OTEL_RESOURCE_ATTRIBUTES", "value": "service.name=$SVC_NAME" }, { "name": "CORECLR_ENABLE_PROFILING", "value": "1" }, { "name": "CORECLR_PROFILER", "value": "{918728DD-259F-4A6A-AC2B-B85E1B658318}" }, { "name": "CORECLR_PROFILER_PATH", "value": "/otel-auto-instrumentation/linux-x64/OpenTelemetry.AutoInstrumentation.Native.so" }, { "name": "DOTNET_ADDITIONAL_DEPS", "value": "/otel-auto-instrumentation/AdditionalDeps" }, { "name": "DOTNET_SHARED_STORE", "value": "/otel-auto-instrumentation/store" }, { "name": "DOTNET_STARTUP_HOOKS", "value": "/otel-auto-instrumentation/net/OpenTelemetry.AutoInstrumentation.StartupHook.dll" }, { "name": "OTEL_DOTNET_AUTO_HOME", "value": "/otel-auto-instrumentation" }, { "name": "OTEL_DOTNET_AUTO_PLUGINS", "value": "AWS.Distro.OpenTelemetry.AutoInstrumentation.Plugin, AWS.Distro.OpenTelemetry.AutoInstrumentation" }, { "name": "OTEL_RESOURCE_ATTRIBUTES", "value": "aws.log.group.names=- $YOUR_APPLICATION_LOG_GROUP,service.name=dotnet-service-name" }, { "name": "OTEL_LOGS_EXPORTER", "value": "none" }, { "name": "OTEL_METRICS_EXPORTER", "value": "none" }, { "name": "OTEL_EXPORTER_OTLP_PROTOCOL", "value": "http/protobuf" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED", "value": "true" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT", "value": "http://localhost:4316/v1/metrics" }, { "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/traces" }, { "name": "OTEL_EXPORTER_OTLP_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316" }, { "name": "OTEL_TRACES_SAMPLER", "value": "xray" }, { "name": "OTEL_TRACES_SAMPLER_ARG", "value": "endpoint=http://- CW_CONTAINER_IP:2000" }, { "name": "OTEL_PROPAGATORS", "value": "tracecontext,baggage,b3,xray" } ], "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation", "containerPath": "/otel-auto-instrumentation", "readOnly": false } ], "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ] }- 对于 Windows Server,使用以下代码。 - { "name": "- my-app", ... "environment": [ { "name": "OTEL_RESOURCE_ATTRIBUTES", "value": "service.name=$SVC_NAME" }, { "name": "CORECLR_ENABLE_PROFILING", "value": "1" }, { "name": "CORECLR_PROFILER", "value": "{918728DD-259F-4A6A-AC2B-B85E1B658318}" }, { "name": "CORECLR_PROFILER_PATH", "value": "C:\\otel-auto-instrumentation\\win-x64\\OpenTelemetry.AutoInstrumentation.Native.dll" }, { "name": "DOTNET_ADDITIONAL_DEPS", "value": "C:\\otel-auto-instrumentation\\AdditionalDeps" }, { "name": "DOTNET_SHARED_STORE", "value": "C:\\otel-auto-instrumentation\\store" }, { "name": "DOTNET_STARTUP_HOOKS", "value": "C:\\otel-auto-instrumentation\\net\\OpenTelemetry.AutoInstrumentation.StartupHook.dll" }, { "name": "OTEL_DOTNET_AUTO_HOME", "value": "C:\\otel-auto-instrumentation" }, { "name": "OTEL_DOTNET_AUTO_PLUGINS", "value": "AWS.Distro.OpenTelemetry.AutoInstrumentation.Plugin, AWS.Distro.OpenTelemetry.AutoInstrumentation" }, { "name": "OTEL_RESOURCE_ATTRIBUTES", "value": "aws.log.group.names=- $YOUR_APPLICATION_LOG_GROUP,service.name=dotnet-service-name" }, { "name": "OTEL_LOGS_EXPORTER", "value": "none" }, { "name": "OTEL_METRICS_EXPORTER", "value": "none" }, { "name": "OTEL_EXPORTER_OTLP_PROTOCOL", "value": "http/protobuf" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED", "value": "true" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/metrics" }, { "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/traces" }, { "name": "OTEL_EXPORTER_OTLP_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316" }, { "name": "OTEL_TRACES_SAMPLER", "value": "xray" }, { "name": "OTEL_TRACES_SAMPLER_ARG", "value": "endpoint=http://- CW_CONTAINER_IP:2000" }, { "name": "OTEL_PROPAGATORS", "value": "tracecontext,baggage,b3,xray" } ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation", "containerPath": "C:\\otel-auto-instrumentation", "readOnly": false } ], "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ] }
 
- Node.js
- 
              
              注意要为使用 ESM 的 Node.js 应用程序启用 Application Signals,在开始这些步骤之前请参阅Setting up a Node.js application with the ESM module format。 使用 CloudWatch 代理检测您在 Amazon ECS 上的应用程序- 首先,指定绑定挂载。在接下来的步骤中,该卷将用于跨容器共享文件。您将在此过程的稍后部分使用此绑定挂载。 - "volumes": [ { "name": "opentelemetry-auto-instrumentation-node" } ]
- 在应用程序的任务定义中添加一个新容器 - init。将- $IMAGE替换为 Amazon Distro for OpenTelemetry Amazon ECR 映像存储库- 中的最新映像。 - { "name": "init", "image": "- $IMAGE", "essential": false, "command": [ "cp", "-a", "/autoinstrumentation/.", "/otel-auto-instrumentation-node" ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation-node", "containerPath": "/otel-auto-instrumentation-node", "readOnly": false } ], }
- 在 - init容器上添加依赖项,以确保此容器在应用程序容器启动之前完成。- "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ]
- 将以下环境变量添加到您的应用程序容器中。 - 环境变量 - 启用 Application Signals 的设置 - OTEL_RESOURCE_ATTRIBUTES- 将以下信息指定为键值对: - service.name设置服务的名称。这将作为应用程序的服务名称显示在 Application Signals 控制面板中。如果您不提供此键的值,将使用默认值- UnknownService。
- deployment.environment设置应用程序运行所在的环境。这将作为应用程序的托管环境显示在 Application Signals 控制面板中。如果您未指定此项,则使用默认值- generic:default。
 - 此属性键仅供 Application Signals 使用,并转换为 X-Ray 跟踪注释和 CloudWatch 指标维度。 - (可选)要启用 Application Signals 的日志关联,请将其他环境变量 - aws.log.group.names设置为应用程序日志的日志组名称。这样,应用程序的跟踪和指标便可与该特定日志组的相关日志条目相关联。对于此变量,将- $YOUR_APPLICATION_LOG_GROUP替换为应用程序的日志组名称。如果您有多个日志组,则可以使用和号(- &)分隔它们,如以下示例所示:- aws.log.group.names=log-group-1&log-group-2。要启用指标与日志关联的功能,设置此当前环境变量已足够。有关更多信息,请参阅 启用指标与日志关联。要启用跟踪与日志关联,您还需要更改应用程序中的日志记录配置。有关更多信息,请参阅 启用跟踪与日志关联。- OTEL_AWS_APPLICATION_SIGNALS_ENABLED- 设置为 - true可使您的容器开始向 Application Signals 发送 X-Ray 跟踪和 CloudWatch 指标。- OTEL_METRICS_EXPORTER- 设置为 - none可禁用其他指标导出程序。- OTEL_LOGS_EXPORTER- 设置为 - none以禁用其他日志导出程序。- OTEL_EXPORTER_OTLP_PROTOCOL- 设置为 - http/protobuf以使用 OTLP/HTTP 和 protobuf 将指标和跟踪发送到 Application Signals。- OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT- 向 CloudWatch 进程守护程序容器发送指标。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:4316/v1/metrics。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为 http://- CW_CONTAINER_IP:4316/v1/metrics,其中- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT- 向 CloudWatch 进程守护程序容器发送跟踪。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:4316/v1/traces。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为 http://- CW_CONTAINER_IP:4316/v1/traces,其中- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_TRACES_SAMPLER- 将此项设置为 - xray以将 X-Ray 设置为跟踪取样器。- OTEL_TRACES_SAMPLER_ARG- 设置跟踪采样器端点。 - 对于在 - host模式下运行的应用程序,请将此设置为- http://localhost:2000。
- 对于在 - bridge模式或- awsvpc模式下运行的应用程序,请将此设置为- http://,其中- CW_CONTAINER_IP:2000- CW_CONTAINER_IP是 EC2 容器实例的私有 IP 地址。您还可以从实例元数据服务(IMDS)检索此地址。
 - OTEL_PROPAGATORS- 将 - xray设置为传播器之一。- NODE_OPTIONS- 设置为 - --require。将- AWS_ADOT_NODE_INSTRUMENTATION_PATH- AWS_ADOT_NODE_INSTRUMENTATION_PATH替换为存储 Amazon Distro for OpenTelemetry Node.js 自动检测的路径。例如,- /otel-auto-instrumentation-node/autoinstrumentation.js
- 挂载您在此过程的步骤 1 中定义的卷 - opentelemetry-auto-instrumentation-node。如果您不需要启用与指标和跟踪的日志关联,请使用以下 Node.js 应用程序示例。如果要启用日志关联,请改为参阅下一步。- 对于应用程序容器,在 - init容器上添加依赖项,以确保容器在应用程序容器启动之前完成。- { "name": "- my-app", ... "environment": [ { "name": "OTEL_RESOURCE_ATTRIBUTES", "value": "service.name=- $SVC_NAME" }, { "name": "OTEL_LOGS_EXPORTER", "value": "none" }, { "name": "OTEL_METRICS_EXPORTER", "value": "none" }, { "name": "OTEL_EXPORTER_OTLP_PROTOCOL", "value": "http/protobuf" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED", "value": "true" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/metrics" }, { "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/traces" }, { "name": "OTEL_TRACES_SAMPLER", "value": "xray" }, { "name": "OTEL_TRACES_SAMPLER_ARG", "value": "endpoint=http://- CW_CONTAINER_IP:2000" }, { "name": "NODE_OPTIONS", "value": "--require /otel-auto-instrumentation-node/autoinstrumentation.js" } ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation-node", "containerPath": "/otel-auto-instrumentation-node", "readOnly": false } ], "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ] }
- (可选)要启用日志关联,请在挂载卷之前执行以下操作。在 - OTEL_RESOURCE_ATTRIBUTES中,为应用程序的日志组设置其他环境变量- aws.log.group.names。这样,应用程序的跟踪和指标便可与这些特定日志组的相关日志条目相关联。对于此变量,将- $YOUR_APPLICATION_LOG_GROUP替换为应用程序的日志组名称。如果您有多个日志组,则可以使用和号(- &)分隔它们,如以下示例所示:- aws.log.group.names=log-group-1&log-group-2。要启用指标与日志关联的功能,设置此当前环境变量已足够。有关更多信息,请参阅 启用指标与日志关联。要启用跟踪与日志关联,您还需要更改应用程序中的日志记录配置。有关更多信息,请参阅 启用跟踪与日志关联。- 示例如下:使用此示例可在您挂载于此过程的步骤 1 中定义的卷 - opentelemetry-auto-instrumentation时启用日志关联。- { "name": "- my-app", ... "environment": [ { "name": "OTEL_RESOURCE_ATTRIBUTES", "value": "aws.log.group.names=- $YOUR_APPLICATION_LOG_GROUP,service.name=- $SVC_NAME" }, { "name": "OTEL_LOGS_EXPORTER", "value": "none" }, { "name": "OTEL_METRICS_EXPORTER", "value": "none" }, { "name": "OTEL_EXPORTER_OTLP_PROTOCOL", "value": "http/protobuf" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED", "value": "true" }, { "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/metrics" }, { "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "value": "http://- CW_CONTAINER_IP:4316/v1/traces" }, { "name": "OTEL_TRACES_SAMPLER", "value": "xray" }, { "name": "OTEL_TRACES_SAMPLER_ARG", "value": "endpoint=http://- CW_CONTAINER_IP:2000" }, { "name": "NODE_OPTIONS", "value": "--require /otel-auto-instrumentation-node/autoinstrumentation.js" } ], "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation-node", "containerPath": "/otel-auto-instrumentation-node", "readOnly": false } ], "dependsOn": [ { "containerName": "init", "condition": "SUCCESS" } ] }
 设置采用 ESM 模块格式的 Node.js 应用程序 我们对采用 ESM 模块格式的 Node.js 应用程序提供有限的支持。有关更多信息,请参阅 使用 ESM 的 Node.js 的已知限制。 对于 ESM 模块格式,使用 init容器注入 Node.js 检测 SDK 不适用。要为使用 ESM 的 Node.js 应用程序启用 Application Signals,请跳过之前程序的步骤 1 和 2,改为执行以下操作。为使用 ESM 的 Node.js 应用程序启用 Application Signals- 将相关依赖项安装到您的 Node.js 应用程序中以进行自动检测: - npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation npm install @opentelemetry/instrumentation@0.54.0
- 在之前程序的步骤 4 和 5 中,删除卷 - opentelemetry-auto-instrumentation-node的挂载:- "mountPoints": [ { "sourceVolume": "opentelemetry-auto-instrumentation-node", "containerPath": "/otel-auto-instrumentation-node", "readOnly": false } ]- 请将节点替换为以下内容。 - { "name": "NODE_OPTIONS", "value": "--import @aws/aws-distro-opentelemetry-node-autoinstrumentation/register --experimental-loader=@opentelemetry/instrumentation/hook.mjs" }
 
步骤 6:部署应用程序
创建任务定义的新修订版并将其部署到您的应用程序集群。您应会在新创建的任务中看到两个容器:
- init– Application Signals 初始化所必需的容器
- my-app
(可选)第 7 步:监控应用程序运行状况
在 Amazon ECS 上启用应用程序后,便可监控应用程序的运行状况。有关更多信息,请参阅 使用 Application Signals 监控应用程序的运行状况。