🐶
ECS Fargateのサイドカーとして動作するDatadog Agentがメトリクスを収集しない場合の対応策
はじめに
最近仕事でDatadog Agentと戯れていたのですが、意図通りにAgentがメトリクスを送信してくれない現象に直面し、少しハマってしまったため備忘録として残しておきます。
この記事の対象者
ECS Fargate上のアプリケーションコンテナのサイドカーとしてDatadog Agentを動かしている方で、次のような状況に陥っている方。
- アプリケーションからメトリクスを送信するコードを書いているにも関わらず、Datadogに反映されないメトリクスが存在する
- アプリケーションやDatadog Agentのログを確認しても目立ったエラーが見当たらず、手詰まりになっている
この記事で話すこと
- Datadog Agentが完全に起動する前にメトリクスを送信している可能性があります
- コンテナの起動に対して依存性を持たせてあげることで解決できるかもしれません
対応策
やることはシンプルで、サイドカーコンテナのAgentが完全に立ち上がってからアプリケーションコンテナを起動するように設定してあげます。
というのも、Agentが起動する前にアプリケーションが動いてメトリクスを送信しており、Agentがそれを検知できていない可能性があるためです。
以下、上記の設定をcdkで行う例です。
...
const taskDef = new ecs.TaskDefinition(...);
const applicationContainerDef = taskDef.addContainer(...);
const datadogContainerDef = taskDef.addContainer(
...
// (1)
healthCheck: {
command: ["CMD-SHELL", "agent health"],
startPeriod: cdk.Duration.seconds(15)
interval: cdk.Duration.seconds(30),
timeout: core.Duration.seconds(5),
retries: 3,
},
...
);
// (2)
applicationContainerDef.addContainerDependencies({
container: datadogContainerDef,
condition: ecs.ContainerDependency.HEALTHY,
});
taskDef.defaultContainer = applicationContainerDef;
...
簡潔に説明します
(1)では、サイドカーコンテナのヘルスチェック設定を追加しています。これにより、コンテナ上で動作するDatadog Agentが正常に稼働しているかどうかを定期的にチェックするようになります。
続いて(2)では、アプリケーションコンテナの起動に対して依存を追加しています。この設定により、サイドカーコンテナ上で動くDatadog Agentのhealth checkに問題が生じないことが分かってから、アプリケーションコンテナが起動するようになります。
これにより、Datadog Agentが起動しきる前にメトリクスを送信してしまうという現象を防ぐことが出来ます。
Discussion