# 透過 Kibana 觀看心電圖及設定警報

### 本篇學習重點

* 如何使用 Kibana 的 Uptime 功能來觀察 Heartbeat 記錄的資料。
* 當發生問題時，如何透過 Alert 設定主動通知。

## Kibana 的 Uptime 功能介面

當我們透過前一篇所介紹的 Heartbeat 收集資料後，接下來我們要將介紹如何透過 Kibana 的 Uptime 功能，來檢視這些資料。

進入 **Kibana** 的主畫面後，點選主選單，並從 **Observability** 的區塊，可以找到 **Uptime** 的進入點。

![05-kibana-uptime-ui](https://i.imgur.com/h1l6TXB.png)

### Monitors 主畫面

點選進入後，我們可以看到 Uptime 的主要 Dashboard，畫面蠻單純，直接列出監控的彙總結果，包含多少個 Monitors 其中有哪些目前是 `Down` 以及過去指定的時間區間中，`Up` 與 `Down` 的 Histogram 圖表。

![05-kibana-uptime-overview](https://i.imgur.com/vj8Nh65.png)

在底下的**監控總覽**的區塊，會條列出每一項我們所設定的 **Monitor**，並且包含這些 Monitor 的主要狀態資訊。

### 指定 Monitor 的內容畫面

點選其中一個 Monitor 之後，可以進入 **ES Cluster Monitor** 的頁面，如下圖。

![05-kibana-uptime-monitor-detail](https://i.imgur.com/yqSRX5X.png)

這個 Monitor 的畫面會包含幾個重點，以上圖我的情境為例進行說明：

* 這一組 Monitor 項目的主要資訊，包含這組監控在指定時間之內的可用性 (availability) 比例 `100.00%`、監控這組服務的 URL `http://training.onedoggo.com`，監控的類型 `HTTP` 、有哪些 Tags `onedoggo` `training` `web`、以及 TLS Certificate 多久之後會到期 `Expires in 9 monthes`。
* 這一組 Monitor 項目，包含哪些從哪些地區的監控： `taipei` 與 `tokyo`，以及這些地區各自在這段時間的可性用 (availability) 比例及最後檢查的時間。
* **Monitor duration：** 這裡會列出每個地區在監控時，Heartbeat 所收到回應的時間，可以看出有沒有在那個時段或是哪個地區的延遲時間 (latency) 特別久。
* **Pings over time：** 在每個時段之中，總共 Pings 多少次，也就是代表發送了多少次 monitor check 的請求，以及異常與正常的比例 (圖中都是正常，所以都是灰色，有異常會是紅色)。
* **History：** 這部份會詳細的列出每次執行檢查請求的執行結果，包含結果是否正常 `Up` 或 `Down`、檢查的時間、從哪個 Geo Location 執行、HTTP status，花了多少時間 (Duration)、如果有錯誤的話，錯誤的內容是什麼 (如下圖)，另外如果有開啟記錄 HTTP response 的話，包含 HTTP Response Headers 與 Body 都會被詳細的記錄下來，在追查問題時很方便。

![image-20210920134237187](https://i.imgur.com/8V434gl.png)

### TLS Certificates 監控總覽

Kibana Uptime 會協助我們將所有 Monitors 之中有包含 **SSL/TLS** 的 Certificate 彙總起來，在 TLS Certificates 這裡可以看到所有的憑證列表及狀態，這個功能很方便，可以直接一覽所有憑證的狀態。

![05-kibana-uptime-tls-certificates](https://i.imgur.com/1Dm9G2M.png)

另外也能透過 Settings 的畫面，指定 Certificate 的過期通知的期限設定。

![05-kibana-uptime-setting-tls](https://i.imgur.com/Vs0q7eD.png)

### 除了 Kibana Uptime 的功能之外，可以匯入 Elastic 替 Heartbeat 建好的 Dashboard

若要使用 Elastic 替 Uptime 建立的 Dashboard，要另外到 Github (<https://github.com/elastic/uptime-contrib>) 下載，並且使用 Kibana > Stack Management > Saved Objects 的功能，使用 Import 將對應 Github 裡的 `http_dashboard.ndjson` 檔案匯入，匯入完成後，就可以到 Dashboard 選擇開啟 `Heartbeat HTTP monitoring` 的 Dashboard。

![image-20210920224716126](https://i.imgur.com/Yb2Sw5J.png)

## 設定 Alert 讓我們能主動接受到異常的通知

當有異常發生時，我們想要主動收到通知，這時就要使用到 Elastic Alert 的功能，我們首先要建立 Connector 來設定通知發送到哪邊，再透過 Uptime 進行 Alert 的設定。

> 這邊要注意 Alert 的功能有蠻多會是需要使用到進階的授權，不是免費的。

### 初始化 Kibana 的 Alert 設定

如果是第一次使用 Alerting 的功能，在進入 **Stack Management** 的 **Connectors** 設定中要建立 Connectors 時，會看到以下的畫面，提示我們會需要先設定好 `xpack.encryptedSavedObjects.encryptionKey`。

![05-alert-warning](https://i.imgur.com/nMvJ7f8.png)

要產生這個 **EncryptionKey** 可以透過 `kibana-encryption-keys` 的指令來協助產生，這個指令就放在 kibana 的 `bin` 資料夾裡面。\[1]

```
./bin/kibana-encryption-keys generate
```

執行指令後，就會產生 encryption keys。

![05-kibana-generate-encryption-key](https://i.imgur.com/TwBpBnR.png)

這個指令只會協助我們產生 key，我們需要將產生出來的設定，添加到 `config/kibana.yml` 裡面。

一但設定完成、重新啟動 kibana 之後，我們回到 Connectors 的設定頁面，就可以建立新的 Connector 了。

![05-kibana-create-connector](https://i.imgur.com/8bzZXfi.png)

### 建立 Connectors

這邊使用 Slack Connector 為例。

> 請注意：要使用 Slack Connector 會需要擁有 Gold License 以上的授權。

![image-20210920125136535](https://i.imgur.com/yGktEaa.png)

選擇 `Slack` 之後，在建立 Connector 的畫面，會出現 `Create a Slack Webhook URL` 的連結，點選下去之後，會導到 Elastic 的官方文件，裡面有完整的設定教學，當中有提到要進入 Slack WebHook 的設定頁面 <https://my.slack.com/services/new/incoming-webhook> 去建立 WebHook。

![image-20210920125453553](https://i.imgur.com/PqHzKwD.png)

指定 Alert 要通知的 Channel 之後，建立 WebHook integration，就可以拿到 `WebHook URL`。

![image-20210920125647084](https://i.imgur.com/cewo7JW.png)

接著在 Add Connector 的地方，把這些資訊填寫完成，並且建立 Connector。

![image-20210920130533941](https://i.imgur.com/SID4Xyv.png)

### Uptime 設定 Default Connectors

接下來，我們可以在 Uptime 設定 Default Connectors，讓之後 Uptime 有異常發生時，透過這些 Connectors 發送通知。

![05-kibana-uptime-setup-default-connector](https://i.imgur.com/mF0iTRn.png)

### 在 Monitors 中啟用 Alert 的通知

一但我們設定好 Alert 的 Connectors 之後，我們就可以到 Monitors 的頁面，啟動 **Status alert**，接下來有異常發生時，就會通知到我們指定的 Connecters 了。

![image-20210920135724633](https://i.imgur.com/Qhlcf5a.png)

### 設定 TLS Certifcate 快過期時的通知報警

如果我們想在 TLS Certificate 快要過期時收到通知，我們要在 Uptime 設定 Alert。

1. 建立 **Alerts and rules** 。
2. 選擇 **Create rules** 。
3. 選擇 **TLS rule** 。
4. 填寫基本資料後，選擇要使用的 Actions。
5. 按下 **Save**。

![05-kibana-create-tls-expire-alert](https://i.imgur.com/gxYfqcG.png)

### 從 Slack 接收 Alert 的通知

接著從 Slack 的畫面可以看到有發生問題、或是狀態恢復時通知的內容。

![05-slack-alert](https://i.imgur.com/w57y32q.png)

***

以上的介紹，是透過 Kibana 針對 Uptime 所提供的功能，讓我們能迅速的掌握系統的可用性狀態，以及能在異常時發送通知提醒，除了 Kibana Uptime 所提供的畫面之外，我們也能自己透過 Virtualize 等工具，從 Heartbeat 所記錄並存放在 Elasticsearch 裡的資料，建立我們自己想要檢視的圖表與儀表版 (Dashboard)，這部份就不在這裡介紹，有興趣的可以從官方 Kibana 的說明文件參考做法。

## 參考資料

1. [官方文件 - Alerting and action settings in Kibana](https://www.elastic.co/guide/en/kibana/7.14/alert-action-settings-kb.html#general-alert-action-settings)
