Metricbeatによるシステム情報の視覚化

#0 はじめに
システム情報(CPU使用率,メモリ使用量等)の可視化を試してみました。
ここでは、Kibana,Elasticsearch,Metricbeatを使ってみました。

#1 Metricbeatとは?
データの収集、送信をするBeatsというのがあります。
Beatsには、下記6種類あります。ここでは、Metricbeatを使います。
Beatsは、[ここ(公式ページ)](https://www.elastic.co/jp/products/beats)を参照してください。

| 名前       | 概要                       |
|:-----------|:---------------------------|
| Filebeat   | ログファイルの収集           |
| Metricbeat | CPU,メモリ等の情報収集       |
| Packetbeat | パケット情報の収集           |
| Winlogbeat | Windowsのイベントログの収集  |
| Auditbeat  | 監査データの収集             |
| Heartbeat  | リモートから稼働状況の監視    |


#2 環境
VMware Workstation 14 Player上の仮想マシン(1台)を使用しました。

##2.1 ゲストマシン
```
[root@centos74 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

[root@centos74 ~]# uname -r
3.10.0-693.el7.x86_64
```


##2.2 機能構成
ゲストマシンでkibana,elasticsearch,Metricbeatが動作します。
それぞれの役割は以下のとおりです。

| 機能          | 役割                                             |
|:-------------|:-------------------------------------------------|
|Metricbeat    | CPU,メモリ等の情報を収集して、Elasticsearchに送信   |
|Elasticsearch | データの保管、検索                                 |
|kibana        | Elasticsearchに保管されたログデータの可視化         |

```
+---- PC -----+  +--------------- Guest Machine(CentOS7.4) -------------------+
|             |  |                                                            |
|             |  | +--- Kibana --+  +-- Elasticsearch --+  +-- Metricbeat --+ |
|             |  | |             |  |                   |  |                | |
|             |  | |             |  |                   |  |                | |
| Web Browser |  | +--[5601]-----+  +-------[9200]------+  +----------------+ |
|    |        |  |      A      |             A  A             |               |
|    |        |  |      |      |             |  |             |               |
|    |        |  |      |      +- localhost -+  +- localhost -+               |
|    |        |  |      |                                                     |
|    |        |  |      |                                                     |
+----|--------+  +---- eth0 --------------------------------------------------+
     |            (192.168.3.20)
     |                  |
     |                  |
     +------------------+
```
図中の[]内はTCPポート番号を表します。矢印(--->)は、TCPコネクションを確立する方向を表します。


#3 インストール

##3.1 公開鍵のインストール

```
[root@centos74 ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
```

##3.2 リポジトリの追加

公式ページの[説明](https://www.elastic.co/guide/en/kibana/current/rpm.html)にしたがって、リポジトリを追加しました。
Kibanaのrpmパッケージは、本リポジトリーより取得します。

```console:Kibanaのリポジトリ追加
[root@centos74 ~]# vi /etc/yum.repos.d/kibana.repo
[root@centos74 ~]# cat /etc/yum.repos.d/kibana.repo
[kibana-6.x]
name=Kibana repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

公式ページの[説明](https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html)にしたがって、リポジトリを追加しました。
Elasticsearch,Metricbeatのrpmパッケージは、本リポジトリーより取得します。

```console:Elasticsearchのリポジトリ追加
[root@centos74 ~]# vi /etc/yum.repos.d/elasticsearch.repo
[root@centos74 ~]# cat /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```


##3.3 パッケージのインストール

```console:kibanaのインストール
[root@centos74 ~]# yum -y install kibana
```

```console:elasticsearchのインストール
[root@centos74 ~]# yum -y install elasticsearch
```

```console:metricbeatのインストール
[root@centos74 ~]# yum -y install metricbeat
```

#4 定義ファイルの編集
##4.1 Elasticsearchの定義ファイル編集
network.hostを192.168.0.1からlocalhostに変更しました。

```
network.hostを192.168.0.1から127.0.0.1に変更する。
[root@centos74 ~]# vi /etc/elasticsearch/elasticsearch.yml
#network.host: 192.168.0.1
network.host: localhost
```

##4.2 Kibanaの定義ファイル編集
server.hostを"localhost"から192.168.3.20に変更しました。

```
[root@centos74 ~]# vi /etc/kibana/kibana.yml
#server.host: "localhost"
server.host: 192.168.3.20
```


##4.3 Metricbeatの定義ファイル編集
Metricbeatの定義ファイルの編集方法は、[ここ](https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-getting-started.html)を参照しました。
setup.kibanaのhostを以下のように変更しました。

```
[root@centos74 ~]# vi /etc/metricbeat/metricbeat.yml

#============================== Kibana =====================================

# Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
# This requires a Kibana endpoint configuration.
setup.kibana:

  # Kibana Host
  # Scheme and port can be left out and will be set to the default (http and 5601)
  # In case you specify and additional path, the scheme is required: http://localhost:5601/path
  # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
  host: "192.168.3.20:5601"
```


#5 ポート番号の開放
Web Browserからkibanaの5601番ポートにアクセスするため、5601番ポートへのアクセスを許可する。

```
[root@centos74 ~]# firewall-cmd --add-port=5601/tcp
success
[root@centos74 ~]# firewall-cmd --runtime-to-permanent
success
[root@centos74 ~]# firewall-cmd --list-ports
5601/tcp
```

#6 サービスの起動

```
[root@centos74 ~]# systemctl start elasticsearch
[root@centos74 ~]# systemctl start kibana
[root@centos74 ~]# systemctl start metricbeat
```


#7 ポート番号の確認
ポート番号の確認方法は、[ここ(lsofコマンドの使い方)](https://qiita.com/hana_shin/items/cdc58fe8f4f7705c7a8a)を参照ください。

```console:elasticsearchが使用しているポート番号
[root@centos74 ~]# lsof -i:9200 -nP
COMMAND    PID          USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java      9871 elasticsearch  176u  IPv6  70263      0t0  TCP 127.0.0.1:9200->127.0.0.1:32972 (ESTABLISHED)
java      9871 elasticsearch  177u  IPv6  71032      0t0  TCP 127.0.0.1:9200 (LISTEN)
java      9871 elasticsearch  178u  IPv6  71033      0t0  TCP [::1]:9200 (LISTEN)
java      9871 elasticsearch  179u  IPv6  70268      0t0  TCP 127.0.0.1:9200->127.0.0.1:32974 (ESTABLISHED)
java      9871 elasticsearch  737u  IPv6  71809      0t0  TCP 127.0.0.1:9200->127.0.0.1:32976 (ESTABLISHED)
node      9942        kibana   10u  IPv4  70262      0t0  TCP 127.0.0.1:32972->127.0.0.1:9200 (ESTABLISHED)
node      9942        kibana   12u  IPv4  70267      0t0  TCP 127.0.0.1:32974->127.0.0.1:9200 (ESTABLISHED)
metricbea 9960          root    5u  IPv4  71039      0t0  TCP 127.0.0.1:32976->127.0.0.1:9200 (ESTABLISHED)
```

```console:kibanaが使用しているポート番号
[root@centos74 ~]# lsof -i:5601 -nP
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    9942 kibana   11u  IPv4  70234      0t0  TCP 192.168.3.20:5601 (LISTEN)
```

#8 ダッシュボードの有効化

https://www.elastic.co/guide/en/beats/metricbeat/6.2/load-kibana-dashboards.html

```
[root@centos74 ~]# metricbeat setup --dashboards
Loaded dashboards
```

#9 kibanaへのアクセス

##9.1 KibanaのTOPページへのアクセス
下記URLにアクセスする。
http://192.168.3.20:5601/
![kibana.png](https://qiita-image-store.s3.amazonaws.com/0/146813/449364ad-df61-93ea-8880-6e0974948f94.png)

##9.2 KibanaのDashboardへのアクセス
![kibana1.png](https://qiita-image-store.s3.amazonaws.com/0/146813/b0b7faba-2a3e-1644-ca2b-536b6dea43b1.png)
![kibana2.png](https://qiita-image-store.s3.amazonaws.com/0/146813/9e298bd4-1ad1-bec0-7264-6c31c0f9c5cc.png)
![kibana3.png](https://qiita-image-store.s3.amazonaws.com/0/146813/cbc97848-1548-056f-89b9-1e6c28f968e6.png)


#10 実験
stress-ng,stress,iperf3等のツールを使って、負荷をかけてみます。
そのときの様子をKibanaのDashboardより確認してみます。

##10.1 CPU使用率の確認
stress-ngコマンドを使って、搭載している全てのCPUでCPU使用率を60%程度にしてみます。
stress-ngコマンドの使い方は、[ここ(stress-ngコマンドの使い方)](https://qiita.com/hana_shin/items/0a3a615274717c89c0a4)を参照してください。

```console:ゲストマシンが搭載しているCPU数(4個)
[root@centos74 ~]# cat /proc/cpuinfo |grep processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3
```

```console:stress-ngコマンド実行
[root@centos74 ~]# stress-ng -c 4 -l 60
stress-ng: info:  [1502] defaulting to a 86400 second run per stressor
stress-ng: info:  [1502] dispatching hogs: 4 cpu
```

```console:psコマンドによるCPU使用率の確認
[root@centos74 ~]# ps -C stress-ng-cpu -o comm,pid,ppid,%cpu
COMMAND            PID   PPID %CPU
stress-ng-cpu     1503   1502 58.9
stress-ng-cpu     1504   1502 59.0
stress-ng-cpu     1505   1502 59.1
stress-ng-cpu     1506   1502 59.0
```

CPU使用率が60%程度になっていることがわかる。
また、stress-ng-cpuプロセスはユーザモードでCPUを消費するので、user(緑色の部分)がCPU使用率の大部分を占めていることもわかる。
![cpu1.png](https://qiita-image-store.s3.amazonaws.com/0/146813/c29cc5e3-8a28-ddd6-4979-2af1d06a0f07.png)
![cpu2.png](https://qiita-image-store.s3.amazonaws.com/0/146813/301397e4-d0a7-9446-05ea-1c632b8dcf2c.png)


##10.2 メモリ使用量の確認
stressコマンドを使って、メモリ使用量を増やしてみます。
stressコマンドを3回実行します。1,2回目で256M、3回目で512Mのメモリを確保してみます。
stressコマンドの使い方は、[ここ(stressコマンドの使い方)](https://qiita.com/hana_shin/items/b1d8cd559d1a326f4d42)を参照してください。

```console:メモリ確保
[root@centos74 ~]# stress -m 1 --vm-hang 0 -q&
[root@centos74 ~]# stress -m 1 --vm-hang 0 -q&
[root@centos74 ~]# stress -m 1 --vm-bytes 536870912 --vm-hang 0 -q&
```

```console:psコマンドによるメモリ使用量の確認
[root@centos74 ~]# ps -C stress -o comm,pid,ppid,rss
COMMAND            PID   PPID   RSS
stress            1668   1026   424
stress            1669   1668 262296 ★256M使用
stress            1676   1466   424
stress            1677   1676 262376 ★256M使用
stress            1692   1466   424
stress            1693   1692 524456 ★512M使用
```

メモリを確保した時点で、メモリ使用量が増加(黒丸で囲んだ場所)していることがわかります。
![mem1.png](https://qiita-image-store.s3.amazonaws.com/0/146813/cc751ed5-b416-48b2-7444-035d497247b3.png)


##11.3 ネットワーク負荷の確認
iperf3コマンドを使って、インバウンド（受信)のネットワーク負荷をかけてみます。
iperf3コマンドの使い方は、[ここ(iperf3コマンドの使い方)](https://qiita.com/hana_shin/items/599eb9a706d89f957e52)を参照してください。

```console:構成
centos74,centos72はホスト名です。centos74でKibanaが動作しています。
centos72からcentos74に対してTCPパケットを送信します。
             192.168.3.0/24
centos72 ----------------------- centos74
       .30                     .20
```

```console:iperf3の実行(サーバ側)
[root@centos74 ~]# iperf3 -s
```

```console:iperf3の実行(クライアント側)
[root@centos72 ~]# iperf3 -c 192.168.3.20 -t 600
```
インバウンドトラフィックが 312.8MB/sであることがわかる。
また、TCPパケットはソフト割込みで処理するため、softirqの割合が増加していることもわかります。
![net1.png](https://qiita-image-store.s3.amazonaws.com/0/146813/ccb6356b-dd9e-56a6-4666-ea24569ad1ca.png)

インバウンドトラフィックのパケット数、バイト数が増加していることがわかります。
![net2.png](https://qiita-image-store.s3.amazonaws.com/0/146813/1adc9877-46a7-efb0-1762-46dfb9eaf8cd.png)

#Y メモ

##Y.1 Logstash
公式[ページ](https://www.elastic.co/guide/en/logstash/current/installing-logstash.html)よると、LogstashはJava 8が必要とあります。

```console:javaの版数
[root@centos74 ~]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
```

##Y.2 Metricbeatのモジュール有効、無効化方法

```
モジュールの有効、無効は/etc/metricbeat/modules.dで行います。
[root@centos74 modules.d]# pwd
/etc/metricbeat/modules.d

apacheモジュールが無効になっていることがわかる。
[root@centos74 modules.d]# ls apache.yml*
apache.yml.disabled

apacheモジュールを有効にする。
[root@centos74 modules.d]# metricbeat modules enable apache
Enabled apache

apacheモジュールが有効になったことがわかる。
[root@centos74 modules.d]# ls apache.yml*
apache.yml

apacheモジュールを無効にする。
[root@centos74 modules.d]# metricbeat modules disable apache
Disabled apache

apacheモジュールが無効になったことがわかる。
[root@centos74 modules.d]# ls apache.yml*
apache.yml.disabled
```




#Z 参考情報
[公式ページ(日本語)](https://www.elastic.co/jp/products/kibana)
[Elasticsearch、Logstash 、Kibana、によるログの可視化　～価値のある情報を導き出す方法のご紹介 ～](http://www.casleyconsulting.co.jp/blog-engineer/%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90/elasticsearch%E3%80%81logstash-%E3%80%81kibana%E3%80%81%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AD%E3%82%B0%E3%81%AE%E5%8F%AF%E8%A6%96%E5%8C%96%E3%80%80%EF%BD%9E%E4%BE%A1%E5%80%A4%E3%81%AE%E3%81%82%E3%82%8B/)