如何通过PromQL找出一段时间内缺失的BGP前缀?
定位缺失的BGP前缀及历史缺失情况
针对你遇到的问题——只能感知BGP前缀数量变化但无法定位具体缺失前缀,以及需要追踪一段时间内的缺失记录,这里有几个实用的PromQL方案:
一、定位当前缺失的前缀
要找出现在不存在、但近期(比如过去1小时)曾经存在的前缀,可以利用last_over_time和标签匹配来做集合差:
# 获取过去1小时内所有出现过的前缀的最后状态 last_over_time(bgp4PathAttrPeer{bgp4PathAttrPeer="10.16.3.9"}[1h]) # 与当前存在的前缀做差,保留仅在历史中出现的条目 - on(bgp4PathAttrPrefix) group_left() bgp4PathAttrPeer{bgp4PathAttrPeer="10.16.3.9"}
这个查询会返回所有当前已撤销的前缀,结果中对应的bgp4PathAttrPrefix标签就是你要找的缺失前缀。如果你的前缀标签不是bgp4PathAttrPrefix,替换成实际的标签名即可(比如prefix)。
二、查找一段时间内的缺失记录
如果需要追踪某个时间段内所有出现过缺失的前缀,以及它们的缺失情况,可以用以下两种方式:
1. 统计过去N天内有缺失的前缀
# 统计每个前缀在过去1天内的缺失次数,筛选出至少缺失过一次的 count_over_time(absent(bgp4PathAttrPeer{bgp4PathAttrPeer="10.16.3.9"})[1d]) by (bgp4PathAttrPrefix) > 0
absent()会在前缀不存在时返回1,存在时返回空;count_over_time则统计过去1天内该前缀缺失的总次数,结果大于0就说明这个前缀在这段时间内被撤销过。
2. 追踪前缀状态变化的时刻
如果想知道具体哪个前缀在什么时候被撤销,可以先通过记录规则把每个前缀的存在状态持久化:
# 在Prometheus配置中添加这条记录规则 groups: - name: bgp_prefix_monitoring rules: - record: bgp_prefix_exists expr: count(bgp4PathAttrPeer{bgp4PathAttrPeer="10.16.3.9"}) by (bgp4PathAttrPrefix)
这条规则会生成一个新指标bgp_prefix_exists,每个前缀对应的值为1(存在)。之后用changes()函数找出状态变化的前缀:
# 找出过去1小时内状态发生变化的前缀(从1变为0即代表被撤销) changes(bgp_prefix_exists[1h]) > 0
结合Prometheus的图表,你可以查看这些前缀的状态变化曲线,准确定位撤销发生的时间点。
小提示
- 调整查询中的时间范围(比如
[1h]换成[6h])可以适配你的实际监控需求; - 如果你的BGP指标还有其他标签(比如AS号),可以在
by()子句中加入这些标签,更精准地筛选目标前缀。
内容的提问来源于stack exchange,提问作者Tomas
相关产品推荐
相关产品推荐

