心跳监控:了解计划任务何时悄然停止工作

发布: (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 = 任务真正完成了它的工作。
0 浏览
Back to Blog

相关文章

阅读更多 »

Claude 运行快速。Codex 发布。

摘要:我给 Claude 和 Codex 两个大型编码任务。- Claude 大约在一小时内完成。- Codex 大约用了八小时。乍一看,这看起来像是……