読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

Glancesを使ったシステム監視 〜 InfluxDBとGrafanaを添えて

Monitoring

サーバーエンジニアの原です。

みなさんはOS Xのシステム監視に何をお使いでしょうか?

大抵の方はアクティビティモニタやMagicanで十分かもしれませんが、今回はCUI派の方に向けて、Python製システム監視ツールの Glancesを紹介したいと思います。

また、中長期的なシステム監視を行うためにGlancesからInfluxDBという時系列データベースに監視データを送信し、グラフ描画ツールのGrafanaでグラフを表示する方法も合わせて紹介したいと思います。

要は、以下の3つのソフトウェアを使って、OS Xの中長期的システム監視をしよう、って話です。

  • Glances : Python製のシステムモニタリングツール
  • InfluxDB : Go製の時系列データベース
  • Grafana : グラフ描画ツール(Webアプリ)

InfluxDBやGrafanaを手軽く試したい方にもオススメです。

Glances

GlancesはPythonで書かれたクロスプラットフォームのシステム監視ツールです。
cursesというライブラリをベースに使っており、CUIでありながらカラフルな画面で構成されています。

Pythonのパッケージマネージャであるpipで簡単にインストールできます。

$ sudo pip install glances

以下のコマンドで起動します。
$ glances

以下のようなUIがターミナル上に表示されます。胸が熱くなりますね。

スクリーンショット 2015-03-21 16.05.09

プロセス一覧をcキーでCPU使用率でソート、mキーでメモリ使用率でソートできます。
詳細はhキーを押して表示できるヘルプを参照してください。
なお、qキーで終了します。

なおGlancesには、CSVへのエクスポート・Webブラウザで表示・StatsDへの監視データ送信・RAIDやSNMP、Dockerなどの監視などの付加機能も組み込まれています。

今回は、InfluxDBへの送信機能のみを使いますが、興味のある方は他の機能も試してみてください。

InfluxDB

InfluxDBは、近年注目を集めている時系列データベースの一つで、Go言語で書かれています。
APIがHTTPで提供されているためクライアントが実装しやすい点や
SQLライクなクエリ言語、Webブラウザでの管理コンソールを備えている点などが特徴としています。

Homebrewの場合、以下のコマンドでインストールできます。
$ brew install influxdb

以下のコマンドで起動します。-configオプションで設定ファイルを指定しています。
今回は特に設定ファイルを修正する必要はありません。
$ sudo influxdb -config /usr/local/etc/influxdb.conf

起動したら、監視データ保存用のデータベースを作成します。
Webブラウザで使用できる管理コンソールからも作成できますが、めんどくさいのでコマンドでHTTP APIを叩きます。
また、のちに使用するGrafanaの設定情報を保存するデータベースも合わせて作成しておきます.

$ curl -X POST 'http://localhost:8086/db?u=root&p=root' -d '{"name": "glances_db"}'
$ curl -X POST 'http://localhost:8086/db?u=root&p=root' -d '{"name": "grafana_db"}'

以下のコマンドで、データベースを意図どおりに作成できたことを確認しましょう。

$ curl 'http://localhost:8086/db?u=root&p=root'

GlancesからInfluxDBに監視データを送信する

GlancesにはInfluxdbへの監視データを送信する機能が既に組み込まれていますが、
それを有効にするには、Python製のInfluxDBクライアントが必要なのでpipでインストールしておきます。

$ pip install influxdb

Glancesの設定ファイルglances.conf内には、デフォルトのInfluxDB接続先の設定がされていますが、それを先ほど作成したデータベースのものに修正しておきます。

glances.confは、/usr/local/etc/glancesディレクトリ内にあります。
[influxdb]の項目を探して、以下のように修正してください。

glances.conf

[influxdb]  
host=localhost  
port=8086  
user=root  
password=root  
db=glances_db

--export-influxdb オプションを使用することで、InfluxDBへの監視データ送信機能を有効にできます。

$ glances --export-influxdb

--export-influxdb オプション無しで実行したときと同じような出力がされますが、内部でInfluxDBに表示されているデータと同じものを送信しています。

以下のコマンドで、InfluxDBに監視データが送信されていることを確認しましょう。

$ curl -G 'http://localhost:8086/db/glances_db/series?u=root&p=root&pretty=true' \
--data-urlencode "q=select * from cpu limit 3"

Grafana

Grafanaは、GraphiteやInfluxDBなどをソースとしたグラフやダッシュボードの生成を行うWebアプリケーションです。見た目がカッコイイことで有名です。

現在の最新リリースバージョンである1.9.1では、フロントエンドのJavaScriptやHTML、CSSのみで構成されていますが、現在開発中の2.0ではGo言語ベースのサーバーサイドアプリケーションになるようです。

今回は、安定している1.9.1を利用します。
(2.0も試したのですが、コンパイルエラーになってしまいました。いずれご紹介する予定です)

最新バージョンをダウンロードして、Webサーバーで公開すれば使えるようになります。

$ curl -O http://grafanarel.s3.amazonaws.com/grafana-1.9.1.tar.gz
$ tar xjf grafana-1.9.1.tar.gz

InfluxDBに接続設定を設定ファイルに追加しておきます。

$ cd grafana-1.9.1/
$ cp config.sample.js config.js

config.js

  datasources: {  
    glances_db: {  
        type: 'influxdb',  
        url: "http://127.0.0.1:8086/db/glances_db",  
        username: 'grafana',  
        password: 'grafana',  
    },  
    grafana_db: {  
        type: 'influxdb',  
        url: "http://127.0.0.1:8086/db/grafana_db",  
        username: 'grafana',  
        password: 'grafana',  
        grafanaDB: true  
    },  
  },

Pythonには簡易的なWebサーバーが内包されているので、
今回はそれを使用してGrafanaをWebブラウザから使ってみましょう。

$ python -m SimpleHTTPServer 9000

Webブラウザでlocalhost:9000にアクセスすると、以下のようなクールな画面が表示します。

スクリーンショット 2015-03-21 15.24.16

Grafanaでグラフ描画

それでは、ダッシュボードにグラフを追加してみましょう。

何も描画されてないグラフ領域のすぐ上にある「First Graph (Click title to edit)」をクリックすると表示されるメニューの「Edit」ボタンクリックすると、以下のようなグラフエディタ画面に遷移します。

スクリーンショット 2015-03-21 15.32.25

右下の紫色のボックス内が「glances_db」であることを確認して、グラフに描画するデータを取得するためのクエリを追加していきます。
「Add Query」ボタンで、データ取得クエリを追加できます。

以下のように入力してみてください。

スクリーンショット 2015-03-21 15.38.31

こんな感じでグラフが描画されます。いい感じ。

スクリーンショット 2015-03-21 15.40.44

初期状態では、グラフには6時間前から現在までのグラフが表示されています。
これは画面上方の「Zoom Out」の右側にあるドロップダウンメニューで変更することができます。
5分前から30日前までが選択肢として提供されている他、任意の期間を設定することもできます。
任意の期間の設定は、グラフ内のx軸に沿ってドラッグすることでも設定できます。

「Back to Dashboard」でダッシュボードに戻ります。
右上のフロッピーディスクアイコンでダッシュボードの保存をすることができるので、忘れずに保存しておきましょう。

ちょっと時間をかければ以下のようなダッシュボードを簡単に作ることができます。色々試してみてください。

スクリーンショット 2015-03-21 16.03.02

まとめ

クロスプラットフォームの監視ツールGlances、そして監視データのInfluxDBへのエクスポート方法とGrafanaによるグラフ描画をご紹介しました。
普段お使いのマシンで中長期的なシステム監視をしたくなったら、試してみてください。

おまけ

ちなみに自分が使っているVPS上のFreeBSDでもGlancesは動作しました。
InfluxDBへの監視データエクスポートも無事動作したのでsupervisordで動作させようかと思ったのですが、デーモンでの使用を想定していないためかcursesが原因でエラーを吐いて動作させることができませんでした。
内部のPythonコードをいじってcursesを使用しないモードを実装したのですが、今度はセグフォで落ちるようになってしまい完全に詰み。
pdbで追っても原因わからずじまいで、開発者へのPRが上げられない・・・。ちょっと何とかしたいです。

ですので、サービスを乗せているマシンのシステム監視にはGlancesはオススメできません。