Graphite で SmokePing 的なものを Part1

自分の家から借りている VPSPing を飛ばしてデータをグラフ化したいと思ったわけです。調べてみるとその手のもので有名な奴は "SmokePing" というもの。

早速試してみたわけですが、何故かとてつもなく遅い。というわけで違う方法がないかと思い、"Graphite" というものにたどり着きました。

今回は Graphite を手っ取り早く動かすまでやってみます。

Graphite

概要

公式ページには

Graphite - Scalable Realtime Graphing

と書かれています。様々なデータを可視化してくれるイメージでしょうか。

さらに公式ドキュメントには以下のような記載があります。

  1. Store numeric time-series data
  2. Render graphs of this data on demand

時系列でデータを保存して、いつでもグラフとして可視化可能になるみたいです。

構造

以下の3つの要素で構成されています。

  1. carbon : 時系列データを収集するデーモン
  2. whisper : 時系列データを保存するデータベースライブラリ
  3. graphite webapp : グラフを描画して表示する Web インターフェース

carbon が口を開けて待っていて、そこに投げ込まれたデータを whipser が保存し、 graphite webapp で見るという感じでしょうか。

インストール方法

インストールをする前に必要なモジュールが入っているか調べましょう。

$ git clone https://github.com/graphite-project/graphite-web.git
$ cd graphite-web
$ ./check-dependencies.py

足りないモジュールをインストールし終わったら、graphite のインストール作業に入ります。

# pip install 
# pip install carbon
# pip install whisper
# pip install graphite-web

データベースを初期化します。

$ PYTHONPATH=`pwd`/webapp:`pwd`/whisper sudo python ./webapp/graphite/manage.py syncdb
Could not import graphite.local_settings, using defaults!
/opt/graphite/webapp/graphite/settings.py:244: UserWarning: SECRET_KEY is set to an unsafe default. This should be set in local_settings.py for better security
  warn('SECRET_KEY is set to an unsafe default. This should be set in local_settings.py for better security')
Operations to perform:
  Synchronize unmigrated apps: account, cli, render, whitelist, metrics, url_shortener, dashboard, composer, events, browser
  Apply all migrations: admin, contenttypes, tagging, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Creating table account_profile
    Creating table account_variable
    Creating table account_view
    Creating table account_window
    Creating table account_mygraph
    Creating table dashboard_dashboard
    Creating table events_event
    Creating table url_shortener_link
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying sessions.0001_initial... OK
  Applying tagging.0001_initial... OK

You have installed Django's auth system, and don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'root'):
Email address: <your email address>
Password:
Password (again):
Superuser created successfully.

次に、データを集める carbon デーモンを起動します。

# ここからは sudo -s で root になっています。(面倒臭かったので。。)
root@raspberrypi:/opt/graphite# PYTHONPATH=`pwd`/whisper ./bin/carbon-cache.py start
Error: missing required config /opt/graphite/conf/storage-schemas.conf

storage-schemas.conf は storage-schemas.conf.example として存在していたのでリネームして再び起動します。

root@raspberrypi:/opt/graphite/conf# cp storage-schemas.conf.example storage-schemas.conf
root@raspberrypi:/opt/graphite# PYTHONPATH=`pwd`/whisper ./bin/carbon-cache.py start
Starting carbon-cache (instance a)

次に graphite webapp を起動します。

root@raspberrypi:/opt/graphite# PYTHONPATH=`pwd`/whisper:`pwd`/webapp ./bin/run-graphite-devel-server.py  /opt/graphite/
Running Graphite from /opt/graphite/ under django development server

/usr/local/bin/django-admin runserver --pythonpath /opt/graphite/webapp --settings graphite.settings 0.0.0.0:8080
/opt/graphite/webapp/graphite/settings.py:244: UserWarning: SECRET_KEY is set to an unsafe default. This should be set in local_settings.py for better security
  warn('SECRET_KEY is set to an unsafe default. This should be set in local_settings.py for better security')
/opt/graphite/webapp/graphite/settings.py:244: UserWarning: SECRET_KEY is set to an unsafe default. This should be set in local_settings.py for better security
  warn('SECRET_KEY is set to an unsafe default. This should be set in local_settings.py for better security')
Performing system checks...

System check identified no issues (0 silenced).
May 14, 2015 - 16:45:19
Django version 1.8.1, using settings 'graphite.settings'
Starting development server at http://0.0.0.0:8080/
Quit the server with CONTROL-C.

早速 Web インターフェースにアクセスしてみましょう。

f:id:ryouta768:20150515021002p:plain

次にデータを投げつけてみましょう。データ収集デーモンである Carbon はポート 2003 で LISTEN しているので netcat を使ってデータを投げます。

☁  ~  while true; do
while> echo "test.key.value1 $RANDOM `date +%s`" | nc -c X.X.X.X 2003
while> sleep 10
while> done

投げつけるデータの形式は、

<metric path> <metric value> <metric timestamp>

です。

投げつけたデータを可視化してみましょう。Web インターフェースにアクセスしてみます。

f:id:ryouta768:20150515021031p:plain

無事グラフが表示されました。

結構投げやりな感じで Graphite の設定をしてみました。ところどころ Warning も出てますが。。。

Part1はここまでということで。