ELK Stack(執筆中)

# はじめに

会社の取り組みでELK Stackについて触れる機会があったのでその時のメモ

# ELK Stackとは

・Elasticsearch
・Logstash
・Kibana
の3つのオープンソースプロジェクトからなるスタック

## Elasticsearchとは

>Elasticsearchは、分散型で無料かつオープンな検索・分析エンジンです。テキスト、数値、地理空間情報を含むあらゆる種類のデータに、そして構造化データと非構造化データの双方に対応しています。

様々なデータを検索、分析できるソフトウェア

## Logstashとは

>Logstash は、軽量でオープンソースのサーバー側データ処理パイプラインです。さまざまなソースからデータを収集し、その場で変換して目的の宛先に送信できます。

いろいろなところから収集したデータを整形し転送できるソフトウェア
Elasticsearchとのデータパイプラインとしてよく利用される。

## Kibanaとは

>Kibana は、ログと時系列の分析、アプリケーションのモニタリング、オペレーショナルインテリジェンスのユースケースに使われる、オープンソースのデータの視覚化および調査ツールです。ヒストグラム、線グラフ、円グラフ、ヒートマップ、組み込み型の地理空間のサポートなど、強力で使いやすい機能を提供します。

検索・分析したデータをいい感じに可視化してくれるソフトウェア

# Elasticsearch用語

| 単語 | 説明 |
| ---- | ----- |
|ノード|1つのサーバのこと|
|クラスタ|ノードの集合体のこと|
|インデックス|データベース|
|タイプ|テーブル|
|ドキュメント|レコード|




# とりあえず触ってみる

githubにdocker-elkというプロジェクトがすでにあったのでそちらを使います。
PCにdockerとdocker-composeが事前にインストールされている必要があります。

https://github.com/deviantony/docker-elk

適当に作業ディレクトリを作成&移動

```
mkdir elk
cd elk
```

プロジェクトをcloneして起動

```
git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
docker-compose up
```

http://localhost:5601

にアクセスするとKibanaのログイン画面が表示されます。


![スクリーンショット 2021-01-28 15.22.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557038/b5300753-8bde-d75b-e1bf-2fbed3f7ad33.png)

ID: elastic
PW: changeme

ログインするとこのような画面が表示され、データを投入するように促されます。
今回はKibanaの公式サイトにあるチュートリアルを参考にデータの投入を行うので「Explore on my own」をクリックします。

![スクリーンショット 2021-01-28 15.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557038/0ef9c98c-f5a8-6b08-c8d4-2206c0f375aa.png)

「Add data」をクリックするとすでに公式が用意しているサンプルデータの一覧が出てきます。
このサンプルデータを使うこともできるみたいです。

![スクリーンショット 2021-01-28 15.27.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557038/f59cb480-cc90-1e6e-16c2-16c4b7f8caa0.png)

## サンプルデータの読み込み

公式のサイトのチュートリアルを元に進めます。

https://www.elastic.co/guide/jp/kibana/current/tutorial-load-dataset.html

リンク先にあるデータをダウンロードし適当なディレクトリに移動しておきます。
また、accounts.zipとlogs.jsonl.gzは解凍しておきましょう。

```
unzip accounts.zip
gunzip logs.jsonl.gz
```

各データの型は以下のように定義されています。

```shakespeare.jsonのデータ型
{
    "line_id": INT,
    "play_name": "String",
    "speech_number": INT,
    "line_number": "String",
    "speaker": "String",
    "text_entry": "String",
}
```

```accounts.jsonのデータ型
{
    "account_number": INT,
    "balance": INT,
    "firstname": "String",
    "lastname": "String",
    "age": INT,
    "gender": "M or F",
    "address": "String",
    "employer": "String",
    "email": "String",
    "city": "String",
    "state": "String"
}
```

logs.jsonlは様々なデータがありますが、今回のチュートリアルで使用する主なデータの型は以下です。

```logs.jsonlのデータ型（抜粋）
{
    "memory": INT,
    "geo.coordinates": "geo_point"
    "@timestamp": "date"
}
```

### マッピング

shakespeare.jsonとlogs.jsonlはデータを読み込む前にフィールドのマッピングを行う必要があります。
マッピングを行い各フィールドの特性を定義します。
・どのフィールドに数字、日付、または地理的位置情報が含まれるか
・日付の形式
などです。RDBのカラム定義のような感じです。


サンプルのcurlでは認証情報がないので「elastic:changeme」(user:pass)を追加しています。

またバージョンの問題で
_default_→削除
string→text
not_analyzed→false
に変換しています。


```
$ curl -u elastic:changeme -H 'Content-Type: application/json' -XPUT http://localhost:9200/shakespeare -d '
{
 "mappings" : {
   "properties" : {
    "speaker" : {"type": "text", "index" : false},
    "play_name" : {"type": "text", "index" : false },
    "line_id" : { "type" : "integer" },
    "speech_number" : { "type" : "integer" }
   }
  }
}
';

$ {"acknowledged":true,"shards_acknowledged":true,"index":"shakespeare"}% 
```

・speakerフィールドとplay_nameフィールドは分析されないフィールドになります。

geo_point​タイプをログのフィールドに適用して、ログ内の緯度/経度ペアを地理的位置としてラベル付けするマッピングが必要です。

```
$ curl -u elastic:changeme -H 'Content-Type: application/json' -XPUT http://localhost:9200/logstash-2015.05.18 -d '
{
  "mappings": {
    "properties": {
      "coordinates": {
        "type": "geo_point"
      }
    }
  }
}
';

$ {"acknowledged":true,"shards_acknowledged":true,"index":"logstash-2015.05.18"}% 
```

```
$ curl -u elastic:changeme -H 'Content-Type: application/json' -XPUT http://localhost:9200/logstash-2015.05.19 -d '
{
  "mappings": {
    "properties": {
      "coordinates": {
        "type": "geo_point"
      }
    }
  }
}
';

$ {"acknowledged":true,"shards_acknowledged":true,"index":"logstash-2015.05.19"}% 
```

```
$ curl -u elastic:changeme -H 'Content-Type: application/json' -XPUT http://localhost:9200/logstash-2015.05.20 -d '
{
  "mappings": {
    "properties": {
      "coordinates": {
        "type": "geo_point"
      }
    }
  }
}
';

$ {"acknowledged":true,"shards_acknowledged":true,"index":"logstash-2015.05.20"}% 
```

accounts.jsonはマッピングを行う必要はありません。

### ドキュメント（レコード）の投入

Bulk APIを利用することで大量のドキュメントをまとめて登録することが出来ます。

```
$ curl -u elastic:changeme -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
$ curl -u elastic:changeme -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/shakespeare/_bulk?pretty' --data-binary @shakespeare.json
$ curl -u elastic:changeme -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/_bulk?pretty' --data-binary @logs.jsonl
```

上記コマンドを入力した際、shakespeare.jsonとlogs.jsonlのデータ投入でエラーが発生しました。
どうやら処理出来るデータ量の何らかの値が上回っているためエラーになっているようです。少し調べてみたのですが、根本的な解決方法がわからないため、今回はjsonの中身を一部削除しファイル容量を減らした状態で登録を行いました。
おそらくelasticsearch.ymlなどに設定を記載することになると思うのです・・・分かる方居たらコメントで教えてください。


```error
{
  "error" : {
    "root_cause" : [
      {
        "type" : "es_rejected_execution_exception",
        "reason" : "rejected execution of coordinating operation [coordinating_and_primary_bytes=0, replica_bytes=0, all_bytes=0, coordinating_operation_bytes=37723053, max_coordinating_and_primary_bytes=26843545]"
      }
    ],
    "type" : "es_rejected_execution_exception",
    "reason" : "rejected execution of coordinating operation [coordinating_and_primary_bytes=0, replica_bytes=0, all_bytes=0, coordinating_operation_bytes=37723053, max_coordinating_and_primary_bytes=26843545]"
  },
  "status" : 429
}
```

### Index Patternの作成





# 参考
https://aws.amazon.com/jp/elasticsearch-service/the-elk-stack/
https://aws.amazon.com/jp/elasticsearch-service/the-elk-stack/logstash/
https://aws.amazon.com/jp/elasticsearch-service/the-elk-stack/kibana/

https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329