Table of Contents
Great systems are not just built. They are monitored.
MetricFire is the fully managed Graphite and Grafana platform for small teams that don’t want to self-host their monitoring stack. Pre-built dashboards, alerts, and native add-ons for Heroku, AWS, Azure, and GCP. All with dedicated support and no infrastructure to maintain.
はじめに
Datadogは人気の監視プラットフォームであり、その主要コンポーネントの一つがDogStatsDです。これはオリジナルのオープンソースStatsDプロトコルをカスタマイズした拡張版です。DogStatsDはタグ付け、ヒストグラム、分布といった強力な機能を追加しますが、ベンダーロックインも引き起こします。これはDogStatsDメトリクスが特定のワイヤフォーマットに従うためで、他の多くの監視プラットフォームはこれをネイティブでサポートしていません。アプリケーションがDogStatsDを出力すると、テレメトリパイプラインはDatadogに強く依存するようになり、監視プロバイダーの切り替えが困難になります。
幸いなことに、Telegrafのような現代的なツールを使えば、既存のDogStatsD計測機能を維持したまま、任意のバックエンドにデータを送信できます。これにより、アプリケーションを書き換えることなく監視コストを制御可能です。Telegrafを使えば、DogStatsDメトリクスをほぼあらゆるストレージバックエンドと互換性のある形式に簡単に変換できます。
DogStatsDを別のモニタリングプロバイダーへ移行する
多くのDevOpsチームは、オープンソースのモニタリングソリューションを採用したり、特定ベンダーのシステムへの依存を減らしたいと考えています。しかしその際によく直面する課題が、DogStatsDがDatadog以外のモニタリングシステムと直接互換性がないという点です。これは、DogStatsDが標準のStatsDやGraphiteにきれいに変換できない独自機能を追加しているためです。DogStatsDのワークロードを別のモニタリングプラットフォーム(例:MetricFireのHosted Graphite)へスムーズに移行するには、次のことができるコンポーネントが必要です。
-
DogStatsDのパケットを受信する
-
Datadogのタグやメトリクスタイプを解析する
-
それらをオープンフォーマットへ変換する
-
標準のStatsD、Graphite、またはPrometheusのメトリクスとして出力する
これを実現するのが、DogStatsD拡張を有効にしたTelegrafの inputs.statsd プラグインです。このプラグインは互換レイヤーとして機能し、Datadog独自のStatsDフォーマットを受け取り、他のバックエンドでも取り込めるベンダー非依存のメトリクスへ変換します。その結果、既存の計測(instrumentation)を維持したまま、タグ情報も保持しつつ、Datadogの独自メトリクスパイプラインにロックインされることを回避できます。
Hosted Graphiteのアカウントをまだお持ちでない場合は、こちらをクリックして無料トライアルを開始し、APIキーを取得してください。
TelegrafのStatsD Inputプラグインを使ってDogStatsDを変換する
Telegrafコレクターのセットアップ
まだサーバー上でTelegrafを実行していない場合は、便利なHG-CLIツールをインストールすることで、Telegrafのインストールと設定を素早く行えます。
curl -s "https://www.hostedgraphite.com/scripts/hg-cli/installer/" | sudo sh
注:Hosted GraphiteのAPIキーを入力し、どのメトリクスセットを取得するかを選択するためのプロンプトに従う必要があります。
Telegrafをインストールしたら、設定ファイル /etc/telegraf/telegraf.conf を開き、次のセクションを追加します。
[[inputs.statsd]]
protocol = "udp"
service_address = ":8125"
# Enable DogStatsD parsing
datadog_extensions = true
datadog_distributions = true
設定ファイルを保存し、Telegrafサービスを再起動するだけで、DogStatsDメトリクスがHGアカウントへ転送されます。または、手動で実行して出力を確認し、構文エラーや権限エラーがないかをチェックすることもできます。
telegraf --config /etc/telegraf/telegraf.conf
TelegrafがDatadogタグをどのように処理するか
Datadogのタグ(例:#env:prod,source:api)は、Telegraf内部では次のようなタグに変換されます:env=prod, source=api
Hosted GraphiteはGraphiteプロトコル上に構築されていますが、Graphite自体はDogStatsD形式のタグ付けをサポートしていません。そのためTelegrafは、これらのタグをGraphiteのメトリクスパス内にエンコードします。例えば、以下のメトリクス:
test.dog-statsd-counter:1|c|#env:sandbox,source:test
は、Hosted Graphiteでは次のように表示されます。
telegraf.<host>.sandbox.counter.test.test_dog-statsd-counter
この仕組みにより、Datadogのメトリクスフォーマットとの互換性を保ちながら、Graphite上でもメトリクスを可視化できます。
Hosted GraphiteにおけるDogStatsDネイティブサポートの今後の計画
Hosted Graphiteでは、DogStatsDのネイティブ取り込み機能を追加する計画があります。これにより、Telegrafや他のミドルウェアを使用せずに、Datadog形式のメトリクスを直接送信できるようになります。この統合では、DogStatsDのタグやメトリクスタイプをバックグラウンドで自動的にGraphite互換形式へ変換します。その目的は、Datadogからの移行をより簡単にし、ベンダーロックインを排除し、よりコスト効率の高いモニタリングスタックへ移行するための低オーバーヘッドな手段を提供することです。
メトリクス送信の例
以下は、ローカルでテストできる実際のDogStatsDコマンドです(Telegrafが localhost:8125 で待ち受けている状態)。
1. Counter(カウンター)
echo "test.dog-statsd-counter:1|c|#env:sandbox,source:test" | nc -w1 -u localhost 8125
Graphiteでは次のメトリクスとして表示されます:
telegraf.<host>.sandbox.counter.test.test_dog-statsd-counter
2. Gauge(ゲージ)
echo "test.dog-statsd-gauge:42|g|#env:sandbox,source:test" | nc -w1 -u localhost 8125
メトリクスは次のように表示されます:
telegraf.<host>.sandbox.gauge.test.test_dog-statsd-gauge
3. Timer(タイマー)
echo "test.dog-statsd-timer:200|ms|#env:sandbox,source:test" | nc -w1 -u localhost 8125
メトリクスは次のように表示されます:
telegraf.<host>.sandbox.timing.test.test_dog-statsd-timer.mean
telegraf.<host>.sandbox.timing.test.test_dog-statsd-timer.upper
...
4. Histogram(ヒストグラム)
echo "test.dog-statsd-histogram:512|h|#env:sandbox,source:test" | nc -w1 -u localhost 8125
メトリクスは次のように表示されます:
telegraf.<host>.sandbox.histogram.test.test_dog-statsd-histogram.sum
telegraf.<host>.sandbox.histogram.test.test_dog-statsd-histogram.mean
...
5. Distribution(分布:主にレイテンシ集計で使用)
echo "test.dog-statsd-distribution:7|d|#env:sandbox,source:test" | nc -w1 -u localhost 8125
メトリクスは次のように表示されます:
telegraf.<host>.sandbox.distribution.test.test_dog-statsd-distribution
6. Set(ユニーク値)
echo "test.dog-statsd-set:1234|s|#env:sandbox,source:test" | nc -w1 -u localhost 8125
メトリクスは次のように表示されます:
telegraf.<host>.sandbox.set.test.test_dog-statsd-set
7. Valueless Tags(値を持たないタグ)
DogStatsDは値を持たないタグをサポートしていますが、Graphiteはメトリクスを階層型のパスとしてのみ保存する仕組みのため、値を持たないタグを個別のメタデータとして保持することができません。そのため、値を持たないタグは削除されるか、メトリクス名にフラット化される形になります。結果として、現在のHosted Graphiteのバックエンドでは、値を持たないタグを取り込むことはできません。
まとめ
DogStatsDは強力ですが、その独自設計は一種のベンダーロックインとして機能します。いったんシステムがDatadog固有のメトリクスやタグを出力するようになると、別のプロバイダーへ切り替えることがより困難でコストも高くなるためです。多くの企業は、環境が拡大するにつれてDatadogのコストが急速に増加することに気づきます。そしてDogStatsDのワイヤーフォーマットによって、他のサービスへ移行することが非常に大変に感じられるようになります。しかし、Telegrafのようなツールはこの障壁を取り除くのに役立ちます。DogStatsDメトリクスを受信し、互換性のあるフォーマットへ変換することで、Telegrafは既存の計測(instrumentation)をすべて維持したまま、メトリクスの保存先を自由に選べるようにします。
つまり、組織は次のことが可能になります。
- DatadogからHosted Graphiteのようなよりコスト効率の高いプラットフォームへ移行することで、モニタリングコストを削減できる
-
GraphiteやStatsDのようなオープンプロトコルを利用することで、ベンダーロックインを回避できる
- アプリケーションはこれまで通りDogStatsDを送信し続けるだけでよいため、コードを書き直すことなく移行できる
-
さまざまなバックエンドと連携できるオープンソースツールを利用できる
要するに、Telegrafはテレメトリパイプラインの主導権を取り戻すための実用的な方法を提供します。Datadogの独自フォーマットに縛られることなく、予算に合ったモニタリングプロバイダーを選択できるようになるのです。