LogstashのMonitoring API を使って、Logstashを可視化してみた。

この記事は[Elastic stack Advent Calendar 2017](https://qiita.com/advent-calendar/2017/elasticsearch)の12/14分の記事です。

みなさん、初めまして。
fujii(@ZooBonta) と申します。

今回は、Logstash 5.0から利用可能になった、
Monitoring API を使って、Logstashを可視化してみようと思います。

## 環境情報
- OS
 - Windows 10
- Elasticsearch/Logstash
 - Ver 6.0.1

## 目的
Logstash のMonitoring APIを使って、Logstashを可視化します。

Monitoring API　を使ってみたかっただけので、
「そんなの、Metricbeats使えば、いいじゃん」とかは言わないでください。。。


## Monitoring APIとは？
Ver5 系から入った、Logstashの監視用APIです。

大きく、以下の4つに分類されます。
1. Node Info API：Logstashのノードに関する情報を扱うAPI
2. Plugins Info API：Logstashにインストールしたプラグインを扱うAPI
3. Node Stats API：Logstashの統計情報を扱うAPI
4. Hot Threads API：Logstashの起動中スレッドの情報を扱うAPI

さっそく、使ってみましょう。

まずは、Node Stats Info APIを使って、jvmの値を見てみます。

`curl -X GET http://localhost:9600/_node/stats/jvm?pretty`

以下の値が返ってきました。

```
{
  "host" : "my-host",
  "version" : "6.0.1",
  "http_address" : "127.0.0.1:9600",
  "id" : "b780ef4e-d70f-4919-a841-6b15caeed834",
  "name" : "my-host",
  "jvm" : {
    "threads" : {
      "count" : 28,
      "peak_count" : 32
    },
    "mem" : {
      "heap_used_percent" : 28,
      "heap_committed_in_bytes" : 1038876672,
      "heap_max_in_bytes" : 1038876672,
      "heap_used_in_bytes" : 299934992,
      "non_heap_used_in_bytes" : 155144224,
      "non_heap_committed_in_bytes" : 174878720,
      "pools" : {
        "survivor" : {
          "peak_used_in_bytes" : 34865152,
          "used_in_bytes" : 8099120,
          "peak_max_in_bytes" : 34865152,
          "max_in_bytes" : 34865152,
          "committed_in_bytes" : 34865152
        },
        "old" : {
          "peak_used_in_bytes" : 256622432,
          "used_in_bytes" : 110373176,
          "peak_max_in_bytes" : 724828160,
          "max_in_bytes" : 724828160,
          "committed_in_bytes" : 724828160
        },
        "young" : {
          "peak_used_in_bytes" : 279183360,
          "used_in_bytes" : 181462696,
          "peak_max_in_bytes" : 279183360,
          "max_in_bytes" : 279183360,
          "committed_in_bytes" : 279183360
        }
      }
    },
    "gc" : {
      "collectors" : {
        "old" : {
          "collection_time_in_millis" : 201,
          "collection_count" : 2
        },
        "young" : {
          "collection_time_in_millis" : 2295,
          "collection_count" : 62
        }
      }
    },
    "uptime_in_millis" : 2429462
  }
}
```
スレッド数、JVMのヒープ、GC実行回数などが見えますね。


それでは、別のLogstashを使って、このAPIの結果をLogstahに入れてみます。

今回は、http_poller プラグインを使いました。

```
input {
   http_poller  {
     urls => {
       host => "http://localhost:9600/_node/stats/jvm"	
     }
     schedule => { cron => "* * * * * UTC"}
     codec => "json"
     metadata_target => "http_poller_metadata"
   }
}
output {
    elasticsearch {
      hosts => ["localhost"]
      index => "jvm-%{+YYYY.MM.dd}"
      document_type  => "monitoring"
    }
}
```

Logstashで取り込んだ結果をKibanaで可視化してみます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/123640/c4dce7e7-3b43-d50b-c452-80f7cd75fb73.png" width=100% alt="Logstash監視">

ヒープ使用量、プロセスのスレッド数、GC実行回数、GC実行時間が取得できていることが確認できました。

これを使えば、Logstashの可視化ができますね。
~~どこかで見たような画面とか、言っちゃいけません。~~

## 最後に
LogstashのMonitoring APIでは、CPUやメモリといったリソース以外にも、
Logstashの全体イベント実行回数や、実行中のスレッド情報も取得可能です。

描画ライブラリと組み合わせると、[Pipeline Viewer](https://www.elastic.co/guide/en/logstash/6.x/logstash-pipeline-viewer.html) のような表現もできるようになっています。

是非、お試しください。