iT邦幫忙

2024 iThome 鐵人賽

DAY 21
1
DevOps

Grafana Zero to Hero系列 第 21

Grafana Zero to Hero - Notification:事件驅動

  • 分享至 

  • xImage
  •  

除了通知外,如果希望 Alert 觸發其他自動化行為,可以使用 Webhook 或 Kafka。兩者的差別在於:Webhook 直接推送訊息至單一個下游服務,而 Kafka 則是推送訊息至 Kafka,再由下游服務自行訂閱訊息,這樣可以解耦 Alerting 與下游服務的相依關係。

Kafka vs Webhook

Webhook

Webhook 是服務之間串接的常用方式,下游服務會提供一組 URL,只要對該 URL 發送 Request 就可以執行預先設定的任務。例如前一篇提到的 Slack 通知的方式之一就是使用 Webhook URL。

除了通訊軟體通知外,許多工具也提供 Webhook 機制。例如,CICD 常用的 Jenkins 提供 Generic Webhook Trigger;自動化服務如 IFTTTZapier 則能串接更多其他服務,例如操作 Google Sheet、Calendar,或是進行更進階的通訊軟體互動等。如果想要自建這種自動化服務,也可以使用開源的 n8n

Webhook Config
Webhook Contact Point 的設定

以 n8n 為例,可以在 Workflow 中建立 Webhook 作為起點,但要注意 Method 必須選擇 POST,因為 Grafana Alerting 的 Webhook 只能發送 POST 或 PUT Method。接著可建立一個 Slack 發送訊息的 Node,轉送 Webhook body 中的 message。認證則使用與前一篇一樣的 Bot Token 並搭配 chat:write.public Scope。最後,可以再串上一個 reply 的 Slack Node,用於通知 Channel 內所有人。

n8n workflow
n8n 中的 Workflow 設定:左邊為 Webhook 起點,中間是 Slack 發送訊息,右邊是 Slack 回覆訊息。

n8n node1
n8n Webhook Node 設定:Method 設定為 POST,可以使用 Listen for test event 來測試接收到的內容。

n8n node2
n8n Slack 發送訊息 Node 設定:Credential 下拉選單可以建立與 Slack App 的連結。

n8n nod3
n8n Slack 回覆訊息 Node 設定:回覆目標根據前一個發送 Slack 訊息 Node 的 message_timestamp 來回覆。

n8n demo
n8n 轉發 Alerting 訊息至 Slack,並附加回覆訊息。

透過 Webhook,可以達到更多自動化的功能,使 Alerting 不再只是通知,而是能作為驅動其他行為的事件。例如,發生已有解決方案的事件時,可以透過自動化直接啟動修復行為,如重新啟動服務等。

Kafka

Kafka 是一種 Message Queue,適用於事件驅動的場景。透過將事件發送至 Kafka Server 的 Topic 中,有需要的服務可以自行訂閱該 Topic,這樣可解耦上游與下游的相依關係。當上游需要更改或下游需要擴展時,只需遵循 Topic 的內容即可。

Grafana 提供 Kafka REST Proxy 作為 Contact Point,透過 Kafka REST Proxy 可以使用 HTTP 將訊息轉送至 Kafka Server 中。有需要關注 Alert 事件的服務則可以自行訂閱 Contact Point 中設定的 Topic。

Kafka REST Proxy Arch
搭配 Kafka REST Proxy 的 Kafka 服務架構

Kafka Config
Kafka REST Proxy Contact Point 的設定

使用 Redpanda Console 可以查看 Kafka Server 的資訊,確認 Alerting 是否成功發送至 Kafka Server。

Topic
在 Redpanda Console 中檢視 Kafka Server 的 Topic。

Message
在 Redpanda Console 中檢視 Topic 的訊息內容。

Consume
下游服務可以訂閱 Kafka 中的 Topic,例如印出訊息內容。

Lab

範例程式碼:https://github.com/blueswen/grafana-zero-to-hero/tree/main/06-alerting/02-trigger-event

Lab Arch

此 Lab 會建立

  1. Nginx:單純作為被監測的 Container
  2. cAdvisor:收集 Container 資料
  3. Node Exporter:收集運行的機器(Node)的資料
  4. Prometheus:採集 cAdvisor 與 Node Exporter 的 Metrics
  5. Grafana:Lab 操作
  6. Kafka Components
    1. Kafka:Kafka Server 接收訊息與供下游服務訂閱
    2. Zookeeper:Kafka 的依賴
    3. Kafka REST Proxy:提供 HTTP API Interface 操作 Kafka Server
    4. Redpanda Console:Kafka Server Web UI,用於檢視 Kafka Server 內容
    5. Application:模擬訂閱 Alerting 的下游服務
  7. n8n:提供 Webhook 的自動化流程工具

Quick Start

  1. 啟動所有服務

    docker-compose up -d
    
  2. 設定 Contact Point 與測試 Alert

    1. Grafana: http://localhost:3000,登入帳號密碼為 admin/admin
    2. Webhook
      1. 登入 n8n: http://localhost:5678,建立帳號與設定一組起點為 Webhook 的 Workflow
      2. 在 Grafana 建立 Webhook Contact Point,n8n 的 Webhook URL 在編輯時使用的是 Test URL,Workflow 啟用後用的 URL 是 Production URL,並將 n8n 提供的 URL Domain 從 localhost 改為 n8n,在 Optional Webhook settingsHTTP Method 設定為 POST
      3. 使用 Contact Point 的 Test 發送測試訊息驗證
    3. Kafka
      1. 在 Grafana 建立 Kafka REST Proxy Contact Point,URL 設定為 http://rest-proxy:8082,Topic 設定為 grafana-alerting
      2. 使用 Contact Point 的 Test 發送測試訊息驗證
      3. 開啟 Redpanda Console: http://localhost:8080/ 在 Topic 頁籤中選擇 grafana-alerting Topic 查看測試訊息
      4. 檢視 Application 的 Container Log 查看 Topic 被訂閱後 Consume 印出的內容
  3. 關閉所有服務

    docker-compose down
    

上一篇
Grafana Zero to Hero - Notification:隨時隨地接收告警
下一篇
Grafana Zero to Hero - Grafana OnCall:從 Alerting 邁向 IRM
系列文
Grafana Zero to Hero30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言