Elastic Stackでシステム監視 Heartbeatで収集した死活情報をKibanaで可視化

前回はHeartbeatで収集した情報をElasticsearchに送信し、そのデータを利用できるようにKibanaでインデックスパターンを登録するところまでやった。
今回はKibanaでその収集した情報をわかりやすく可視化したいと思う。

まず、Heartbeatが収集したデータを見てみる。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#安物のなんちゃって管理機能付きL2SWをhttpで死活確認(稼働中)
{
  "@timestamp": "2018-04-19T00:52:11.281Z",
  "@metadata": {
    "beat": "heartbeat",
    "type": "doc",
    "version": "6.2.3"
  },
  "beat": {
    "hostname": "es.example.com",
    "version": "6.2.3",
    "name": "es.example.com"
  },
  "tcp": {
    "port": 80,
    "rtt": {
      "connect": {
        "us": 1718
      }
    }
  },
  "http": {
    "response": {
      "status": 200
    },
    "rtt": {
      "write_request": {
        "us": 67
      },
      "response_header": {
        "us": 3393
      },
      "validate": {
        "us": 3432
      },
      "content": {
        "us": 39
      },
      "total": {
        "us": 5236
      }
    },
    "url": "http://192.168.0.250"
  },
  "monitor": {
    "name": "http",
    "type": "http",
    "ip": "192.168.0.250",
    "duration": {
      "us": 5320
    },
    "status": "up",
    "scheme": "http",
    "id": "http@http://192.168.0.250"
  },
  "type": "monitor"
}

IP電話機をicmpで死活確認(稼働中)
{
  "@timestamp": "2018-04-19T00:52:11.281Z",
  "@metadata": {
    "beat": "heartbeat",
    "type": "doc",
    "version": "6.2.3"
  },
  "type": "monitor",
  "beat": {
    "hostname": "es.example.com",
    "version": "6.2.3",
    "name": "es.example.com"
  },
  "icmp": {
    "requests": 1,
    "rtt": {
      "us": 201992
    }
  },
  "monitor": {
    "name": "icmp",
    "type": "icmp",
    "ip": "192.168.6.145",
    "duration": {
      "us": 202085
    },
    "status": "up",
    "id": "icmp-icmp-ip@192.168.6.145"
  }
}

IP電話機をicmpで死活確認(電源OFF)
{
  "@timestamp": "2018-04-19T00:52:11.281Z",
  "@metadata": {
    "beat": "heartbeat",
    "type": "doc",
    "version": "6.2.3"
  },
  "beat": {
    "name": "es.example.com",
    "hostname": "es.example.com",
    "version": "6.2.3"
  },
  "icmp": {
    "requests": 0
  },
  "monitor": {
    "id": "icmp-icmp-ip@192.168.6.159",
    "name": "icmp",
    "type": "icmp",
    "ip": "192.168.6.159",
    "duration": {
      "us": 5001197
    },
    "status": "down"
  },
  "error": {
    "type": "io",
    "message": "write ip4 0.0.0.0-\u003e192.168.6.159: sendto: host is down"
  },
  "type": "monitor"
}

icmp(ping)で収集した場合とhttpで収集した場合でデータが別物な部分があるが、monitor.ip(監視対象ホストのIPアドレス)やmonitor.status(死活状態)は共通で、最低限の死活監視であればそれらとタイムスタンプだけ見れば良いのかも。

Heartbeatで収集したデータをKibanaを使って可視化 1
Kibana左列のVisualizeを開き、(新規作成)をクリック。

ヒートマップを使って時間別の死活状態を表示

Heartbeatで収集したデータをKibanaを使って可視化 2
ヒートマップを作成する場合は上の画像の赤枠の1つHeart Mapを使用する。

Heartbeatで収集したデータをKibanaを使って可視化 3
今回は前回作成したインデックスから作成するので heartbeat-* をクリック。

Heartbeatで収集したデータをKibanaを使って可視化 4
Metricsの側は1以上の値が入るなら何でも良いと思う。今回はAggregationにSum、フィールドにmonitor.duration.usを指定した。
バケツの指定
X軸(X-Axis)はAggregationに Date Histogram を指定。フィールドは @timestamp。
Y軸(Y-Axis)はSub Aggregationに Terms を指定。ファールドはmonitor.ip.keyword (監視対象ホストIP)、SizeにはHeartbeatでの監視対象台数以上を指定。
左上のAdd a filter でフィルターを追加する。条件は[monitor.status] [is] [up]でステータスがup(稼働中)のみ表示とする。
左上の黒塗りのheartbeat-*の下Optionsでオプション画面を開き、Numbers of colorsを2にするとヒートマップの表示色数が2色に減る。2色を指定しても実際には白・薄色・濃色の3色での表示だが。
(グラフ描画)をクリックしてヒートマップが表示されること。(上の画像では真っ白が「停止」、薄色・濃色が「稼働」を示す)
気に入ったら[Save]で保存する。

リスト表示で死活状態を表示

Heartbeatで収集したデータをKibanaを使って可視化 2
死活リストを作成する場合は上の画像の赤枠の1つData Tableを使用する。

Heartbeatで収集したデータをKibanaを使って可視化 3
今回は前回作成したインデックスから作成するので heartbeat-* をクリック。

Heartbeatで収集したデータをKibanaを使って可視化 5
Metricsの指定
AggregationにはTop Hitを指定する。フィールドは@timestampとする。 OrderはDescending(降順)、Sizeには1を指定し、最新の1つのレコードのみ表示とする。
バケツの指定
Split RowsでAggregationをTermにする。フィールドはmonitor.ip.keywordとする。SizeにはHeartbeatでの監視対象台数以上を指定。
これに死活状態を追加で表示するが、好みでSplit RowsにしてもSplit Tableにしても良いかと思う。今回はステータスがup(稼働)とdown(停止)を完全に分けて表示したかったのでSplit Tableを指定した。
Sub AggregationはTermを選択、フィールドはminitor.status.keyword、Sizeはupとdownの2種類なので2を指定。

Dashboardを作成

Heartbeatで収集したデータをKibanaを使って可視化 6
ダッシュボードに上で作成した2つのVisualizeを貼り付けて保存する。
ヒートマップは表示期間を広げても狭めても問題ないが、死活リストは表示期間を広げるとUpとDownの両方に同一の監視対象機材が表示されることがある。死活リストはUp, Downそれぞれで表示対象期間内のステータス変更最新日時を求めるものなので表示期間を例えば24時間とするとその期間にステータスが変わるとそれがそれぞれUp, Downに入るのは当然。どうしても現在のステータスだけを表示したいということなら表示する対象期間を直近の15分とか5分とかにすればその「直近」にステータスが変わっていなければ監視対象IPはUpまたはDownのどちらかだけに表示されることになる。ステータス変更日時を見れば理屈は解る筈。

関連記事:

Elastic Stackでシステム監視 Heartbeatを使う準備

Heartbeatは各ホストにインストールする必要がないタイプのbeatsの1つ。他所のホストにpingを飛ばしたりhttpでアクセスして反応を見るというもの。ホストがWindows, Linux, xBSDならMetricbeatやFilebeatを入れて、またはSNMP(または他の監視機能)付きのアプライアンスならそれで情報を取れば良いのだが、「管理機能付きアンマネージド(意味不明)」な安物L2SWや家庭用程度の無線LANのAPやIP電話機などはbeatsをインストールすることも出来ずSNMP等も無いことが多いので死活監視をするとしたらpingや管理画面のウェブにアクセスして反応を見る程度になる。その程度でも機器が多い環境では死活監視できるのはありがたい。

インストール

FreeBSDのportsではHeartbeatはMetricbeatやFilebeatなどと一緒にインストールされるのでそれらを既に使っているならインストール済みの筈。

beatsは初めてというなら一応、以下。
# cd /usr/ports/sysutils/beats
# make install
# sysrc heartbeat_enable=Yes
heartbeat_enable:  -> Yes    #←この表示が出れば/etc/rc.confに追記(or変更)されている

FreeBSDのportsでは各beatsの実行ファイルと簡易版の設定ファイルの雛形だけがインストールされる。
できれば下のファイルも/usr/local/etc/あたりにコピーしておくと便利。Elasticのウェブサイトのドキュメントでは設定の情報を探すのが大変なので。
/usr/ports/sysutils/beats/work/src/github.com/elastic/beats/heartbeat/heartbeat.reference.yml

存在しない場合は
# cd /usr/ports/sysutils/beats
# make extract
# cp ./work/src/github.com/elastic/beats/heartbeat/heartbeat.reference.yml /usr/local/etc/
# cp ./work/src/github.com/elastic/beats/libbeat/_meta/
# make clean

Heartbeatの設定

/usr/local/etc/heartbeat.yml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#== Configure monitors ==
heartbeat.monitors:
# 監視対象1 IP-Phone #155
- type: icmp
  schedule: '@every 600s'
  hosts: ["192.168.6.155"]

# 監視対象2 LAN#4 Wi-Fi AP#2
- type: http
  urls: ["http://192.168.2.248/admin"]
  schedule: '@every 600s'

# 監視対象3 L2SW-LAN#5
- type: http
  urls: ["http://192.168.0.250"]
  schedule: '@every 300s'

#== Elasticsearch template setting ==
#setup.template.enabled: true
setup.template.name: "heartbeat"        #インデックス名を変更する場合は必要な設定(下の方)
setup.template.pattern: "heartbeat-*"   #インデックス名を変更する場合は必要な設定(下の方)

setup.template.settings:
  index.number_of_shards: 1
  index.codec: best_compression
  #_source.enabled: false

#== Dashboards ==
setup.dashboards.enabled: false
#setup.dashboards.url:

#== Kibana ==
#setup.kibana:
#  host: "127.0.0.1:5601"

#== Outputs ==
#output.logstash:
#  hosts: ["localhost:5044"]

output.elasticsearch:
  enabled: true                         #←この行が無いとelasticsearchに出力されないが簡易版の設定ファイルには書かれて無い
  hosts: ["localhost:9200"]
  ssl.enabled: false                    #SSL無効
  index: "heartbeat-%{+yyyy.MM.dd}"     #インデックス名を変更 初期値はheartbeat-バージョン-日付

  #username: "elastic"
  #password: "changeme"

#== Logging ==
#logging.level: debug
#logging.selectors: ["*"]
#logging.to_syslog: false
#logging.to_files: true
#logging.files:
#  path: /var/log
#  name: heartbeat.log

今回はHeartbeatなので出力するデータにそれほど無駄な内容はない筈。なのでLogstashでデータ加工をする必要はない。そこで、Heartbeatから直接elasticsearchに出力させることにした。
その場合、41行目が大事。

Heartbeat用テンプレートの登録

少なくとも「FreeBSDのportsでインストールしたHeartbeat 6.2.3」では上の設定でHeartbeatを起動するとタイムスタンプが「日時」ではなく「文字列」として認識されるためテンプレートを指定して@timestampの値を強制的に「日時」にする。今回はテンプレートで指定するのはタイムスタンプだけとする。

Elastic Stackでシステム監視 Heartbeat 1
Kibanaで左列のでDev Toolを開き、以下を入力してで実行する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
PUT /_template/heartbeat
{
"template" : "heartbeat-*",
  "mappings": {
    "doc": {
      "properties": {
        "@timestamp": {
          "type": "date"
        }
      }
    }
  }
}

右列の結果欄に  "acknowledged": true   が表示されること。

同様に  GET heartbeat-2018.04.18/_mapping   などのように"heartbeat-今日の日付"でマッピングを取得し、右列の結果で@timestampのtypeがdateという表示であればOK.
ただし、これはheartbeat起動後。

ここまでやったらHeartbeatを起動する。

# service heartbeat start

Kibanaでインデックスパターンを登録

Elastic Stackでシステム監視 Heartbeat 2
左列のManagementを開き、Index Patternsをクリック。

Elastic Stackでシステム監視 Heartbeat 3
[Create Index Pattern]をクリック。

Elastic Stackでシステム監視 Heartbeat 4
Index patternのテキストボックスに heartbeart-* を入力する。このとき下部にhearbeat-yyyy.MM.ddのインデックスが表示されていること。(無ければ登録できない)
[ Next step] をクリック。

Elastic Stackでシステム監視 Heartbeat 5
Time Filter field nameのプルダウンメニューが表示されていること。ここでプルダウンメニューが表示されていなければタイムスタンプとなるフィールドが存在しないと認識されているのでテンプレートの登録が正しく行われていない筈。
[]をクリックしてリストから @timestamp を選択する。
[Create Index pattern]をクリック。

Elastic Stackでシステム監視 Heartbeat 6
heartbeat-*のインデックスパターンが表示されていることを確認。違うインデックスパターンが表示されているなら上部でheartbeat-*を選択する。
フィールドリストの@timestampの右側に(時計アイコン)が表示されていること。

これでHeartbeatのデータをKibanaで使える状態になった。
Kibanaでの死活状態の可視化は次回。

関連記事:
Up