warning 或 critical 时触发告警,变回 passing 时告警自动恢复。
本集成适用于开源版和企业版 Consul,只需要在一个 Consul Agent 上添加一段 Watch 配置,不需要安装额外的脚本或插件。
在 Flashduty On-call
您可通过以下两种方式获取集成推送地址,任选其一即可。
使用专属集成
当您不需要将告警路由到不同的协作空间时,优先选择此方式。展开
展开
- 进入 Flashduty 控制台,选择 协作空间,打开一个协作空间
- 选择 配置 → 集成数据 → 专属集成,点击 新增一个集成
- 选择 HashiCorp Consul,点击 保存
- 打开生成的集成卡片,复制 推送地址
使用共享集成
当您需要根据 Payload 将告警路由到不同的协作空间时,选择此方式。展开
展开
- 进入 Flashduty 控制台,选择 集成中心 → 告警事件
- 选择 HashiCorp Consul,填写集成名称
- 配置默认路由并选择协作空间;创建后可在 路由 中增加更多规则
- 点击 保存,复制生成的 推送地址
工作方式
Consul 的
checks 类型 Watch 在任意一个被监听的健康检查发生变化时(包括状态和输出内容的变化),把所有被监听检查的当前状态作为一个 JSON 数组 POST 到推送地址。Flashduty 把数组中的每个检查转换为一个事件:
warning、critical的检查触发告警,已有告警时合并到同一条告警passing的检查恢复对应的告警;没有对应告警时不做任何处理- 维护模式(
consul maint)产生的_node_maintenance和_service_maintenance:<服务 ID>检查属于计划内变更,不会创建告警
warning 或 critical 的检查会马上产生告警。
前提条件
- 网络:运行 Watch 的 Consul Agent 需要能访问 Flashduty 推送地址(如
https://api.flashcat.cloud)。 - 权限:需要能修改该 Agent 的配置目录(例如
/etc/consul.d)并执行consul reload。 - ACL:如果开启了 ACL,Watch 使用的 Token 需要有全部节点和服务的读权限,见下方步骤。
在 Consul 中配置
1
选择运行 Watch 的 Agent
Watch 查询的是整个数据中心的健康检查,在一个 Agent 上配置即可,可以是某台 Server,也可以是一台专用的 Client。在多个 Agent 上配置同一个 Watch 不会产生重复告警(同一检查的事件会合并),但每条告警的事件数会成倍增加。
2
添加 Watch 配置
在该 Agent 的配置目录中新建文件
flashduty-watch.json,写入下方内容,并把 path 替换为 Flashduty 集成的完整推送地址(包含 integration_key 参数):-
不要设置
state参数。设置"state": "critical"后,检查恢复时会从数组中消失,Flashduty 收不到passing,告警无法自动恢复。 -
只关心部分检查时,可以用
filter参数缩小范围,例如"filter": "ServiceName == \"web\" or CheckID == \"serfHealth\"";也可以用"service": "web"只监听一个服务的检查(不包含节点级检查,例如serfHealth)。 -
开启了 ACL 时,在 Watch 中增加
"token": "<ACL Token>"。该 Token 的策略至少需要:
3
重新加载配置
/consul/config 的目录,再执行:http watch handler failed with output 时,说明 Flashduty 拒绝了请求,日志中带有 HTTP 状态码和原因。4
验证告警和恢复
Consul 没有测试通知按钮,可以注册一个 TTL 检查来验证。TTL 检查注册后默认是 把检查置为 验证完成后删除该检查:开启了 ACL 时,为每条命令加上
critical,会立即产生一条告警:passing,告警随之恢复:-H "X-Consul-Token: <ACL Token>"。Alert Key
Flashduty 使用
Partition、Node 和 CheckID 共同生成 Alert Key。
Node是检查所在的节点名。CheckID是检查的 ID。Consul 规定同一节点上的CheckID唯一;服务检查的默认 ID 形如service:<服务 ID>,节点存活检查为serfHealth。Partition是 Consul 企业版的管理分区(Admin Partition),开源版为空。
状态和告警等级
检查在
warning 和 critical 之间变化时,Flashduty 按告警等级分别建立告警:warning 变为 critical 会新建一条 Critical 告警,passing 会同时恢复两条告警。
标签
告警标题为
<检查名称> on <节点名>,告警描述为检查的 Output 和 Notes。
常见问题
检查或节点被删除后,告警没有恢复怎么办?
检查或节点被删除后,告警没有恢复怎么办?
处于
warning 或 critical 的检查被注销(deregister)或节点离开集群后,它不再出现在 Watch 发送的数组中,Flashduty 收不到恢复,需要手动关闭对应的告警。经常下线节点的环境可以在协作空间中开启 超时自动关闭。推送失败会重试吗?
推送失败会重试吗?
不会。Consul 的 HTTP handler 请求失败后不重试。但下一次任意检查发生变化时,Watch 会重新发送所有检查的当前状态,漏掉的触发或恢复会在那时补上。
为什么一条告警的事件数一直在增加?
为什么一条告警的事件数一直在增加?
任何一个被监听的检查变化(包括输出内容变化)都会让 Watch 发送一次全部检查,处于异常状态的检查每次都会合并一个事件到它的告警中。可以用
filter 或 service 参数只监听需要值班处理的检查。Agent 日志提示 request body exceeds 1 MiB limit 怎么办?
Agent 日志提示 request body exceeds 1 MiB limit 怎么办?
单次推送的数组不能超过 1 MiB。检查数量很多时,请用
filter 或 service 参数把检查拆分到多个 Watch 中,每个 Watch 可以使用同一个推送地址。支持 PagerDuty 集成中使用的 consul-alerts 吗?
支持 PagerDuty 集成中使用的 consul-alerts 吗?
不需要。consul-alerts 是第三方守护进程;本集成直接使用 Consul 官方的 Watch 机制,不需要额外部署组件。