share facebook facebook2 twitter menu hatena pocket slack

2015.01.15 THU

Hosted Graphite を使って 5 分で始める俺の可視化(2)~ fluentd からメトリクスを送る ~

川原 洋平

WRITTEN BY川原 洋平

ども、cloudpackかっぱ (@inokara) です。

はじめに

Hosted Graphitefluentd からメトリクスを送ってみたいと思いますので fluentd プラグインを作ってメトリクスを送ってみたい。

参考

Hosted Graphite にメトリクスを送る為には…

基本的には…

  • API Key が必要になる
  • 従来の Graphite と同様に TCP や UDP を利用する
  • Hosted Graphite ではない普通の Graphite は Render API ってのはある

実際に送る…

TCP で送る場合には…

echo "YOUR-API-KEY.conc_users 1.2" | nc carbon.hostedgraphite.com 2003

UDP で送る場合には…

echo "YOUR-API-KEY.conc_users 59" | nc -uw0 carbon.hostedgraphite.com 2003

TCP や UDP はプレフィックスとして API Key を利用する。

尚、HTTP で送る場合には…(Hosted Graphite のみ)

curl https://YOUR-API-KEY@www.hostedgraphite.com/api/v1/sink --data-binary "conc_users 59"

curl を利用する場合には上記のようにメトリクスを送る。

各種言語で…

様々な言語がサポートされている。

一応、個人的に慣れ親しんだ Ruby 場合には以下のようなパターンがある。

ということで、既に fluent-plugin-graphite があるので参考にさせて頂きつつ fluentd プラグインを作って fluentd から Hosted Graphite にメトリクスを送ってみたい。

fluentd からメトリクスを送る

プラグイン

引き続き、以下を対応予定。

  • テスト(メソッド単位のテストが不十分)
  • 複数 metric_key の指定(カンマ区切りで並べる感じを想定)(対応した)

プラグインの作り方

以下を参考にさせて頂いた。

個人的に作り方をまとめると…

  1. bundle gem ${プラグイン名} でひな形を作成(プラグインの命名には注意)
  2. ディレクトリ構成を修正する(${プラグイン名}/lib/fluent/plugin にする、version.rb を削除して gemspec ファイルに書く等…)
  3. テスト用のディレクトリを作成
  4. テストを作る
  5. プラグインを作る

超ざっくりで恐縮だが、1 から 3 までが終われば 4. 5. を繰り返すことになると思う。ホントに見よう見まねで作ったので、プラグイン作成については引き続き勉強していきたい。(改めて纏めたい)また、プラグインを作る(メンテナンス)することで fluentd の基礎的な部分の勉強になると思う。

実際にメトリクスを送る

以下の環境にて試してみる。

# ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux-gnu]
# fluentd --version
fluentd 0.12.2

プラグインをインストール。

sudo gem install fluent-plugin-out_hosted_graphite --no-ri --no-rdoc -V

Hosted Graphite の API キーを取得しておく。ログインしたらトップページに表示されている。
Hosted Graphite を使って 5 分で始める俺の可視化(2)fluentd連携: APIキーを取得

fluentd にプラグインの設定を行う。

<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>

<match *.*>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type hosted_graphite
    api_key cxxxxxxf-4xx4-4xx0-axx5-dxxxxxxxxxx9
    metric_key foo.bar
    protocol udp
  </store>
</match>

とりあえずは type copy を使って fluentd のログにも出力させるようにしておく。尚、プラグインの設定は以下の通り。

オプション パラメータ(例) デフォルト値 / Required 説明
type hosted_graphite fluent-plugin-out_hosted_graphite を指定
api_key cxxxxxxf-4xx4-4xx0-axx5-dxxxxxxxxxx9 なし / Required Hosted Graphite の API キーを指定
metric_key foo.bar なし / Required Record 内のキーを指定
protocol udp http / Required メトリクスを転送する際のプロトコルを指定(HTTP or TCP or UDP)

以下のように fluentd を起動する。

fluentd -c conf/test.conf -o debug.log &

正常に起動したログを確認する。

(前略)
2015-01-11 00:51:09 +0000 [info]: reading config file path="conf/test.conf"
2015-01-11 00:51:09 +0000 [info]: starting fluentd-0.12.2
2015-01-11 00:51:09 +0000 [info]: gem 'fluent-plugin-out_hosted_graphite' version '0.0.1'
2015-01-11 00:51:09 +0000 [info]: gem 'fluentd' version '0.12.2'
2015-01-11 00:51:09 +0000 [info]: using configuration file: <ROOT>
  <source>
    type forward
    port 24224
    bind 0.0.0.0
  </source>
  <match *.*>
    type copy
    <store>
      type stdout
    </store>
    <store>
      type hosted_graphite
      api_key cxxxxxxf-4xx4-4xx0-axx5-dxxxxxxxxxx9
      metric_key foo.bar
      protocol udp
    </store>
  </match>
</ROOT>
2015-01-11 00:51:09 +0000 [info]: adding match pattern="*.*" type="copy"
2015-01-11 00:51:09 +0000 [info]: adding source type="forward"
2015-01-11 00:51:09 +0000 [info]: listening fluent socket on 0.0.0.0:24224

更にテストで以下のようにメトリクスを送る。

while true
do
  echo "{"foo.bar": $RANDOM, "memo": "test"}" | fluent-cat  hosted-graphite.test
  sleep 10
done

暫くすると以下のようにメトリクスが蓄積され始める。
Hosted Graphite を使って 5 分で始める俺の可視化(2)fluentd連携: メトリクスが蓄積され始める
おお。

ついでに Tasseo でも…
Hosted Graphite を使って 5 分で始める俺の可視化(2)fluentd連携: Tasseoとも連携

ということで…

fluentd を使って Hosted Graphite にメトリクスを送ってたが Hosted Graphite は簡単に Graphite を扱える上でに Grafana や Tasseo 等も自前に用意することなく利用出来るのが嬉しい。また、Hosted Graphite に用意された Gem を利用して、更に詳しいプラグインの作り方の解説により自分のようなド素人でも思ったよりも簡単に作ることが出来たことに感謝しつつプラグインは引き続きメンテナンスしていきたい。

元記事はこちらです。
Hosted Graphite を使って 5 分で始める俺の可視化(2)~ fluentd からメトリクスを送る ~