fluentd+influxDB+Grafanaの導入

#fluentd+influxDB+Grafanaの導入

- 時系列データをグラフ化しよう！

|**ポートを利用するライブラリ**|**目的**|**ポート番号**|
|---|---|---|
| nginx | - | 80 |
| influxDB | - | 8083 |
| influxDB | - | 8086 |
| influxDB | - | 8090 |
| influxDB | - | 8099 |
※ポート番号の解説は[influxDB installation](http://influxdb.com/docs/v0.8/introduction/installation.html)を参照

##1 nginxの導入を行います。
[~/OneDrive/Manuals/nginx.md](/Users/soushi/OneDrive/Manuals/nginx.md)に従って、nginxを導入します。

##2 influxDBの導入を行います。
[~/OneDrive/Manuals/influxDB.md](~/OneDrive/Manuals/influxDB.md)に従って、influxDBを導入します。

##3 Grafanaのダウンロード・セットアップを実行します。
###3.1 Grafana本体のダウンロードセットアップを行います。
~~~sh
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用に設定します。

~~~sh
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)のコメントアウトが解除されているかどうかをチェックすること。

<img width="906" alt="Grafana Fig 4.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/fc8ae74a-07c7-1798-b7d5-69bf578b37bb.png">


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

~~~sh
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コマンドで定期的にサンプルデータを挿入します。

~~~sh
watch -n 1 ~/SampleGenerator.sh
~~~

###2.5.3 InfluxDBのフロントエンドにアクセスして、挿入されたデータを表示します。
####2.5.3.1 http://10.0.0.1:8083/ にアクセスします。
==InfluxDBのAdmin UIにアクセス出来ない場合は、下記コマンドを実行して、データを削除する。但し、データを削除するため正式サービスでは使用できない…。==

~~~sh
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...]()
<img width="1010" alt="Grafana Fig 5.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/da488fc8-6de7-9c41-11f1-a62bc4042831.png">
<img width="1010" alt="Grafana Fig 6.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/0471353a-1f2b-391f-ed94-28ed4690d40b.png">


####2.6 Grafanaのフロントエンドにアクセスし、挿入されたデータを表示します。
#####2.6.1 http://10.0.0.1/grafana/ にアクセスします。
#####2.6.2 グラフのタイトルをクリックし、Editボタンを押します。

<img width="273" alt="Grafana Fig 7.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/cc530355-8399-b69d-2282-30f223ab900b.png">


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

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

<img width="1010" alt="Grafana Fig 8.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/738eea91-072a-497e-87d4-ab2c069f661b.png">


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

==表示されない場合は、vmのtimezoneの設定や、時刻があっているかどうかを確認すること。[こちらを参照](http://linux.kororo.jp/cont/server/ntp.php)==

- 時刻の即時調整は、ホストVM上で下記コマンドを実行

~~~sh
ntpdate clock.nc.fukuoka-u.ac.jp
~~~

<img width="1010" alt="Grafana Fig 9.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/bb41d244-d108-ba64-70b8-b8a4c6cb65b0.png">


###2.6 ホストVM上に、dockerコンテナ毎のリソース使用量監視デーモンを導入します。
####2.6.1 Go言語のインストール
|**項目**|**値**|
|---|---|
| goのインストール場所 | /usr/bin/go |
| GOPATHの値(何でも良い) | /usr/local/go |
※GOPATHの値についての解説は[こちら](http://qiita.com/yuku_t/items/c7ab1b1519825cc2c06f)

~~~sh
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コマンドの詳細については[こちら](http://stedolan.github.io/jq/)

~~~sh
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

~~~sh
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 コンテナのリソース使用量を取得してみます。
==公式マニュアルの日本語訳は[こちら](http://dev.classmethod.jp/tool/jq-manual-japanese-translation-roughly/)==
==jqコマンドの簡単な説明は[こちら](http://momijiame.tumblr.com/post/51299899637/jq)==

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

~~~sh
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"を取得すれば良いので･･･

~~~sh
curl -s http://192.168.66.201:12375/containers/31f9c4bd79b3/json | jq '.Metrics.cpuacct.cpu_usage.total_usage'
~~~

- CPUコア毎の負荷は、percpu_usageが配列になっているので、次のようにして取得します。

~~~sh
curl -s http://192.168.66.201:12375/containers/31f9c4bd79b3/json | jq '.Metrics.cpuacct.cpu_usage.percpu_usage[]'
~~~

~~~
22953770
40554065
64838051
34194559
~~~

- 0番目のCPUコアの負荷は、次のようにして取得します。

~~~sh
curl -s http://192.168.66.201:12375/containers/31f9c4bd79b3/json | jq '.Metrics.cpuacct.cpu_usage.percpu_usage[0]'
~~~

~~~
22953770
~~~

- 複数の項目のみを取り出したJSONに直すこともできます。(カンマ区切りにする)
※CPUの合計負荷とメモリ使用量を取得

~~~sh
curl -s http://192.168.66.201:12375/containers/31f9c4bd79b3/json | jq '.Metrics.cpuacct.cpu_usage.total_usage, .Metrics.memory.usage'
~~~

~~~sh
162540445
11755520
~~~

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

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

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

~~~sh
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をインストールします。
[こちらのマニュアルを参照](/Users/soushi/OneDrive/Manuals/Ruby.md)

###3.2 fluentd本体とinfluxdb用のプラグインをインストールします。
~~~sh
gem install fluentd fluent-plugin-influxdb
fluentd --setup /etc/fluent
~~~

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

~~~sh

~~~


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