🐳

Datadog Agent にコミュニティインテグレーションをカスタムイメージで導入する

2024/07/03に公開

前提条件

本記事では、Puma コミュニティインテグレーションを例に、カスタムイメージを利用したコミュニティインテグレーションのインストール方法について解説します。
全てのコミュニティインテグレーションに対応した汎用的な内容になっていると思いますが、参考にする場合は必要に応じて適宜読み替えてください。

また、以下のバージョンを前提としています。

  • EKS(EC2) 1.28
    • Cluster Autoscaler 1.28.2
    • Horizontal Pod Autoscaler
  • Datadog
    • Helm マニフェスト 3.59.6
    • Datadog Agent 7.52.1

コミュニティインテグレーションを使うことになった経緯

弊社では、Rails のアプリケーションサーバーとして Puma を利用しており、 Puma Pod の CPU使用率を指標として Horizontal Pod Autoscaler でオートスケール行っています。
しかし、 Puma の CPU 使用率はそこまで高くないのに応答が返ってこないケースが時々発生することから、Puma の残スレッド数を基にオートスケールさせた方が良いのではないかと考えました。そこで、スレッド数なども取得できるDatadog の Puma コミュニティインテグレーションの導入をすることになりました。

インテグレーションとは

Datadog をさまざまなツールやサービスと連携させて、モニタリングやアラートを一元管理する仕組みのことです。
具体的にはデータ収集(メトリクス、ログ、トレースなど)を機能として提供します。
Datadog公式によると、現在750以上の組み込みインテグレーションが提供されているようです。

すべてのシステム、アプリケーション、サービスの横断的な監視を実現します。Datadog が提供する 750 以上の組み込みインテグレーションをご活用ください。

コミュニティインテグレーションとは

Datadog Agent のコミュニティ開発のインテグレーションのことで、Datadog Agent にはパッケージ化されていませんが、アドオンとしてインストール可能です。
コミュニティインテグレーションは Datadog の Integrations-extra GitHub リポジトリに格納されています。

導入方法

Datadog の Puma インテグレーションのドキュメントを見ると、

Agent v7.21 / v6.21 以降の場合は、下記の手順に従い Puma チェックをホストにインストールします。Docker Agent または 上記バージョン以前の Agent でインストールする場合は、コミュニティインテグレーションの使用をご参照ください。
以下のコマンドを実行して、Agent インテグレーションをインストールします。

datadog-agent integration install -t datadog-puma==<INTEGRATION_VERSION>

のように記載されていますが、弊社では Datadog Agent を Helm でインストールしていることと、Argo CD で GitOps を実現していることから上記の方法はマッチしませんでした。

また、Datadog Agent の Helm Value にもコミュニティインテグレーションをインストールするための値は用意されていません。
charts/datadog/values.yaml

コミュニティインテグレーションを value からインストール出来るようにして欲しいという内容の Issue が上がっているので、需要はありそうですが現時点では実装はされていないようです。
Allow for installation of extra integrations at startup

そこで、タイトル通り Datadog Agent のカスタムイメージを作成し対応することにしました。
カスタムイメージの作成方法は、コミュニティインテグレーションを使用するの Docker での手順を参考にします。

カスタムイメージ作成

まず、コミュニティインテグレーション入りのカスタムイメージを作成します。
今回は ECR にある Datadog Agent の Image をベースにします。
他にも Docker Hub と GCR に対応しているようです

今回は ECR のプライベートレジストリに datadog-agent-extension という名前でリポジトリを作成し、そこに 7.52.1 というタグをつけてカスタムイメージを設置する想定で進めます。
カスタムイメージのタグは中身が分かりやすいように Datadog Agent の Version(7.52.1) に揃えています。

カスタムイメージのための Dockerfile を作成し

Dockerfile
# Base となる Datadog Agent の Image
FROM public.ecr.aws/datadog/agent:7.52.1
# インストールしたいコミュニティインテグレーションのインストールコマンドを記載する
RUN agent integration install -r -t datadog-puma==1.2.1

build します

# パブリック ECR にログイン
$ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
# イメージの build (--platform の後に指定する値は Datadog Agent が動作するサーバーの CPUアーキテクチャに合わせて変更してください)
$ docker build -t datadog-agent-extension:7.52.1 . --platform amd64

次の手順に進む前に ECR のプライベートレジストリに datadog-agent-extension リポジトリを作成しておいてください(操作手順のスクリーンショットなどは省く)。

カスタムイメージへのタグ付けからから ECR への Push までは以下のような手順で行います(AWSのアカウントIDは各自の環境に応じてよしなに対応してください)。

# イメージのタグ付け
$ docker tag datadog-agent-extension:7.52.1 ${aws_account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/datadog-agent-extension:7.52.1
# プライベート ECR にログイン
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${aws_account_id}.dkr.ecr.ap-northeast-1.amazonaws.com
# プライベート ECR に Push
$ docker push ${aws_account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/datadog-agent-extension:7.52.1

カスタムイメージをHelmで利用する

Datadog Agent の values.yaml に下記設定を加えることで、Datadog Agent のカスタムイメージを起動させることができます。

values.yaml
agents:
  image:
    repository: ${aws_account_id}.dkr.ecr.ap-northeast-1.amazonaws.com/datadog-agent-extension
    tag: 7.52.1

コミュニティインテグレーションがインストールされたかどうかは以下コマンドで確認できます。

# Datadog Agent コンテナに接続
$ kubectl -n monitoring exec -it datadog-4bzm6 -c agent -- bash
root@datadog-4bzm6:/# agent integration show datadog-puma
Package datadog-puma:
Installed version: 1.2.1

agents.image.tag を Datadog Agent の Version 以外にしたい場合

実は agents.image.tag にどんな値を入れても良いというわけではありません。
Datadog Agent の Varsion 番号以外の値を入れた場合、charts/datadog/templates/_helpers.tpl での Version Check 処理で弾かれます。
この Version Check 処理は Datadog Helm マニフェストの Version に対して、Datadog Agent の Version が適切か判断しています。
回避策としては agents.image.doNotCheckTag: true にすれば OK です。
とはいえ、Datadog Agent の Version 以外にすると混乱しそうなので、 個人的には Datadog Agent の Version にすることをお勧めします。

まとめ

  • 現状、コミュニティインテグレーションの導入は Datadog Agent の Helm value で対応していない
    • CLI でのインストールのみ対応
  • Datadog Agent の Helm Value から Datadog Agent として利用するイメージを変更することが可能
    • コミュニティインテグレーション入りのカスタムイメージを Helm Value に指定することで、コミュニティインテグレーションを導入することができる
SocialPLUS Tech Blog

Discussion