ようへいの日々精進XP

よかろうもん

dd-agent の DogStatsD 使ってカスタムメトリクスを Ruby を使った送るメモ

はじめに

Datadog のエージェント(dd-agent)をインストールすると DogStatsD を利用出来るようになる(と言うよりも DogStatsD は dd-agent の構成要素の一つだと思っている)ので DogStatsD を Ruby からサンプル通りに使ってみた。

DogStatsD がナニモノかは以下の図が一目瞭然だと思われる。

f:id:inokara:20150415000612p:plain

(出典:DogStatsDの解説

ザクッと言うと「ローカルホストで動いている dd-agent の DogStatsD に対して指定されたフォーマットを用いて UDP でデータを送ることでカスタムメトリクスを収集することが出来る」となるかな。


参考


準備

Ruby の導入

これ を利用して rbenv で Ruby 2.2.2 を用意。

$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]

dogstatsd-ruby の導入

gem install dogstatsd-ruby --no-ri --no-rdoc -V

簡単。


動かしてみる

サンプルをそのまま

利用してみる。

# Load the dogstats module.
require 'statsd'

# Create a stats instance.
statsd = Statsd.new('localhost', 8125)

# Increment a counter.
statsd.increment('page.views')

# Record a gauge 50% of the time.
statsd.gauge('users.online', 123, :sample_rate=>0.5)

# Sample a histogram
statsd.histogram('file.upload.size', 1234)

# Time a block of code
#statsd.time('page.render') do
#  render_page('home.html')
#end

# Send several metrics at the same time
# All metrics will be buffered and sent in one packet when the block completes
statsd.batch do |s|
  s.increment('page.views')
  s.gauge('users.online', 123)
end

# Tag a metric.
statsd.histogram('query.time', 10, :tags => ["version:1"])

Statsd.newインスタンスを生成して incrementgauge 等のメソッドを利用してメトリクスを送信することになる。

尚、time メソッドrender_page が以下のようなエラーとなったので一旦コメントアウト

test.rb:18:in `block in <main>': undefined method `render_page' for main:Object (NoMethodError)
        from /home/ansible/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/dogstatsd-ruby-1.4.1/lib/statsd.rb:184:in `time'
        from test.rb:17:in `<main>'

おそらくだが、home.html にアクセスする時間をメトリクスで送る為の time メソッドだと思われる。

そして、上記のスクリプトを何度か実行すると...

Datadog ダッシュボードにて...

以下のように Infrastructure List にて確認することが出来る。

f:id:inokara:20150414235708p:plain

Apps にスクリプトから登録したメトリクスが登録されている。

f:id:inokara:20150415000755p:plain


ということで

DogStatsD を利用することでカスタムメトリクスの収集が簡単に実装出来る。また、クライアントライブラリも各種言語提供されているのでアプリケーションへの組み込みも用意だと思われる。