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のパスを追加しています。

# 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のインストール

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

以下のコマンドで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をインストールします。

# 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のインストールを実施します。

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

# 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をインストールします。
インストール手順は以下を参照。

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

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

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のインストールは以下の公式ドキュメントを参考に実施します。

まずは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]を選択し、メトリクスが取得できていることを確認します。

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

標準で取得される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は以下から確認できます。

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」以下にログが出力されるようになります。
ログの設定は以下を参照。

# 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を表示対象に変更しておく必要があります。

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

サンプルデータ

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

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

  • Sample eCommerce orders
  • Sample flight data
  • Sample web logs

Filebeatで複数行ログを扱う

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

Javaのスタックトレースの場合は、filebeat.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"は複数行となる項目を指定しています。(これが正しいのかわかっていませんが)

参考