サーバーエンジニアの原です。
みなさんはOS Xのシステム監視に何をお使いでしょうか?
大抵の方はアクティビティモニタやMagicanで十分かもしれませんが、今回はCUI派の方に向けて、Python製システム監視ツールの Glancesを紹介したいと思います。
また、中長期的なシステム監視を行うためにGlancesからInfluxDBという時系列データベースに監視データを送信し、グラフ描画ツールのGrafanaでグラフを表示する方法も合わせて紹介したいと思います。
要は、以下の3つのソフトウェアを使って、OS Xの中長期的システム監視をしよう、って話です。
InfluxDBやGrafanaを手軽く試したい方にもオススメです。
Glances
GlancesはPythonで書かれたクロスプラットフォームのシステム監視ツールです。
cursesというライブラリをベースに使っており、CUIでありながらカラフルな画面で構成されています。
Pythonのパッケージマネージャであるpipで簡単にインストールできます。
$ sudo pip install glances
以下のコマンドで起動します。$ glances
以下のようなUIがターミナル上に表示されます。胸が熱くなりますね。
プロセス一覧を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にアクセスすると、以下のようなクールな画面が表示します。
Grafanaでグラフ描画
それでは、ダッシュボードにグラフを追加してみましょう。
何も描画されてないグラフ領域のすぐ上にある「First Graph (Click title to edit)」をクリックすると表示されるメニューの「Edit」ボタンクリックすると、以下のようなグラフエディタ画面に遷移します。
右下の紫色のボックス内が「glances_db」であることを確認して、グラフに描画するデータを取得するためのクエリを追加していきます。
「Add Query」ボタンで、データ取得クエリを追加できます。
以下のように入力してみてください。
こんな感じでグラフが描画されます。いい感じ。
初期状態では、グラフには6時間前から現在までのグラフが表示されています。
これは画面上方の「Zoom Out」の右側にあるドロップダウンメニューで変更することができます。
5分前から30日前までが選択肢として提供されている他、任意の期間を設定することもできます。
任意の期間の設定は、グラフ内のx軸に沿ってドラッグすることでも設定できます。
「Back to Dashboard」でダッシュボードに戻ります。
右上のフロッピーディスクアイコンでダッシュボードの保存をすることができるので、忘れずに保存しておきましょう。
ちょっと時間をかければ以下のようなダッシュボードを簡単に作ることができます。色々試してみてください。
まとめ
クロスプラットフォームの監視ツールGlances、そして監視データのInfluxDBへのエクスポート方法とGrafanaによるグラフ描画をご紹介しました。
普段お使いのマシンで中長期的なシステム監視をしたくなったら、試してみてください。
おまけ
ちなみに自分が使っているVPS上のFreeBSDでもGlancesは動作しました。
InfluxDBへの監視データエクスポートも無事動作したのでsupervisordで動作させようかと思ったのですが、デーモンでの使用を想定していないためかcursesが原因でエラーを吐いて動作させることができませんでした。
内部のPythonコードをいじってcursesを使用しないモードを実装したのですが、今度はセグフォで落ちるようになってしまい完全に詰み。
pdbで追っても原因わからずじまいで、開発者へのPRが上げられない・・・。ちょっと何とかしたいです。
ですので、サービスを乗せているマシンのシステム監視にはGlancesはオススメできません。