Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで③ - filebeat編

## 背景
前回の記事の続きです！
この記事は3/4回目です。

## できること
この投稿は全４回に渡ってシリーズ化する予定です！
ほかの記事もよろしければぜひご覧ください。

1. [Elasticsearch編](https://qiita.com/sgr0416st/items/d0d00723b49c3935137e): ElasticsearchをDocker上で起動して、実際に動かしてみる
2. [Kibana編](https://qiita.com/sgr0416st/items/28dc2df02bb946f94209): KibanaをDocker上で起動して、データを可視化してみる
3. **[Filebeat編](https://qiita.com/sgr0416st/items/74723ba2bb5667f5411a): Filebeatを利用して、ログファイルをKibanaで表示してみる**
4. [Spring Boot編](https://qiita.com/sgr0416st/items/3bb415783f1464aa7df6): 簡単なSpring Webアプリケーションをローカルで実行、ログを作成してそれをKibanaで可視化する

[デモ編](https://qiita.com/sgr0416st/items/6409fb84f5463cd2112a): とりあえず完成品を動かしてみる

## Filebeatとは
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-overview.html

> Filebeatは、ログデータを転送して一元管理するための軽量なシッパーです。サーバーにエージェントとしてインストールされたFilebeatは、指定されたログファイルまたはロケーションを監視し、ログイベントを収集して、インデックス作成のためにElasticsearchまたはLogstashに転送します。(訳)

今回の目的ではざっくり、ファイルの変化を検出して、新しく追加されたデータをElasticsearchに送るツールと捉えてもらって大丈夫です。

## 手順
それでは早速filebeatをDocker上で起動していきます。

#### 前提
- 前回の記事([Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで - Kibana編](https://qiita.com/sgr0416st/items/28dc2df02bb946f94209))を実行済み

**１. ファイルの準備**
以下の様なフォルダ構成にします。(今回追加するファイル・フォルダのみに焦点をあてて説明します)
ちょっと今までよりも色々なファイルを準備する分、大変かもしれませんが頑張りましょう！

- /{projectディレクトリ}/
    - elasticsearch/
        - elasticsearch.yml 
    - **filebeat/**
        - **config/**
            - **filebeat.docker.yml**
        - **logs/**
            - **logging-demo.log**
        - **Dockerfile**
    - **docker-compose.yml**

**２. dockerの準備**
今回はイメージを直接利用するのではなく、少しカスタマイズしたいのでDockerfileを記述していきます。

```Dockerfile
FROM docker.elastic.co/beats/filebeat:7.13.0

COPY config/filebeat.docker.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chown root:filebeat /usr/share/filebeat/filebeat.yml
USER filebeat
```

ここでは主に、ローカルの設定ファイルをコンテナ内の必要な場所にコピーする処理を追記しています。

次に、docker-compose.ymlファイルを以下の様に追記します

```docker-compose.yml
version: '3.2'
services:
  ...

  filebeat:
    build:
      context: filebeat/
    hostname: filebeat101
    container_name: con-filebeat
    networks:
      - elastic
    volumes:
      - type: bind
        source: ./filebeat/logs
        target: /usr/share/filebeat/logs
    depends_on:
      - elasticsearch

...

networks:
  elastic:
    driver: bridge
```

ほとんど前回までに出てきたものと同じ様な設定だと思います。
imageの代わりにbuild.contextでDockerfileのあるパスを指定してあげることで、Dockerfileからイメージをビルドしてコンテナを作成する様になります。

**３. filebeatの設定ファイルの準備**
filebeat.docker.ymlを以下の様に編集します

```filebeat.docker.yml
filebeat.inputs:
  - type: log
    paths:
      - /usr/share/filebeat/logs/logging-demo.log

setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"

output.elasticsearch:
  hosts: 
    - "elasticsearch:9200"
  index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
``` 

この設定は最初のセクションでfilebeatが読み込むべきログファイルを指定します。

次のセクションで、index templateを設定していきます。各ログデータは特定のindexと呼ばれる識別子を持っており、index templateとはこのログファイルから抽出したデータを検索する際の共通の識別子です(今回はデフォルトをそのまま使っているので省いてしまっても構いません)。詳しくは[公式の説明](https://www.elastic.co/guide/en/beats/filebeat/current/configuration-template.html)をご確認ください。

最後のセクションでは、データの出力先を指定しています。ここではコンテナの具体的なIPアドレスがわからないため、Dockerfileのサービス名(elasticsearch)をホストとして利用しています。
indexの設定では、各ログデータにつけるindex(識別子)のパターンを指定しています。今回はこれもデフォルトと同じで、filebeatのバージョンとタイムスタンプからindexを生成するようにしています。
その他の設定も気になる方は[こちら](https://www.elastic.co/guide/en/beats/filebeat/current/configuring-howto-filebeat.html)からご覧ください。

**３. ログファイルの準備**
最後にfilebeatが読み込むためのログファイルを準備します。
なんでもいいのですが、この記事の最終目的であるSpring Bootアプリケーションのログモニタリングを意識して、Spring Bootのログフォーマットに近いログを適当に用意したのでコピペして使ってみてください。

```logging-demo.log
2021-06-26 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2021-06-26 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-06-26 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1358 ms
2021-06-26 10:57:51.698  INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2021-06-26 10:57:51.702  INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*
```

**４. 実行されているか確認する**
以下のコマンドを実行してしばらく待機ます(起動まで2~5分程かかります)。

```
docker-compose up -d
```

その後、filebeatがログを読み込んでElasticsearchにデータを送信できているか確認するために、filebeatによって作成されたインデックスパターンのログが存在するか検証するリクエストを送ってみましょう。
以下のコマンドをターミナルから入力して実行してみてください。

```shell
curl -XGET "http://localhost:9200/filebeat-*/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match_all": { }
  },
  "sort": [
    {
      "@timestamp": "desc"
    }
  ]
}'
```

以下の様なレスポンスが返ってきたら成功です。

```json
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
  ...
```

**４. Kibanaでログデータを表示する**
これをKibanaで表示するにはもう少し作業が必要になります。
初回のみKibanaに手動でindex patternを登録する必要があるので、Kibana [(http://localhost:5601)](http://localhost:5601) にアクセスして、ホーム左上のアイコンからStack Management > Index Patterns へと進んでCreate Index Patternを選択してください。
![kibana index pattern registration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/ed8060f9-b66d-012d-719b-cff17383f8d2.png)![kibana index pattern registration2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/5522bffb-b369-caab-2b54-c45c2302ea4a.png)

次に、"sel"の欄にfilebeat-*と選択して次へ進んでください。
![kibana index pattern registration3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/cd594c68-20c5-a2c0-9544-d9608680b716.png)

その後、time fieldの欄のドロップダウンから@timestampを選択し、index patternを作成してください。
![kibana index pattern registration4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/5e00f907-168e-67ce-491f-8cd44b5beedf.png)

これで無事準備が整ったので、メニューからAnalytics > Discoverへと進みましょう。
![kibana index pattern registration5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/692c33a8-0ce9-e076-258b-997afc99b61a.png)

左にあるドロップダウンから作成されたindex patternが選択されていることを確認します。
その後、検索範囲をfilebeatを実行した日の0:00 ~ 翌日の0:00に設定して再検索してみましょう。
![kibana index pattern registration6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/225fa61b-78bb-211b-f1f4-f89b984e0ebc.png)

![search result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271486/eaa20026-72c1-23f1-5fac-c76926163f79.png)

上の画像のようにグラフや検索結果が出てきたら見事成功です。お疲れ様でした！！
最後にコンテナを消去して綺麗にしておきましょう。

```shell
docker-compose down -v --rmi local
```

次回はいよいよ最後、Spring Bootアプリケーションのログをこれらのツールを利用してモニタリングしていきます。
[Elastic StackをDocker上で実行してログモニタリングサービスを作成するまで④ - Spring Boot編](https://qiita.com/sgr0416st/items/3bb415783f1464aa7df6)

## 参考
- filebeat configuration: https://www.elastic.co/guide/en/beats/filebeat/current/configuring-howto-filebeat.html
- index template: https://www.elastic.co/guide/en/beats/filebeat/current/configuration-template.html
- kibana index pattern registration: https://www.elastic.co/guide/en/kibana/current/index-patterns.html