fluentd/Elasticsearch/kibanaを試す: (2)基本構成/起動/停止

#はじめに
ログ収集、可視化などに良く使われているらしいfluentd, Elasticsearch, kibanaを試してみた時のメモです。
今回は最低限の構成を行って各コンポーネントの起動/停止、単体での簡易的な動作確認などやってみます。
※バージョンによって構成ファイルの書き方など結構変わっている部分が多いです。特にfluentdはV0.x(td-agent v2)とV1.0(td-agent v3)でtd-agent.confが結構変わっているようなので、古い情報を参考にしていると動かなかったりするので注意！

##関連記事

[fluentd/Elasticsearch/kibanaを試す: (1)インストール](https://qiita.com/tomotagwork/items/6c8e7ad59095bce9a21e)
[fluentd/Elasticsearch/kibanaを試す: (2)基本構成/起動/停止](https://qiita.com/tomotagwork/items/572d46d59c3eb5723a4d)

#fluentd

## 最低限の構成

構成ファイル: /etc/td-agent/td-agent.conf

起動/停止を行うだけであれば、特に設定に手を入れなくても(デフォルトの設定で)起動/停止はできました。

## fluentdの起動/停止

起動コマンド: systemctl start td-agent.service
停止コマンド: systemctl stop td-agent.service
確認コマンド: systemctl status td-agent.service

```xxx:起動
[root@test06 ~]# systemctl start td-agent.service

```

正常に起動すれば特にメッセージは無し

```xxx:ステータス確認
[root@test06 /etc/td-agent]# systemctl status td-agent.service
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/usr/lib/systemd/system/td-agent.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2018-06-05 20:09:36 JST; 46s ago
     Docs: https://docs.treasuredata.com/articles/td-agent
  Process: 1898 ExecStart=/opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid (code=exited, status=0/SUCCESS)
 Main PID: 1904 (fluentd)
    Tasks: 11
   CGroup: /system.slice/td-agent.service
           tq1904 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.l...
           mq1909 /opt/td-agent/embedded/bin/ruby -Eascii-8bit:ascii-8bit /opt/td-agent/embedded/bin/fluentd --log /var...

 6月 05 20:09:35 test06 systemd[1]: Starting td-agent: Fluentd based data collector for Treasure Data...
 6月 05 20:09:36 test06 systemd[1]: Started td-agent: Fluentd based data collector for Treasure Data.
```

この時、fluentd関連のプロセスはtd-agentというユーザー権限で実行されています。(インストール時にユーザー:td-agent, グループ:td-agentが追加されています)

```xxx:起動時のプロセス状況
[root@test06 /etc/td-agent]# ps -ef | grep td-agent
td-agent  1904     1  0 20:09 ?        00:00:00 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
td-agent  1909  1904  1 20:09 ?        00:00:00 /opt/td-agent/embedded/bin/ruby -Eascii-8bit:ascii-8bit /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid --under-supervisor
root      1999  1803  0 20:10 pts/0    00:00:00 grep --color=auto td-agent
```

```xxx:停止
[root@test06 /etc/td-agent]# systemctl stop td-agent.service

```

```xxx:ステータス確認
[root@test06 /etc/td-agent]# systemctl status td-agent.service
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/usr/lib/systemd/system/td-agent.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: https://docs.treasuredata.com/articles/td-agent

 6月 05 20:09:35 test06 systemd[1]: Starting td-agent: Fluentd based data collector for Treasure Data...
 6月 05 20:09:36 test06 systemd[1]: Started td-agent: Fluentd based data collector for Treasure Data.
 6月 05 20:11:15 test06 systemd[1]: Stopping td-agent: Fluentd based data collector for Treasure Data...
 6月 05 20:11:15 test06 systemd[1]: Stopped td-agent: Fluentd based data collector for Treasure Data.
 6月 05 20:11:31 test06 systemd[1]: Starting td-agent: Fluentd based data collector for Treasure Data...
 6月 05 20:11:31 test06 systemd[1]: Started td-agent: Fluentd based data collector for Treasure Data.
 6月 05 20:11:57 test06 systemd[1]: Stopping td-agent: Fluentd based data collector for Treasure Data...
 6月 05 20:11:58 test06 systemd[1]: Stopped td-agent: Fluentd based data collector for Treasure Data.
```

##簡易テスト
単純な構成をして動作確認をしてみます。
fluentdの構成ファイルを以下のように指定します。

```td-agent.conf
<system>
  log_level debug
</system>

<source>
  @type forward
  @id input_forward
</source>

<match *.*>
  type stdout
</match>
```

`<source>`で[forward input plugin](https://docs.fluentd.org/v1.0/articles/in_forward) というのを使う設定をしています(in_forward)。
これによりfluentdが特定のポートでリモートからのログを受け付けてくれます。(他のノードのfluentdからフォワードされてきたり、fluentdのクライアントからログ送信が行われることを想定しているようです。)


`<match>`では、[stdout output plugin](https://docs.fluentd.org/v1.0/articles/out_stdout)を使って標準出力にログを出すように設定しています(out_stdout)。入力、出力、加工は、ログに付けられた"タグ"の単位ごとに指定します。ここでは、"*.*"にマッチするタグがつけられたログの処理を記述しています。("*"はワイルドーカードなので、ここではピリオドを含む任意の名前のタグが対象。)

構成ファイルを変更したら再起動。

```td-agent.log
...
2018-06-05 20:17:34 +0900 [info]: starting fluentd-1.0.2 pid=2239 ruby="2.4.2"
2018-06-05 20:17:34 +0900 [info]: spawn command to main:  cmdline=["/opt/td-agent/embedded/bin/ruby", "-Eascii-8bit:ascii-8bit", "/opt/td-agent/embedded/bin/fluentd", "--log", "/var/log/td-agent/td-agent.log", "--daemon", "/var/run/td-agent/td-agent.pid", "--under-supervisor"]
2018-06-05 20:17:35 +0900 [info]: gem 'fluent-plugin-elasticsearch' version '2.10.1'
2018-06-05 20:17:35 +0900 [info]: gem 'fluent-plugin-elasticsearch' version '2.4.0'
2018-06-05 20:17:35 +0900 [info]: gem 'fluent-plugin-kafka' version '0.6.5'
2018-06-05 20:17:35 +0900 [info]: gem 'fluent-plugin-rewrite-tag-filter' version '2.0.1'
2018-06-05 20:17:35 +0900 [info]: gem 'fluent-plugin-s3' version '1.1.0'
2018-06-05 20:17:35 +0900 [info]: gem 'fluent-plugin-td' version '1.0.0'
2018-06-05 20:17:35 +0900 [info]: gem 'fluent-plugin-td-monitoring' version '0.2.3'
2018-06-05 20:17:35 +0900 [info]: gem 'fluent-plugin-webhdfs' version '1.2.2'
2018-06-05 20:17:35 +0900 [info]: gem 'fluentd' version '1.0.2'
2018-06-05 20:17:35 +0900 [warn]: #0 'type' is deprecated parameter name. use '@type' instead.
2018-06-05 20:17:35 +0900 [info]: adding match pattern="*.*" type="stdout"
2018-06-05 20:17:35 +0900 [info]: adding source type="forward"
2018-06-05 20:17:35 +0900 [info]: #0 starting fluentd worker pid=2250 ppid=2245 worker=0
2018-06-05 20:17:35 +0900 [info]: #0 [input_forward] listening port port=24224 bind="0.0.0.0"
2018-06-05 20:17:35 +0900 [info]: #0 fluentd worker is now running worker=0
2018-06-05 20:17:35.369921297 +0900 fluent.info: {"worker":0,"message":"fluentd worker is now running worker=0"}
```

fluentd起動時のログに、forard inputプラグインが24224ポート(デフォルト)でListenしている旨のメッセージも出ています。

```netstat状況
[root@test06 /etc/td-agent]# netstat -an | grep 24224
tcp        0      0 0.0.0.0:24224           0.0.0.0:*               LISTEN
udp        0      0 0.0.0.0:24224           0.0.0.0:*
```

テスト用のログをforwart input pluginに対して投げてみます。
簡易的にin_fowardにメッセージを投げることができるfluentdクライアントのコマンドが提供されているのでそれを使います。

```xxx:手動でログ投入
[root@test06 /etc/td-agent]# echo '{"message":"Hello World."}' | /opt/td-agent/embedded/bin/fluent-cat debug.test
```

```xxx:結果/td-agent.log
...
2018-06-05 20:32:40.515070859 +0900 debug.test: {"message":"Hello World."}
```

これで、in_forwadに対して送られたメッセージがfluentdによって認識され、std_outにより標準出力(=>ログファイル)に出力されたことが確認できました。


#Elasticsearch

## 最低限の構成

構成ファイル: /etc/elasticsearch/elasticsearch.yml

デフォルトの設定のままだと、elasticsearchは9200番ポートでリクエストを受け付けるようになりますが、loopbackアドレスにのみバインドされるようになっており、外部から接続が出来ません。今回はfluentd/Elasticsearch/kibanaを1環境に構築しようとしているので、それでもいいんですが、仮想化環境で使っているので外からもなにかとアクセスできるようにしたい(実際本番で使うならそうしたいことが多いだろうし)。

以下のように編集(変更部分のみ抜粋)

```elasticsearch.yml
# Set a custom port for HTTP:
#
http.port: 9200
http.host: 0.0.0.0
```

ここでは、有効な全アドレスにバインドさせるため、http.hostに0.0.0.0を指定しています。ポートはデフォルトの9200をそのまま指定。

## Elasticsearchの起動/停止

起動コマンド: systemctl start elasticsearch.service
停止コマンド: systemctl stop elasticsearch.service
確認コマンド: systemctl status elasticsearch.service

```xxx:起動
[root@test06 /etc/elasticsearch]# systemctl start elasticsearch.service

```

```xxx:ステータス確認
[root@test06 ~]# systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2018-06-05 20:53:39 JST; 17s ago
     Docs: http://www.elastic.co
 Main PID: 1880 (java)
    Tasks: 45
   CGroup: /system.slice/elasticsearch.service
           mq1880 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInit...

 6月 05 20:53:39 test06 systemd[1]: Started Elasticsearch.
 6月 05 20:53:39 test06 systemd[1]: Starting Elasticsearch...
```

```netstat
[root@test06 ~]# netstat -an | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN
```


```xxx:停止
[root@test06 ~]# systemctl stop elasticsearch.service

```

```xxx:ステータス確認
[root@test06 ~]# systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: http://www.elastic.co

 6月 05 20:53:39 test06 systemd[1]: Started Elasticsearch.
 6月 05 20:53:39 test06 systemd[1]: Starting Elasticsearch...
 6月 05 20:55:00 test06 systemd[1]: Stopping Elasticsearch...
 6月 05 20:55:01 test06 systemd[1]: Stopped Elasticsearch.
```

##簡易テスト

参考: https://www.elastic.co/guide/en/elasticsearch/reference/6.2/_create_an_index.html

### インデックスを作成してみる
インデックスというのはRDBのテーブルみたいなモノです。
Elasticsearchに対する操作はREST APIで行えるので、curlやブラウザなどから操作します。

```xxx:customerというインデックス作成
[root@test06 ~]# curl -X PUT http://localhost:9200/customer?pretty
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "customer"
}
```

```xxx:結果確認
[root@test06 ~]# curl -X GET http://localhost:9200/_cat/indices?v
health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   customer -Yglb-nvT0WQAsRzjzpv0A   5   1          0            0       460b           460b
```

###データ投入
参考: https://www.elastic.co/guide/en/elasticsearch/reference/6.2/_index_and_query_a_document.html

Firefoxのプラグイン使ってRESTのPUTリクエストでJSON形式でデータを投入してみます。

```
PUT http://localhost:9200/customer/_doc/1?pretty
Content-Type: application/json
{"name": "John Doe"}
 -- response --
201 Created
Location:  /customer/_doc/1
Content-Type:  application/json; charset=UTF-8
Content-Encoding:  gzip
Content-Length:  161

{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
```

###データの確認
RESTのGETリクエストで上で投入したデータを取得してみる。

```
GET http://localhost:9200/customer/_doc/1?pretty

 -- response --
200 OK
Content-Type:  application/json; charset=UTF-8
Content-Encoding:  gzip
Content-Length:  125

{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "name" : "John Doe"
  }
}
```

#kibana

## 最低限の構成

構成ファイル: /etc/kibana/kibana.yml

デフォルトの設定のままだと、kibanaは5601番ポートでリクエストを受け付けるようになりますが、Elasticsearchと同様、loopbackアドレスにのみバインドされるようになっており、外部から接続が出来ません。

以下のように編集(変更部分のみ抜粋)

```kibana.yml
server.host: "0.0.0.0"
```

## kibanaの起動/停止

起動コマンド: systemctl start kibana.service
停止コマンド: systemctl stop kibana.service
確認コマンド: systemctl status kibana.service

```xxx:起動
[root@test06 /etc/kibana]# systemctl start kibana.service

```

```xxx:ステータス確認
[root@test06 /etc/kibana]# systemctl status kibana.service
● kibana.service - Kibana
   Loaded: loaded (/etc/systemd/system/kibana.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2018-06-07 21:48:03 JST; 16s ago
 Main PID: 1869 (node)
    Tasks: 10
   CGroup: /system.slice/kibana.service
           mq1869 /usr/share/kibana/bin/../node/bin/node --no-warnings /usr/share/kibana/bin/../src/cli -c /etc/kibana/...

 6月 07 21:48:11 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:11Z","tags":["error","elastic...9200"}
 6月 07 21:48:11 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:11Z","tags":["warning","elast...200/"}
 6月 07 21:48:11 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:11Z","tags":["warning","elast...ions"}
 6月 07 21:48:11 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:11Z","tags":["status","plugin...arch"}
 6月 07 21:48:13 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:13Z","tags":["warning","elast...200/"}
 6月 07 21:48:13 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:13Z","tags":["warning","elast...ions"}
 6月 07 21:48:16 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:16Z","tags":["warning","elast...200/"}
 6月 07 21:48:16 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:16Z","tags":["warning","elast...ions"}
 6月 07 21:48:18 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:18Z","tags":["warning","elast...200/"}
 6月 07 21:48:18 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:18Z","tags":["warning","elast...ions"}
Hint: Some lines were ellipsized, use -l to show in full.
```

```xxx:停止
[root@test06 /etc/kibana]# systemctl stop kibana.service

```

```xxx:ステータス確認
[root@test06 /etc/kibana]# systemctl status kibana.service
● kibana.service - Kibana
   Loaded: loaded (/etc/systemd/system/kibana.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

 6月 07 21:48:58 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:58Z","tags":["warning","elast...200/"}
 6月 07 21:48:58 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:48:58Z","tags":["warning","elast...ions"}
 6月 07 21:49:01 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:49:01Z","tags":["warning","elast...200/"}
 6月 07 21:49:01 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:49:01Z","tags":["warning","elast...ions"}
 6月 07 21:49:04 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:49:04Z","tags":["warning","elast...200/"}
 6月 07 21:49:04 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:49:04Z","tags":["warning","elast...ions"}
 6月 07 21:49:06 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:49:06Z","tags":["warning","elast...200/"}
 6月 07 21:49:06 test06 kibana[1869]: {"type":"log","@timestamp":"2018-06-07T12:49:06Z","tags":["warning","elast...ions"}
 6月 07 21:49:06 test06 systemd[1]: Stopping Kibana...
 6月 07 21:49:06 test06 systemd[1]: Stopped Kibana.
Hint: Some lines were ellipsized, use -l to show in full.
```

## 簡易テスト
ブラウザからkibanaに接続してみます。
http://localhost:5601/ にアクセス！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/c7cc91b6-4387-68d3-64f6-17c6d74a9e2e.png)

こんな感じでブラウザのインターフェースでいろいろ操作ができます。

これで一通り最低限の環境が整ったので、ログの投入～可視化の辺りを色々試していこうと思います。