mcuadros/ofelia 没有 Webhook 功能,无法使用本集成。
在 Flashduty On-call
您可通过以下两种方式获取集成推送地址,任选其一即可。
使用专属集成
- 进入 Flashduty 控制台,选择 协作空间,打开一个协作空间
- 选择 配置 → 集成数据 → 专属集成,点击 新增一个集成
- 选择 Ofelia,点击 保存
- 打开生成的集成卡片,复制 推送地址
使用共享集成
- 进入 Flashduty 控制台,选择 集成中心 → 告警事件
- 选择 Ofelia,填写集成名称
- 配置默认路由并选择协作空间;创建后可在 路由 中增加更多规则
- 点击 保存,复制生成的 推送地址
在 Ofelia 中配置
Ofelia 通过 Docker API 工作,即使只运行
job-local 任务也是如此,所以运行 Ofelia 的容器必须挂载 /var/run/docker.sock;缺少它时,Ofelia 启动即退出。使用 docker run 时加 -v /var/run/docker.sock:/var/run/docker.sock:ro。
1
定义 Webhook
在 Ofelia 的配置文件中新增一个 Webhook,只写 如果您在
url 和 trigger,不要写 preset。Ofelia 会使用内置的 json-post 预设,向该地址 POST 一个 JSON 请求。[global] 中设置了 webhook-allowed-hosts,需要把 api.flashcat.cloud 加入列表。如果用 Docker 标签定义,标签必须写在带有 ofelia.service: "true" 的 Ofelia 服务容器上,其他容器上的 Webhook 标签会被忽略:2
把 Webhook 挂到任务上
在需要监控的任务上用 Docker 标签写法为
webhooks 指定刚才定义的名称:ofelia.job-exec.backup-database.webhooks: "flashduty"。想让所有任务都发送,可以在 [global] 中设置 webhook-webhooks = flashduty(标签为 ofelia.webhook-webhooks)。3
固定主机名
Flashduty 用主机名区分不同机器上的同名任务。Ofelia 运行在容器里时,主机名默认是容器 ID,重建容器后会变,已打开的告警就无法被新的成功执行恢复。请在 Compose 中设置
hostname(如上例),或在 docker run 中加 --hostname。4
验证生命周期
让一个任务真正失败一次(例如临时把命令改成
false),确认 Flashduty 收到 Critical 告警;再把命令改回去,等下一次执行成功,确认原告警恢复。Ofelia 没有测试发送功能,上述真实执行是唯一的验证方式。Alert Key
Flashduty 用
host.hostname 与 job.name 组合出 Alert Key,两者之间用不可见分隔符连接后取 MD5。在我们的真实验证中,同一任务的失败与成功执行携带相同的主机名和任务名;而 execution.id 每次执行都不同,因此只作为排查参考,不参与 Alert Key。
- 同一台主机上的两个不同任务是两条告警;同名任务在两台主机上也是两条告警
- 任务的命令、调度表达式、耗时和错误内容的变化不会改变 Alert Key
- 同一个 Ofelia 里不同类型的任务(
job-exec、job-run等)如果重名,会被当成同一条告警,请保持任务名唯一 job.name缺失时 Flashduty 返回 400,避免把失败和恢复写进错误的告警
状态和告警等级
任务因
no-overlap 被跳过时,上一次执行还没有结束,任务的健康状态没有变化,所以跳过的执行不会影响已打开的告警。
任务失败后重复失败,会更新同一条告警,不会新建。若同一任务长期不再执行(任务被删除或停用),告警不会自动恢复,需要手动关闭,或开启协作空间的超时自动关闭。
告警内容
- 标题:
Ofelia job "<任务名>" failed,恢复时为Ofelia job "<任务名>" succeeded - 描述:
execution.error,换行后追加execution.stderr - 标签:
check、job_name、job_type、job_schedule、execution_status、duration、resource/host(主机名)、ofelia_version、source=ofelia
排查问题
- Flashduty 没有收到任何请求:确认任务上写了
webhooks = flashduty,查看 Ofelia 日志里的Webhook error;Ofelia 对失败的 Webhook 默认重试 3 次,间隔 5 秒 - 只收到失败,没有恢复:确认 Webhook 设置了
trigger = always,并确认主机名在两次执行之间没有变化 - Flashduty 返回参数错误:确认没有给该 Webhook 设置其他
preset,请求体必须是json-post预设的 JSON - Docker 标签不生效:Webhook 标签只在带有
ofelia.service: "true"的容器上处理;INI 与标签同名时以 INI 为准 - 提示 host not in allowed hosts list:把
api.flashcat.cloud加入[global] webhook-allowed-hosts