Grafana系列之面板接入Prometheus Alertmanager

關于Grafana的儀表板Dashboard,以及面板Panel,參考Grafana系列之Dashboard。可以直接在面板上創建Alert,即所謂的Grafana Alert,參考Grafana系列之Grafana Alert。除了Grafana Alert外,面板也可接入Prometheus Alertmanager。

Alertmanager

關于Alertmanager的講解,網上有很多不錯的資料。

在這里插入圖片描述

配置文件

alertmanager.yaml配置文件如下:

global:resolve_timeout: 10m # 10分鐘內不再產生告警,則表示告警恢復
inhibit_rules:
- equal:- namespace- alertnamesource_matchers:- severity = criticaltarget_matchers:- severity =~ warning|info
- equal:- namespace- alertnamesource_matchers:- severity = warningtarget_matchers:- severity = info
- equal:- namespacesource_matchers:- alertname = InfoInhibitortarget_matchers:- severity = info
- target_matchers:- alertname = InfoInhibitor
receivers:
- name: web.hook.promalert.feishu # 飛書群機器人告警通知webhook_configs:- url: http://prometheus-alert-center:8080/prometheusalert?type=fs&tpl=fs-tpl-pretty&fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/9234ce69-1111-2222-96ce-f9136e47ac7&split=false # 不要試了,我已經篡改了send_resolved: false # 告警恢復后,不發送恢復通知
- name: 'web.hook.promalert.email' # 郵件告警通知webhook_configs:- url: 'http://prometheus-alert-center:8080/prometheusalert?type=email&tpl=email-tpl-pretty&email=aaa@tesla.com,bbb@tesla.com&split=false'send_resolved: false
- name: "null"
route:group_by:- namespace- instance- alertname- severitygroup_interval: 5mgroup_wait: 30sreceiver: web.hook.promalert.feishurepeat_interval: 60m # 持續產生的告警,每隔1h才發送,避免告警轟炸,默認10mroutes:- receiver: web.hook.promalert.feishu- matchers:- alertname = "Watchdog"receiver: "null"
templates:
- /etc/alertmanager/config/*.tmpl

配置中一般會包含以下幾個主要部分:

  • 全局配置(global):用于定義一些全局的公共參數,如全局的SMTP配置,Slack配置等內容;
  • 模板(templates):用于定義告警通知時的模板,如HTML模板,郵件模板等;
  • 告警路由(route):根據標簽匹配,確定當前告警應該如何處理;
  • 接收人(receivers):支持郵箱、微信、Slack、Webhook等,接收人一般配合告警路由使用;
  • 抑制規則(inhibit_rules):合理設置抑制規則可減少垃圾告警的產生

恢復通知

恢復通知到底要不要發送,不同的團隊可采用不一樣的實踐。

這里給出一個綠色的恢復通知的樣式:
在這里插入圖片描述

分組

一個規則文件下可以配置若干個告警規則,規則文件也可以有若干個。比較好的做法是,關于節點的放在一個文件里,關于pod的放在一個文件里,業務告警規則放在另一個文件里,最后的效果
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

實戰

新增一個alert.yaml文件如下:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:labels:# labels與Prometheus CRD中match ruleSelector -> matchLabels保持一致。release: kube-prom-stackname: tesla
spec:groups:- name: teslarules:- alert: "tesla登錄耗時大于6s"expr: 'round(rate(tesla_login_seconds_sum[1m])/rate(tesla_login_seconds_count[1m]), 0.01) > 6'for: 0slabels:severity: criticalannotations:summary: tesla登錄耗時大于6sdescription: "tesla登錄耗時大于6s<br> 實際耗時: {{ $value }}s<br> <a href=\"http://grafana.test.tesla.com:8800/d/ce83e684dcqv4c/tesla登錄?from=now-5m&to=now&timezone=browser&var-appId={{ $labels.appId }}&var-tenantId={{ $labels.tenantId }}\">查看詳情</a>"- alert: "接口異常"expr: 'round(rate(http_server_requests_seconds_count{status=~"4..|5.."}[1m]), 0.01) > 0'for: 0slabels:severity: criticalannotations:summary: 接口異常description: "接口異常<br> 應用: {{ $labels.job }}<br> 方法: {{ $labels.method }}<br> 狀態碼: {{ $labels.status }}<br> 接口: {{ $labels.uri }}<br> 報錯: {{ $labels.exception }}<br> <a href=\"http://grafana.test.tesla.com:8800/d/ee990bqfj9nuoe/api?from=now-1h&to=now&var-job={{ $labels.job }}&var-uri={{ $labels.uri }}&var-status={{ $labels.status }}\">查看詳情</a>"

然后執行命令:kubectl apply -f alert.yaml -o observe,或kc apply -f alert.yaml -o observe,kc是kubecolor的縮寫。

來到Prometheus Alert頁面,會發現新增的告警規則
在這里插入圖片描述
Prometheus告警有一個獨立的模塊,Alertmanager,告警效果如下
在這里插入圖片描述
上面直接給出最后的實現效果。

round

分析上面的告警配置,不難發現規則配置的核心自然就是expr表達式。

一開始并沒有使用round函數,rate(tesla_login_seconds_sum[1m])/rate(tesla_login_seconds_count[1m]) > 6,給出的告警是這樣的:
在這里插入圖片描述
小數點后位數太多,不友好。

description里的這個數據對應于{{ $value }},取自于expr表達式的比較操作符的前面那部分。description里不能用round等PromQL函數,于是對expr統一增加round函數。

踩坑:對所有的expr表達式統一加round函數。

round函數不帶小數點,也就是沒有寫成round(0.1)round(0.01)的兩個問題:

  • 對API接口的4xx或5xx異常監控:expr表達式為round(rate(http_server_requests_seconds_count{status=~"4..|5.."}[1m])) > 0,意思是過去1分鐘內平均值。試想一下,過去1分鐘有1次接口異常,rate(http_server_requests_seconds_count{status=~"4..|5.."}[1m])結果是什么?好好想一想,或者去Grafana頁面驗證一下。正確的結果是1/60=0.0166667,這個數據使用round取整,肯定不滿足大于0,也就是說本應該告警的事件,發生漏保。
  • 四舍五入并不精準:比如說某個登錄請求耗時是6.2秒,經過round函數處理后,自然變成6。6.2 > 6自然成立,round(6.2) > 6則不成立;本應該告警的事件,因為round使用不當,告警漏報。

如下圖,指標數是0.0166667的2倍,過去1分鐘發生2次。
在這里插入圖片描述
結論:統一調整優化round語法為取兩位小數點,也就是一開始給出的規則配置文件。

跳轉鏈接

告警成功發出后,在告警內容里增加該Prometheus Alert對應的Grafana面板鏈接,這一點很容易想到。

主要說四點:

  • 換行符:兼容郵件和markdown,換行符是<br>,而不是\n
  • 跳轉鏈接:markdown語法[some-url](some-url)支持有限(自己不會),改為使用href方式;
  • 轉義字符:description本身是雙引號,在里面使用href標簽,需要對href標簽引入的雙引號加以轉義處理,否則執行kc apply -f alert.yaml命令失敗,報錯如下面截圖所示。值得一提的是,如果對k8s(的yaml)不熟,死死盯著報錯提示的第18行,就會陷入死胡同。kubectl執行yaml文件時,會忽略yaml文件里的注釋行;真實的配置錯誤行,并不是報錯提示的那一行。
    在這里插入圖片描述
  • 變量定位:配置的跳轉地址寫成 http://grafana.test.tesla.com:8800/d/ee990bqfj9nuoe/api,當然沒有問題。既然是API接口異常,并且Grafana面板里配置有變量,能不能直接跳轉到觸發告警的異常API呢?當然可以,{{ $labels.job }}即可從標簽組里獲取到具體的某個標簽。寫法:http://grafana.test.tesla.com:8800/d/ee990bqfj9nuoe/api?from=now-1h&to=now&var-job={{ $labels.job }}&var-uri={{ $labels.uri }}&var-status={{ $labels.status }}

Markdown

Prometheus Alert提供對Markdown語法的支持,不過需要測試和配置。
在這里插入圖片描述
有待進一步學習

模板配置

告警方式有很多,本文暫且只考慮和配置飛書、郵件。不管什么樣的通知方式,告警內容都是其中非常核心的一環(也就是上面的配置文件中的templates模塊)。

當同時接入郵件、飛書、企業微信、阿里云短信,同一套告警內容如何同時適配多個不同的接收終端?

借助于開源項目(https://github.com/feiyu563/PrometheusAlert),可一定程度上解決上面提出的問題。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
飛書的告警模板:
在這里插入圖片描述
可供參考的飛書模板:

{{ $var := .externalURL}}{{range $k,$v:=.alerts}}
{{if eq $v.status "resolved"}}
生產環境(GPU)告警恢復通知
🟡【告警名稱】{{$v.labels.alertname}}
🚨【告警級別】{{$v.labels.severity}}
?【告警狀態】{{$v.status}}
🧭【開始時間】{{GetCSTtime $v.startsAt}}
🧭【結束時間】{{GetCSTtime $v.endsAt}}
📝【告警詳情】{{$v.annotations.description}}
{{else}}
非生產環境(GPU)告警通知
🟡【告警名稱】{{$v.labels.alertname}}
🚨【告警級別】{{$v.labels.severity}}
🔥【告警狀態】{{$v.status}}
🧭【開始時間】{{GetCSTtime $v.startsAt}}
📝【告警詳情】{{$v.annotations.description}}
{{end}}
{{end}}
{{ $urimsg:=""}}{{range $key,$value:=.commonLabels}}{{$urimsg = print $urimsg $key "%3D%22" $value "%22%2C"}}{{end}}[👉 點我屏蔽該告警 👈](http://alert.test.tesla.com/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D)

可供參考的郵件模板:

{{if eq .state "ok"}}
<h1><a href ={{.ruleUrl}}>Grafana恢復信息</a></h1>
<h2>{{.ruleName}}</h2>
<h5>告警級別:嚴重</h5>
<h5>開始時間:{{GetCSTtime ""}}</h5>
<h3>{{.message}}</h3>
{{else}}
<h1><a href ={{.ruleUrl}}>Grafana恢復信息</a></h1>
<h2>{{.ruleName}}</h2>
<h5>告警級別:嚴重</h5>
<h5>開始時間:{{GetCSTtime ""}}</h5>
<h3>{{.message}}</h3>
{{end}}
<img src=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png />

參考

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66446.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66446.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows 上安裝 MongoDB 的 zip 包

博主介紹&#xff1a; 大家好&#xff0c;我是想成為Super的Yuperman&#xff0c;互聯網宇宙廠經驗&#xff0c;17年醫療健康行業的碼拉松奔跑者&#xff0c;曾擔任技術專家、架構師、研發總監負責和主導多個應用架構。 近期專注&#xff1a; RPA應用研究&#xff0c;主流廠商產…

LeetCode 2266.統計打字方案數:排列組合

【LetMeFly】2266.統計打字方案數&#xff1a;排列組合 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-number-of-texts/ Alice 在給 Bob 用手機打字。數字到字母的 對應 如下圖所示。 為了 打出 一個字母&#xff0c;Alice 需要 按 對應字母 i 次&#xff0c…

PTA乙級1001~1005【c++】

首先講解一下PTA乙級在哪里。PTA乙級題其實就是PAT (Basic Level) Practice &#xff08;中文&#xff09; 1001 害死人不償命的(3n1)猜想 #include<iostream> using namespace std;int main() {int cnt 0;int n;cin >> n;while(n ! 1){cnt ;if (n & 1){n …

滲透筆記1

第一天 工具&#xff1a;cs cobalt strike 4.9 / msf kali &#xff08;自帶 Ubuntu&#xff09; cs cobalt strike 4.9&#xff1a;server-client server部署在云服務器上&#xff0c;client分別在各地&#xff0c;與server相連接&#xff1b;連接上后就可以共享上線主機。…

用Python實現SVM搭建金融反詐模型(含調試運行)

1.概述 信用卡盜刷一般發生在持卡人信息被不法分子竊取后&#xff0c;復制卡片進行消費或信用卡被他人冒領后激活并消費等情況下。一旦發生信用卡盜刷&#xff0c;持卡人和銀行都會遭受一定的經濟損失。本節要運用支持向量機分類算法搭建一個金融反欺詐模型。 2.數據集 使用…

HunyuanVideo 文生視頻模型實踐

HunyuanVideo 文生視頻模型實踐 flyfish 運行 HunyuanVideo 模型使用文本生成視頻的推薦配置&#xff08;batch size 1&#xff09;&#xff1a; 模型分辨率(height/width/frame)峰值顯存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本項目適用于使用 N…

第6章 ThreadGroup詳細講解(Java高并發編程詳解:多線程與系統設計)

1.ThreadGroup 與 Thread 在Java程序中&#xff0c; 默認情況下&#xff0c; 新的線程都會被加入到main線程所在的group中&#xff0c; main線程的group名字同線程名。如同線程存在父子關系一樣&#xff0c; Thread Group同樣也存在父子關系。圖6-1就很好地說明了父子thread、父…

nginx常用配置 (含負載均衡、反向代理、限流、Gzip壓縮、圖片防盜鏈 等示例)

nginx的配置文件通常在 /etc/nginx/nginx.conf , /etc/nginx/conf.d/*.conf 中&#xff0c; 一般直接 改 conf.d目錄下的 default.conf文件&#xff0c; 然后 先檢測配置文件是否有錯誤 nginx -t 再重新加載配置文件 或 重啟nginx&#xff0c;命令如下 nginx -s reload 或…

Python編程與在線醫療平臺數據挖掘與數據應用交互性研究

一、引言 1.1 研究背景與意義 在互聯網技術飛速發展的當下,在線醫療平臺如雨后春筍般涌現,為人們的就醫方式帶來了重大變革。這些平臺打破了傳統醫療服務在時間和空間上的限制,使患者能夠更加便捷地獲取醫療資源。據相關報告顯示,中國基于互聯網的醫療保健行業已進入新的…

Linux網絡_套接字_UDP網絡_TCP網絡

一.UDP網絡 1.socket()創建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET網絡 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;適用于 IPv4 協議。用于網絡通信AF_INET6&#xff1a;IPv6 地址族&a…

1 行命令引發的 Go 應用崩潰

一、前言 不久前&#xff0c;阿里云 ARMS 團隊、編譯器團隊、MSE 團隊攜手合作&#xff0c;共同發布并開源了 Go 語言的編譯時自動插樁技術。該技術以其零侵入的特性&#xff0c;為 Go 應用提供了與 Java 監控能力相媲美的解決方案。開發者只需將 go build 替換為新編譯命令 o…

R語言的并發編程

R語言的并發編程 引言 在現代計算中&#xff0c;如何有效地利用計算資源進行數據處理和分析已成為一個重要的研究方向。尤其在大數據時代&#xff0c;數據量的急劇增加讓單線程處理方式顯得力不從心。為了解決這一問題&#xff0c;各種編程語言都開展了并發編程的研究和應用。…

Flink(十):DataStream API (七) 狀態

1. 狀態的定義 在 Apache Flink 中&#xff0c;狀態&#xff08;State&#xff09; 是指在數據流處理過程中需要持久化和追蹤的中間數據&#xff0c;它允許 Flink 在處理事件時保持上下文信息&#xff0c;從而支持復雜的流式計算任務&#xff0c;如聚合、窗口計算、聯接等。狀…

C#項目生成時提示缺少引用

問題描述 剛從git或svn拉取下來的C#項目&#xff0c;在VS生成時提示缺少引用 解決方案 1、從“管理NuGet程序包”中下載并安裝缺少的引用&#xff0c;如果引用較多逐個下載安裝會比較麻煩&#xff0c;建議采用下面第2種方案處理 2、通過命令對所有缺少引用進行安裝 &#…

EAMM: 通過基于音頻的情感感知運動模型實現的一次性情感對話人臉合成

EAMM: 通過基于音頻的情感感知運動模型實現的一次性情感對話人臉合成 1所有的材料都可以在EAMM: One-Shot Emotional Talking Face via Audio-Based Emotion-Aware Motion Model網站上找到。 摘要 盡管音頻驅動的對話人臉生成技術已取得顯著進展&#xff0c;但現有方法要么忽…

BeanFactory 是什么?它與 ApplicationContext 有什么區別?

談到Spring&#xff0c;那勢必要講講容器 BeanFactory 和 ApplicationContext。 BeanFactory是什么&#xff1f; BeanFactory&#xff0c;其實就是 Spring 容器&#xff0c;用于管理和操作 Spring 容器中的 Bean。可能此時又有初學的小伙伴會問&#xff1a;Bean 是什么&#x…

【深度學習】Huber Loss詳解

文章目錄 1. Huber Loss 原理詳解2. Pytorch 代碼詳解3.與 MSELoss、MAELoss 區別及各自優缺點3.1 MSELoss 均方誤差損失3.2 MAELoss 平均絕對誤差損失3.3 Huber Loss 4. 總結4.1 優化平滑4.2 梯度較好4.3 為什么說 MSE 是平滑的 1. Huber Loss 原理詳解 Huber Loss 是一種結合…

python實現pdf轉word和excel

一、引言   在辦公中&#xff0c;我們經常遇收到pdf文件格式&#xff0c;因為pdf格式文件不易修改&#xff0c;當我們需要編輯這些pdf文件時&#xff0c;經常需要開通會員或收費功能才能使用編輯功能。今天&#xff0c;我要和大家分享的&#xff0c;是如何使用python編程實現…

【PyCharm】連接Jupyter Notebook

【PyCharm】相關鏈接 【PyCharm】連接 Git【PyCharm】連接Jupyter Notebook【PyCharm】快捷鍵使用【PyCharm】遠程連接Linux服務器【PyCharm】設置為中文界面 【PyCharm】連接Jupyter Notebook PyCharm連接Jupyter Notebook的過程可以根據不同的需求分為 本地連接 和 遠程連…

Java鎖 公平鎖和非公平鎖 ReentrantLock() 深入源碼解析

賣票問題 我們現在有五個售票員 五個線程分別賣票 賣票 ReentrantLock(); 運行后全是 a 對象獲取 非公平鎖缺點之一 容易出現鎖饑餓 默認是使用的非公平鎖 也可以傳入一個 true 參數 使其變成公平鎖 生活中排隊講求先來后到 視為公平 程序中的公平性也是符合請求鎖的絕對…