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のどちらかだけに表示されることになる。ステータス変更日時を見れば理屈は解る筈。

関連記事: