#はじめに
ログ収集、可視化などに良く使われているらしいfluentd, Elasticsearch, kibanaを試してみた時のメモです。
今回は最低限の構成を行って各コンポーネントの起動/停止、単体での簡易的な動作確認などやってみます。
※バージョンによって構成ファイルの書き方など結構変わっている部分が多いです。特にfluentdはV0.x(td-agent v2)とV1.0(td-agent v3)でtd-agent.confが結構変わっているようなので、古い情報を参考にしていると動かなかったりするので注意!
##関連記事
fluentd/Elasticsearch/kibanaを試す: (1)インストール
fluentd/Elasticsearch/kibanaを試す: (2)基本構成/起動/停止
#fluentd
最低限の構成
構成ファイル: /etc/td-agent/td-agent.conf
起動/停止を行うだけであれば、特に設定に手を入れなくても(デフォルトの設定で)起動/停止はできました。
fluentdの起動/停止
起動コマンド: systemctl start td-agent.service
停止コマンド: systemctl stop td-agent.service
確認コマンド: systemctl status td-agent.service
[root@test06 ~]# systemctl start td-agent.service
正常に起動すれば特にメッセージは無し
[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が追加されています)
[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
[root@test06 /etc/td-agent]# systemctl stop td-agent.service
[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の構成ファイルを以下のように指定します。
<system>
log_level debug
</system>
<source>
@type forward
@id input_forward
</source>
<match *.*>
type stdout
</match>
<source>
でforward input plugin というのを使う設定をしています(in_forward)。
これによりfluentdが特定のポートでリモートからのログを受け付けてくれます。(他のノードのfluentdからフォワードされてきたり、fluentdのクライアントからログ送信が行われることを想定しているようです。)
<match>
では、stdout output pluginを使って標準出力にログを出すように設定しています(out_stdout)。入力、出力、加工は、ログに付けられた"タグ"の単位ごとに指定します。ここでは、"."にマッチするタグがつけられたログの処理を記述しています。("*"はワイルドーカードなので、ここではピリオドを含む任意の名前のタグが対象。)
構成ファイルを変更したら再起動。
...
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している旨のメッセージも出ています。
[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クライアントのコマンドが提供されているのでそれを使います。
[root@test06 /etc/td-agent]# echo '{"message":"Hello World."}' | /opt/td-agent/embedded/bin/fluent-cat debug.test
...
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環境に構築しようとしているので、それでもいいんですが、仮想化環境で使っているので外からもなにかとアクセスできるようにしたい(実際本番で使うならそうしたいことが多いだろうし)。
以下のように編集(変更部分のみ抜粋)
# 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
[root@test06 /etc/elasticsearch]# systemctl start elasticsearch.service
[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...
[root@test06 ~]# netstat -an | grep 9200
tcp6 0 0 :::9200 :::* LISTEN
[root@test06 ~]# systemctl stop elasticsearch.service
[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やブラウザなどから操作します。
[root@test06 ~]# curl -X PUT http://localhost:9200/customer?pretty
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "customer"
}
[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アドレスにのみバインドされるようになっており、外部から接続が出来ません。
以下のように編集(変更部分のみ抜粋)
server.host: "0.0.0.0"
kibanaの起動/停止
起動コマンド: systemctl start kibana.service
停止コマンド: systemctl stop kibana.service
確認コマンド: systemctl status kibana.service
[root@test06 /etc/kibana]# systemctl start kibana.service
[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.
[root@test06 /etc/kibana]# systemctl stop kibana.service
[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/ にアクセス!
こんな感じでブラウザのインターフェースでいろいろ操作ができます。
これで一通り最低限の環境が整ったので、ログの投入~可視化の辺りを色々試していこうと思います。