DogStatsDを使った独自メトリクスのDatadog取り込み検証をローカル環境で実施する

クラウド勤怠とクラウド給与で一人プロダクトSREをしているVTRyoです。いつの間にかプロダクトを兼任していて人手が足りません、助けてください

Datadogに独自メトリクスを取り込むために最初はStaging環境などで検証しようとしたのですが、動くかわからないもののためにエンジニアのコードレビュー時間を取っても勿体ないです。

ローカルでDogStatsDを検証する方法があったので紹介します。

前提

Datadog側が提供している既存のメトリクスでは取得できない、アプリケーション独自のメトリクスを集計する必要がありました。
プロダクト固有の問題に寄り添ったSLIを設定するためには、もはや必須の条件です。

独自のメトリクスをDatadogに送信する方法はいくつかあります。

  • カスタムAgentチェック
  • DogStatsD
  • PowerShell
  • DatadogのHTTP API

今回はDogStatsDを利用します。
アプリケーション側で制御できることや、Datadog Agentに付属するメトリクス集計サービスであることによる導入コストの低さが理由です。

DogStatsD は StatsD プロトコルを実装すると共に、Datadog 固有の以下の拡張機能を提供します。

導入方法はDatadogの公式ドキュメントに記載があります。

たとえばCOUNTメトリクスであれば、コードサンプルが用意されているので導入については公式を参照してください。

require 'datadog/statsd'

statsd = Datadog::Statsd.new('localhost', 8125)

while true do
    statsd.increment('example_metric.increment', tags: ['environment:dev'])
    statsd.decrement('example_metric.decrement', tags: ['environment:dev'])
    statsd.count('example_metric.count', 2, tags: ['environment:dev'])
    sleep 10
end

Datadog Agent側の設定でも、DogStatsDポートをホストポートにバインドするように設定されていれば、アプリケーションに組み込むだけで独自メトリクスの集計が開始されます。

ローカルでDogStatsDを動かしていく

各種の設定方法を理解したところで、本番に出す前に検証したいところです。
手元で動かしているアプリケーションで動作確認し、その作成したメトリクスをDatadogのWeb画面で確認しましょう。

やることはかんたんです。

  1. アプリケーションにDatadog::Statsdに関する処理を書く
  2. DogStatsDのコンテナをdocker runする

アプリケーションコード

例えばある処理中で以下のように差し込むとしましょう。
シンプルに処理が走る度にCOUNTメトリクスをインクリメントします。

require 'datadog/statsd'

def hoge
  puts "metrics increment!"

  # DD_AGENT_HOST = 127.0.0.1
  statsd = Datadog::Statsd.new(ENV.fetch('DD_AGENT_HOST', nil), 8125, tags: { service: 'hoge', env: Rails.env, Type: 'Web' }) # 8125はポート番号

  # https://github.com/DataDog/dogstatsd-ruby/blob/master/lib/datadog/statsd.rb#L159
  statsd.increment('example_metric.increment') 
  statsd.close
end

DogStatsDを起動する

DockerでDogStatsDを起動しましょう。

検証に参考・利用したのは以下です。

この時、DatadogのAPI KEYを環境変数に渡します。

-pではDD_AGENT_HOSTで指定しているIPアドレスにします。

docker run -p 127.0.0.1:8125:8125/udp -d --name dogstatsd -h `hostname` \
 -e API_KEY=YOUR_API_KEY datadog/docker-dd-agent:latest-dogstatsd

起動が完了すれば準備完了です。
statsdを差し込んだプログラムを動かし、Datadog側に取り込まれたか確認します。

Datadogで確認する

Metrics Explorerを使用すると検索しやすいでしょう。独自に設定したメトリクス名が表示できればローカルからDatadogへ独自メトリクスの取り込みが完了しています。

※別のコンテナからDogStatsDに転送する場合

別のコンテナからDogStatsDに送りたい場合は、次のどちらかの方法が取れます。
詳しくはこちらを参照してください。

  • Docker host IPを使う
  • Docker linksを使う
docker run  --name my_container \
            --all_your_flags \
            --link dogstatsd:dogstatsd \
            my_image_id

おわりに

今回はDogStatsDをローカルで検証したい、その方がお手軽でしょという気持ちで試しました。
アプリケーション独自のメトリクス収集ができると、これまで観測できなかった数値が可視化されるためSRE的にもポイント高いです。

独自メトリクスは一回試してみると案外かんたんにできてしまうので、臆せずドカドカ手を動かしましょう。

プロダクトSREに興味がある方、マネーフォワードに興味がある方はMeetyなどからもお気軽にメッセージくださいませ!


マネーフォワードでは、エンジニアを募集しています。
ご応募お待ちしています。

【会社情報】
Wantedly
株式会社マネーフォワード
福岡開発拠点
関西開発拠点(大阪/京都)

【SNS】
マネーフォワード公式note
Twitter – 【公式】マネーフォワード
Twitter – Money Forward Developers
connpass – マネーフォワード
YouTube – Money Forward Developers

Pocket