可定位僵尸Service端点:count by (job, service, endpoint, instance) (avg_over_time(up[30m]) == 0) unless on(job, service, endpoint) (up{job=~"blackbox|probe|.*-test"} == 1)。

要快速定位全集群中处于非 Active 状态的“僵尸”Service端点(即已注册但长期无健康上报、实际不可用的 endpoint),PromQL 本身没有“一键”函数,但可通过组合高阶函数与服务发现元数据精准识别。核心思路是:利用 up 指标判断目标实例是否在线,结合 service、job、endpoint 等标签反向关联到 Service 的 endpoints,再排除掉仍被正常采集的活跃端点。
确认 Service endpoints 对应的 target 实例
Prometheus 中每个 endpoint 在抓取时会作为独立 target 存在,并自动注入 __meta_kubernetes_service_name、__meta_kubernetes_endpoint_port_name 等服务发现标签(取决于你的服务发现配置,如 Kubernetes SD)。这些标签最终会映射为 Prometheus 的 label,例如:service、endpoint、job。
你可以先运行以下查询,验证集群中所有被发现的 endpoint 及其所属 Service:
count by (job, service, endpoint) (up{job=~".+"})筛选长期 up == 0 且曾被发现过的 endpoint
僵尸 endpoint 的典型特征是:曾出现在服务发现中(即有对应 target 标签),但当前及过去一段时间内 up == 0,且无其他指标上报(说明采集器已停止拉取)。
使用 absent_over_time() 配合 up 判断“持续失联”:
-
absent_over_time(up[1h])表示该 target 在过去 1 小时内完全没上报过up指标(包括up=0)——这更可能是 target 已从 SD 中消失,不属“僵尸”而是“已注销”; - 真正要找的是
up == 0且稳定维持的 endpoint,推荐用:
count_over_time(up == 0[30m]) > 59(假设 scrape interval=30s,即连续30分钟上报up=0); - 更稳妥写法(兼容不同采集间隔):
avg_over_time(up[30m]) == 0 —— 若过去30分钟平均值为 0,基本可判定持续不可达。
关联 Service 层级,输出“僵尸 endpoint 所属的 Service”
仅知道 target 失联还不够,需定位到具体 Service。利用 Prometheus 的 label 一致性,直接按 service 和 job 聚合:
该查询结果中每一行,就代表一个长期失联的 endpoint,及其归属的 Service 名称(service 标签)和监控任务(job)。
若想进一步聚焦“Service 级别是否有僵尸 endpoint”,可用:
count by (job, service) (avg_over_time(up[30m]) == 0) > 0排除误报:过滤掉本就不该活跃的 endpoint
某些 endpoint 是故意不活跃的(如备用端口、未启用的 probe、或已下线但未清理的旧 Service)。建议加白名单过滤:
- 排除
job="kube-probe"或endpoint="readyz"等探针类端点; - 排除带
release="legacy"或env="staging"等明确标识的测试/废弃环境; - 结合 Kubernetes endpoint 对象状态(需配合 kube-state-metrics)交叉验证:
kube_endpoint_address_available{condition="true"} == 0 unless on(service, namespace) kube_service_labels{label_prometheus!="ignore"}
最终推荐的一键定位表达式(可直接粘贴进 Prometheus UI):
count by (job, service, endpoint, instance) (avg_over_time(up[30m]) == 0) unless on(job, service, endpoint) (up{job=~"blackbox|probe|.*-test"} == 1)这个表达式能列出所有持续30分钟不可达、且不属于探针/测试类任务的 endpoint,并附带其所属 Service 和物理实例信息,便于运维快速下线或排查。

















