DogStatsD

DogStatsD は、Datadog Agent に付属するメトリクス集計サービスです。カスタムアプリケーションメトリクスを最も簡単に Datadog に取り込むには、メトリクスを DogStatsD に送信します。DogStatsD は StatsD プロトコルを実装すると共に、Datadog 固有の以下の拡張機能を提供します。

  • ヒストグラムメトリクスタイプ
  • サービスチェック
  • イベント
  • タグ付け

準拠する StatsD クライアントは、DogStatsD および Agent で動作しますが、その場合、Datadog 固有の拡張機能は含まれません。

: DogStatsD は、StatsD のタイマーをネイティブメトリクスタイプとして実装しません (ただし、ヒストグラム経由でサポートします)。

DogStatsD は Datadog コンテナレジストリ、GAR、ECR、Azure ACR、および Docker Hub で利用可能です。

レジストリイメージ
Datadog Container Registryregistry.datadoghq.com/dogstatsd
Google Artifact Registrygcr.io/datadoghq/dogstatsd
Amazon ECRpublic.ecr.aws/datadog/dogstatsd
Azure ACRdatadoghq.azurecr.io/dogstatsd
Docker Hubhub.docker.com/r/datadog/dogstatsd
Docker Hub はイメージプルレート制限の対象です。Docker Hub のカスタマーでない場合、Datadog では、Datadog コンテナレジストリまたはクラウドプロバイダーのレジストリを使用することが推奨されています。その手順については、コンテナのレジストリを変更するを参照してください。

仕組み

DogStatsD は、UDP 経由でカスタムメトリクスイベント、およびサービスチェックを受け入れ、それらを定期的に集計して Datadog に転送します。

UDP を使用することによりアプリケーションは、DogStatsD にメトリクスを送信し、応答を待たずに作業を再開できます。DogStatsD が利用できなくなった場合でも、アプリケーションは中断されません。

DogStatsD

DogStatsD は、データを受け取ると共に、_フラッシュ間隔_と呼ばれる時間間隔 (デフォルトで 10 秒) でメトリクスごとに複数のデータポイントを 1 つのデータポイントに集計します。DogStatsD では、フラッシュインターバルとして 10 秒が使用されています。

セットアップ

DogStatsD は、Datadog Agent にバンドルされたサーバーと、複数の言語で利用可能なクライアントライブラリとで構成されています。DogStatsD サーバーは、Agent v6+ の UDP ポート 8125 を通じて、デフォルトで有効になっています。必要に応じて、サーバーのカスタムポートを設定できます。Datadog Agent DogStatsD サーバーのアドレスとポートに合わせて、クライアントを設定してください。

Datadog Agent DogStatsD サーバー

ポートを変更する必要がある場合は、メインの Agent 構成ファイルdogstatsd_port オプションを構成してから、Agent を再起動してください。DogStatsD を UNIX ドメインソケット で使用するように設定することもできます。

独自の Agent DogStatsD サーバーの UDP ポートを有効にするには、次のようにします。

  1. dogstatsd_port パラメータを設定します。

    ## @param dogstatsd_port - integer - optional - default: 8125
    ## Override the Agent DogStatsD port.
    ## Note: Make sure your client is sending to the same UDP port.
    #
    dogstatsd_port: 8125
    
  2. Agent を再起動します

デフォルトの場合、DogStatsD は、UDP ポート 8125 をリッスンしているため、コンテナ内で Agent を実行する際にはこのポートをホストポートにバインドする必要があります。StatsD メトリクスが localhost の外部からの場合は、メトリクス収集を許可するために DD_DOGSTATSD_NON_LOCAL_TRAFFICtrue に設定する必要があります。DogStatsD サーバーを起動した状態で Agent を実行するには、次のコマンドを実行します:

docker run -d --cgroupns host \
              --pid host \
              -v /var/run/docker.sock:/var/run/docker.sock:ro \
              -v /proc/:/host/proc/:ro \
              -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
              -e DD_API_KEY=<DATADOG_API_KEY> \
              -e DD_DOGSTATSD_NON_LOCAL_TRAFFIC="true" \
              -p 8125:8125/udp \
              registry.datadoghq.com/agent:latest

StatsD メトリクスの収集に使用するポートを変更する必要がある場合は、DD_DOGSTATSD_PORT="<NEW_DOGSTATSD_PORT> 環境変数を使用してください。DogStatsD を UNIX ドメインソケット で使用するように設定することもできます。

StatsD メトリクスの収集は、UNIX ドメインソケットにおいて、デフォルトで有効になっています。UDP 経由で StatsD メトリクスの収集を開始するには、Operator 設定で DogStatsD 機能を有効にする必要があります。

  1. features.dogstatsd.hostPortConfig.enableddatadog-agent.yaml マニフェストに追加します。

    features:
        dogstatsd:
            hostPortConfig:
                enabled: true
    

    This is an example datadog-agent.yaml manifest:

    apiVersion: datadoghq.com/v2alpha1
    kind: DatadogAgent
    metadata:
      name: datadog
    spec:
      global:
        credentials:
          apiSecret:
            secretName: datadog-secret
            keyName: api-key
      features:
        dogstatsd:
          hostPortConfig:
            enabled: true
    

    This enables the Agent to collect StatsD metrics over UDP on port 8125.

  2. 変更を適用します。

    kubectl apply -f datadog-agent.yaml
    

警告: features.dogstatsd.hostPortConfig.hostPort パラメーターはホスト上のポートを開きます。ファイアウォールが、アプリケーションまたは信頼できるソースからのアクセスのみ許可することを確認してください。ネットワークプラグインで hostPorts がサポートされていない場合は、Agent Pod の仕様に hostNetwork: true を追加してください。これにより、ホストのネットワークネームスペースが Datadog Agent と共有されます。これは、コンテナ上で開かれるすべてのポートがホスト上でも開かれることを意味します。ホストとコンテナの両方でポートが使用されている場合、それらは競合することにより (同じネットワークネームスペースを共有しているため)、Pod は起動しません。一部の Kubernetes インストールでは、これが許可されません。

StatsD メトリクスを Agent に送信する

アプリケーションには、ホストの IP アドレスを特定するための信頼できる手段が必要です。Kubernetes 1.7 ではそれが簡単に実現されています。これにより、Pod に環境変数として渡すことができる属性のセットが拡張されます。バージョン 1.7 以降では、PodSpec に環境変数を追加することで、ホスト IP を任意の Pod に渡すことができます。たとえば、アプリケーションのマニフェストは次のようになります。

env:
    - name: DD_AGENT_HOST
      valueFrom:
          fieldRef:
              fieldPath: status.hostIP

これにより、アプリケーションを実行している Pod は、$DD_AGENT_HOST のポート 8125 で DogStatsD メトリクスを送信できるようになります。

: ベストプラクティスとして、Datadog では属性を割り当てる際に統合サービスタグ付けを使用することが推奨されています。unified service tagging は、envservice、および version の 3 つの標準タグを使用して Datadog テレメトリを結び付けます。環境を統一する方法については、unified service taggingを参照してください。

DogStatsD で helm を使用してカスタムメトリクスを収集するには:

  1. datadog-values.yaml ファイルを更新して DogStatsD を有効にします。

      dogstatsd:
        port: 8125
        useHostPort: true
        nonLocalTraffic: true
    

    Note: hostPort functionality requires a networking provider that adheres to the CNI specification, such as Calico, Canal, or Flannel. For more information, including a workaround for non-CNI network providers, see the Kubernetes documentation: HostPort services do not work.

    Warning: The hostPort parameter opens a port on your host. Make sure your firewall only allows access from your applications or trusted sources. If your network plugin doesn’t support hostPorts, so add hostNetwork: true in your Agent pod specifications. This shares the network namespace of your host with the Datadog Agent. It also means that all ports opened on the container are opened on the host. If a port is used both on the host and in your container, they conflict (since they share the same network namespace) and the pod does not start. Some Kubernetes installations do not allow this.

  2. Agent コンフィギュレーションをアップグレードします。

    helm upgrade -f datadog-values.yaml <RELEASE_NAME> datadog/datadog
    
  3. アプリケーション Pod を更新する: アプリケーションには、ホストの IP アドレスを特定するための信頼できる手段が必要です。Kubernetes 1.7 ではそれが簡単に実現されています。これにより、Pod に環境変数として渡すことができる属性のセットが拡張されます。バージョン 1.7 以降では、PodSpec に環境変数を追加することで、ホスト IP を任意の Pod に渡すことができます。たとえば、アプリケーションのマニフェストは次のようになります。

    env:
        - name: DD_AGENT_HOST
          valueFrom:
              fieldRef:
                  fieldPath: status.hostIP
    

    With this, any pod running your application is able to send DogStatsD metrics through port 8125 on $DD_AGENT_HOST.

発信点検出

Datadog Agent v6.10.0 では、_発信点検出_の機能がサポートされています。これにより、DogStatsD はコンテナメトリクスの発信元を検出し、自動的にメトリクスにタグを付けることができます。発信点検出が有効になっている場合、UDP 経由で受信したすべてのメトリクスには同一の Pod タグが付与されます。 Autodiscovery メトリクスとしてのタグ。

DogStatsD クライアント

すべての DogStatsD クライアントにおいて、発信点検出はデフォルトで有効になっています。

クライアントで発信点検出を無効にするには、次のいずれかの操作を実行します。

Datadog Agent

Datadog Agent において、発信点検出はデフォルトでは有効になっていません。Datadog Agent で発信点検出を有効にするには、DD_DOGSTATSD_ORIGIN_DETECTION_CLIENT 環境変数を true に設定します。

Agent による EKS Fargate での発信点検出を支援するように、Pod 仕様で shareProcessNamespace:true を設定します。

発信点検出方法

発信点検出はさまざまな方法で実現できます。デフォルトでは、cgroups を通じた発信点検出が有効になっています。UDP 経由の発信点検出または DD_EXTERNAL_ENV については、構成が必要です。

Linux の場合、コンテナ ID は procfs に関連するエントリから cgroups を抽出することで取得できます。クライアントは /proc/self/cgroup または /proc/self/mountinfo から読み取って、コンテナ ID の解析を試みます。

cgroup v2 では、/proc/self/cgroup から cgroup パスを解決し、/proc/self/mountinfo からの cgroup マウントポイントと組み合わせることによりコンテナ ID を推測できます。結果として得られるディレクトリの inode が Datadog Agent に送信されます。Datadog Agent がクライアントと同じノードにある場合、この情報を使用して Pod の UID を特定できます。

UDP 経由の発信点検出を有効にするには、アプリケーションマニフェストに次の行を追加します。

env:
- name: DD_ENTITY_ID
    valueFrom:
      fieldRef:
        fieldPath: metadata.uid

DogStatsD クライアントが内部タグ entity_id を追加します。このタグの値は DD_ENTITY_ID 環境変数の内容であり、それは Pod の UID です。

UDP の場合、pod_name タグは、デフォルトでは追加されません。カスタムメトリクスが多くなりすぎないようにするためです。

自分の Pod に以下のラベルを追加します。

admission.datadoghq.com/enabled: "true"

Pod にこのラベルがある場合、Admissions Controller により環境変数 DD_EXTERNAL_ENV が注入されます。この変数の値がメトリクスと共にフィールドに入れられて送信されます。Datadog Agent は、これを使用してメトリクスの発信点を特定できます。

タグのカーディナリティ

タグのカーディナリティについて詳しくは、タグの付け方: タグのカーディナリティをお読みください。

グローバルに

DD_CARDINALITY 環境変数を設定するか、またはコンストラクタに 'cardinality' フィールドを渡すことにより、タグのカーディナリティをグローバルに指定できます。

メトリクスごとに

cardinality パラメーターに値を渡すことにより、メトリクスごとにタグのカーディナリティを指定できます。このパラメーターの有効な値は "none""low""orchestrator" または "high" です。

DogStatsD クライアント

使用するプログラミング言語向けの DogStatsD クライアントライブラリをインストールし、Datadog Agent DogStatsD サーバーのアドレスとポートに合わせて構成してください。

DogStatsD クライアントをインストールする

公式の Datadog-DogStatsD クライアントライブラリは、以下の言語で利用可能です。準拠する StatsD クライアントは、DogStatsD および Agent で動作しますが、前述の Datadog 固有の拡張機能は含まれません。

pip install datadog
gem install dogstatsd-ruby
go get github.com/DataDog/datadog-go/v5/statsd

Java DataDog StatsD Client は maven central とともに配布され、Maven からダウンロードできます。まず、pom.xml に次の構成を追加します。

<dependency>
    <groupId>com.datadoghq</groupId>
    <artifactId>java-dogstatsd-client</artifactId>
    <version>4.2.1</version>
</dependency>

composer.json に次の内容を追加します。

"datadog/php-datadogstatsd": "1.6.*"

: Composer に付属している最初のバージョンは 0.0.3 です。

または、github.com/DataDog/php-datadogstatsd でリポジトリのクローンを手動で作成し、require './src/DogStatsd.php' でそれをセットアップします。

Nuget CLI を使用してパッケージを直接インストールするか、NuGet から PackageReference を取得します。

dotnet add package DogStatsD-CSharp-Client

DogStatsD クライアントをインスタンス化する

DogStatsD クライアントをインストールしたら、コードでインスタンス化します。

from datadog import initialize, statsd

options = {
    'statsd_host':'127.0.0.1',
    'statsd_port':8125
}

initialize(**options)
デフォルトの場合、Python DogStatsD クライアントインスタンス ( statsd グローバルインスタンスを含む)をプロセス間で共有することはできませんが、それらはスレッドセーフです。このため、親プロセスと各子プロセスは、クライアントの独自インスタンスを作成するか、 disable_bufferingTrueに設定して、バッファリングを明示的に無効にする必要があります。詳細については、datadog.dogstatsd のドキュメントを参照してください。
# Import the library
require 'datadog/statsd'

# Create a DogStatsD client instance.
statsd = Datadog::Statsd.new('localhost', 8125)
DogStatsD をコンテナ Agent と共に、または Kubernetes で使用する場合、UNIX ドメインソケットを使用しているなら $DD_DOGSTATSD_SOCKET 環境変数を、あるいはホストポートバインディング方式を使用している場合は $DD_AGENT_HOST 環境変数を使用して、StatsD メトリクスの転送先のホストをインスタンス化する必要があります。
dogstatsd_client, err := statsd.New("127.0.0.1:8125")
if err != nil {
    log.Fatal(err)
}

その他のオプションについては、Datadog の GoDoc を参照してください。

import com.timgroup.statsd.NonBlockingStatsDClientBuilder;
import com.timgroup.statsd.StatsDClient;

public class DogStatsdClient {

    public static void main(String[] args) throws Exception {

        StatsDClient statsd = new NonBlockingStatsDClientBuilder()
            .prefix("statsd")
            .hostname("localhost")
            .port(8125)
            .build();


        // alternatively
        StatsDClient statsdAlt = new NonBlockingStatsDClient(
            new NonBlockingStatsDClientBuilder(
                .prefix("statsd")
                .hostname("localhost")
                .port(8125)
                .resolve()));

    }
}

composer を使用して、新しい DogStatsd オブジェクトをインスタンス化します。

<?php

require __DIR__ . '/vendor/autoload.php';

use DataDog\DogStatsd;

$statsd = new DogStatsd(
    array('host' => '127.0.0.1',
          'port' => 8125,
     )
  );

DogStatsd クラスを構成します。

// The code is located under the StatsdClient namespace
using StatsdClient;

// ...

var dogstatsdConfig = new StatsdConfig
{
    StatsdServerName = "127.0.0.1",
    StatsdPort = 8125,
};

using (var dogStatsdService = new DogStatsdService())
{
    if (!dogStatsdService.Configure(dogstatsdConfig))
        throw new InvalidOperationException("Cannot initialize DogstatsD. Set optionalExceptionHandler argument in the `Configure` method for more information.");
    // ...
} // Flush metrics not yet sent

クライアントのインスタンス化パラメーター

: ベストプラクティスとして、Datadog はタグを割り当てるときに統合サービスタグ付けを使用することをお勧めします。unified service tagging は、envservice、および version の 3 つの標準タグを使用して Datadog テレメトリを結び付けます。環境を統一する方法については、unified service taggingを参照してください。

必須の DogStatsD 構成 (urlport) に加えて、DogStatsD クライアントでは次のオプションのパラメーターを使用できます。

パラメーターデフォルト説明
statsd_host文字列localhostDogStatsD サーバーのホスト。
statsd_port整数8125DogStatsD サーバーのポート。
statsd_socket_path文字列nullDogStatsD UNIX ドメインソケットのパス (hostport をオーバーライド。Agent v6 以上でのみサポート)。
statsd_constant_tags文字列のリストnullすべてのメトリクス、イベント、サービスチェックに適用するタグ。
statsd_namespace文字列nullすべてのメトリクス、イベント、サービスチェックの前に付けるネームスペース。

datadog.initialize() で使用できるオプションのパラメーターと、datadog.dogstatsd.DogStatsd インスタンスを明示的にインスタンス化する場合にのみ使用できるパラメーターの完全なリストについては、Datadog Python ライブラリを参照してください。

パラメーターデフォルト説明
host文字列localhostDogStatsD サーバーのホスト。
port整数8125DogStatsD サーバーのポート。
socket_path文字列nullDogStatsD UNIX ドメインソケットのパス (hostport をオーバーライド。Agent v6 以上でのみサポート)。
tags文字列のリストnullすべてのメトリクス、イベント、サービスチェックに適用するタグ。
namespace文字列nullすべてのメトリクス、イベント、サービスチェックの前に付けるネームスペース。
single_threadブール値falseコンパニオンスレッドではなく、有効になっている場合、クライアントがメインスレッドでメトリクスを送信するようにします。

オプションのパラメーターの完全なリストについては、GitHub の dogstatsd-ruby リポジトリを参照してください。

Go クライアントには、クライアントの動作を設定するための複数のオプションがあります。

パラメーター説明
WithNamespace()文字列すべてのメトリクス、イベント、サービスチェックの前に付けるネームスペースを構成します。
WithTags()文字列のリストすべてのメトリクス、イベント、サービスチェックに適用されるグローバルタグ。

利用可能なすべてのオプションについては、Datadog の GoDoc を参照してください。

v2.10.0 以降では、NonBlockingStatsDClientBuilder を使ってクライアントをインスタンス化することを推奨します。以下の ビルダーメソッドを使用して、クライアントのパラメータを定義することができます。次のビルダーメソッドを使用してクライアントパラメーターを定義できます。

ビルダーメソッドデフォルト説明
prefix(String val)文字列nullすべてのメトリクス、イベント、サービスチェックに適用するプレフィックス。
hostname(String val)文字列localhostターゲット StatsD サーバーのホスト名。
port(int val)整数8125ターゲット StatsD サーバーのポート。
constantTags(String... val)文字列 varargsnullすべてのメトリクス、イベント、サービスチェックに適用されるグローバルタグ。
blocking(boolean val)ブール値falseインスタンス化するクライアントのタイプ: ブロッキングか非ブロッキングか。
socketBufferSize(int val)整数I-1基礎となるソケットバッファのサイズ。
enableTelemetry(boolean val)ブール値falseクライアントテレメトリーレポート。
entityID(String val)文字列null発信点検出のためのエンティティ ID。
errorHandler(StatsDClientErrorHandler val)整数nullクライアント内部でエラーが発生した場合のエラーハンドラー。
maxPacketSizeBytes(int val)整数8192/1432最大パケットサイズ、UDS で 8192、UDP で 1432。
processorWorkers(int val)整数1送信のためにバッファを組み立てているプロセッサーワーカスレッドの数。
senderWorkers(int val)整数1ソケットにバッファを送信している送信側ワーカスレッドの数。
poolSize(int val)整数512ネットワークパケットバッファプールのサイズ。
queueSize(int val)整数4096キュー内の未処理メッセージの最大数。
timeout(int val)整数100ブロック操作のタイムアウト (ミリ秒単位)。unix ソケットにのみ適用されます。

詳細は、Java DogStatsD パッケージの NonBlockingStatsDClient Class と NonBlockingStatsDClientBuilder Class を検索してください。ご利用のクライアントリリースに対応したバージョンであることを確認してください。

パラメーターデフォルト説明
host文字列localhostDogStatsD サーバーのホスト。これが設定されていない場合、Agent は環境変数 DD_AGENT_HOST または DD_DOGSTATSD_URL を参照します。
port整数8125DogStatsD サーバーのポート。これが設定されていない場合、Agent は環境変数 DD_DOGSTATSD_PORT または DD_DOGSTATSD_URL を参照します。
socket_path文字列nullDogStatsD UNIX ドメインソケットのパス (hostport をオーバーライド)。Agent v6 以上でのみサポート。これが設定されていない場合、Agent は環境変数 DD_DOGSTATSD_URL を参照します。
global_tags文字列のリストnullすべてのメトリクス、イベント、サービスチェックに適用するタグ。@dd.internal.entity_id タグは、DD_ENTITY_ID 環境変数の global_tags に追加されます。
origin_detectionブール値true各メトリクスに発信点検出フィールドを追加するかどうか
container_id文字列null発信点検出のためにすべてのメトリクスにタグ付けするコンテナ ID。
パラメーターデフォルト説明
StatsdServerName文字列localhostターゲット StatsD サーバーのホスト名。
StatsdPort整数8125ターゲット StatsD サーバーのポート。
Prefix文字列nullすべてのメトリクス、イベント、サービスチェックに適用するプレフィックス。
ConstantTags文字列のリストnullすべてのメトリクス、イベント、サービスチェックに適用されるグローバルタグ。
OriginDetectionブール値true各メトリクスに発信点検出フィールドを追加するかどうか
ContainerID文字列null発信点検出のためにすべてのメトリクスにタグ付けするコンテナ ID。

DogStatsD の詳細

DogStatsD と StatsD はほぼ同じですが、DogStatsD には、使用可能なデータ型、イベント、サービスチェック、タグなど、Datadog に固有の高度な機能が含まれています。


DogStatsD が使用するデータグラム形式についてさらに理解を深めたい場合、または独自の Datadog ライブラリを開発したい場合は、データグラムとシェルの使用状況を参照してください。ここでは、メトリクスとイベントをコマンドラインから直接送信する方法についても説明しています。

参考資料