ElasticStack 7.8 環境構築（Elasticsearch/Kibana/Elastic APM/Filestash/Filebeat/Metricbeat）

# はじめに

最近、ElasticStack関係の調査することが多く、毎回書くのも面倒なので一か所にまとめてみました。
今回構築する環境で以下のことを実行することができるようになります。

- syslog → Filebeat → Logstash → Elasticsearch → Kibana
- Metricbeat → Logstash → Elasticsearch → Kibana
- APM Server → Elasticsearch → Kibana

※Elastic APMはElasticStackには含まれていなかったかもしれませんが。

インストールでは、yumを利用する方法とrpmをダウンロードする方法がありますが、今回はrpmをダウンロードする方法で実施しています。


# 環境

使用した環境は以下のとおり。
サーバは1台に全てのアプリケーションをインストールしています。
少なくともFilebeatは通常別サーバにインストールすることになるので、その際は接続先のElasticsearch(もしくはLogstash)のIPアドレスの設定だけは実施する必要があります。

- CentOS 7.5
- Elasticsearch 7.8.0
- Kibana 7.8.0
- Metribeat 7.8.0
- Filebeat 7.8.0
- APM Server 7.8.0


# OpenJDKのインストール

まず、OpenJDK 8をインストールします。
※Elasticsearch v7.8.0ではAdoptOpenJDK14が同梱されているので、そちらを利用することもできます。（/usr/share/elasticsearch/jdk/bin/java）

```
# yum install -y java-1.8.0-openjdk-devel

# java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
```

JAVA_HOMEを設定し、PATHにJavaのパスを追加しています。

```terminal
# echo "export JAVA_HOME=$(readlink -e $(which java)|sed 's:/bin/java::')" > /etc/profile.d/java.sh
# echo "PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile.d/java.sh
# source /etc/profile
```


# Elasticsearchのインストール

以下の公式サイトのドキュメントを参照しインストールを実施していきます。

- [Get Elasticsearch up and running(公式サイト)](https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-install.html)

以下のコマンドでElasticsearchをインストールします。



```
# curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-x86_64.rpm
# rpm -ivh elasticsearch-7.8.0-x86_64.rpm
```

Elasticsearchを外部からアクセスできるように設定します。

```
# vi /etc/elasticsearch/elasticsearch.yml
#network.host: 192.168.0.1
network.host: 0.0.0.0
transport.host: localhost
```

自動起動するように設定し、起動まで実行します。

```
# systemctl enable elasticsearch
# systemctl start elasticsearch
```

最後に動作確認。

```
# curl http://127.0.0.1:9200
{
  "name" : "elasticserver1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "ZUiSSmOETuOAnZp2Adz9dQ",
  "version" : {
    "number" : "7.8.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "757314695644ea9a1dc2fecd26d1a43856725e65",
    "build_date" : "2020-06-14T19:35:50.234439Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
```

ログと設定ファイルは以下のディレクトリになります。

- /var/log/elasticsearch/
- /etc/elasticsearch/


# Kibanaのインストール

Elasticsearchのインストールが終わったら、次はKibanaをインストールします。

- [Install Kibana with RPM(公式サイト)](https://www.elastic.co/guide/en/kibana/current/rpm.html)

```
# wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.0-x86_64.rpm
# rpm -ivh kibana-7.8.0-x86_64.rpm
```

Kibanaを外部から接続できるように設定します。

```
# vi /etc/kibana/kibana.yml

#server.host: "localhost"
server.host: "0.0.0.0"
```

自動起動するように設定し、起動まで実行します。

```
# systemctl enable kibana
# systemctl start kibana
```

最後に動作確認。以下のURLをブラウザから開いて、Kibanaの画面が表示されることを確認します。

- http://[KibanaサーバーのIPアドレス]:5601



# APM Serverのインストール

APM Serverのインストールを実施します。

- [Getting started with APM Server(公式サイト)](https://www.elastic.co/guide/en/apm/server/current/getting-started-apm-server.html)

まず、モジュールをダウンロードしインストールします。

```
# curl -L -O https://artifacts.elastic.co/downloads/apm-server/apm-server-7.8.0-x86_64.rpm
# rpm -ivh apm-server-7.8.0-x86_64.rpm

$ su - apm-server
$ apm-server setup --index-management
Index setup finished.
$ apm-server setup --pipelines
Loaded Ingest pipelines
```

APM Serverを外部からアクセスできるように設定します。

```
# vi /etc/apm-server/apm-server.yml
apm-server:
  # Defines the host and port the server is listening on. Use "unix:/path/to.sock" to listen on a unix domain socket.
  #host: "localhost:8200"
  host: "0.0.0.0:8200"
```

自動起動するように設定し、起動まで実行します。

```
# systemctl enable apm-server
# systemctl start apm-server
```

最後に動作確認。

```
# curl -L http://localhost:8200
{
  "build_date": "2020-06-14T17:10:16Z",
  "build_sha": "06c58bf4e5b675d04314bf44961ffd6b0e13f544",
  "version": "7.8.0"
}
```


# Logstashをインストールする

Logstashをインストールします。
インストール手順は以下を参照。

- [Step 1: Install Metricbeat(公式サイト)](https://www.elastic.co/guide/en/logstash/current/installing-logstash.html)

```
# curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.8.0.rpm
# rpm -ivh logstash-7.8.0.rpm
```

以下のサイトからLogstashの最新版のURLを確認できます。

- https://www.elastic.co/jp/downloads/logstash

Logstashの設定は以下に作成します。

- /etc/logstash/conf.d

このディレクトリにFilebeatからログを受信し、Elasticsearchへ送信する設定を以下のように作成します。

```
# vi /etc/logstash/conf.d/syslog_test.conf

input {
  beats {
    port => "5044"
  }
}
output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "syslogtest-%{+YYYY.MM.dd}" 
  }
}
```

Logstashを自動起動するように設定し、起動させます。

```
# systemctl start logstash
# systemctl enable logstash
```

Logstashの設定ファイルは以下になります。

- /etc/logstash/logstash.yml


# Metricbeatのインストール

Metricbeatのインストールは以下の公式ドキュメントを参考に実施します。

- [Step 1: Install Metricbeat(公式サイト)](https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-installation.html)

まずはRPMをダウンロードし、インストールします。

```
# curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.8.0-x86_64.rpm
# rpm -ivh metricbeat-7.8.0-x86_64.rpm
```

次にElasticsearchとKibanaのエンドポイントを設定します。
Kibanaのエンドポイントを設定すると、サンプルKibanaダッシュボードを使用することができます。
Elasticsearchへのインデックステンプレートの登録は自動で実行されます。
※今回は全てのアプリを同一サーバに構築しているためlocalhostを指定していますが、実際のホスト名（IPアドレス）を指定してください。

```
# vi /etc/metricbeat/metricbeat.yml 

setup.kibana:
  host: "localhost:5601"
output.elasticsearch:
  hosts: ["localhost:9200"]
```

Metricbeatには、サンプルのKibanaダッシュボードがパッケージされており、以下のコマンドで作成することができます。

```
# metricbeat setup --dashboards
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
```

Metricbeatを自動起動するように設定し、起動させます。

```
# systemctl enable metricbeat
# systemctl start metricbeat
```

Kibanaで[Metrics]を選択し、メトリクスが取得できていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/49e9446c-e5b7-3f3b-b6d6-90eace94b8d3.png)

Filebeatのサンプルダッシュボードが作成されていることを確認するために、[Dashboard]を選択し、[Metricbeat XXX]というダッシュボードが一覧に表示されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/49cb959d-5971-2b5c-5cfb-d97f1c2f0e02.png)


標準で取得されるOS（CPU/メモリ等）のメトリクスが不要な場合は以下のコマンドを実行した後、Metricbeatを再起動してください。

```
# metricbeat modules disable system
Disabled system
```


Metricbeatのログは以下に出力されます。

- /var/log/metricbeat/metricbeat



# Filebeatの設定

以下のコマンドでインストールします。

```
# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.0-x86_64.rpm
# rpm -ivh filebeat-7.8.0-x86_64.rpm
```

最新版のURLは以下から確認できます。

- https://www.elastic.co/jp/downloads/beats/filebeat

filebeat.ymlを変更し、syslogを読み込み、Logstashへ送信するように設定します（変更点のみ抜粋）。
syslogを扱う専用モジュールがありますが、今回は一般的なログの転送の確認をしたいだけなので使用していません。
※今回は全てのアプリを同一サーバに構築しているためlocalhostを指定していますが、実際のホスト名（IPアドレス）を指定してください。
送信先がElasticsearchの場合は、output.logstashをコメントアウトし、output.elasticsearchをアンコメントしてください。Filebeatではoutは一つしか指定できません。

```
# vi /etc/filebeat/filebeat.yml

- type: log
  enabled: true
  paths:
    - /var/log/messages
#output.elasticsearch:
  #hosts: ["localhost:9200"] 
output.logstash:
  hosts: ["localhost:5044"]
setup.kibana:
  host: "localhost:5601"
```

同ファイルの最後にFilebeat自身のログ出力の設定を追加します。
これで「/var/log/filebeat」以下にログが出力されるようになります。
ログの設定は以下を参照。

- [Configure logging(Elasticsearch公式)](https://www.elastic.co/guide/en/beats/filebeat/current/configuration-logging.html)

```
# vi /etc/filebeat/filebeat.yml

logging.level: info
logging.to_files: true
logging.files:
  path: /var/log/filebeat
  rotateeverybytes: 10485760
  name: filebeat
  keepfiles: 7
  permissions: 0644
```

setupコマンドでKibanaへ対してサンプルダッシュボードを作成することができます。

```
# filebeat setup
```

Filebeatを自動起動するように設定し、起動させます。

```
# systemctl enable filebeat
# systemctl start filebeat
```

Kibanaで[Logs]を選択し、ログが取得できていることを確認します。
[Settings]で対象のindexを表示対象に変更しておく必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/0e61a229-6e31-b69b-95ca-c5ed14c6d3a9.png)

Filebeatのサンプルダッシュボードが作成されていることを確認するために、[Dashboard]を選択し、[Filebeat XXX]というダッシュボードが一覧に表示されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/27e77f42-4973-f9be-222f-69f1d1d3b357.png)


# サンプルデータ

KibanaのHomeの真ん中ぐらいにある「Add sample data / Load a data set and a Kibana dashboard」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/6de3ab59-1af4-db7c-b136-a9807ccd49db.png)

サンプルデータとして、以下の3つが表示されますので好きなサンプルデータを選択します。

- Sample eCommerce orders
- Sample flight data
- Sample web logs

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/562c3106-bb14-c132-bd81-85951e1435c5.png)


# Filebeatで複数行ログを扱う

Filebeatで複数行ログを1ドキュメントとして扱うためには、複数行を判断するための設定を追加する必要があります。
Filebeatで複数行ログを扱う場合の設定については以下の公式ドキュメントに記載があります。

- [Manage multiline messages](https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html)

Javaのスタックトレースの場合は、filebeat.ymlに以下のような設定を追加します。

```yml:/etc/filebeat/filebeat.yml
- type: log
  multiline.pattern: '^[[:space:]]'
  multiline.negate: false
  multiline.match: after
  json.message_key: message
```

ホワイトスペースで始まっている（multiline.pattern: ^[[:space:]], multiline.negate: false）連続した行が、前のマッチしない行の後（multiline.match: after）に追加されるという意味になります。
"json.message_key"は複数行となる項目を指定しています。（これが正しいのかわかっていませんが）


# 参考


- [Configure logging(Elasticsearch公式)　※Filebeatのログ設定](https://www.elastic.co/guide/en/beats/filebeat/current/configuration-logging.html)