share facebook facebook2 twitter menu hatena pocket slack

2015.07.02 THU

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

川原 洋平

WRITTEN BY川原 洋平

はじめに

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

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


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

元記事はこちら

Check! Amazon EC2 Container Service で Docker を学びたい!(準備編)