【雲原生】Grafana Alerting 告警模組介紹與實戰操作

語言: CN / TW / HK

一、概述

在版本4.0+ grafana中增加了Alerting 告警模組,豐富了grafana功能,以前告警需要藉助AlertManager,但是有grafana告警模組之後就可以不使用AlertManager告警了,但是grafana也支援對接AlertManager,所以還是非常方面,又可以省區一個元件的維護和資源開銷。

下圖概述了 Grafana 告警的工作原理,並向您介紹了一些關鍵概念,這些概念協同工作並構成了我們靈活而強大的警報引擎的核心。 在這裡插入圖片描述

特徵: - 一頁包含所有警報:單個 Grafana 警報頁面將 Grafana 管理的警報和駐留在與 Prometheus 相容的資料來源中的警報整合到一個位置。 - 多維度告警:警報規則可以為每個警報規則建立多個單獨的警報例項(稱為多維警報),使你能夠強大而靈活地通過單個警報來了解整個系統。 - 路由警報:根據您定義的標籤將每個警報例項路由到特定的聯絡點。通知策略是一組規則,用於將警報路由到聯絡點的位置、時間和方式。 - 抑制告警:抑制告警允許您停止接收來自一個或多個警報規則的持久通知。您還可以根據特定條件部分暫停警報。 - 抑制告警時間段:使用抑制告警時間段設定,您可以指定不希望生成或傳送新通知的時間間隔。您還可以將警報通知凍結在重複時間段內,例如在維護期間。

官方文件:https://grafana.com/docs/grafana/latest/alerting/
關於Grafana其它模組的介紹可以參考我這篇文章:【雲原生】Grafana 介紹與實戰操作

告警配置全過程如下圖: 在這裡插入圖片描述

二、Grafana Alerting 模組介紹

在這裡插入圖片描述

  • Alert rules(告警規則)——設定確定是否觸發警報例項的評估條件。告警規則由一個或多個查詢和表示式、條件、計算頻率以及滿足條件的持續時間(可選)組成。
  • Contact points(聯絡點即告警通道)——定義在警報觸發時如何通知聯絡人。我們支援多種 告警通道,例如:郵件、webhook、alertmanager、釘釘等等。
  • Notification policies(通知策略)——設定警報的路由位置、時間和方式。每個通知策略指定一組標籤匹配器,以指示它們負責哪些警報。通知策略分配有一個由一個或多個通知程式組成的聯絡點。
  • Silences(告警抑制)——可以設定某個時間段不告警,例如:系統升級或者階段。

三、配置圖表

圖表配置可以參考我這篇文章:【雲原生】Grafana 介紹與實戰操作

四、告警告警規則

進入編輯介面,可以是下圖Edit進入編輯介面,也可以通過快捷方式“選中圖表-》按e在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 配置相關資訊 在這裡插入圖片描述 配置link,可以在告警裡顯示,就可以跳轉到相關監控項圖表 在這裡插入圖片描述

告警狀態變化Normal-》Padding-》Firing 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述

五、配置告警通道(Contact points)

1)Email

1、配置smtp(grafana.ini)

```bash [smtp] enabled = true host = "smtp.qq.com:465" user = "[email protected]"

If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""

password = "xxxxxx" ;cert_file = ;key_file = ;skip_verify = false from_address = [email protected] from_name = Grafana

EHLO identity in SMTP dialog (defaults to instance_name)

;ehlo_identity = dashboard.example.com

SMTP startTLS policy (defaults to 'OpportunisticStartTLS')

;startTLS_policy = NoStartTLS ```

【溫馨提示】上面配置記得換成自己的郵箱密碼。

重啟grafana bash systemctl restart grafana-server

2、配置訊息模板

```bash {{ define "myalert" }} [{{.Status}}] {{ .Labels.alertname }} Labels: {{ range .Labels.SortedPairs }} {{ .Name }}: {{ .Value }} {{ end }} {{ if gt (len .Annotations) 0 }} Annotations: {{ range .Annotations.SortedPairs }} {{ .Name }}: {{ .Value }} {{ end }} {{ end }} {{ if gt (len .SilenceURL ) 0 }} Silence alert: {{ .SilenceURL }} {{ end }} {{ if gt (len .DashboardURL ) 0 }} Go to dashboard: {{ .DashboardURL }} {{ end }} {{ end }}

{{ define "mymessage" }} {{ if gt (len .Alerts.Firing) 0 }} {{ len .Alerts.Firing }} firing: {{ range .Alerts.Firing }} {{ template "myalert" .}} {{ end }} {{ end }} {{ if gt (len .Alerts.Resolved) 0 }} {{ len .Alerts.Resolved }} resolved: {{ range .Alerts.Resolved }} {{ template "myalert" .}} {{ end }} {{ end }} {{ end }} ```

3、配置告警通道

在這裡插入圖片描述 上面配置好後就等待著告警就ok了。告警資訊示例如下: 在這裡插入圖片描述

2)WebHook

在這裡插入圖片描述

告警示例 JSON:

bash { "receiver": "My Super Webhook", "status": "firing", "orgId": 1, "alerts": [ { "status": "firing", "labels": { "alertname": "High memory usage", "team": "blue", "zone": "us-1" }, "annotations": { "description": "The system has high memory usage", "runbook_url": "https://myrunbook.com/runbook/1234", "summary": "This alert was triggered for zone us-1" }, "startsAt": "2021-10-12T09:51:03.157076+02:00", "endsAt": "0001-01-01T00:00:00Z", "generatorURL": "https://play.grafana.org/alerting/1afz29v7z/edit", "fingerprint": "c6eadffa33fcdf37", "silenceURL": "https://play.grafana.org/alerting/silence/new?alertmanager=grafana&matchers=alertname%3DT2%2Cteam%3Dblue%2Czone%3Dus-1", "dashboardURL": "", "panelURL": "", "valueString": "[ metric='' labels={} value=14151.331895396988 ]" }, { "status": "firing", "labels": { "alertname": "High CPU usage", "team": "blue", "zone": "eu-1" }, "annotations": { "description": "The system has high CPU usage", "runbook_url": "https://myrunbook.com/runbook/1234", "summary": "This alert was triggered for zone eu-1" }, "startsAt": "2021-10-12T09:56:03.157076+02:00", "endsAt": "0001-01-01T00:00:00Z", "generatorURL": "https://play.grafana.org/alerting/d1rdpdv7k/edit", "fingerprint": "bc97ff14869b13e3", "silenceURL": "https://play.grafana.org/alerting/silence/new?alertmanager=grafana&matchers=alertname%3DT1%2Cteam%3Dblue%2Czone%3Deu-1", "dashboardURL": "", "panelURL": "", "valueString": "[ metric='' labels={} value=47043.702386305304 ]" } ], "groupLabels": {}, "commonLabels": { "team": "blue" }, "commonAnnotations": {}, "externalURL": "https://play.grafana.org/", "version": "1", "groupKey": "{}:{}", "truncatedAlerts": 0, "title": "[FIRING:2] (blue)", "state": "alerting", "message": "**Firing**\n\nLabels:\n - alertname = T2\n - team = blue\n - zone = us-1\nAnnotations:\n - description = This is the alert rule checking the second system\n - runbook_url = https://myrunbook.com\n - summary = This is my summary\nSource: https://play.grafana.org/alerting/1afz29v7z/edit\nSilence: https://play.grafana.org/alerting/silence/new?alertmanager=grafana&matchers=alertname%3DT2%2Cteam%3Dblue%2Czone%3Dus-1\n\nLabels:\n - alertname = T1\n - team = blue\n - zone = eu-1\nAnnotations:\nSource: https://play.grafana.org/alerting/d1rdpdv7k/edit\nSilence: https://play.grafana.org/alerting/silence/new?alertmanager=grafana&matchers=alertname%3DT1%2Cteam%3Dblue%2Czone%3Deu-1\n" } 這裡通過python的去寫webhook,因為條件有限,還是通過webhook轉到郵箱發告警,一般企業會通過webhook轉釘釘,微信,zabbix等等。

1、編寫webhook api服務

```python

!/usr/bin/python3

-- coding: utf-8 --

@Time : 2022/12/24 11:03

@Author : liugp

@Email : [email protected]

@File : GrafanaWebHook.py

import json import smtplib from email.mime.text import MIMEText from email.header import Header from flask import Flask, request

pip3 install flask

app = Flask(name)

class GrafanaWebHook: def init(self): # 第三方 SMTP 服務資訊 self.mail_host = "smtp.qq.com" self.mail_user = "[email protected]" self.mail_pass = "xxxxxx"

    self.sender = "[email protected]"
    self.receiver = "[email protected]"  # 接收郵件,可設定為你的QQ郵箱或者其他郵箱

def send_mail(self, title, status, messages):

    print(messages)
    for message in messages:
        message['panelURL'] = str(message['panelURL']).replace("localhost:3000","192.168.182.110:3000")
        print(message)
        if not 'description' in message['annotations'].keys():
           message['annotations']['description'] = "test"

        message = MIMEText('grafana alert:' + title + '\n告警時間:' + str(message['startsAt']) +
                           '\n告警狀態:' + str(status) + '\n告警內容:' + str(
            message['annotations']['description']) + '\n告警面板:' + str(message['silenceURL']) + '', 'plain', 'utf-8')
        message['From'] = self.sender
        message['To'] = self.receiver

        subject = title
        message['Subject'] = Header(subject, 'utf-8')

        try:
            smtpObj = smtplib.SMTP_SSL(self.mail_host, 465)
            smtpObj.login(self.mail_user, self.mail_pass)
            smtpObj.sendmail(self.sender, self.receiver, message.as_string())
            print("郵件傳送成功")
            return True
        except smtplib.SMTPException as e:
            print("Error: 無法傳送郵件", e)
            return False

def getAlertData(self):
    alertData = request.get_data()
    # 將str型別的資料轉換為dict型別
    alertData = json.loads(alertData)
    #print(alertData)
    return alertData

@app.route('/webhook', methods=["POST"]) def webhook_server(): gw = GrafanaWebHook() alertData = gw.getAlertData() title = alertData['title'] status = alertData['status'] messages = alertData['alerts'] ret = gw.send_mail(title, status, messages) if ret: return {"status":"ok"} else: return {"status":"error"}

if name == "main": app.run(debug=False, host='0.0.0.0', port=18088)

```

【溫馨提示】使用時注意把上面的郵箱和密碼修改哦!!!

在這裡插入圖片描述

2、在grafana頁面上配置

在這裡插入圖片描述

配置好後就可以等待告警,告警示例如下: 在這裡插入圖片描述

3)Alertmanager

配置如下: 在這裡插入圖片描述 這裡主要講了三種告警通道,其它告警通道小夥伴可以自行測試驗證,有疑問的小夥伴也歡迎給我留言,後續會持續更新【雲原生+大資料】相關的文章,請小夥伴耐心等待~