Grafana告警(邮件)自定义模板配置
一年前给客户部署配置过grafana,告警配置也是用的原始的,客户在使用过程中只需要一些核心点信息,想要实现这个就需要用Grafana的自定义告警模板以及编辑邮件模板。
通知模板
模板信息的配置中查阅了相关资料,自己组装了一套,主要用于邮件标题,想要实现的效果如:“服务器: ***, ****, 内存使用率超过**告警”,告警事项这儿用alertname直接固定 比如配置的是内存超过90阈值就发邮件,那就把alertname设置成“内存使用率超过90告警”即可。重点是获取异常的服务器信息。
查阅相关资料后,编写代码如下:
{{ define "email.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}服务器:{{ range $i, $alert := .Alerts.Firing }}{{ index $alert.Labels "instance" }},{{ end }}{{ range $i, $alert := .Alerts.Firing }}{{if eq $i 0 }}{{ index $alert.Labels "alertname" }}{{end}}{{ end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}服务器:{{ range $i, $alert := .Alerts.Resolved }}{{ index $alert.Labels "instance" }},{{ end }}{{ range $i, $alert := .Alerts.Resolved }}{{if eq $i 0 }}{{ index $alert.Labels "alertname" }}{{end}}{{ end }}
{{- end }}
{{ end }}
在Contact points->Optional Email settings->Subject配置自定义模板名称
代码编写完成后在旧版(9.1)上一直不行,后来grafana官方资料发现,告警规则中的查询表达式若是用的经典模式(Classic condition)在不能使用“$alert.Labels "instance"”获取服务器信息,变更告警规则为Reduce,发现可以收取到正确格式的相关邮件标题,然后进入下一步更改 邮件模板
邮件模板
邮件模板主要是根据客户需要展示具体事项、服务器和事项的当前值即可。
找到grafana的安装目录(默认:C:\Program Files\GrafanaLabs\grafana\public\emails\),打开
ng_alert_notification.html文件 按照要求注释更改部分html代码即可。部分代码片段如下:
{{ range .Labels.SortedPairs }}<tr style="vertical-align: top; padding: 0;" align="left"><td colspan="2" class="value" style="word-break: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; border-collapse: collapse !important; color: #222222; font-family: 'Open Sans', 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; font-weight: normal; line-height: 19px; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; margin: 0; padding: 24px 0 0;" align="left" valign="top">{{if eq .Name "instance" }}<span class="value-heading" style="font-weight: bold;">服务器:</span> <span class="value-value" style="padding-left: 8px;">{{ .Value }}</span>{{else if eq .Name "alertname" }}<span class="value-heading" style="font-weight: bold;">事项:</span> <span class="value-value" style="padding-left: 8px;">{{ .Value }}</span>{{else}}{{end}}</td></tr>{{ end }}{{ if gt (len .Annotations.SortedPairs) 0 }}<tr style="vertical-align: top; padding: 0;" align="left"><td colspan="2" class="annotations" style="word-break: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; hyphens: auto; border-collapse: collapse !important; color: #222222; font-family: 'Open Sans', 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; font-weight: normal; line-height: 19px; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; margin: 0; padding: 24px 0 12px;" align="left" valign="top">{{ range .Annotations.SortedPairs }}{{if eq .Name "description" }}<p style="color: #222222; font-family: 'Open Sans', 'Helvetica Neue', 'Helvetica', Helvetica, Arial, sans-serif; font-weight: normal; line-height: 19px; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; margin: 0 0 10px; padding: 0;" align="left"><span class="annotations-heading" style="font-weight: bold; text-transform: capitalize;">当前值:</span> <span class="annotations-value" style="padding-left: 8px;">{{ .Value }}</span></p>{{end}}{{ end }}</td></tr>{{ end }}
此处针对当前值,9.1版本里的{{ .ValueString }}是一个字符串,本人对go语言不熟以及对对照官方给出的方法在这个模板html里无法解析出服务器信息,所以在告警里的annotations的Description里获取了当前值,代码用“{{ printf "%.2f" $values.B.Value }}”(当前值保留2位小数)。
收取的邮件效果如下
重新在告警规则中的查询表达式中对表达式B使用Reduce,表达式C使用Classic condition配置阈值,发现邮件未按阈值进行邮件发送,且annotations的Description里的表达式也获取不到正确的值。查询官方资料( 具体链接:template-notifications/reference),发现最新版里有一个Values是KV,应该是可以解析出服务器信息和对应的value值。
下载安装完最新版(10.4.1),在配置告警时发现和9.1有明细的变化,
直接配置完相关信息,发送邮件可以实现按阈值进行邮件发送,满足客户需要。后面再对新版本的邮件模板html进行改造
部分代码片段如下:
{{ __dangerouslyInjectHTML `<!--[if mso | IE]><table role="presentation" border="0" cellpadding="0" cellspacing="0"><tr><td class="" style="vertical-align:top;width:600px;" ><![endif]-->` }}<div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;"><table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%"><tbody>{{ if .Labels.SortedPairs }}<!--<tr><td align="left" class="txt" style="font-size:0px;padding:10px 25px;word-break:break-word;"><div style="font-family: Inter, Helvetica, Arial; font-size: 13px; line-height: 150%; text-align: left; color: #000000;"><strong>Labels</strong></div></td></tr>--><tr><td align="left" class="txt" style="font-size:0px;padding:10px 25px;word-break:break-word;"><table cellpadding="0" cellspacing="0" width="100%" border="0" style="color:#000000;font-family:Inter, Helvetica, Arial;font-size:13px;line-height:22px;table-layout:auto;width:100%;border:none;"><mj-raw>{{ range .Labels.SortedPairs }}</mj-raw>{{if eq .Name "instance" }}<tr><td><strong>服务器</strong></td><td>{{ .Value }}</td></tr>{{else if eq .Name "alertname" }}<tr><td><strong>事项</strong></td><td>{{ .Value }}</td></tr>{{ else }}{{ end }}<mj-raw>{{ end }}</mj-raw><mj-raw>{{ range $refID, $value := .Values }}</mj-raw>{{ if eq $refID "B" }}<tr><td><strong>当前值</strong></td><td>{{ printf "%.2f" $value }}</td></tr>{{ end }}<mj-raw>{{ end }}</mj-raw></table></td></tr>{{ end }}{{ if (without .Annotations.SortedPairs.Names "description" "summary") }}<tr><td align="left" class="txt" style="font-size:0px;padding:10px 25px;word-break:break-word;"><div style="font-family: Inter, Helvetica, Arial; font-size: 13px; line-height: 150%; text-align: left; color: #000000;"><strong>Annotations</strong></div></td></tr><tr><td align="left" class="txt" style="font-size:0px;padding:10px 25px;word-break:break-word;"><table cellpadding="0" cellspacing="0" width="100%" border="0" style="color:#000000;font-family:Inter, Helvetica, Arial;font-size:13px;line-height:22px;table-layout:auto;width:100%;border:none;"><mj-raw>{{ range .Annotations.SortedPairs }}</mj-raw><mj-raw>{{ if and (ne .Name "description") (ne .Name "summary") }}</mj-raw><tr><td><strong>{{ .Name }}</strong></td><td>{{ .Value }}</td></tr><mj-raw>{{ end }}</mj-raw><mj-raw>{{ end }}</mj-raw></table></td></tr>{{ end }}</tbody></table></div>
{{ __dangerouslyInjectHTML `<!--[if mso | IE]></td></tr></table><![endif]-->` }}
邮件收取效果如图:
另外关于邮件里跳转链接的配置,在grafana的安装路径的grafana\conf下,打开defaults.ini文件找到“[server]”,编辑 domain = 192.168.**.**,这样就可以从邮件里直接跳转到相关的grafana页面。
相关文章:
Grafana告警(邮件)自定义模板配置
一年前给客户部署配置过grafana,告警配置也是用的原始的,客户在使用过程中只需要一些核心点信息,想要实现这个就需要用Grafana的自定义告警模板以及编辑邮件模板。 通知模板 模板信息的配置中查阅了相关资料,自己组装了一套&…...
大话设计模式——六大基本设计原则(SOLID原则)
设计模式 定义:软件开发中,在特定上下文中解决一类常见问题的被证明为有效的最佳实践。可供其他开发者重复使用解决相似问题。 好处: 提高代码的可重用性,减少重复代码。提高代码的可维护性,使代码更易于理解和修改。…...
Qt | Q_PROPERTY属性和QVariant 类
一、属性基础 1、属性与数据成员相似,但是属性可使用 Qt 元对象系统的功能。他们的主要差别在于存取方式不相同,比如属性值通常使用读取函数(即函数名通常以 get 开始的函数)和设置函数(即函数名通常以 set 开始的函数)来存取其值,除此种方法外,Qt 还有其他方式存取属性值…...
力扣207.课程表
你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 例如…...
十五届web模拟题整理
模拟赛一期 1.动态的Tab栏 请在 style.css 文件中补全代码。 当用户向下滚动的高度没有超过标题栏(即 .heading 元素)的高度时,保持 Tab 栏在其原有的位置。当滚动高度超过标题栏的高度时,固定显示 Tab 栏在网页顶部。 /* TODO…...
ubuntu20.04 安裝PX4 1.13
step1_install_depenences.sh #!/bin/bash #install gazebo 11 #install protobuf 3.19.6python3 -m pip install --upgrade pip python3 -m pip install --upgrade Pillow# 將 empy 的版本調整爲3.3.4 pip3 uninstall empy pip3 install empy3.3.4sudo apt-get update sudo ap…...
大型网站系统架构演化
大型网站质量属性优先级:高性能 高可用 可维护 应变 安全 一、单体架构 应用程序,数据库,文件等所有资源都在一台服务器上。 二、垂直架构 应用和数据分离,使用三台服务器:应用服务器、文件服务器、数据服务器 应用服…...
探索Java中的栈:Stack与Deque(ArrayDeque和LinkedList)
文章目录 1. 栈(Stack)1.1 定义方式1.2 特点1.3 栈的层次结构 2. 双端队列(Deque)2.1 定义方式及继承关系2.2 特点:2.3 ArrayDeque2.4 LinkedList2.5 Deque 的各种方法2.6 如何选择ArrayDeque和LinkedList 3. 如何选择…...
实践笔记-03 docker buildx 使用
docker buildx 使用 1.启用docker buildx2.启用 binfmt_misc3.从默认的构建器切换到多平台构建器3.1创建buildkitd.toml文件(私有仓库是http没有证书的情况下,需要配置)3.2创建构建器并使用新创建的构建器 4.构建多架构镜像并推送至harbor仓库…...
【数据结构与算法】之8道顺序表与链表典型编程题心决!
个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 目录 1、顺序表 1.1 合并两个有序数组 1.2 原地移除数组中所有的元素va…...
Go 源码之旅-开篇
欢迎来到《Go 源码之旅》专栏!在这个专栏中,我们将深入探索 Go 编程语言的内部数据结构的工作原理,一起踏上一段令人兴奋的源码之旅。 我们将一步步解析关键的数据结构底层工作原理以及一些常用框架的设计原理及其源码。 无论你是初学者还是…...
spring的事件推送
本质上是设计模式中的观察者模式。 一、什么是观察者模式 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。 二、什么是spring的事件推送 在 Spring 的事…...
计算机网络—HTTPS协议详解:工作原理、安全性及应用实践
🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:ヒューマノイド—ずっと真夜中でいいのに。 1:03━━━━━━️💟──────── 5:06 🔄 ◀️ ⏸…...
卫星遥感影像在农业方面的应用及评价
一、引言 随着科技的进步,卫星遥感技术在农业领域的应用越来越广泛。卫星遥感技术以其宏观、快速、准确的特点,为农业生产和管理提供了有力的技术支撑。本文将对卫星遥感在农业方面的应用进行详细介绍,并通过具体案例进行说明。 二、…...
docker pull镜像的时候指定arm平台
指定arm平台 x86平台下载arm平台的镜像包 以mysql镜像为例 docker pull --platform linux/arm64 mysqldocker images查看镜像信息 要查看Docker镜像的信息,可以使用docker inspect命令。这个命令会返回镜像的详细信息,包括其元数据和配置。 docker i…...
如何通过OceanBase V4.2 动态采样优化查询性能
OceanBase v4.2 推出了优化器动态采样的功能,在SQL运行过程中,该功能会收集需要的统计信息,协助优化器制定出更好的执行计划,进一步提升了查询性能。 影响查询性能的因素是什么?为何你的优化器效果不佳? …...
Vue3---基础1(认识,创建)
变化 相对于Vue2,Vue3的变化: 性能的提升 打包大小减少 41% 初次渲染快 55%,更新渲染快133% 内存减少54% 源码的升级 使用 proxy 代替 defineProperty 实现响应式 重写虚拟 DOM 的实现和 Tree-shaking TypeScript Vue3就可以更好的支持TypeSc…...
JAVA集合ArrayList
目录 ArrayList概述 add(element) 用法 add(index, element)用法 remove(element)用法 remove(index)用法 get(index)用法 set(index,element) 练习 test1 定义一个集合,添加字符串,并进行遍历&…...
Bitmap OOM
老机器Bitmap预读仍然OOM,无奈增加一段,终于不崩溃了。 if (Build.VERSION.SDK_INT < 21)size 2; 完整代码: Bitmap bitmap; try {//Log.e(Thread.currentThread().getStackTrace()[2] "", surl);URL url new URL(surl);…...
基于深度学习的人脸表情识别系统(PyQT+代码+训练数据集)
基于深度学习的人脸表情识别系统(PyQT代码训练数据集) 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现 前言 本项目是基于mini_Xception深度学习网络模型的人脸表情识别系统&#x…...
科技与科学领域每日新闻摘要-2026-05-12
科技与科学领域每日新闻摘要 日期: 2026年5月12日 1. Nature发布2026年最值得关注的七大技术 核心要点: 《自然》杂志发表2026年最值得关注的七项关键技术,包括异种器官移植、AI天气预报、可控核聚变、光学显微脑图谱、mRNA疗法、高精度天文成像和量子计算。这些技…...
PiliPlus:如何用第三方B站客户端解锁终极观影体验?
PiliPlus:如何用第三方B站客户端解锁终极观影体验? 【免费下载链接】PiliPlus PiliPlus 项目地址: https://gitcode.com/gh_mirrors/pi/PiliPlus 你是否厌倦了官方B站客户端的广告轰炸?是否想要更纯净、更流畅的观影体验?P…...
MTK平台Android 11定制:Settings里那些被“砍掉”的功能,到底怎么改的?
MTK平台Android 11深度定制:Settings功能裁剪的工程实践与源码解析 在移动设备系统定制领域,MTK平台因其高度集成的硬件方案和灵活的软件架构,成为众多厂商的首选。当我们基于MTK平台进行Android 11系统级定制时,Settings应用的模…...
3步解决下载难题:imFile下载管理器实战指南
3步解决下载难题:imFile下载管理器实战指南 【免费下载链接】imfile-desktop A full-featured download manager. 项目地址: https://gitcode.com/gh_mirrors/im/imfile-desktop 你是否经常遇到这些下载烦恼?浏览器下载速度慢如蜗牛,大…...
ARM A64指令集架构解析与优化实践
1. A64指令集架构概述A64指令集作为ARMv8-A架构的64位执行状态核心,采用固定32位长度编码设计,这种设计在指令获取和流水线处理上具有显著优势。与传统的变长指令集相比,固定长度编码使得指令预取和译码阶段更加高效,尤其适合现代…...
手把手复现:在MATLAB/Simulink里搭建PMSM的两种解耦模型(附模型下载)
在MATLAB/Simulink中构建永磁同步电机解耦控制模型的实战指南 永磁同步电机(PMSM)因其高效率和高功率密度,已成为工业驱动和电动汽车领域的核心部件。但对于刚接触电机控制的工程师和学生来说,如何将教科书中的解耦控制理论转化为…...
别再只会拖模块了!手把手教你用Simulink封装打造自己的‘智能积木’
从零构建你的Simulink智能积木库:封装技术实战指南 在工程建模领域,Simulink就像数字世界的乐高积木箱,但大多数用户只停留在拖拽现成模块的初级阶段。真正的高手都掌握了一项核心技能——模块封装。这就像把一堆散乱的乐高零件组装成功能完整…...
研究生必备|5款主流文献引用工具深度测评:从课程论文到毕业答辩,哪款能让你省下20小时格式调整时间?
凌晨3点,你盯着Word里200多条参考文献发呆:导师刚通知改用APA格式,而你手动调了一整天的GB/T 7714全得推倒重来。投稿被拒,只因参考文献格式不符合期刊要求。课程论文、小论文、开题报告、毕业大论文……每一次都是格式地狱。本文…...
FPGA与CPU电源时序测试技术解析与实践
1. FPGA与CPU电源时序测试的核心挑战在现代电子系统中,FPGA、MCU和CPU等处理器件的电源设计堪称"心脏手术"。我曾参与过多个Xilinx UltraScale和Intel Stratix 10项目的电源验证,深刻体会到毫秒级的时序偏差就可能导致数千美元的芯片瞬间损毁。…...
AI Agent思维文件版本控制:mindkeeper工具的设计原理与实战指南
1. 项目概述:为AI的“大脑”打造时光机如果你正在使用像OpenClaw这样的AI助手框架,或者任何基于Markdown文件来定义AI行为、记忆和技能的项目,那么你一定经历过这样的时刻:为了优化AI的回复风格,你反复调整了SOUL.md里…...
