← 文章 / 云原生与基础设施
signoz 6小时前 · 2026-10-07 02:33:46 · 0 阅读

ECS EC2 收集代理 - 配置

本指南介绍安装完成后的 Daemon 服务配置、数据流转验证,以及应用数据采集的设置。

前提条件

配置之前,请确认以下事项已完成:

  • 已完成安装步骤
  • Daemon 服务已在 ECS 集群上运行
  • 可以访问 SigNoz Cloud 或自托管实例

验证数据采集

登录 SigNoz 实例,检查是否已正常接收 ECS 基础设施指标和日志。

如需可视化 ECS 数据,可导入预置的 Dashboard:

在 SigNoz 的 Dashboards 页面中导入这些文件。

从应用发送数据

本节将介绍如何把部署在 ECS 上的应用数据,通过上一节创建的 Daemon 服务发送到 SigNoz Cloud。


第 1 步:为应用添加 OpenTelemetry Instrumentation

关于如何为应用添加 OpenTelemetry instrumentation,可参考这里的文档。

Note

这一步需要将 OpenTelemetry SDK 及初始化代码加入应用代码库,并重新构建应用容器镜像。

第 2 步:为应用容器添加 Entrypoint

我们需要为应用容器添加一个 entrypoint,把 OTEL_EXPORTER_OTLP_ENDPOINT 环境变量设置为 Daemon 服务的 endpoint,这样应用容器就能把数据发送到运行在同一台主机上的 Daemon 容器。

下面这些 AWS entrypoint 会从 IMDSv2 读取实例 IP。AWS 建议容器的 IMDSv2 hop limit 设为 2。由于账户或启动配置可能改变默认值,请对集群中的每个容器实例执行以下命令:

Copy
aws ec2 modify-instance-metadata-options \
  --instance-id <instance-id> \
  --http-put-response-hop-limit 2 \
  --http-endpoint enabled

请核对这些值:

  • <instance-id>:各容器实例对应的 Amazon EC2 实例 ID(i-...)。可在EC2 控制台的实例页面查询。
EC2External

方法 1:在任务定义中更新 entrypoint

需要获取任务所在实例的端点或 IP 地址。可通过查询该实例的元数据服务实现。对于 EC2,元数据服务位于 169.254.169.254,且需使用 IMDSv2 会话令牌。

entryPoint 示例如下:

Copy
{
       
      "entryPoint": [
        "sh",
        "-c",
        "TOKEN=$(curl -s -X PUT http://169.254.169.254/latest/api/token -H \"X-aws-ec2-metadata-token-ttl-seconds: 21600\"); export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf OTEL_EXPORTER_OTLP_ENDPOINT=\"http://$(curl -s -H \"X-aws-ec2-metadata-token: $TOKEN\" http://169.254.169.254/latest/meta-data/local-ipv4):4318\"; <Application Startup Commands>"
      ],
			"command": [],
			
}
  • 将 <Application Startup Commands> 替换为启动应用程序所需的命令。
  • 上述 entrypoint 配置的是 4318 端口的 OTLP/HTTP。若需通过 gRPC 导出,请将 OTEL_EXPORTER_OTLP_PROTOCOL 设置为 grpc,并使用 4317 端口。

方法 1:在任务定义中更新 entrypoint

需要获取任务所在实例的端点或 IP 地址。根据网络模式和云服务商不同,有多种获取方式。

根据网络模式和云服务商,entryPoint 配置示例如下:

  • 使用默认网络模式,即桥接(Bridge)模式:

    Copy
    {
           
          "entryPoint": [
            "sh",
            "-c",
            "export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf OTEL_EXPORTER_OTLP_ENDPOINT=\"http://172.17.0.1:4318\"; <Application Startup Commands>"
          ],
    			"command": [],
    			
    }
  • 使用自定义 Docker 网络的桥接(Bridge)模式

    若使用自定义 Docker 网络,需在任务定义中配置 ExtraHosts。

    Copy
    {
        
        "extraHosts": [
          {
            "hostname": "signoz-collector",
            "ipAddress": "host-gateway"
          }
          
        ]
    }

    entryPoint 的写法如下:

    Copy
    {
           
          "entryPoint": [
            "sh",
            "-c",
            "export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf OTEL_EXPORTER_OTLP_ENDPOINT=\"http://signoz-collector:4318\"; <Application Startup Commands>"
          ],
    			"command": [],
    			
    }
  • 如果网络模式不是 Bridge,且运行在 AWS EC2 实例上:

    Copy
    {
           
          "entryPoint": [
            "sh",
            "-c",
            "TOKEN=$(curl -s -X PUT http://169.254.169.254/latest/api/token -H \"X-aws-ec2-metadata-token-ttl-seconds: 21600\"); export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf OTEL_EXPORTER_OTLP_ENDPOINT=\"http://$(curl -s -H \"X-aws-ec2-metadata-token: $TOKEN\" http://169.254.169.254/latest/meta-data/local-ipv4):4318\"; <Application Startup Commands>"
          ],
    			"command": [],
    			
    }
  • 如果网络模式不是 Bridge,且运行在 GCP 实例上:

    Copy
    {
           
          "entryPoint": [
            "sh",
            "-c",
            'export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf OTEL_EXPORTER_OTLP_ENDPOINT="http://$(curl "http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/ip?recursive=true&alt=text" -H "Metadata-Flavor: Google"):4318"; <Application Startup Commands>'
          ],
    			"command": [],
    			
    }

说明:

  • 将 <Application Startup Commands> 替换为启动应用所需的命令。
  • entrypoint 配置 OTLP/HTTP 使用 4318 端口。若需通过 gRPC 导出,请设置 OTEL_EXPORTER_OTLP_PROTOCOL=grpc 并使用 4317 端口。
  • 有关 metadata server 的更多信息,请参阅 https://www.baeldung.com/linux/cloud-ip-meaning

3. 添加应用的服务名称

要为应用添加服务名称,需将应用容器的 OTEL_RESOURCE_ATTRIBUTES 环境变量设置为 service.name=<your-service-name>。

在任务定义中添加以下行即可。

Copy
 
    ContainerDefinitions:
        - Name: <your-container-name>
          
          Environment:
            - Name: OTEL_RESOURCE_ATTRIBUTES
              Value: service.name=<your-service-name>
          
 

如果使用 JSON 格式的任务定义,可以添加以下内容。

Copy
 
    "containerDefinitions": [
        {
            "name": "<your-container-name>",
            
            "environment": [
                {
                    "name": "OTEL_RESOURCE_ATTRIBUTES",
                    "value": "service.name=<your-service-name>"
                }
            ],
            
        }
    ],
 
 

4. 从应用中添加 ECS 任务属性

daemon collector 运行在独立的 ECS task 中,无法判断遥测数据来自哪个任务。要在遥测数据中加入你应用的 ECS 任务信息,需要在 OpenTelemetry SDK 中启用 ECS 资源探测器。该探测器会为 traces、metrics 和 OTLP logs 添加 aws.ecs.task.family、aws.ecs.task.arn 等属性。

  • Go:将 resource.WithFromEnv() 和 resource.WithDetectors(ecs.NewResourceDetector()) 传入 resource.New(),再把结果通过 WithResource(res) 传给每个 provider。该探测器位于 go.opentelemetry.io/contrib/detectors/aws/ecs。
  • Node.js:将 NodeSDK 的 resourceDetectors 选项设置为 [envDetector, awsEcsDetector]。awsEcsDetector 位于 @opentelemetry/resource-detector-aws。
  • Python:将 OTELResourceDetector() 和 AwsEcsResourceDetector() 传入 get_aggregated_resources(),再把结果以 resource= 的形式传给 TracerProvider、MeterProvider 和 LoggerProvider。AwsEcsResourceDetector 位于 opentelemetry-sdk-extension-aws。
  • Java agent:在容器环境变量中设置 OTEL_RESOURCE_PROVIDERS_AWS_ENABLED=true。参见 Java agent 配置文档。

Go、Node.js 和 Python 环境中的环境检测器保留步骤 3 中设置的 service.name。每个应用容器读取其所在的 ECS 任务元数据,因此属性与该任务匹配。收集器通过 filelog 从容器输出读取的日志不会获取这些属性。

为确保检测器正常工作,请在 SigNoz 中打开你的服务链路追踪。其资源属性中应显示 aws.ecs.task.arn。

Warning

如果你的守护进程配置中的 ecs 检测器没有包含来自 安装模板 的 resource_attributes 覆盖配置,请添加它们。否则,收集器会用自身任务的值填充那些你的应用未发送的 ECS 任务属性。

后续步骤

原始来源: signoz

评论 (0)