argocd-notifications-controller)推送告警:本集成提供一段 argocd-notifications-cm 配置,包含一个 Webhook 服务、两个请求体模板和一个触发器。每个 Argo CD 应用(Application)对应两类 Flashduty 告警:
- 同步失败:同步操作以
Error或Failed结束时触发,下一次同步成功(Succeeded)时自动关闭 - 健康降级:应用健康状态变为
Degraded时触发,恢复为Healthy时自动关闭
在 Flashduty On-call
您可通过以下两种方式获取集成推送地址,任选其一即可。
使用专属集成
- 进入 Flashduty 控制台,选择 协作空间,打开一个协作空间
- 选择 配置 → 集成数据 → 专属集成,点击 新增一个集成
- 选择 Argo CD,点击 保存
- 打开生成的集成卡片,复制 推送地址
使用共享集成
- 进入 Flashduty 控制台,选择 集成中心 → 告警事件
- 选择 Argo CD,填写集成名称
- 配置默认路由并选择协作空间;创建后可在 路由 中增加更多规则
- 点击 保存,复制生成的 推送地址
在 Argo CD 中配置
以下操作需要能修改 Argo CD 所在命名空间(默认
argocd)中 ConfigMap 的 Kubernetes 权限,以及修改 Application 或 AppProject 注解的权限。Argo CD 集群需要能访问推送地址所在的域名。
1
写入 Webhook 服务、模板和触发器
把下面的内容保存为 合并到现有的 如果 Argo CD 通过 Helm Chart 安装,请把
flashduty-notifications.yaml,将 url 替换为上一步复制的推送地址(包含 ?integration_key=...):argocd-notifications-cm(--type merge 只增改上面这些键,不影响已有配置):service.webhook.flashduty 写到 notifications.notifiers,两个模板写到 notifications.templates,触发器写到 notifications.triggers,否则下次升级会覆盖手动修改。配置说明:- 模板中的每个值都经过
toJson转义,同步错误信息中的引号和换行不会破坏 JSON,请不要去掉。字段名不要修改,event_type和app_uid必须保留 - 触发器的四个条件分别对应同步失败、同步成功、健康降级和恢复健康。Argo CD 对每个条件单独记录是否已通知,条件从不成立变为成立时发送一次,所以不需要
oncePer argocd_url取自argocd-notifications-cm的context.argocdUrl,用于生成告警中的应用链接;未配置时该字段为空,不影响告警
2
订阅通知
触发器需要被订阅后才会发送。按需要的范围选择一种方式:
-
单个应用:在 Application 上添加注解
-
一个项目下的所有应用:在 AppProject 的
metadata.annotations中添加同样的注解notifications.argoproj.io/subscribe.on-flashduty.flashduty: "" -
所有应用:在
argocd-notifications-cm的subscriptions中添加一项。如果已有subscriptions,请在原列表中追加,不要用上一步的 merge 命令整体覆盖
3
验证连通性
Argo CD 没有发送测试消息的按钮。可以在 命令会打印请求和响应的调试日志,其中包含完整的推送地址(含
argocd-notifications-controller Pod 中用 argocd admin notifications template notify 按当前应用状态发送一次通知:integration_key),请不要把输出贴到公开位置。输出中 Received response: 一行的状态为 200 OK 即表示 Flashduty 已接受请求。应用当前为 Healthy 时这是一条恢复消息,不会生成告警;为 Progressing 等中间状态时 Flashduty 直接忽略。4
验证生命周期
让一个已订阅的应用同步失败(例如在 Git 中把某个 Deployment 的镜像字段改为空后同步),确认 Flashduty 收到告警;改回后再次同步成功,确认原告警关闭。
Alert Key
Flashduty 使用
event_type 和应用的 app_uid(app.metadata.uid)计算 Alert Key。Kubernetes 为每个对象分配的 UID 在集群的整个生命周期内唯一,因此:
- 同一应用的同步失败、再次失败和同步成功落在同一条告警上;健康降级和恢复健康落在另一条告警上,同步成功不会关闭健康降级告警
- 不同 Argo CD 实例中同名的应用不会共用告警
- 应用删除后重建会得到新的 UID,对应新的告警
event_type 或 app_uid,或者同步消息缺少 phase、健康消息缺少 health_status 时,Flashduty 会拒绝该请求。
告警生命周期
状态值不区分大小写,其他值会被拒绝。
应用在告警期间被删除时,Argo CD 不会再发送恢复消息,需要在 Flashduty 中手动关闭该告警,或开启协作空间的超时自动关闭(建议 24 小时)。
告警等级
如需统一改为其他等级,在推送地址后追加
&severity=Critical(或 Warning、Info)。恢复事件保留原告警的等级。
告警内容
- 标题:
Argo CD application <应用名> sync <phase>或Argo CD application <应用名> health <health_status> - 描述:同步失败为 Argo CD 的同步结果信息(
operationState.message);健康降级为Health status: Degraded - 标签:
resource(应用名)、app_uid、app_namespace、project、event_type、phase、revision、sync_status、health_status、app_url(<argocdUrl>/applications/<应用名>,配置了context.argocdUrl时才有)
排查问题
- 没有收到告警:查看
argocd-notifications-controller的日志(kubectl logs -n argocd deploy/argocd-notifications-controller),确认应用上有notifications.argoproj.io/subscribe.on-flashduty.flashduty注解,或subscriptions中包含on-flashduty - 日志中出现
failed with error code 400:确认模板与本文一致,所有值都经过toJson;响应内容会指出缺少或不支持的字段 - 日志中出现
template 'flashduty-sync' is not supported或trigger 'on-flashduty' is not configured:确认上一步的键已写入argocd-notifications-cm,Helm 安装请检查对应的 values - 告警没有恢复:确认触发器中包含
Succeeded和Healthy两个条件,且没有为它们设置oncePer