Skip to main content
Monitors 告警规则的 备注描述(Description) 用于定义告警和恢复事件中的说明文本。你可以使用 Go text/template 引用告警标签、查询值、关联查询结果和安全的 Sprig 函数,生成 Text 或 Markdown 格式的描述内容。
本文描述的基础模板变量、Sprig 函数名和标签增强后再渲染 Description 的行为需要 monit-edge v0.42.0 或以上版本。通过 $annotations 读取 $<查询名称>.<字段名称> 格式的查询附加信息需要 monit-edge v0.53.0 或以上版本;使用该能力前,请先升级告警引擎。

工作方式

规则触发或恢复时,monit-edge 会把完整告警事件作为模板根对象,并额外注入一组常用短变量。标签增强执行完成后,模板会基于增强后的事件渲染,结果会写入事件的 Description 字段,再继续发送事件。
日常模板建议优先使用 $labels$values$value$relates$status$checkMode。其他短变量用于高级模板或兼容场景,只有确实需要时再使用。

Sprig 函数名

monit-edge 会使用 Sprig 标准函数名注册安全的 Sprig 函数。同一个可用函数也会额外注册一份 sprig_ 前缀形式,方便在命名冲突时使用。 应该这样写:
也可以使用带前缀的形式:
如果 Sprig 标准函数名与 monit-edge 自定义函数重名,monit-edge 自定义函数会保留标准函数名,Sprig 函数仍可通过 sprig_ 前缀调用。

内置变量

示例:

查询结果附加信息

如果主查询明确配置了标签字段,其他非值字段会作为附加信息进入 $annotations。查询附加信息始终使用 $<查询名称>.<字段名称> 作为 key:
无论只有一个还是多个查询,也无论使用阈值判定、数据存在还是数据缺失模式,写法都相同。$ 前缀专门用于查询字段,规则中手工配置的自定义字段名称不能以 $ 开头。字段如何分类,请参见查询结果字段映射

自定义字段

规则上配置的自定义字段会进入告警事件的 $annotations,字段本身也支持变量与模板渲染:
  • 简单变量:支持 ${label_name} 形式(如 ${service}),渲染时替换为告警事件中对应标签的值。例如值填写 https://a.com/runbook/${service}${service} 会被替换为告警事件的 service 标签值。
  • Go template:当值中包含 {{ 时,整个值按与备注描述相同的 Go template 规则渲染,可以引用本文档介绍的内置变量与函数。
  • title 字段:字段名为 title 时,其渲染结果将作为事件标题
示例:

根对象字段

根对象字段使用 .FieldName 访问。 .Queries 中的 Query 对象包含 .Name.Expr.LabelFields.ValueFields.Args .RelateQueries 中的 RelateQuery 对象包含 .Name.Expr.Args

关联查询结果行

关联查询结果通过 $relates 访问。map 的 key 是关联查询名称,例如 R1 示例:

Go Template 内置函数

以下函数由 Go text/template 提供。

monit-edge 自定义函数

以下函数由 monit-edge 注册,使用时不需要前缀。

Sprig 函数

monit-edge 会使用 Sprig 标准函数名注册安全的 Sprig 函数,同时也注册 sprig_ 前缀形式。Sprig 函数来自 Masterminds/sprig; 需要查看上游函数行为时,可以参考该仓库文档。 常用示例:
正则使用注意事项:regexFindsprig_regexFind 返回的是完整匹配文本,不返回捕获组。如果要提取捕获组,请使用 regexReplaceAllsprig_regexReplaceAll
结果是:

常用 Sprig 函数

同一个函数也可以使用 sprig_ 前缀调用,例如 sprig_containssprig_regexReplaceAll

禁用的 Sprig 函数

为了保证告警描述渲染过程可预测且安全,monit-edge 不会注册会读取进程环境变量、执行 DNS 解析、生成随机输出、创建凭证或证书、加解密数据,或者主动让模板失败的 Sprig 函数。 以下 Sprig 函数的标准形式和 sprig_ 前缀形式都不可用:
如果模板使用这些函数,解析阶段会报类似 function "env" not definedfunction "sprig_env" not defined 的错误。

完整示例:提取 MySQL Unknown Column 字段名

排障

function "contains" not defined 表示规则运行在较旧的 monit-edge 版本上,该版本尚未启用 Sprig 标准函数名。请升级 monit-edge;如果该版本支持前缀形式,也可以临时改用 sprig_contains function "env" not definedfunction "sprig_env" not defined 表示模板使用了被禁用的 Sprig 函数。请删除该函数,或改用确定性的模板逻辑。 regexFindsprig_regexFind 返回 Unknown column 'x' 而不是 x 是预期行为。提取捕获组请使用 regexReplaceAllsprig_regexReplaceAll