Datadog Agent の豆知識

## はじめに
こんにちは、Datadog Japan で Sales Engineer をしている [**AoTo**](https://qiita.com/AoTo0330) です。

この投稿は **[<font color="#6495ED">AoTo Advent Calendar 2023</font>](https://qiita.com/advent-calendar/2023/aoto) 22日目**の記事です。

Datadog の中で Datadog Agent に触れていく中で知った豆知識を、ここでいくつか紹介していきます🐶

## Agent のプロセス
Datadog Agent を起動すると複数のプロセスが起動します。これは Datadog Agent で利用する機能やインテグレーションに依存しますが、以下の種類のプロセスが起動します。

 - **Agent**
 - **Trace Agent**
 - **Process Agent**
 - **Security Agent**
 - **System Probe**

基本的に Datadog Agent に関連するプロセスは、Linux, Windows の場合`dd-agent`や`ddagentuser` のような[非特権ユーザーとして実行](https://docs.datadoghq.com/ja/data_security/agent/#非特権ユーザーとして実行)されます。この他に、これらのプロセスは例外として`root`や`LOCAL_SYSTEM`で実行されます。

細かい挙動までは触れられませんが、それぞれ以下のような役割があります。

### Agent
いわゆる　**Datadog Agent** の主要な機能です。
主な役割は<INS>システム情報の収集とインフラストラクチャーメトリクスの記録、それらのデータの Datadog バックエンドへの送信</INS>です。

システム情報の収集は[`gohai`](https://github.com/DataDog/datadog-agent/tree/main/pkg/gohai)と呼ばれるツールを利用しており、[`facter`](https://github.com/puppetlabs/facter)と[`ohai`](https://github.com/chef/ohai)の機能の一部を実装する[`verity`](https://github.com/kentaro/verity)からフォーク(分岐)したものです。

### Trace Agent
トレースの監視情報を扱うエージェントです。
主な役割は、[アプリケーションの計装](https://docs.datadoghq.com/tracing/trace_collection/)によって生成されたトレースデータの収集・処理・送信です。<INS>トレース情報の収集とサンプリング、トレースの[難読化](https://docs.datadoghq.com/tracing/configure_data_security/?tab=net#trace-obfuscation)やタグに応じた処理を行い、Datadog バックエンドへの送信</INS>を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/4f0322cf-2804-109d-3883-0c194d3fae11.png)

### Process Agent
プロセスやコンテナの監視情報を扱うエージェントです。
主な役割は、[ライブプロセス](https://docs.datadoghq.com/ja/infrastructure/process/)や[コンテナモニタリング](https://docs.datadoghq.com/ja/containers/)で確認できる監視データの収集・処理・送信です。<INS>プロセスとコンテナの監視情報の記録と収集に加えて、`system-probe`による eBPF を利用した監視情報の取り込みを行い、Datadog バックエンドへの送信</INS>を行います。

### Security Agent
セキュリティに関連する脅威を扱うエージェントです。
主な役割は、[CSM Threats](https://docs.datadoghq.com/security/threats/) ので確認できる脅威データの収集・処理・送信です。<INS>[CSM Workload Security](https://docs.datadoghq.com/security/cloud_security_management/setup/csm_workload_security/) による記録と収集に加え、`system-probe`による eBPF を利用した脅威情報の取り込みと Datadog バックエンドへの送信</INS>です。

### System Probe
eBPF を利用した監視・脅威情報を扱うエージェントです。
主な役割は、[**Network Performance Monitoring(NPM)**](https://docs.datadoghq.com/ja/network_monitoring/performance/), [**Universal Service Monitoring(USM)**](https://docs.datadoghq.com/ja/universal_service_monitoring), [**Cloud Security Management(CSM) Workload Security**](https://docs.datadoghq.com/security/cloud_security_management/setup/csm_workload_security/) で確認できる監視・脅威データの収集・処理・送信です。

詳しい解説は先日の『[eBPF で SRE を始めよう！](https://qiita.com/AoTo0330/items/433e46ad6d78a86e07b8)』でも解説しています！

https://qiita.com/AoTo0330/items/433e46ad6d78a86e07b8#system-probe-エージェント

## Agent の通信
Datadog Agent に関わる通信の規則は、公式の[ネットワークトラフィック](https://docs.datadoghq.com/ja/agent/configuration/network/)ページで説明されています。ここで記載されている注意書きを見ていきましょう。

> Traffic is always initiated by the Agent to Datadog. No sessions are ever initiated from Datadog back to the Agent.

Datadog Agent と Datadog バックエンドの通信は全て Datadog Agent から開始されます。
現在では [**Datadog Fleet Automataion**](https://docs.datadoghq.com/ja/agent/fleet_automation/) の主要機能である [**Remote Configuration**](https://docs.datadoghq.com/agent/remote_config) のように、Datadog バックエンドで Datadog Agent の構成変更を行える機能がありますが、この場合でも <INS>Datadog Agent がアウトバウンドで構成情報をポーリングして反映をする</INS>アーキテクチャとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/d41c8aa9-47b1-da57-a31a-4079ec47fb51.png)

> All outbound traffic is sent over SSL through TCP or UDP.

Datadog Agent のアウトバウンド通信は TCP/UDP over SSL/TLS を利用して行われます。つまりデフォルトでは Agent による通信は暗号化された状態で行われます。また、直接アウトバウンド通信ができない場合でも、[プロキシを設定する](https://docs.datadoghq.com/ja/agent/configuration/proxy/)ことで Datadog Agent による監視を実装することが可能です。

https://docs.datadoghq.com/data_security/agent/#networking-and-proxying

## Agentの種類
Datadog Agent には監視する対象に対応した専用のエージェントが存在します。

 - [**Datadog Agent**](https://docs.datadoghq.com/ja/agent/basic_agent_usage/)
 - [**Datadog Docker Agent**](https://docs.datadoghq.com/containers/docker/)
 - [**Datadog Cluster Agent**](https://docs.datadoghq.com/containers/cluster_agent/)
 - [**Datadog Lambda Extension(Serverless Agent)**](https://docs.datadoghq.com/serverless/libraries_integrations/extension/)
 - [**Datadog IoT Agent**](https://docs.datadoghq.com/ja/agent/iot/)
 - [**Datadog `serverless-init` Agent**](https://hub.docker.com/r/datadog/serverless-init)

基本的に Datadog Agent の機能が中心となりますが、各監視対象に応じて一部の機能のみを実装したり軽量化を行った結果として、様々な種類のエージェントが用意されています。

### Datadog Agent
Datadog の基本的なエージェントです。**Linux, Windows, MacOS** の[様々なディストリビューションに対応](https://docs.datadoghq.com/agent/supported_platforms/)しており、1行のコマンドだけでインストールできます。

この1行のコマンドによるインストールを行うために、Amazon S3 上で OS に応じたスクリプトやインストーラーが公開されています。

 - Linux: `https://s3.amazonaws.com/dd-agent/scripts/install_script_agent7.sh`
 - Windows: `https://s3.amazonaws.com/ddagent-windows-stable/datadog-agent-7-latest.amd64.msi`
 - MacOS: `https://s3.amazonaws.com/dd-agent/scripts/install_mac_os.sh`

さらに、Datadog Agent はソースコードを指定して直接インストールを行うことが可能です。Datadog Agent のためのパッケージのビルド方法は [GitHub](https://github.com/DataDog/datadog-agent/blob/main/docs/dev/agent_omnibus.md) に公開されています。

### Datadog Docker Agent
Python3 インタプリタと Python チェックと共に Datadog Agent が含まれる Docker イメージです。厳密には一般的に Datadog Agent と同様の機能が含まれますが、軽量なコンテナとして動作するために Datadog の公式でイメージが [AWS Elactic Container Registry(ECR)](https://gallery.ecr.aws/datadog/agent), [Google Container Registry(GCR)](https://gcr.io/datadoghq), [Docker Hub](https://hub.docker.com/r/datadog/agent) に公開されています。

ちなみに、これらのイメージの元となる [`Dockerflie`](https://github.com/DataDog/datadog-agent/blob/main/Dockerfiles/agent/Dockerfile) も [`DataDog/datadog-agent`](https://github.com/DataDog/datadog-agent) リポジトリで公開されています。

### Datadog Cluster Agent
Kubernetes のクラスターを監視するための機能を備えた専用のエージェントです。API サーバーとノードベースの Datadog Agent のプロキシとして機能し、Kubbernetes クラスター内での負荷を軽減します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/e0c4de53-c13b-ccaa-3643-c9db3c929693.png)

### Datadog Lambda Extension
AWS Lambda 関数に用意されている拡張機能を利用して Datadog Agent をデプロイする特別なビルド方式です。Datadog は　[AWS Lambda 拡張機能パートナー](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/extensions-api-partners.html)に含まれており、これにより AWS から直接 Datadog Lambda Extension を指定して拡張機能を利用できます。

コールドスタートに多少のオーバーヘッドが発生しますが、継続的にパフォーマンスを最適化しているため、常に最新のリリースを使用することが推奨されています。

### Datadog IoT Agent
IoT デバイスや埋め込みアプリケーション用に最適化された軽量なエージェントです。Python インタープリターや標準 Agent のインテグレーションは含まれていません。様々なアーキテクチャに対応しており、x64, arm64(ARMv8), ARMv7 で実行中の Linux デバイスに DEB および RPM パッケージとして実装できます。

[**<font color="#632CA6">Datadog Advent Calendar 2023</font>**](https://qiita.com/advent-calendar/2023/datadog) でも IoT Agent について解説された素晴らしい記事があるので、こちらもご覧ください🐶

https://qiita.com/1Kano/items/993fb83a00fa77765d2c

### Datadog `serverless-init` Agent
マネージドコンテナに同梱するための専用の軽量エージェントです。現在は [**Azure Container Apps**](https://docs.datadoghq.com/serverless/azure_container_apps/) と [**Google Cloud Run**](https://docs.datadoghq.com/serverless/google_cloud_run/) での実装が公式にサポートされています。エージェントが持つ機能は[`serverless-init`](https://github.com/DataDog/datadog-agent/tree/main/cmd/serverless-init)で確認できます。

Datadog の公式でイメージは [AWS Elactic Container Registry(ECR)](https://gallery.ecr.aws/datadog/serverless-init), [Google Container Registry(GCR)](https://gcr.io/datadoghq/serverless-init), [Docker Hub](https://hub.docker.com/r/datadog/serverless-init) に公開されています。

`serverless-init`をコンテナに同梱すると、アプリケーションのメインプロセスをラップしてサブプロセスとして実行されます。そのため、`serverless-init`をエントリポイント(`ENTRYPOINT`)として設定するか、最初の引数(`CMD`)として設定する必要があります。

Azure Container Apps, Google Cloud Run は `Dockerfile` への記載の他に、[**Cloud Native Buildpacks**](https://buildpacks.io/) を利用することで既存の `Dockerfile` に手を加えることなく、さらには `Dockerfile` を作成せずに Datadog Agent をマネージドコンテナに実装することができます。

## Agent のバージョン
現在の Datadog Agent の最新のメジャーバージョンは v7 となっています。利用できる一番古いメジャーバージョンは v5 となっており、v6 になる際に Python から Golang による書き直しがされ Forwarder, Collector, DogstatsD が単一の Agent プロセスに統合されました。

メジャーバージョンの v6 から v7 への変更により、インテグレーションおよびカスタムチェック用の Python 3 のサポートのみが追加されています。

https://docs.datadoghq.com/ja/agent/versions/

Datadog としては Datadog Agent をマイナーリリースとパッチリリース毎、または少なくとも毎月更新することを推奨しています。Datadog Agent の最新リリースは [GitHub のリリース](https://github.com/DataDog/datadog-agent/releases)で最新の情報を確認できます。

バージョンアップの方法も公式にサポートされており、[v7 へのアップグレード](https://docs.datadoghq.com/ja/agent/versions/upgrade_to_agent_v7/)と [v6 へのアップグレード](https://docs.datadoghq.com/ja/agent/versions/upgrade_to_agent_v6/)や[マイナーバージョン間でのアップグレード](https://docs.datadoghq.com/ja/agent/versions/upgrade_between_agent_minor_versions)のガイドがあります。基本的に環境変数を利用でき、`DD_UPGRADE`や`DD_AGENT_MINOR_VERSION`を指定することで前述のインストールスクリプトを利用してアップグレードが可能です。

## Agent のライセンス
Datadog Agent が [GiHub のパブリックリポジトリ](https://github.com/DataDog/datadog-agent)で公開されている通り、ユーザー空間で実行されるコンポーネントは [Apache License 2.0](https://github.com/DataDog/datadog-agent/blob/main/LICENSE) に、BPF コードは [GNU General Public License 2.0](https://github.com/DataDog/datadog-agent/blob/main/pkg/ebpf/c/COPYING) に基づいてライセンスされています。このように Datadog Agent はオープンソースとして公開されており、ライセンスに基づいた自由な利用が可能です。

Datadog に含まれる様々な機能やプラットフォームへの互換性はもちろん完璧ではないため、バグや問題・仕様について提案・意見があれば [Contributing to Datadog Agent](https://github.com/DataDog/datadog-agent/blob/main/docs/dev/contributing.md) に基づいてコントリビュートをしていただくことが可能です。特に特定の issue で Datadog エンジニアリングチームとコンタクトを取ることで、問題が直接共有され Datadog としても問題解決に取り組みやすくなります。

ご興味があれば是非 issue を上げるところから貢献されてみてはいかがでしょうか🐶

## Agent のインテグレーション
Datadog は様々なデータソースから情報を収集する手段として、現在は[**750以上のインテグレーション**](https://docs.datadoghq.com/ja/integrations/)を提供しています。こうしたインテグレーションのうち、[エージェントベースのインテグレーション](https://docs.datadoghq.com/ja/getting_started/integrations/)は Datadog Agent とともにインストールされ、Python の `Check` メソッドにより収集するメトリクスが定義されます。

エージェントベースのインテグレーションは、基本的に`<INTEGRATIONS_NAME.d>/conf.yaml`ファイルによって設定可能で、インストール時のデフォルトで`<INTEGRATIONS_NAME.d>/conf.yaml.example`ファイルが用意されているため、設定できる項目やオプションをその中でも確認できます。

さらに、[Live Process 機能](https://docs.datadoghq.com/ja/infrastructure/process/)を有効化することで　[インテグレーションの自動検出](https://docs.datadoghq.com/ja/getting_started/integrations/#自動検出インテグレーション)を行い、何かしらの監視情報が取得できるインテグレーションを表示することができます。

## おわりに
Datadog Agent の技術的な裏側に興味のある方々向けに、**公式で公開されている**豆知識をまとめてみました。

Datadog Agent は多くの機能を備えており、その全体像を把握するのは難しいです。Observability によって実現したいこと、監視したい対象や情報や、現在の監視方法を再確認することで、Datadog Agent のどの機能を利用するべきかを考えて使いこなしていただければと思います🐶