收集 Amazon Elastic Container Service 或 AWS Fargate OpenTelemetry 数据
您可以配置 Grafana Alloy 或 AWS ADOT 来收集来自 Amazon Elastic Container Service (ECS) 或 AWS Fargate 的 OpenTelemetry 兼容数据,并将其转发到任何 OpenTelemetry 兼容端点。
指标可从多种来源获取,包括 ECS 本身、使用 EC2 时的 ECS 实例、X-Ray 以及您自己的应用。您还可以从为 Prometheus 或 OTLP 插桩的应用中收集日志和追踪。
准备工作
- 确保您对使用 OpenTelemetry 插桩应用有基本的了解。
- 准备一个可用的 Amazon ECS 或 AWS Fargate 部署。
- 确定 Alloy 将接收到的遥测数据写入何处。
- 熟悉 Alloy 中 Components 的概念。
收集任务和容器指标
在此配置中,您将一个 OTEL Collector 添加到运行您的应用的任务中,它使用 ECS Metadata Endpoint 收集集群中的任务和容器指标。
您可以在两种 Collector 实现之间进行选择
您可以使用 AWS OpenTelemetry Collector,即 ADOT。ADOT 原生支持抓取任务和容器指标。ADOT 带有可在任务定义中选择的默认配置。
或者,您可以使用 Alloy 作为 Collector,与 Prometheus ECS Exporter 一起使用,后者以 Prometheus 格式暴露 ECS Metadata Endpoint 指标。
配置 ADOT
如果您使用 ADOT 作为 Collector,请在您的任务定义中添加一个新的容器,并使用您在 AWS SSM Parameter Store 中定义的自定义配置。
您可以在 AWS Observability Repo 中找到示例 OTEL 配置文件。您可以使用这些示例作为起点,并添加适当的 Exporter 配置,将指标发送到 Prometheus 或 Otel 端点。
- 使用
ecs-default-config
来消费 StatsD 指标、OTLP 指标和追踪以及 AWS X-Ray SDK 追踪。 - 使用
otel-task-metrics-config
来消费 StatsD、OTLP、AWS X-Ray 和容器资源利用率指标。
阅读 otel-prometheus
以了解如何设置 Prometheus remote write (示例中为 AWS Managed Prometheus)。
完成以下步骤创建示例任务。有关更多信息,请参阅 ADOT 文档。
创建 SSM Parameter Store 条目来存储 Collector 配置文件。
打开 AWS 控制台。
在 AWS 控制台中,选择 Parameter Store。
选择 创建参数。
创建一个参数,使用以下值:
- 名称:
collector-config
- 层级: Standard
- 类型: String
- 数据类型: Text
- 值: 复制并粘贴您的自定义 OpenTelemetry 配置文件。
- 名称:
从 GitHub 下载 ECS Fargate 或 ECS EC2 任务定义模板。
编辑任务定义模板并添加以下参数。
{{region}}
: 数据发送区域。{{ecsTaskRoleArn}}
: AWSOTTaskRole ARN。{{ecsExecutionRoleArn}}
: AWSOTTaskExcutionRole ARN。- 添加一个名为 AOT_CONFIG_CONTENT 的环境变量。选择 ValueFrom 以告知 ECS 从 SSM Parameter 获取值,并将值设置为
collector-config
。
按照 ECS Fargate 设置说明,使用该模板创建任务定义。
配置 Alloy
使用以下内容作为您的 Alloy 配置的起点:
prometheus.scrape "stats" {
targets = [
{ "__address__" = "localhost:9779" },
]
metrics_path = "/metrics"
scheme = "http"
forward_to = [prometheus.remote_write.default.receiver]
}
// additional OTEL config as in [ecs-default-config]
// OTLP receiver
// statsd
// Use the alloy convert command to use one of the AWS ADOT files
// https://grafana.org.cn/docs/alloy/latest/reference/cli/convert/
...
prometheus.remote_write "default" {
endpoint {
url = sys.env("PROMETHEUS_REMOTE_WRITE_URL")
basic_auth {
username = sys.env("PROMETHEUS_USERNAME")
password = sys.env("PROMETHEUS_PASSWORD")
}
}
}
此配置设置了一个用于容器指标的抓取任务,并将其导出到 Prometheus 端点。
完成以下步骤创建示例任务。
创建 SSM Parameter Store 条目来存储 Collector 配置文件。
打开 AWS 控制台。
在 AWS 控制台中,选择 Parameter Store。
选择 创建参数。
创建一个参数,使用以下值:
- 名称:
collector-config
- 层级: Standard
- 类型: String
- 数据类型: Text
- 值: 复制并粘贴您的自定义 Alloy 配置文件。
- 名称:
从 GitHub 下载 ECS Fargate 或 ECS EC2 任务定义模板。
编辑任务定义模板并添加以下参数。
{{region}}
: 数据发送区域。{{ecsTaskRoleArn}}
: AWSOTTaskRole ARN。{{ecsExecutionRoleArn}}
: AWSOTTaskExcutionRole ARN。添加一个名为 ALLOY_CONFIG_CONTENT 的环境变量。
- 选择 ValueFrom 以告知 ECS 从 SSM Parameter 获取值,并将值设置为
collector-config
。
- 选择 ValueFrom 以告知 ECS 从 SSM Parameter 获取值,并将值设置为
添加用于 Prometheus remote write 的环境变量
- PROMETHEUS_REMOTE_WRITE_URL
- PROMETHEUS_USERNAME
- PROMETHEUS_PASSWORD - 为提高安全性,请在 AWS Secret Manager 中创建密码,并在 ValueFrom 字段中引用该 Secret 的 ARN。
在 Docker 配置中,将 Entrypoint 更改为
bash,-c
{{command}}
:"echo \"$ALLOY_CONFIG_CONTENT\" > /tmp/config_file && exec alloy run --server.http.listen-addr=0.0.0.0:12345 /tmp/config_file"
确保您没有遗漏命令周围的双引号。Alloy 目前不支持直接从 ECS Metadata Endpoint 收集容器指标,因此如果需要,您需要为 Prometheus Exporter 添加第二个容器
- 为任务添加一个新容器。
- 将容器名称设置为
"ecs-exporter"
。 - 将镜像设置为
"quay.io/prometheuscommunity/ecs-exporter:latest"
。 - 添加
tcp/9779
作为端口映射。
按照 ECS Fargate 设置说明,使用该模板创建任务定义。
收集 EC2 实例指标
对于在 EC2 上运行的 ECS 集群,您可以通过在单独部署为 Daemon 的 ECS 任务中使用 AWS ADOT 或 Alloy 来收集实例指标。
Alloy
您可以按照 配置 Alloy 中描述的步骤创建另一个任务,并进行以下更改:
- 只添加 Alloy 容器,不添加 Prometheus Exporter,并将任务作为 Daemon 运行,这样它就会在集群中每个节点上自动运行一个实例。
- 更新您的 Alloy 配置,以收集来自实例的指标。配置因 EC2 节点类型而异。有关详细信息,请参阅
collect
文档。
ADOT
AWS Otel 文档中描述的方法使用了 OTel 的 awscontainerinsightreceiver
Receiver。此 Receiver 已包含在 ADOT 中。
您需要使用基于示例配置文件的自定义配置 SSM Parameter,将遥测数据路由到您的最终目的地。
收集应用遥测数据
要收集您的应用发出的指标和追踪,无论 Collector 实现如何,都使用 Collector Sidecar 容器暴露的 OTLP 端点。将 localhost
指定为主机名,这是大多数插桩库和 Agent 的默认设置。
对于 Prometheus 端点,将一个抓取任务添加到 ADOT 或 Alloy 配置中,并使用 localhost
、服务端口和端点路径。
收集日志
在 ECS 中收集应用日志的最简单方法是利用 AWS firelens 日志驱动程序。根据您的用例,您可以使用 FluentBit 的 OpenTelemetry 插件或使用 FluentBit Loki 插件将日志转发到您任务中的 Collector 容器。您也可以将所有内容直接发送到您的最终目的地。