鱒身(Masu_mi)のブログ

知った事をメモする場所。

メトリクス可視化をやってみた(Diamond + InfluxDB + Grafana)

Diamond + InfluxDB + Grafanaでメトリックス集計した。無理やり入れた感が否めない。

今日の方針

  • 収集にはDiamondを使う
  • Diamondはvirtualenvのpython27環境にpipでインストールする
  • NginxのメトリックスもDiamondで収集する
  • InfluxDBGraphite_インタフェースを利用する
  • 可視化はGrafanaを利用する
  • Grafanaのユーザー管理はGithub OAuthを利用する

Diamon

Diamondのロゴ

Pythonで書かれたメトリックスの収集・転送を行うエージェント。 メトリックスの収集を行うcollectorと転送を行うhandlerによって構成されている。

ソースコード

簡単にソースコードを追った。

bin/diamond
プログラムのエントリポイント オプション処理, デーモン化, フォーク処理, シグナルハンドラ設定, サーバー起動処理
diamond/server.py
Server定義を行っている
diamond/handler/*
データ転送に用いるhandlerのプリインが各種置かれている
/usr/share/diamond/collector/*
データ収集に用いるcollectorのプリインが各種置かれている

server.py:Server.run の処理

  1. Config処理

  2. collectorロード

  3. handlerロード

  4. multiprocessingを使ってhandler起動

  5. 収集開始(無限ループ突入)

    5.a. multiprocessingを使ってcollector起動

設定ファイル

通常は/etc/diamond/diamond.conf が設定ファイルとして読み込まれる。

コレクター・ハンドラーの有効化

設定項目collectors_path, handlers_config_pathによってcollector, handlerの読込先ディレクトリが定義されている。 そのため、これらの指定ディレクトリにpythonコードを配置すればロード可能となる。 ロードするかの設定は各プラグインそれぞれデフォルトで enabled = False のため無効となっている。 そのため実際に有効化するには設定ファイルでenabled = Trueとする必要がある。

実際には以下の2つの方法がある。

diamond.confを書き換える方法

通常の設定ファイルを変更する。

$ cat /etc/diamond/diamond.conf
...
[[XxxxxXxxxx]] ## XxxxxXxxxx : collector, handler名
enabled = True
...
プラグイン用設定ファイルを作成する方法

設定ファイルに指定されているプラグイン用のディレクトリにプラグイン用の設定ファイルを配置する。 collectorについてはdiamond-setupというテンプレート生成コマンドが準備されている。 設定ファイル用ディレクトリを指定する項目はそれぞれhandlerはcollectors_config_path, handlers_config_path の2つ。

$ diamond-setup --print -C XxxxxXxxxx # XxxxxXxxx : プラグイン名
$ cat /etc/diamond/collector/XxxxXxxx.conf
enabled = True

インストールと設定と起動

python27を使う。

$ scl enable python27 bash
$ pip install diamon
$ cd ${path_to_repo} && sudo cp ./bin/init.d/diamond /etc/init.d/diamon

python26 使ってしまったりと不都合があったため、/etc/init.d/diamond を書き換える。

DAEMON=/opt/rh/python27/root/usr/bin/diamond
. /opt/rh/python27/enable

実行ユーザーを準備する。

$ sudo adduser diamond -s /sbin/nologin
$ sudo passwd -d diamond

はじめにNginx側から提供するように監視用のエンドポイントを設定する。

$ cat <<EOF | tee -a /etc/nginx/conf.d/default.conf
server {
    listen 127.0.0.1:8080;
    server_name localhost;
    location /nginx_status {
        stub_status on;
        access_log /data/server/shared/log/access.log;
        allow 127.0.0.1;
        deny all;
    }
}
EOF
$ sudo service nginx restart

DiamondのNginxCollectorを有効にする。 先ほど設定したエンドポイントはNginxCollectorのデフォルト設定に合わせてあるため有効にするだけで良い

cat <<EOF | sudo tee /etc/diamond/collectors/NginxCollector.conf
    enabled  = True
EOF

Diamondを起動する

sudo service diamond start
tail -F /var/log/diamond/diamond.log
[2016-10-01 13:14:18,186] [MainThread] Changed UID: 1002 (diamond) GID: 0 ().
[2016-10-01 13:14:18,186] [MainThread] Detaching Process.

デバッグログの出し方

設定ファイルに以下を設定する。

[logger_root]
# to increase verbosity, set DEBUG
level = DEBUG

InfluxDB

InfluxDBのロゴ

Goで書かれたMITライセンスの時系列データベース。

  • 書き込み速度と高可用性に最適化しようとしている
  • APIはHTTP(S)をサポートしておりSQL-likeなクエリ言語も提供している
  • Graphite, collectd, OpenTSDB など他のプロトコルによる入力もサポートしている

ソースコード

簡単にソースコードを追った。

influxd(server) ./cmd/influxd/main.go がエントリポイント
influx(client) ./cmd/influx/main.go がエントリポイント

influxd(Server)の構造

./cmd/influxd:Main
コマンド全体プロセス * サブコマンドのディスパッチ * サーバーが停止しないようにブロックする
./cmd/influxd/run:Command
サブコマンド(influxd run)に対応する サーバーの設定読み込み
./cmd/influxd/run:Server

サーバー本体に対応する構造体 NewServer(): サーバー機能に必要なセットアップを一通り済ませる

ログファイル, meta:Client, その他のリソース確保
Open(): サーバー提供
appendXxxxService() などを用いて提供サービスを読み込み、実行
./service/*
各種サービス * meta:Client はNewServerで読み込まれる * 他はだいたいOpenで読み込まれる

インストールと設定と起動

yumでインストールする

$ cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo
[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
EOF
$ sudo yum install influxdb

DiamondがInfluxDBのインタフェースに転送しようとしたところ失敗したため。 Graphite互換インタフェースを有効にする。

$ vim /etc/influxdb/influxdb.conf
...
[[graphite]]
  # enabled = false
  enabled = true
...

起動する。

$ sudo service influxdb start

Grafana

時系列データ・メトリックスの問い合わせ・可視化ツール。

  • サポートしている時系列データソースが多い

    Graphite, ElasticSearch, Cloudwatch, Prometheus, InfluxDB, OpenTSDB, KairosDB

  • 認証機能が充実している

    LDAP, BasicAuth, Auth Proxy

  • 注釈を付けられる

  • スナップショットが取得でき他メンバーに共有できる

ソースコード

読んだ感じ、キャンセレーションにcontextを既に使っていたりとGo言語でWebアプリ書く参考になりそうだった。

./pkg/cmd/grafana-server/main.go
エントリポイントでserver.Start()している
./pkg/cmd/grafana-server/server.go
web frameworkとしてmacaronを使っている

また.editconfigがあった。初めて知った。 人間関係を壊したくないのでeditorconfig/editorconfig-vimをインストールします。

インストールと設定と起動

yumでインストールする

$ cat <<EOF | sudo tee /etc/yum.repos.d/grafana.repo
[grafana]
name=grafana
baseurl=https://packagecloud.io/grafana/stable/el/6/\$basearch
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packagecloud.io/gpg.key https://grafanarel.s3.amazonaws.com/RPM-GPG-KEY-grafana
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF
$ sudo yum install grafana

GitHubでのOAuth認証を有効にする。

GitHub上で Settings > OAuth Applications の項目からアプリケーションを登録する。

選択場所

開く

選択場所

書く

grafana側でauth.githubを有効にする <http://docs.grafana.org/installation/configuration/#authgithub>。 設定項目を見るとauth_url, token_urlが存在するのでGitHub Enterprise も使えそう。 他にも認証オプションは豊富

$ vim /etc/grafana/grafana.ini
[auth.github]
enabled = true
allow_sign_up = true
client_id = ################
client_secret = ######################################
scopes = user:email,read:org
auth_url = https://github.com/login/oauth/authorize
token_url = https://github.com/login/oauth/access_token
api_url = https://api.github.com/user
team_ids =
allowed_organizations =

起動する。

$ sudo service grafana-server start

結果

対象サーバーはiptablesでポート閉じまくっているのでトンネルを掘って利用する。

$ ssh -L 8083:localhost:8083 -L 3000:localhost:3000 -L 8086:localhost:8086 ${target_host}
loginの選択肢にgithubが入っているスクリーンショット

loginでGithubを利用できる

アクセスしてmetrixを設定するとちゃんとグラフを見ることができた。

Grafanaのダッシュボード

Grafanaのダッシュボード

ちゃんとGitHub上で認証ユーザーが1人増えていることも確認できた。

OAuth 管理画面のスクリーンショット(1User利用中)

利用者が1人になっている

競合製品が多くこれから一歩ずつ知識を深め広めて検討できる状態にしたい。 一旦は比較対象になる組み合わせで稼働させられてよかった。