こんにちは!マイクロサービスの海原を航海するエンジニアの皆さん、日々の運用お疲れ様です。
Java、Go、Python、Node.js、さらにはRustやC++まで……。組織が成長し、システムがモダンになるにつれ、気がつけば社内は「多言語の要塞(マイクロサービス)」と化していませんか?
障害が起きたとき、「どのサービスが、どのサービスを叩いて沈黙しているのか」を突き止めるために、各言語のエージェントを入れて、コードを書き換えて、ビルドし直して……と奔走した苦い経験、きっとあなたにもあるはずです。
今回は、そんな地獄のような依存関係の迷宮から私たちを解放してくれる、Datadogの奥義「Universal Service Monitoring(以下、USM)」について、徹底的に解説していきます。
これをマスターすれば、コードを1行も触ることなく、OSの深層からサービス間の通信が丸裸になります。毎日の障害調査やアーキテクチャの把握が劇的に楽になりますよ。さあ、一緒に扉を開けていきましょう!
—
1. そもそもUSM(Universal Service Monitoring)とは何か?
従来のAPM(Application Performance Monitoring)は、非常に強力でした。しかし、そこには一つの「宿命」がありました。それは「言語ごとのエージェントをアプリケーションコードやランタイムに組み込む必要がある」ということです。
- Javaなら `-javaagent` を仕込み、
- Pythonならコード内でライブラリを初期化し、
- 新しくマイナーな言語で作られたサービスがあれば、対応エージェントがないと途方に暮れる。
これでは開発チームに負担がかかりますし、サードパーティ製のブラックボックスなバイナリや、レガシーなシステムは監視の網から零れ落ちてしまいます。
APMとUSMの決定的な違い
| 比較項目 | 従来のAPM | Universal Service Monitoring (USM) |
| :— | :— | :— |
| 監視の仕組み | アプリケーションコード内にSDK/エージェントを埋め込む | Linuxカーネル空間(eBPF)でネットワークパケットを盗聴・解析 |
| 対象言語 | エージェントがサポートする言語のみ | 言語非依存(C++, Go, Java, Rust, 自家製スクリプト何でもOK) |
| コード変更 | 必要(再ビルドやデプロイが必要な場合も) | 不要(コードは1文字も変えない) |
| 取得できる情報 | コードレベルの詳細なプロファイル、例外スタックトレース | サービス間の通信レイテンシ、スループット、エラー率、HTTP/gRPCのステータス |
そう、USMの正体は、Linuxカーネルの機能であるeBPF(Extended Berkeley Packet Filter)の力を借りて、OSのネットワークレイヤーから直接トラフィックをキャプチャし、「どのサービスとどのサービスが通信しているか」を自動でマッピングする技術です。
アプリケーションが何語で書かれていよう関係ありません。TCP/UDPのパケットが流れ、HTTPやgRPCなどのプロトコルが解釈できれば、Datadogが勝手に「サービス」として認識してくれます。
—
2. 導入の前提条件とセットアップの全体像
「eBPFとかカーネルとか、なんだか難しそう……」と思いましたか?
大丈夫、安心してください。現代のDatadog Agentは、この複雑な仕組みを驚くほどシンプルにパッケージングしてくれています。
必要な前提条件
1. Linuxカーネルバージョン: `4.14` 以上(eBPFの機能要件を満たすもの。最近のモダンなLinuxディストリビューションなら大抵クリアしています)
2. Datadog Agent: バージョン `7.35.0` 以上
3. 権限: カーネルプローブ(kprobes)やソケットフィルタをアタッチするための権限(通常はコンテナであれば特権コンテナ、あるいは適切なCAP_SYS_ADMINなどのケイパビリティ)
—
3. 実践!コード書き換えゼロのUSMセットアップ手順
それでは、実際にKubernetes環境(あるいはLinuxホスト)にUSMを導入する手順を見ていきましょう。今回は最も一般的なKubernetes(Helmチャート)をベースに解説します。
Step 1: Datadog AgentのHelm設定を書き換える
Datadog AgentのHelm値(`values.yaml`)で、System ProbeとeBPF、そしてUSMの機能を有効化します。これが魔法のスイッチです。
datadog-values.yaml
datadog:
apiKey: “
site: “datadoghq.com” # 契約しているリージョンに合わせて変更
# デフォルトのAPM(トレーシング)に加えて、システムプローブを有効化
apm:
enabled: true
# eBPFを利用する機能群の親設定
systemProbe:
enabled: true
# USM(Universal Service Monitoring)を有効化
serviceMonitoring:
enabled: true
Network Performance Monitoring (NPM) も併用するとシナジーが高いので推奨
agents:
enabled: true
containers:
systemProbe:
securityContext:
capabilities:
add:
- SYS_ADMIN
- SYS_RESOURCE
- NET_ADMIN
- NET_BROADCAST
- NET_RAW
- IPC_LOCK