fluentd+influxDB+Grafanaの導入


fluentd+influxDB+Grafanaの導入

  • 時系列データをグラフ化しよう!
ポートを利用するライブラリ 目的 ポート番号
nginx - 80
influxDB - 8083
influxDB - 8086
influxDB - 8090
influxDB - 8099

※ポート番号の解説はinfluxDB installationを参照

1 nginxの導入を行います。

~/OneDrive/Manuals/nginx.mdに従って、nginxを導入します。

2 influxDBの導入を行います。

~/OneDrive/Manuals/influxDB.mdに従って、influxDBを導入します。

3 Grafanaのダウンロード・セットアップを実行します。

3.1 Grafana本体のダウンロードセットアップを行います。

mkdir /usr/local/download
cd /usr/local/download
yum -y install wget
yum -y install tar
wget http://grafanarel.s3.amazonaws.com/grafana-1.9.1.tar.gz
tar xzvf grafana-1.9.1.tar.gz
mv grafana-1.9.1 grafana
mv grafana /var/www

3.2 GrafanaをInfluxDB用に設定します。

cd /var/www/
cp /var/www/grafana/config.sample.js /var/www/grafana/config.js
vi grafana/config.js
  • vi grafana/config.js
  • ==コメントアウトを解除すること==
datasources: {
        influxdb: {
          type: 'influxdb',
          url: "http://10.0.0.1:8086/db/grafanadb",
          username: 'soushi',
          password: 'soushi',
        },
        grafana: {
          type: 'influxdb',
          url: "http://10.0.0.1:8086/db/grafanaconf",
          username: 'soushi',
          password: 'soushi',
          grafanaDB: true
        },
      },

2.4 Grafanaのフロントエンドにアクセスします。

2.4.1 ブラウザでhttp://10.0.0.1:80/grafana/ にアクセスする。

  • 下記画面が表示されれば正常。もし、上のバーのみ表示されて、他には何も表示されない(Welcome to Grafanaなどが表示されない)場合、grafanaの設定ファイル(/var/www/html/grafana/config.js)のコメントアウトが解除されているかどうかをチェックすること。

2.5 サンプルデータの挿入

2.5.1 InfluxDBにサンプルデータを挿入するスクリプトを作成します。

cat <<< '#!/bin/bash

T=`ruby -e "puts Time.now.to_i * 1000"`
V=`echo $RANDOM`
cat << EOT > data
[
  {
    "name": "sample",
    "columns": ["time", "value"],
    "points": [
      [$T, $V]
    ]
  }
]
EOT
curl -v --dump-header - -X POST "http://localhost:8086/db/grafanadb/series?u=soushi&p=soushi" -d @data' > ~/SampleGenerator.sh
  • 作成されるジェネレータスクリプト(SampleGenerator.sh)の内容
#!/bin/bash

T=`ruby -e "puts Time.now.to_i * 1000"`
V=`echo $RANDOM`
cat << EOT > data
[
  {
    "name": "sample",
    "columns": ["time", "value"],
    "points": [
      [$T, $V]
    ]
  }
]
EOT
curl -v --dump-header - -X POST "http://localhost:8086/db/grafanadb/series?u= soushi&p= soushi" -d @data
chmod +x ~/SampleGenerator.sh

2.5.2 watchコマンドで定期的にサンプルデータを挿入します。

watch -n 1 ~/SampleGenerator.sh

2.5.3 InfluxDBのフロントエンドにアクセスして、挿入されたデータを表示します。

2.5.3.1 http://10.0.0.1:8083/ にアクセスします。

==InfluxDBのAdmin UIにアクセス出来ない場合は、下記コマンドを実行して、データを削除する。但し、データを削除するため正式サービスでは使用できない…。==

rm -rf /opt/influxdb/shared/data/raft/

2.5.3.2 ログインします。

設定値
初期ログインID root
初期パスワード root
ホストネーム 10.0.0.1
ホストポート番号 8086

2.5.3.3 grafanadb -> Explore Dataをクリックし、SELECT文を発行します。「select * from sample」

uploading Grafana Fig 5.png...

2.6 Grafanaのフロントエンドにアクセスし、挿入されたデータを表示します。

2.6.1 http://10.0.0.1/grafana/ にアクセスします。
2.6.2 グラフのタイトルをクリックし、Editボタンを押します。

2.6.3 Graph-Metrics->series項目に、「sample」を追加します。

![Grafana - データソースの選択 - シリーズの選択]

2.6.4 グラフが表示されます。

==表示されない場合は、vmのtimezoneの設定や、時刻があっているかどうかを確認すること。こちらを参照==

  • 時刻の即時調整は、ホストVM上で下記コマンドを実行
ntpdate clock.nc.fukuoka-u.ac.jp

2.6 ホストVM上に、dockerコンテナ毎のリソース使用量監視デーモンを導入します。

2.6.1 Go言語のインストール

項目
goのインストール場所 /usr/bin/go
GOPATHの値(何でも良い) /usr/local/go

※GOPATHの値についての解説はこちら

yum -y --enablerepo=epel install golang
mkdir /usr/local/go
echo 'export GOPATH=/usr/local/go' >> /etc/profile
export GOPATH=/usr/local/go

2.6.2 jqコマンドをインストールします。

jqコマンドの詳細についてはこちら

cd /usr/local/download
wget http://stedolan.github.io/jq/download/linux64/jq
chmod +x jq
mv jq /usr/local/bin/

2.6.3 コンテナリソース使用量監視デーモンを設定・起動します。

2.6.3.1

mkdir /usr/local/download
cd /usr/local/download
git clone https://github.com/maebashi/docker-metricsd.git
cd docker-metricsd
go get -d -v
go build docker-metricsd.go
mv /usr/local/download/docker-metricsd/docker-metricsd /etc/init.d/

2.6.3.2 コンテナのリソース使用量を取得してみます。

==公式マニュアルの日本語訳はこちら==
==jqコマンドの簡単な説明はこちら==

-curl http://<ホストVMのIPアドレス>:12375/containers/<監視するdockerのID(docker psコマンドで表示されるID)>/json | jq .

curl -s http://192.168.66.201:12375/containers/31f9c4bd79b3/json | jq .
  • jqコマンドの結果、下記のように整形されて表示されます。
(略)
   "cpuacct": {
      "cpu_usage": {
        "total_usage": 162540445,
        "percpu_usage": [
          22953770,
          40554065,
          64838051,
          34194559
        ],
        "usage_in_kernelmode": 30000000,
        "usage_in_usermode": 0
      },
      "throttling_data": {}
    },
    "memory": {
      "usage": 11755520,
      "max_usage": 12083200,
      "stats": {
        "active_anon": 2441216,
        "active_file": 2342912,
...
  • jqコマンドでCPU負荷を取得します。
  • つまり"Metrics"->"cpuacct"->"cpu_usage"->"total_usage"を取得すれば良いので・・・
curl -s http://192.168.66.201:12375/containers/31f9c4bd79b3/json | jq '.Metrics.cpuacct.cpu_usage.total_usage'
  • CPUコア毎の負荷は、percpu_usageが配列になっているので、次のようにして取得します。
curl -s http://192.168.66.201:12375/containers/31f9c4bd79b3/json | jq '.Metrics.cpuacct.cpu_usage.percpu_usage[]'
22953770
40554065
64838051
34194559
  • 0番目のCPUコアの負荷は、次のようにして取得します。
curl -s http://192.168.66.201:12375/containers/31f9c4bd79b3/json | jq '.Metrics.cpuacct.cpu_usage.percpu_usage[0]'
22953770
  • 複数の項目のみを取り出したJSONに直すこともできます。(カンマ区切りにする) ※CPUの合計負荷とメモリ使用量を取得
curl -s http://192.168.66.201:12375/containers/31f9c4bd79b3/json | jq '.Metrics.cpuacct.cpu_usage.total_usage, .Metrics.memory.usage'
162540445
11755520

==jqでbash変数の値を使う方法==

  • --arg VAR_NAME $VARNAMEオプションを使う。
  • NAME="soushi"; jq --arg NAME $NAME '{"name": $NAME}'

2.6.3.3 influxdbにリソース使用量を送信するスクリプトを生成します。

cat <<< '#!/bin/bash

T=`ruby -e "puts Time.now.to_i * 1000"`
data=`curl -s http://192.168.66.201:12375/containers/31f9c4bd79b3/json | jq --arg T $T  "[{"name": "cpu_total_usage", "columns": ["time", "values"], "points": [[$T, .Metrics.cpuacct.cpu_usage.total_usage]]}, {"name": "memory_usage", "columns": ["time", "values"], "points": [[$T, .Metrics.memory.usage]]}]"`

curl -v --dump-header - -X POST "http://10.0.0.1:8086/db/grafanadb/series?u=soushi&p=soushi" -d @data' > ~/send_container_status.sh

3 fluentdを導入します。

名前 場所
fluentd本体 /usr/local/rvm/gems/ruby-1.9.3-p551/bin/fluentd
fluentd設定ファイル /etc/fluent/fluent.conf

3.1 Ruby+gemsをインストールします。

こちらのマニュアルを参照

3.2 fluentd本体とinfluxdb用のプラグインをインストールします。

gem install fluentd fluent-plugin-influxdb
fluentd --setup /etc/fluent

4 サンプルプログラムのダウンロードと実行



  • 第1章〜第2章(grafana+influxdb)までの実行コードはこちら
  • 第1章〜第2章(grafana+influxdb)までを実行済みのdockerファイルはこちら
  • 第3章(fluentd)のみの実行コードはこちら
  • 第1章〜第3章(grafana+influxdb+fluentd)までの実行コードはこちら
  • 第1章〜第3章(grafana+influxdb+fluentd)までを実行済みのdockerファイルはこちら
  • 第1章〜第4章まで全てを実行するための実行コードはこちら