Apache APISIX での Datadog を使った Cloud Monitoring
API7.ai
November 12, 2021
IT製品や消費者向けアプリケーション開発の複雑さが増すにつれ、監視はアプリケーション提供の不可欠な部分となっています。さらに、安定性を確保しつつ迅速なアップグレードサイクルの需要に応え、効率的なパフォーマンスを維持し、サービスレベル指標(SLI)とサービスレベル目標(SLO)、サービスレベル契約(SLA)の完璧なバランスを保つためには、効果的な監視が非常に重要です。
クラウドAPI管理製品であるApache APISIXは、アプリケーションから監視の懸念を切り離し、開発者がビジネスロジックに集中してアプリケーションを構築できるようにします。Apache APISIXは、選択したプラットフォームの監視を担当します。
Apache APISIXは最近、Datadogとのより深い統合を提供する新しいプラグインAPISIX-Datadogをリリースしました。この記事では、APISIX-Datadogプラグインとその機能を紹介します。
APISIX-Datadogプラグインの仕組み
APISIX-Datadogプラグインは、カスタムメトリクスをDogStatsDサーバーにプッシュし、DatadogエージェントとUDP接続を介してバンドルされています。DogStatsDは基本的にStatsDプロトコルの実装です。Apache APISIXエージェントのカスタムメトリクスを収集し、単一のデータポイントに集約して、設定されたDatadogサーバーに送信します。DogStatsDの詳細については、DogStatsDドキュメントをご覧ください。
APISIX-Datadogが有効になると、Apache APISIXエージェントは各リクエスト応答サイクルに対して以下のメトリクスをDogStatsDサーバーにエクスポートします:
メトリクス名 | StatsDタイプ | 説明 |
---|---|---|
リクエストカウンター | カウンター | 受信したリクエストの数。 |
リクエストレイテンシ | ヒストグラム | リクエストを処理するのにかかった時間(ミリ秒単位)。 |
アップストリームレイテンシ | ヒストグラム | リクエストをアップストリームサーバーにプロキシしてから応答を受信するまでの時間(ミリ秒単位)。 |
APISIXレイテンシ | ヒストグラム | APISIXエージェントがリクエストを処理するのにかかった時間(ミリ秒単位)。 |
イングレスサイズ | タイマー | リクエストボディのサイズ(バイト単位)。 |
エグレスサイズ | タイマー | レスポンスボディのサイズ(バイト単位)。 |
これらのメトリクスは以下のタグとともにDogStatsDエージェントに送信されます。特定のタグに適切な値がない場合、そのタグは単に省略されます。
メトリクス名 | 説明 |
---|---|
route_name | ルートスキーマ定義で指定された名前。存在しない場合、ルートID値にフォールバックします。 |
service_id | サービスを抽象化してルートが作成されている場合、特定のサービスIDが使用されます。 |
consumer | ルートにリンクされたコンシューマーがある場合、コンシューマーのユーザー名がタグとして追加されます。 |
balancer_ip | 現在のリクエストを処理したアップストリームバランサーのIP。 |
response_status | HTTPレスポンスステータスコード。 |
scheme | リクエストに使用されたスキーム(HTTP、gRPC、gRPCsなど)。 |
プラグインはタイマー付きのバッファを保持します。タイマーが切れると、APISIX-Datadogプラグインはバッファされたメトリクスをバッチとしてローカルで実行されているdogstatsdサーバーにフラッシュします。このアプローチは、同じUDPソケットを再利用するためリソースをあまり消費せず(UDPソケットは非常に軽量であるため、影響は小さいかもしれませんが)、タイマーを設定できるため常にネットワークに負荷をかけません。
Datadogエージェントの実行手順
- 既にインフラストラクチャ内でDatadogを使用している場合、システムにDatadogエージェントがインストールされているはずです。Dockerコンテナ、Pod、またはパッケージマネージャーのバイナリのいずれかである可能性があります。この場合、準備は完了しています。ファイアウォール(もしあれば)でポート8125/udpが許可されていることを確認してください。具体的には、Apache APISIXエージェントがDatadogエージェントのポート8125に到達できることを確認してください。このサブセクションはスキップできます。
完全なDatadogエージェントのインストール方法については、こちらをご覧ください。
- Datadogを初めて使用する場合
- まず、www.datadoghq.comにアクセスしてアカウントを作成します。
- APIキーを生成します。
- APISIX-Datadogプラグインは、
datadog/agent
のdogstatsdコンポーネントのみを必要とします。プラグインは、statsdプロトコルに従って標準のUDPソケットを介してdogstatsdサーバーに非同期でメトリクスを送信します。そのため、APISIXは完全なエージェントではなく、スタンドアロンのdatadog/dogstatsd
イメージを使用することを推奨しています。これは非常に軽量(約11MB)で、datadog/agent
イメージの約2.8GBと比較して非常に小さいです。
コンテナとして実行するには:
# 最新のイメージをプル
docker pull datadog/dogstatsd:latest
# デタッチドコンテナを実行
docker run -d --name dogstatsd-agent -e DD_API_KEY=<ステップ2で取得したAPIキー> -p 8125:8125/udp datadog/dogstatsd
本番環境でKubernetesを使用している場合、dogstatsd
をDaemonset
またはApache APISIXエージェントと並行してMulti-Container Pod
としてデプロイできます。
Apache APISIXでDatadogを使用する方法
APISIX-Datadogプラグインの有効化
以下は、特定のルートに対してdatadogプラグインを有効にする方法の例です。dogstatsd
エージェントが既に起動していることを前提としています。
# 特定のルートに対してプラグインを有効化
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"datadog": {}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
},
"uri": "/hello"
}'
これで、エンドポイントURI /hello
へのリクエストは上記のメトリクスを生成し、DatadogエージェントのローカルDogStatsDサーバーにプッシュします。
カスタム設定
デフォルト設定では、プラグインはdogstatsdサービスが127.0.0.1:8125
で利用可能であることを期待します。設定を更新したい場合は、プラグインメタデータを更新してください:
メタデータスキーマ
名前 | タイプ | 必須 | デフォルト | 説明 |
---|---|---|---|---|
hosts | 文字列 | オプション | "127.0.0.1" | DogStatsDサーバーのホストアドレス |
port | 整数 | オプション | 8125 | DogStatsDサーバーのホストポート |
namespace | 文字列 | オプション | "apisix" | APISIXエージェントが送信するすべてのカスタムメトリクスのプレフィックス。メトリクスグラフのエンティティを見つけるのに便利です。例: (apisix.request.counter) |
constant_tags | 配列 | オプション | ["source"] | 生成されたメトリクスに埋め込まれる静的タグ。特定のシグナルに基づいてメトリクスをグループ化するのに便利です。 |
タグを効果的に記述する方法の詳細については、こちらをご覧ください。
更新されたメタデータを以下のように/apisix/admin/plugin_metadata
エンドポイントにリクエストします:
curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/datadog -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"host": "127.0.0.1",
"port": 8125,
"constant_tags": [
"source:apisix",
"service:custom"
],
"namespace": "apisix"
}'
プラグインスキーマ
同様に、プラグインを有効にする際にいくつかの属性を調整できます。
名前 | タイプ | 必須 | デフォルト | 有効値 | 説明 |
---|---|---|---|---|---|
batch_max_size | 整数 | オプション | 5000 | [1,...] | 各バッチの最大バッファサイズ |
inactive_timeout | 整数 | オプション | 5 | [1,...] | バッファが非アクティブの場合にフラッシュされる最大年齢(秒単位) |
buffer_duration | 整数 | オプション | 60 | [1,...] | バッチ内の最も古いエントリの最大年齢(秒単位)バッチが処理される前に |
max_retry_count | 整数 | オプション | 1 | [1,...] | エントリがdogstatsdサーバーに到達できない場合の最大リトライ回数 |
すべてのフィールドはオプションであり、属性が設定されていない場合、datadogプラグインはデフォルト値でインスタンス化されます。任意の属性を更新するには、必要なルート、サービス、またはコンシューマーを更新された属性値で更新します。例えば、以下のコードは各バッチの最大バッファサイズを変更します:
'{
...
"plugins": {
"datadog": {
"batch_max_size": 10
}
}
... }'
APISIX-Datadogプラグインの無効化
プラグインを無効にするには、プラグイン設定から対応するJSON設定を削除してdatadog
を無効にします。APISIXプラグインはホットリロードされるため、APISIXを再起動する必要はありません。
# ルートのプラグインを無効化
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/hello",
"plugins": {},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'