资讯详情

资讯详情

Healthchecks 脚本运行时长测量:/start 信号、执行时间与 Run ID 完整指南

后端任务调度【免费下载链接】healthchecksOpen-source cron job and background task monitoring service, written in Python Django项目地址https://gitcode.com/gh_mirrors/he/healthchecks点击查看免费下载本篇指南讲解 Healthchecks开源 cron 任务与后台任务监控服务基于 Python Django如何通过给 Ping URL 追加/start来标记任务开始进而测量并展示每次任务执行的耗时同时深入解析其告警逻辑、72 小时关联窗口、并发场景下rid运行 ID的正确用法以及这些能力背后的源码实现。读完本文你将能在 Python、Shell 等任意语言中为任务接入开始—结束双信号精确度量脚本运行时长并理解并发任务下的告警行为边界。核心概念/start信号与执行时间测量原理Healthchecks 的 Ping 机制原本只关心任务是否存活任务每完成一次执行就向 Ping URL 发一次请求success 信号超时未收到即判定为 down。但很多场景下运维还希望知道每次执行到底花了多长时间——慢任务即便最终成功也可能意味着隐患。为此Healthchecks 提供了/start信号给 Ping URL 追加/start后缀如https://hc.example.com/ping/code/start在任务开始时请求一次服务端收到 start 信号后将检查状态显示为Started进行中服务端会保存这些 start 事件并在检查列表中展示任务执行时长执行时长的计算方式为相邻 start 事件与 success 事件之间的时间间隔。在源码层面这一设计体现在三个关键位置URL 路由中为 start / fail / log 分别注册了子路由见 hc/api/urls.pyuuid_urls [ path(, views.ping), path(fail, views.ping, {action: fail}), path(start, views.ping, {action: start}), path(log, views.ping, {action: log}), path(int:exitstatus, views.ping), ]也就是说/ping/uuid/start、/ping/uuid/fail与裸/ping/uuidsuccess是同一视图函数ping()的不同 action 调用。视图函数 hc/api/views.py 解析请求并调用check.ping(...)其中action参数决定了本次请求的语义Check.ping()方法实现了完整的 start/success 状态机见 hc/api/models.pyif action start: self.last_start frozen_now self.last_start_rid rid # Dont update last_ping field. elif action in (success, fail): self.last_ping frozen_now self.last_duration None if self.last_start: if self.last_start_rid rid: # rid matches: calculate last_duration, clear last_start self.last_duration self.last_ping - self.last_start self.last_start None可见执行时长本质上是服务端用last_duration字段记录的时间差DurationField见 hc/api/models.py。提示如果客户端不方便在 URL 上追加/start也可以反过来让服务端通过在 HTTP 请求体中检索关键词来自动判定某次 ping 是 start、success 还是 failure 信号详见 过滤规则文档。告警逻辑start 之后没有 success 就会告警使用/start信号后Healthchecks 会应用一条额外的告警规则如果任务发送了 start 信号但在其配置的宽限期grace time内没有发送 success 信号Healthchecks 会判定任务失败将检查标记为 down 并发送告警。也就是说即使任务的常规超时timeout设置得比较宽松只要 start 信号发出后超过 grace 时间仍无成功回报就会触发告警。这在监控长任务卡死时非常有效任务不再受 timeout 的固有节奏限制而是以最近的 start 为起点计算宽限窗口。从源码看宽限期起点的计算在get_grace_start()中完成见 hc/api/models.pyif with_started and self.last_start and self.status ! down: result min(result, self.last_start)get_status(with_startedTrue)还会在last_start存在且未超时的情况下返回started状态见 hc/api/models.py——这正是界面上显示 Started 的来源。任务启动后alert_after告警截止时间也会随之更新见 hc/api/models.py。用法示例Python 中测量脚本运行时长以 Python 为例完整流程如下来自 measuring_script_run_time.mdimport requests URL PING_URL # /start kicks off a timer: if the job takes longer than # the configured grace time, SITE_NAME will mark it as down try: requests.get(URL /start, timeout5) except requests.exceptions.RequestException: # If the network request fails for any reason, we dont want # it to prevent the main job from running pass # TODO: run the job here fib lambda n: n if n 2 else fib(n - 1) fib(n - 2) print(F(42) %d % fib(42)) # Signal success: requests.get(URL)要点说明发送 start 信号时使用了timeout5并捕获RequestException网络请求失败不应阻塞主任务运行这是生产环境的标准姿势成功信号使用不带任何后缀的裸 Ping URL即/ping/code把URL替换为真实 Ping URL 即可直接运行。Ping URL 的完整格式、签名参数与备选请求方式可参考 HTTP API 文档。查看测量到的执行时长当 Healthchecks 收到 start 信号后又收到一次普通 pingsuccess或 fail 信号且两个事件相隔不足 72 小时时执行时长会显示在检查列表中若相隔超过 72 小时两个事件会被视为互不相关时长不予显示。这个 72 小时上限在源码中有明确常量定义见 hc/api/models.py# max time between start and ping where we will consider both events related: MAX_DURATION td(hours72)它同时作用于两个层面的计算实时状态机Ping.duration()在回溯查找 start 事件时只查询created self.created - MAX_DURATION范围内的 ping见 hc/api/models.py批量列表计算prepare_durations()同样以MAX_DURATION为边界决定是否回退到逐条查询见 hc/api/models.py。检查列表页会展示每次运行时长查看单个检查时也能在事件日志中看到历次运行的时长此外Healthchecks API 也会在检查对象中返回last_duration以秒为单位的整数见 hc/api/models.py便于外部系统程序化消费时长数据。并发场景与 Run IDrid 参数当同一任务的多个实例并发运行时仅靠事件顺序计算时长会出错Healthchecks 无法可靠地判断哪个 success 事件对应哪个 start 事件。为了解决这个问题客户端可以在任意 ping URL 上通过rid查询参数指定一个运行 ID当某个 success 事件带有rid参数时Healthchecks 在计算执行时长时会去查找带有相同rid值的 start 事件。rid的格式要求必须是 UUID且采用规范文本表示例如728b3763-ea80-4113-9fc0-f49b3adf226a不要带花括号字母大小写均可。客户端可以随机生成 run ID也可以用确定性流程生成唯一重要的是同一次任务执行的 start 与 success 两个 ping 必须使用相同的 run ID。服务端对rid的校验与使用见 hc/api/views.pyrid, rid_str None, request.GET.get(rid) if rid_str is not None: if not is_valid_uuid_string(rid_str): return HttpResponseBadRequest(invalid uuid format) rid UUID(rid_str)rid会同时写入Check.last_start_rid与每条Ping.ridhc/api/models.py供后续配对计算使用。仓库测试 hc/api/tests/test_ping.py 覆盖了rid匹配成功时设置last_duration、rid不匹配时不设置、fail 时清除 running 状态等关键分支。Shell 脚本示例使用uuidgen生成 run ID、curl 发送请求#!/bin/sh RIDuuidgen # send a start ping, specify rid parameter: curl -fsS -m 10 --retry 5 PING_URL/start?rid$RID # ... FIXME: run the job here ... # send the success ping, use the same rid parameter: curl -fsS -m 10 --retry 5 PING_URL?rid$RID使用了 run ID 后事件日志Events 区会以缩写形式展示每个 run ID如上图所示两个 success 事件都展示出了执行时长。如果这里没有使用 run ID第 4 条事件将不会显示执行时长——因为它前面并没有紧跟的 start 事件可供配对。从源码看基于rid的配对逻辑体现在两处Check.ping()状态机中success rid 匹配 → 计算时长并清除 last_start、success 无 rid 或 fail 且 rid 不匹配 → 清除 last_start见 hc/api/models.pyPing.duration()回溯查找时以ping.rid self.rid为配对条件见 hc/api/models.py。使用 Run ID 时的告警逻辑边界当任务使用 run ID 时告警规则有一个重要注意事项Healthchecks不会监控所有并发任务实例的执行时长只会监控最近一次启动的实例的执行时长。举例说明假设宽限期grace为 1 分钟再看上面 run ID 的示例日志——第 4 条事件运行了 6 分 39 秒远超 1 分钟的时间预算但 Healthchecks 没有产生任何告警因为最近启动的那次运行在时限内完成了它只花了 37 秒小于 1 分钟。这一行为由状态机中的单槽位设计决定Check模型上只有一对last_start/last_start_rid字段hc/api/models.py即服务端同一时刻只追踪一个进行中的运行。后到的 start 信号会直接覆盖此前的last_start记录因此并发场景下告警监控覆盖的仅是最后那次启动的运行。如果并发实例的数量和时长对你很重要设计告警策略时需将这一限制纳入考量Healthchecks 的/start机制主要面向追踪最近一次执行、度量时长并对其超时告警而非为所有并发实例各自维护独立的告警计时器。更多调度与宽限期语义可参考 配置检查文档 与 监控 cron 任务文档。小结/start信号追加到 Ping URL 即可标记任务开始配合 success 信号形成开始—结束配对服务端据此计算并展示每次执行时长告警规则start 发出后超过宽限期grace未收到 success任务即被判为 down 并告警72 小时窗口start 与 success 相隔超过 72 小时即视为无关时长不予展示源码常量MAX_DURATIONrun IDrid并发执行时在 start 与 success 上携带相同 UUID即可准确配对、分别度量时长但告警仅追踪最近一次启动的运行。相关实现文件速查路由 hc/api/urls.py、视图 hc/api/views.py、状态机与时长计算 hc/api/models.py 与 hc/api/models.py、测试用例 hc/api/tests/test_ping.py。赞分享后端任务调度【免费下载链接】healthchecksOpen-source cron job and background task monitoring service, written in Python Django项目地址https://gitcode.com/gh_mirrors/he/healthchecks点击查看免费下载相关推荐json.cpp浮点数序列化为什么float32比double更高效终极优化指南json.cpp浮点数序列化为什么float32比double更高效终极优化指南 json.cpp是一个专为经典C设计的轻量级JSON库它在浮点数序列Steam挂刀行情站实战指南四大平台饰品差价24小时自动追踪从部署到看盘一次搞定Steam挂刀行情站实战指南四大平台饰品差价24小时自动追踪从部署到看盘一次搞定 凌晨两点你盯着BUFF上一件饰品犹豫要不要下手——同一件货在IGXE的后端网页爬虫数据分析Tinyhttpd CGI超时控制防止长时间运行的脚本阻塞Tinyhttpd CGI超时控制防止长时间运行的脚本阻塞 你是否曾遇到过Web服务器因某个失控的CGI脚本而陷入瘫痪作为轻量级HTTP服务器的典范Tin后端网络上一篇NCM文件解密终极指南快速解锁网易云音乐加密格式下一篇Windows窗口置顶终极指南AlwaysOnTop让你的重要窗口永不遮挡创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →