Apache APISIX での Datadog を使った Cloud Monitoring

API7.ai

November 12, 2021

Ecosystem

カバー画像

IT製品や消費者向けアプリケーション開発の複雑さが増すにつれ、監視はアプリケーション提供の不可欠な部分となっています。さらに、安定性を確保しつつ迅速なアップグレードサイクルの需要に応え、効率的なパフォーマンスを維持し、サービスレベル指標(SLI)とサービスレベル目標(SLO)、サービスレベル契約(SLA)の完璧なバランスを保つためには、効果的な監視が非常に重要です。

クラウドAPI管理製品であるApache APISIXは、アプリケーションから監視の懸念を切り離し、開発者がビジネスロジックに集中してアプリケーションを構築できるようにします。Apache APISIXは、選択したプラットフォームの監視を担当します。

Apache APISIXは最近、Datadogとのより深い統合を提供する新しいプラグイン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_statusHTTPレスポンスステータスコード。
schemeリクエストに使用されたスキーム(HTTP、gRPC、gRPCsなど)。

プラグインはタイマー付きのバッファを保持します。タイマーが切れると、APISIX-Datadogプラグインはバッファされたメトリクスをバッチとしてローカルで実行されているdogstatsdサーバーにフラッシュします。このアプローチは、同じUDPソケットを再利用するためリソースをあまり消費せず(UDPソケットは非常に軽量であるため、影響は小さいかもしれませんが)、タイマーを設定できるため常にネットワークに負荷をかけません。

Datadogエージェントの実行手順

  1. 既にインフラストラクチャ内でDatadogを使用している場合、システムにDatadogエージェントがインストールされているはずです。Dockerコンテナ、Pod、またはパッケージマネージャーのバイナリのいずれかである可能性があります。この場合、準備は完了しています。ファイアウォール(もしあれば)でポート8125/udpが許可されていることを確認してください。具体的には、Apache APISIXエージェントがDatadogエージェントのポート8125に到達できることを確認してください。このサブセクションはスキップできます。

完全なDatadogエージェントのインストール方法については、こちらをご覧ください。

  1. Datadogを初めて使用する場合
    1. まず、www.datadoghq.comにアクセスしてアカウントを作成します。
    2. APIキーを生成します。 APIキーの生成
  2. 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を使用している場合、dogstatsdDaemonsetまたは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整数オプション8125DogStatsDサーバーのホストポート
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
        }
    }
}'
Tags: