はじめに
Datadog のエージェント(dd-agent)をインストールすると DogStatsD を利用出来るようになる(と言うよりも DogStatsD は dd-agent の構成要素の一つだと思っている)ので DogStatsD を Ruby からサンプル通りに使ってみた。
DogStatsD がナニモノかは以下の図が一目瞭然だと思われる。
(出典:DogStatsDの解説)
ザクッと言うと「ローカルホストで動いている dd-agent の DogStatsD に対して指定されたフォーマットを用いて UDP でデータを送ることでカスタムメトリクスを収集することが出来る」となるかな。
参考
- http://docs.datadoghq.com/ja/guides/dogstatsd/
- http://docs.datadoghq.com/ja/guides/metrics/
- http://www.rubydoc.info/github/DataDog/dogstatsd-ruby/master/Statsd
準備
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
でインスタンスを生成して increment
や gauge
等のメソッドを利用してメトリクスを送信することになる。
尚、time
メソッドの render_page
が以下のようなエラーとなったので一旦コメントアウト。
test.rb:18:in `block in': 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 ` '
おそらくだが、home.html にアクセスする時間をメトリクスで送る為の time メソッドだと思われる。
そして、上記のスクリプトを何度か実行すると…
Datadog ダッシュボードにて…
以下のように Infrastructure List にて確認することが出来る。
Apps にスクリプトから登録したメトリクスが登録されている。
ということで
DogStatsD を利用することでカスタムメトリクスの収集が簡単に実装出来る。また、クライアントライブラリも各種言語提供されているのでアプリケーションへの組み込みも用意だと思われる。