在 GitHub 的开发人员的帮助下,我找到了一个解决方案。
您可以通过以下方式看到配置的处理,类似于带有 AND 和 OR 声明的 if 语句。
Alertmanager 将配置应用于上下左右原则。 up-down 类似于您将在常规 if 语句中使用的 OR 语句。
当你从左到右时,你可以将它与 if 命令中的 AND 语句进行比较。
您还应该记住,当第一个语句匹配并且没有声明“AND”部分时,alertmanager 会将警报推送到接收器,而不需要进一步寻找任何其他匹配。因此,在上面的示例中,如果 prometheus 触发带有以下标签 {severity: "warning", application: "barfoo"} 的警报,则警报将发送到 hipchat-teamX。
注意以下,application 的 label 值匹配 hipchat-teamY 的路由。那么为什么它不被发送到那条路线呢?答案并不难,因为第一个匹配,并且没有声明子路由,所以它将停止寻找任何其他匹配。
但是,如果 alertmanager 具有如下代码的配置,则警报将发送到接收者“hipchat-teamY”。
routes:
match:
severity:"warning"
receiver: "hipchat-teamX"
routes:
match_re:
application:"(barfoo.*)"
receiver: "hipchat-teamY"
match_re:
application:"(foo|bar)"
receiver: "hipchat-teamX"
match_re:
application:"(barfoo.*)"
receiver: "hipchat-teamY"
为了让它更高级一点,假设 prometheus 发送一个带有以下标签的新警报 {severity: "critical", application: "barfoo"}。使用以下配置,警报被路由到 hipchat-teamX。
使用标签 {severity: "critical", application: "foo"},警报被发送到 hipchat-teamY。
routes:
match:
severity:"warning"
receiver: "hipchat-teamX"
routes:
match_re:
application:"(barfoo.*)"
receiver: "hipchat-teamY"
match_re:
application:"(foo|bar)"
receiver: "hipchat-teamX"
match:
severity:"critical"
receiver: "hipchat-teamY"
routes:
match_re:
application:"(barfoo.*)"
receiver: "hipchat-teamX"
match_re:
application:"(foo|bar)"
receiver: "hipchat-teamY"
我希望这个解释能帮助遇到同样问题的其他人。