AWS Distro for OpenTelemetry を使用した ECS クラスター内のサービスメトリクスの収集
デフォルト設定で ADOT Collector をデプロイする
ADOT コレクターは、以下に示すように、サイドカーパターンを使用してタスク定義を使ってデプロイできます。コレクターに使用されるコンテナイメージには、2 つのコレクターパイプライン設定がバンドルされており、コンテナ定義の command セクションで指定できます。この値を設定すると --config=/etc/ecs/ecs-default-config.yaml
パイプライン設定を使用することになります。この設定は、コレクターと同じタスク内で実行されている他のコンテナからアプリケーションメトリクスとトレースを収集し、Amazon CloudWatch と AWS X-Ray に送信します。具体的には、コレクターは OpenTelemetry Protocol (OTLP) Receiver を使用して、OpenTelemetry SDK でインストルメント化されたアプリケーションから送信されたメトリクスを受信し、StatsD Receiver を使用して StatsD メトリクスを収集します。さらに、AWS X-ray Receiver を使用して、AWS X-Ray SDK でインストルメント化されたアプリケーションからトレースを収集します。
Amazon ECS クラスターにデプロイされた ADOT コレクターが使用する IAM タスクロールとタスク実行ロールの設定の詳細については、ドキュメントを参照してください。
{
"family":"AdotTask",
"taskRoleArn":"arn:aws:iam::123456789012:role/ECS-ADOT-Task-Role",
"executionRoleArn":"arn:aws:iam::123456789012:role/ECS-Task-Execution-Role",
"networkMode":"awsvpc",
"containerDefinitions":[
{
"name":"application-container",
"image":"..."
},
{
"name":"aws-otel-collector",
"image":"public.ecr.aws/aws-observability/aws-otel-collector:latest",
"cpu":512,
"memory":1024,
"command": [
"--config=/etc/ecs/ecs-default-config.yaml"
],
"portMappings":[
{
"containerPort":2000,
"protocol":"udp"
}
],
"essential":true
}
],
"requiresCompatibilities":[
"EC2"
],
"cpu":"1024",
"memory":"2048"
}
Prometheus メトリクス収集のための ADOT Collector のデプロイ
デフォルト設定とは異なるパイプラインを使用して、中央コレクターパターンで ADOT をデプロイするには、以下に示すタスク定義を使用できます。ここでは、コレクターパイプラインの設定は、AWS SSM Parameter Store の otel-collector-config という名前のパラメータから読み込まれます。コレクターは REPLICA サービススケジューラ戦略を使用して起動されます。
{
"family":"AdotTask",
"taskRoleArn":"arn:aws:iam::123456789012:role/ECS-ADOT-Task-Role",
"executionRoleArn":"arn:aws:iam::123456789012:role/ECS-Task-Execution-Role",
"networkMode":"awsvpc",
"containerDefinitions":[
{
"name":"aws-otel-collector",
"image":"public.ecr.aws/aws-observability/aws-otel-collector:latest",
"cpu":512,
"memory":1024,
"secrets":[
{
"name":"AOT_CONFIG_CONTENT",
"valueFrom":"arn:aws:ssm:us-east-1:123456789012:parameter/otel-collector-config"
}
],
"portMappings":[
{
"containerPort":2000,
"protocol":"udp"
}
],
"essential":true
}
],
"requiresCompatibilities":[
"EC2"
],
"cpu":"1024",
"memory":"2048"
}
SSM Parameter Store パラメータ名は、AOT_CONFIG_CONTENT という名前の環境変数を使用してコレクターに公開する必要があります。 アプリケーションからの Prometheus メトリクス収集に ADOT コレクターを使用し、REPLICA サービススケジューラー戦略でデプロイする場合は、レプリカ数を 1 に設定してください。コレクターのレプリカを 2 つ以上デプロイすると、ターゲット送信先でメトリクスデータが正しく表示されなくなります。
以下に示す設定により、ADOT コレクターは Prometheus Receiver を使用してクラスター内のサービスから Prometheus メトリクスを収集できるようになります。このレシーバーは、最小限の変更で Prometheus サーバーの代替として機能するように設計されています。このレシーバーでメトリクスを収集するには、スクレイピング対象のターゲットサービスのセットを検出するメカニズムが必要です。レシーバーは、サポートされている数十のサービス検出メカニズムのいずれかを使用して、スクレイピングターゲットの静的および動的検出の両方をサポートしています。
Amazon ECS には組み込みのサービスディスカバリーメカニズムがないため、コレクターは Prometheus のファイルベースのターゲット検出サポートに依存しています。ファイルベースのターゲット検出用に Prometheus レシーバーをセットアップするために、コレクターは Amazon ECS Observer 拡張機能を使用します。この拡張機能は ECS/EC2 API を使用して、実行中のすべてのタスクから Prometheus スクレイプターゲットを検出し、設定の ecs_observer/task_definitions セクションにリストされているサービス名、タスク定義、コンテナラベルに基づいてフィルタリングします。検出されたすべてのターゲットは、result_file フィールドで指定されたファイルに書き込まれます。このファイルは ADOT コレクターコンテナにマウントされたファイルシステム上に存在します。その後、Prometheus レシーバーはこのファイルにリストされているターゲットからメトリクスをスクレイプします。
メトリクスデータを Amazon Managed Prometheus ワークスペースに送信する
Prometheus Receiver によって収集されたメトリクスは、以下の設定の exporters セクションに示されているように、コレクターパイプラインの Prometheus Remote Write Exporter を使用して Amazon Managed Prometheus ワークスペースに送信できます。このエクスポーターは、ワークスペースのリモート書き込み URL で設定され、HTTP POST リクエストを 使用してメトリクスデータを送信します。組み込みの AWS Signature Version 4 認証機能を使用して、ワークスペースに送信されるリクエストに署名します。
extensions:
health_check:
sigv4auth:
region: us-east-1
ecs_observer:
refresh_interval: 60s
cluster_name: 'ecs-ec2-cluster'
cluster_region: us-east-1
result_file: '/etc/ecs_sd_targets.yaml'
services:
- name_pattern: '^WebAppService$'
task_definitions:
- job_name: "webapp-tasks"
arn_pattern: '.*:task-definition/WebAppTask:[0-9]+'
metrics_path: '/metrics'
metrics_ports:
- 3000
receivers:
awsxray:
prometheus:
config:
scrape_configs:
- job_name: ecs_services
file_sd_configs:
- files:
- '/etc/ecs_sd_targets.yaml'
refresh_interval: 30s
relabel_configs:
- source_labels: [ __meta_ecs_cluster_name ]
action: replace
target_label: cluster
- source_labels: [ __meta_ecs_service_name ]
action: replace
target_label: service
- source_labels: [ __meta_ecs_task_definition_family ]
action: replace
target_label: taskdefinition
- source_labels: [ __meta_ecs_task_container_name ]
action: replace
target_label: container
processors:
filter/include:
metrics:
include:
match_type: regexp
metric_names:
- ^http_requests_total$
exporters:
awsxray:
prometheusremotewrite:
endpoint: https://aps-workspaces.us-east-1.amazonaws.com/workspaces/WORKSPACE_ID/api/v1/remote_write
auth:
authenticator: sigv4auth
resource_to_telemetry_conversion:
enabled: true
service:
extensions:
- ecs_observer
- health_check
- sigv4auth
pipelines:
metrics:
receivers: [prometheus]
exporters: [prometheusremotewrite]
traces:
receivers: [awsxray]
exporters: [awsxray]
メトリクスデータを Amazon CloudWatch に送信する
あるいは、以下の設定の exporters セクションに示すように、コレクターパイプラインで Amazon CloudWatch EMF Exporter を使用して、メトリクスデータを Amazon CloudWatch に送信することもできます。このエクスポーターは、メトリクスデータをパフォーマンスログイベントとして CloudWatch に送信します。エクスポーターの metric_declaration フィールドは、生成される埋め込みメトリクス形式のログの配列を指定するために使用されます。以下の設定では、http_requests_total という名前のメトリクスに対してのみログイベントが生成されます。このデータを使用して、CloudWatch は ClusterName、ServiceName、TaskDefinitionFamily のディメンションを持つ CloudWatch 名前空間 ECS/ContainerInsights/Prometheus の下にメトリクス http_requests_total を作成します。
extensions:
health_check:
sigv4auth:
region: us-east-1
ecs_observer:
refresh_interval: 60s
cluster_name: 'ecs-ec2-cluster'
cluster_region: us-east-1
result_file: '/etc/ecs_sd_targets.yaml'
services:
- name_pattern: '^WebAppService$'
task_definitions:
- job_name: "webapp-tasks"
arn_pattern: '.*:task-definition/WebAppTask:[0-9]+'
metrics_path: '/metrics'
metrics_ports:
- 3000
receivers:
awsxray:
prometheus:
config:
global:
scrape_interval: 15s
scrape_timeout: 10s
scrape_configs:
- job_name: ecs_services
file_sd_configs::
- files:
- '/etc/ecs_sd_targets.yaml'
relabel_configs:
- source_labels: [ __meta_ecs_cluster_name ]
action: replace
target_label: ClusterName
- source_labels: [ __meta_ecs_service_name ]
action: replace
target_label: ServiceName
- source_labels: [ __meta_ecs_task_definition_family ]
action: replace
target_label: TaskDefinitionFamily
- source_labels: [ __meta_ecs_task_container_name ]
action: replace
target_label: container
processors:
filter/include:
metrics:
include:
match_type: regexp
metric_names:
- ^http_requests_total$
exporters:
awsxray:
awsemf:
namespace: ECS/ContainerInsights/Prometheus
log_group_name: '/aws/ecs/containerinsights/{ClusterName}/prometheus'
dimension_rollup_option: NoDimensionRollup
metric_declarations:
- dimensions: [[ClusterName, ServiceName, TaskDefinitionFamily]]
metric_name_selectors:
- http_requests_total
service:
extensions:
- ecs_observer
- health_check
- sigv4auth
pipelines:
metrics:
receivers: [prometheus]
processors: [filter/include]
exporters: [awsemf]
traces:
receivers: [awsxray]
exporters: [awsxray]