🌊
Datadog-agentのメトリクスに動的タグの付与する方法
概要
- datadogを利用する機会がありまして、AWS ECS on Fargateにおいてのタスク定義、動的タグを付与する際に問題になった疑問点や対策を紹介します。
Datadog
事前準備
- AWSアカウント
- Datadogアカウント
- コンテナでのアプリケーション
- Datadog-agentの導入
AWS ECS タスク定義
タスク定義
datadog-agentのタスク定義を一部抜粋します
{
"executionRoleArn": "<aws_ecs_execution_task_role_arn>",
"containerDefinitions": [{
"image": "<dd_agent_image_ecr_url>:<image_tag>",
"name": "dd-agent",
"environment": [
{
"name": "DD_TAGS",
"value": "sha:<github_sha>"
},
{
"name": "DD_ENV",
"value": "dev"
},
{
"name": "DD_SERVICE",
"value": "java"
},
{
"name": "DD_VERSION",
"value": "1.0.0"
}
],
"secrets": [
{
"name": "DD_API_KEY",
"valueFrom": "<secretsmanager_id_arn>:dd_api_key::"
},
{
"name": "DD_SITE",
"valueFrom": "<secretsmanager_id_arn>:dd_site::"
}
],
"portMappings": [
{
"containerPort": 8126,
"hostPort": 8126,
"protocol": "tcp"
},
{
"containerPort": 8125,
"hostPort": 8125,
"protocol": "udp"
}
],
"healthCheck": [
{
"command": [
"CMD-SHELL",
"agent-health"
],
"timeout": 5,
"interval": 30,
"retries": 3,
"startPeriod": 15
}
],
"entryPoint": [
"sh",
"-c"
],
"command": [
"/opt/setup.sh"
]
}],
"family": "<ecs_family>",
"networkMode": "awsvpc",
"cpu": "512",
"memory": "1024",
"requiresCompatibilities": [
"FARGATE"
]
}
問題・対応策
- 事前にタスク定義により埋め込みをすることで、必要なパラメータを設定することができるが、コンテナのメタ情報などに関してはdatadog-agentが起動する前に設定を追加する必要があります。そのため、サイドカーに設定されているdatadog-agentの起動スクリプト内でコンテナ内のメタ情報を取得してタグに設定し、起動する必要があります。
独自のイメージ作成/動的タグを付与する起動スクリプト
- agentイメージファイルを取り込んで起動スクリプトで起動するイメージを作成します
#バージョン番号は任意に変更
FROM datadog/agent:7.50.1
#パッケージをupdateおよびインストール
RUN apt-get update -y && \
apt-get install unzip jq -y
#動的タグを付与するためにawscliをインストール
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && \
./aws/install && \
rm -f awscliv2.zip
#起動スクリプトを設置
COPY setup.sh /opt/setup.sh
RUN chmod 755 /opt/setup.sh
# パッケージアップデートキャッシュを削除
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/*
#ポートを開放
EXPOSE 8125/udp 8126/tcp
- Fargate起動時を上書きで起動するため、起動用スクリプトにてDD_TAGSを書き換えます
#!/bin/bash
# 例えば,DD_TAGSにCPUモデルを追加したい場合(awsの命名規則ルールに対応するため)
CPU_MODEL=$(lscpu --json | jq -r '.lscpu[] | select(.field == "Model name:")' | jq -r .data | sed -e 's/ /_/g' | sed -e "s/(\(.\))/_\1/g" | tr '[:upper:]' '[:lower:]')
DD_TAGS="$DD_TAGS model:$CPU_MODEL"
#タグをECSサービスに追加
aws ecs tag-resource --resource-arn "<ecs_service_arn>" --tags key=DD_TAGS,value=$DD_TAGS
/usr/bin/entrypoint.sh
#daemon start
supervisord -n -c /etc/dd-agent/supervisor.conf
メトリクス
- 上記で設定したタグ名で絞り込みを行い、モデルごとのCPU使用率を確認します
まとめ
- タグを動的に設定することで、コード変更された際のパフォーマンスを変化を監視することが可能になります。
- ECS on Fargateでは複数のCPUモデルが存在しているため、その時々でのモデルでのパフォーマンスを監視することも可能になります。
- また上記以外にも様々なタグを設定することも可能ですので、是非設定してみてください
Discussion