三个容易混的概念
PromQL 里与时间相关的函数容易混淆:time() 返回查询执行时刻的 Unix 秒,timestamp() 返回某个样本自身携带的时间戳,day_of_week、hour 等函数则基于评估时刻返回日期时间标量。区分这三者是写对规则的前提,混用会让数据中断检测失效,或让时间条件判断错位。
函数对照
| 函数 | 返回值 | 典型用途 |
|---|---|---|
| time() | 查询时刻的 Unix 秒(标量) | 计算样本新鲜度、按当前时间做条件判断 |
| timestamp(v) | 该样本的时间戳(秒) | 检测数据中断:当前时间减样本时间过大 |
| day_of_week() | 星期几(0 表示周日) | 只在工作日生效的规则 |
| hour() | 当前小时(0-23) | 营业时段与夜间使用差异化阈值 |
| minute() | 当前分钟 | 配合 hour 做更细的时间窗口控制 |
用法示例
用法示例
# 数据中断检测:当前时间与样本时间差超过 5 分钟
time() - timestamp(up{job="api"}) > 300
# 仅工作日生效的高负载检查
day_of_week() >= 1 <= 5 and node_load1 > 8
# 营业时段(9 点到 21 点)才评估的低流量告警
hour() >= 9 <= 21 and sum(rate(orders_total[5m])) < 1典型使用场景
- 用 time() 与 timestamp() 的差值判断 exporter 是否停止上报
- 按业务时段设置差异化阈值,避免夜间低频流量触发误报
- 在规则里排除特定星期或时段,配合维护窗口使用
- 排查规则为何没触发时,先确认评估时刻各时间函数的取值
time()、day_of_week() 返回标量,可参与算术与比较;日期时间函数取执行评估的 Prometheus 进程时区,跨时区团队要统一约定并写进文档。
timestamp() 是每个样本自己的时间,同一次查询里不同序列的值可能不同,用于告警时通常搭配 up 这类固定序列。
排查顺序
- 先确认指标本身是否还有新样本,没有样本时任何时间函数都算不出结果
- 再确认告警的评估间隔与 for 时长,评估太稀会错过短时窗口
- 最后核对进程时区与容器时区是否一致,容器默认 UTC 的场景尤其常见