心跳监控:了解计划任务何时悄然停止工作
发布: (2026年5月3日 GMT+8 10:53)
3 分钟阅读
原文: Dev.to
Source: Dev.to
Uptime 监控可以告诉你服务器何时宕机,但一些最糟糕的故障看起来是这样的:
- 服务器正常
- cron 调度器已触发
- 没有明显的错误
任务悄悄地停止了任何有用的工作——比如几天未运行的夜间数据同步、“已完成”但写入了零字节的备份,或是几周前就开始抛出异常的报表任务。这些失败对传统的 HTTP 监控是不可见的,因为端点从未返回错误。
心跳监控 解决了这个问题。
工作原理
心跳监控是一个死人的开关。不是 Tickstem 去轮询你的端点,而是你的任务在每次成功运行结束时调用 Tickstem。如果在预期间隔 + 宽限窗口内不再收到 ping,你就会收到警报。
你需要配置两件事:
| 参数 | 描述 |
|---|---|
interval | 你期望收到 ping 的频率(例如,每 24 小时) |
grace window | 在触发警报前的宽限时间(例如 1 小时) |
警报规则: 连续两个间隔未收到 ping → 发送警报。
接入方式
Go
import "github.com/tickstem/heartbeat"
client := heartbeat.New(os.Getenv("TICKSTEM_API_KEY"))
hb, err := client.Create(ctx, heartbeat.CreateParams{
Name: "nightly-sync",
IntervalSecs: 86400,
GraceSecs: 3600,
})
// at the end of every successful run — token is the credential, no API key needed
if err := client.Ping(ctx, hb.Token); err != nil {
log.Println("heartbeat ping failed:", err) // non-fatal
}
Node.js
import { HeartbeatClient } from "@tickstem/heartbeat"
const hb = new HeartbeatClient(process.env.TICKSTEM_API_KEY)
const heartbeat = await hb.create({ name: "nightly-sync", interval_secs: 86400 })
// at the end of every successful run
await hb.ping(heartbeat.token).catch(err => console.error("ping failed:", err))
Curl (no SDK needed)
curl -s -X POST https://api.tickstem.dev/v1/heartbeats/$HEARTBEAT_TOKEN/ping
Token 放在 URL 中;不需要 auth 头。如果 curl 失败,脚本仍应正常退出。
值得注意的地方
Ping 只在成功时发送。因此沉默意味着出现了问题——要么任务崩溃了,要么根本没有被调度,要么完成时没有实际执行工作。让 ping 为非致命错误;一次瞬时的网络波动不应中止成功的同步。
何时使用
任何“已运行”与“完成了有用工作”是不同概念的任务:
- 数据库备份
- 数据同步 / ETL 流程
- 报表生成
- 发票或支付处理
- 缓存预热
Uptime 监控和心跳监控是互补的:
- Uptime = 服务器存活。
- Heartbeat = 任务真正完成了它的工作。