Tags

By year

  1. 2014 (28)

ちょっとだけ解った気になる Graphite と Grafana

Grafana Graphite Sensu Docker Elasticsearch

Posted on May 27


はじめに

  • Sensu のメトリクスを蓄積して可視化する為のツールとして Graphite がほぼデファクトになっているのでマジメに触っておく(Graphite はメトリクスを蓄積する為のデータベースで graphite webappGraphite に蓄積されたメトリクスを可視化するものと考えると良いかも)
  • 上記の通り、Graphite では graphite webapp という可視化ツールがデフォっぽいけど Grafana というみんな大好き Kibana をフォークしたツールもあるので触っておく
  • 今回は Graphite に関してはこちらの Dockerfile を利用して環境を構築した


参考



Graphite


アーキテクチャ

Graphite は以下のような 3 つのコンポーネントで構成されている。

  • carbon - 時系列データを収集する(Twisted というネットワーク・プログラミング用のフレームワークで実装されている)
  • whisper - 収集した時系列データを蓄積するシンプルなデータベース
  • graphite webapp - DjangoWeb アプリケーションで実装され、オンデマンドでグラフを描画するのに Cairo が利用されている

セットアップ

それほど難しくない。ディストリビュージョンによってはパッケージが用意されているのでそちらを利用しても良いかも。


Carbon の種類

Carbon の種類という言い方が正しいのか解らないが Carbon には以下のような種類のデーモンが利用出来る。

全ての設定は carbon.conf にて設定が可能で [] で区切られたセクションで個々の設定を行う。以下、各々の特徴を簡単にピックアップ。(ドキュメントの意訳と実際に試してみた結果)

carbon-cache

  • 色々なプロトコルでメトリクスを受信してディスクに書き込む
  • メトリクスを受信するとメモリにバッファして whisper ライブラリにより適当な間隔でディスクにフラッシュする

また…

The [cache] section tells carbon-cache.py what ports (2003/2004/7002), protocols (newline delimited, pickle) and transports (TCP/UDP) to listen on.

とあるので Firewall 等では 20032004 そして 7002 ポートは開放しておく必要があるので注意。また、それぞれの用途については carbon.conf に色々とコメントが書かれているのでそちらも参考になる。

LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2003

# Set this to True to enable the UDP listener. By default this is off
# because it is very common to run multiple carbon daemons and managing
# another (rarely used) port for every carbon instance is not fun.
ENABLE_UDP_LISTENER = False
UDP_RECEIVER_INTERFACE = 0.0.0.0
UDP_RECEIVER_PORT = 2003

PICKLE_RECEIVER_INTERFACE = 0.0.0.0
PICKLE_RECEIVER_PORT = 2004

# Set to false to disable logging of successful connections
LOG_LISTENER_CONNECTIONS = True

# Per security concerns outlined in Bug #817247 the pickle receiver
# will use a more secure and slightly less efficient unpickler.
# Set this to True to revert to the old-fashioned insecure unpickler.
USE_INSECURE_UNPICKLER = False

CACHE_QUERY_INTERFACE = 0.0.0.0
CACHE_QUERY_PORT = 7002

上記は carbon.conf からポートに関する部分を抜粋したもの。2003 ポート自体がメトリクスを受け入れる為のポートのようで、デフォルトでは UDP はオフになっていることが解る。また、2004 ポートは pickle という Python 独自のデータストリーム方式でのメトリクスを待ち受けるようだ。pickle についてはこちらこちらが参考になりそう。

carbon-relay

  • メトリクスのレプリケーションとシャーディング(冗長化とスケーリング)を提供する
  • RELAY_METHOD = rules となっている場合に複数のホストで稼働している carbon-cache にメトリクスをリレーすることが出来る
  • RELAT_METHOD = consistent-hashing の場合には複数の carbon-cache ホストでのシャーディングを定義出来る
  • また、graphite-web からのデータ取り出しに際しては local_settings.pyCARBONLINK_HOSTS で定義した複数の carbon-cache ホストから読み込む

尚、Graphite のクラスタリングについては以下の記事に詳細に紹介されていた。

また、自分がなんやかんや言うよりも @y_uuki さんの以下の資料で一目瞭然!

解りやすい。

carbon-aggregator

  • carbon-cache より前で動作する
  • whisper に書き込む前にメトリクスをバッファリングすることで whisper への負荷を減らす
  • granular reporting が不要な場合にも有用で whisper のサイズ削減にも貢献する(※granular reporting の意味がイマイチ解りませんでした…)

storage-schemas.conf

storage-schemas.conf では…

  • メトリクス収集の周期と期間を定義している
  • メトリクスのパス毎に指定可能
  • 定義された内容は whisper によって解釈される

ということで、ざっくり言うとメトリクスの保存ポリシーを定義している。

尚、設定については以下の三つを設定する必要がある。

  • 設定名(という言い方が正しいか解らないけど)[] で囲む
  • pattern= は正規表現での設定が可能
  • retentions=frequency:history といフォーマットで記載

以下は例。

[hoge_collection]
pattern = hoge.huga$
retentions = 10s:14d

hoge_collection という名前で hoge.huga で終わるパスのメトリクスは 10 秒毎に取得し 14 日間保持することを示している。

また、周期や保存の期間については以下のような単位で設定が可能。

  • s - 秒
  • m - 分
  • h - 時間
  • d - 日
  • y - 年

Carbon を操作して解るメトリクスのフォーマット

そろそろうんちくも疲れてきたので…こちらを参考にして、以下のように nc を利用して Graphite のホストに対してメトリクスを送ってみる。

PORT=2003
SERVER=172.17.0.2
echo "`hostname -s`.hoge.huga.test `echo $RANDOM` `date +%s`" | nc ${SERVER} ${PORT}

適当に何度か叩いていると…

おおー。(※こちらによると nc-q0 オプションを指定しない場合には TCP 接続を開きっぱなしになるnc のバージョンもあるようなので注意する。)

ということで上記にあるように Graphite が解釈出来るメトリクスの基本的なフォーマットは以下の通りとなる。

${metric path} ${metric value} ${metric timestamp}

${metric path} については . ドットを区切りとして階層構造を持たせることが出来る。どの位の階層を持てるかを試してみたのが以下の図。

結構イケそう…(実際の限界については情報を見つけることが出来なかった)



Grafana

Kibana の従兄弟

と勝手に命名。

見ての通り Kibana にとてもよく似ているのはもちろん、グラフの設定情報については Kibana 同様に Elasticsearch に保存するような設定になっているのでちゃんと使おうとすると Elasticsearch が必要になる。

上記のようにエラーが表示される。まあ、ちょっと試す分には全然問題ないかと…


使い方

使い方はとっても簡単。一時間位使ってみた記事を以下に書いたのでそちらを見て頂くといかに簡単かが解るかも…

ポイントとしては Grafanaconfig.js にちゃんと graphite-web の設定を行えれば Graphite のメトリクスを以下のように自動で取得してくれているので、あとは必要に応じてメトリクスを選択するだけ。

グラフにメトリクスを追加したい場合でも Add Query をクリックするだけ。後は自動的に取得されている Graphite のメトリクスを選択していく。


基本的な使い方以外にも…

ドキュメントを見ると基本的な使い方以外にも以下のような機能が実装されている。

個人的に気になったのが Scripted DashboardsPlaylist の二つ。ざっくり言うと Scripted DashboardJavaScript を使って動的にダッシュボードを生成することが出来る機能、Playlist は指定した期間のグラフを保存しておいて後からも見ることが出来る機能のようだ。



まとめ

この記事を通して痛感したこと、解ったこと。


痛感したこと

  • Graphite とか Grafana 関係無しに英語力足りてねえ
  • Python 力が全く無い…

解ったこと

  • GraphiteGrafana もさらっと使う分にはとても簡単
  • Graphite については 2006 年くらいから続いているプロジェクトでかなり歴史はある(=実績もある?)
  • Graphite3 つのコンポーネント(Carbonwhispergraphite-web)がある
  • Carbon3 つのデーモン(carbon-cachecarbon-relaycarbon-aggregator)がある
  • carbon-cache はメトリクス収集、carbon-relay は冗長化とシャーディング、carbon-aggregator はバッファ
  • メトリクスデータの基本フォーマットは ${metric path} ${metric value} ${metric timestamp}
  • GrafanaElasticsearch も必要な場合があるが基本的には操作は簡単!

次やること

  • GraphiteRender URL APIwhisper について調べる
  • GrafanaScripted DashboardsPlaylist について調べる



2014 かっぱのほげふが