eBPF で SRE を始めよう！

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

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

2023/12/19に O’Reilly Japan から『[入門 eBPF](https://www.oreilly.co.jp/books/9784814400560/)』の邦訳が発売されましたが、皆さんはもう手に入れましたか？私は手に入れました！

https://www.oreilly.co.jp/books/9784814400560/

そんな eBPF に入門中の私ですが、Observability にも欠かせない技術となっている eBPF によって SRE を簡単に始めることができると知り、その概要と活用方法を紹介しようと思いました。

今回は Datadog Agent の一部であり、eBPF を利用した [`system-probe`](https://pkg.go.dev/github.com/DataDog/datadog-agent/cmd/system-probe) エージェントの機能から、[**Universal Service Monitoring(USM)**](https://docs.datadoghq.com/ja/universal_service_monitoring) のソリューションについてまとめています。

## `system-probe` エージェント
Datadog は L4-L7 ネットワークのモニタリングソリューションとして [`system-probe`](https://pkg.go.dev/github.com/DataDog/datadog-agent/cmd/system-probe) を提供し始めました。当初は [**Network Performance Monitoring**](https://docs.datadoghq.com/ja/network_monitoring/performance/) 用の機能のみを備えていましたが、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/)[^1]
 - [**Data Streams Monitoring(DSM)**](https://docs.datadoghq.com/ja/data_streams/)
 - [Dynamic Instrumentation](https://docs.datadoghq.com/ja/dynamic_instrumentation/)
 - [OOM Kill Check](https://docs.datadoghq.com/ja/integrations/oom_kill/)
 - [TCP Queue Length Check](https://docs.datadoghq.com/ja/integrations/tcp_queue_length/)
 - [Processes Check](https://docs.datadoghq.com/integrations/process/)
 [^1]: Cloud Workload Security(CWS) と言う名称から変更されました。一部のドキュメント・UI・コードの中に名称が残っている場合があります。

 [`system-probe`](https://pkg.go.dev/github.com/DataDog/datadog-agent/cmd/system-probe) エージェントは Datadog Agent(v6/7以上) と同様に Go 言語で書かれており、設定により必要となると Datadog Agent から起動され独自のプロセスとして実行されます。上記の機能を有効化しない限り動かないため、有効化されると[`system_probe.py`](https://github.com/DataDog/datadog-agent/blob/main/tasks/system_probe.py)によって自動ビルドされる形で Datadog Agent コンポーネントに含まれています。

 Datadog はセキュリティ上の理由から、この `system-probe` が起動する際に最小限の権限を与えるように設計し、監視データを収集する際は Datadog Agent を介して Datadog のバックエンドに送信されます。`system-probe` そのものではありませんが、Datadog が想定する eBPF の監視ソリューションへの活用方法は以下のブログからもある程度読み取ることができます。[^2]
[^2]: このブログのコードは [Pixie Lab](https://px.dev/) からインスピレーションを得て作成されています。

 https://www.datadoghq.com/ja/blog/ebpf-guide/

 Datadog は2022年に HTTP セッションの監視を応用して、eBPF によってアプリケーショントラフィックの監視を行う [**Universal Service Monitoring(USM)**](https://docs.datadoghq.com/ja/universal_service_monitoring) を**一般提供(GA)** しました。Datadog USM によって、アプリケーションレベルのトラフィックを監視するだけで、インフラストラクチャ内で実行されているすべてのサービスを検出できるようになっています。

 ## USM をはじめる
前述の通り eBPF を活用してアプリケーショントラフックを監視するソリューションである [**Universal Service Monitoring(USM)**](https://docs.datadoghq.com/ja/universal_service_monitoring) は、その技術背景から当初は Linux での利用に限られていました。現在は Windows IIS など様々な技術を利用することで、以下のバージョンと互換性要件で提供されています。

| 互換性 | バージョン |
| -- | -- |
| Datadog Agent | 6.40, 7.40 以上 |
| OS | Linux Kernel 4.14 以上 <br>CentOS, RHEL 8.0 以上 <br>Windows 2012 R2 以降の IIS |
| L7 プロトコル | HTTP, HTTPS(OpenSSL) |

有効化の方法は単純で、`system-probe.yaml`ファイルに下記の設定を追加するか、それに準ずる形で環境変数`DD_SYSTEM_PROBE_SERVICE_MONITORING_ENABLED`に`true`を渡したりすることで有効化できます。

```system-probe.yaml
service_monitoring_config:
  enabled: true
```

これにより先ほどの通り、`system-probe`が準備され、別プロセスとして eBPF を用いた HTTP セッションの監視が行われます。アプリケーションサービスとその依存関係は自動的に検出され、[**Service Catalog**](https://docs.datadoghq.com/ja/tracing/service_catalog/) にマッピングされます。

## USM メトリクスの活用
`system-probe`エージェントによって自動検出されたアプリケーションサービスは、Datadog Agent によって[自動的にタグ付け](https://docs.datadoghq.com/ja/universal_service_monitoring/#自動サービスタグ付け)されます。

USM によって生成される以下のメトリクスも、統合サービスタグ付けの恩恵を受けてタグが付与された状態で Datadog 上で可視化できます。

| メトリクス名 | 単位 | タイプ | 説明 |
| -- | -- | -- | -- | 
| universal.http.client | 秒 | Distribution | アウトバウンドリクエストのレイテンシー、カウント、エラー、およびレート |
| universal.http.client.hits | Hits | カウント | アウトバウンドリクエストとエラーの合計数 |
| universal.http.client.apdex | スコア | Gauge | アウトバウンドリクエストの Apdex スコア |
| universal.http.server | 秒 | Distribution | インバウンドリクエストのレイテンシー、カウント、エラー、およびレート |
| universal.http.server.hits | Hits | カウント | インバウンドリクエストとエラーの合計数 |
| universal.http.server.apdex | スコア | Gauge | この Web サービスの Apdex スコア |

また、エラーに関するメトリクス名は上記に共通しており、`error:true`タグが付与されます。APM とメトリクス名は異なり、`universal.http.client.*`か`universal.http.server.*`のように命名されそれぞれアウトバウンドとインバウンドのトラフィックに基づくメトリクスを提供しています。

これらのメトリクスはデフォルトで、[Service Page](https://docs.datadoghq.com/ja/tracing/services/service_page/) の Service Summary に表示され、リクエスト・エラー・レイテンシーの指標を可視化できます。

![USM_ServiceSummary.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/526d645f-2042-aa37-775b-23a670809616.jpeg)

## USM で SRE を始める
このように USM は SRE で重要とされる、<INS>システムの健全性を示す指標である４つの**ゴールデンシグナル**のうち、**R.E.D メトリクス** の3つが自動的に可視化</INS>されます。飽和度を表すメトリクスはサービスのインフラストラクチャメトリクスから確認でき、USM で可視化された各メトリクスと同一のタグを持っているため、すぐに確認ができます。

 - **レイテンシ** - リクエスト処理時間
 - **トラフィック** - リクエスト量
 - **エラー** - リクエスト失敗率
 - **飽和度** - リソース使用率

USM のこれらの指標は、[**Datadog Monitor**](https://docs.datadoghq.com/ja/monitors/) と [**SLOs**](https://docs.datadoghq.com/ja/service_management/service_level_objectives/) を利用して SRE の主目的である信頼性の指標を可視化することができます。

SRE の概念や各用語については、ちょうど今日素晴らしい記事が PagerDuty さんから出ていたので是非ご一読ください！

https://www.pagerduty.co.jp/blog/what-is-sre/

[**APM Monitor**](https://docs.datadoghq.com/ja/monitors/types/apm/?tab=apmmetrics) は Monitor の機能の一つですが、USM のメトリクスを含むアプリケーションメトリクスを Service Level Indicator(SLI) にの元の指標に定めて、閾値・異常検知で状態を監視することができます。

APM Monitor でメトリクスを選択し、閾値の値やその時間範囲あたりでの達成率を決めることで、Service Level Objective を定めることが出来ます。[Monitor-based SLOs](https://docs.datadoghq.com/service_management/service_level_objectives/monitor/) はここで設定したサービスのモニターの正常な動作を示した時間を掃除間で割ることで SLI と SLO が計算され定義できます。

他にも [Time Slice SLOs](https://docs.datadoghq.com/ja/service_management/service_level_objectives/time_slice/)を利用することで、95パーセンタイルのレイテンシーが1秒未満である時を正常な稼働時間として SLI を定義をして、SLO を定めることもできます。

このように、Datadog Agent の設定を1つ有効化するだけで、SRE を始める上では欠かせない指標が Datadog 上で自動的に可視化され、サービスの特性に応じてゴールデンシグナルから SLI, SLO を定めて実践を行うことが可能です。

## おわりに
eBPF を活用したソリューションはアプリケーショントラフィックの監視だけではなく、もちろんネットワークトラフィックの可視化や脅威の検出やセキュリティの強化、動的なアプリケーションコンテキストのトレースのように幅広い用途で活用することが可能です。

今回ご紹介した [**Datadog Universal Service Monitoring(USM)**](https://docs.datadoghq.com/ja/universal_service_monitoring) はその中でも特に設定が簡単で有用な Observability データを取得できるソリューションです。

SRE を始めるにあたって、アプリケーションの指標を取得したいが実働環境への組み込むことが難しい場合や、商用パッケージアプリケーション(COTS: Commercial Off-The-Shelf Software)の可視化にも取り組みたいという場合には、USM をご検討ください！

以上、「eBPF を完全に理解した」[**AoTo**](https://qiita.com/AoTo0330)でした🐶