prometheus 中 honor_labels 配置项的源码分析
标签解释
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config
根据官方解释honor_labels配置项的作用主要用于解决被采集的目标标签和服务端本地标签(包含静态标签和服务发现的标签)发生同名时的覆盖规则
当honor_labels为true
同名的标签以被采集的标签为准忽略服务端本地标签
当honor_labels为false(默认为false)
同名的被采集的标签将不会覆盖服务端本地标签,而是标签名前增加exported_而服务端本地标签保留(例如两端同时拥有job标签,被采集端标签将会替换exported_job服务端本地标签继续使用job标签
以上官方解释了发生标签同名的情况下的覆盖规则,但是在业务实际使用中我们还需要考虑被采集端偶尔缺失该同名标签或者标签值为空的情况。我们需要了解该场景下本地标签是否会被删除还是会继续保留。
源码分析
当honor_labels为true时候,遍历本地标签target.Labels(),
如果被采集端不存在该标签 !lset.Has(l.Name),则使用本地标签,如果存在则使用被采集端同名标签。
如果被采集端存在该标签但是值为空时需要跟下lb.Set(l.Name, l.Value)的代码
当值为空时候return b.Del(n) 该标签会被标记为删除后续操作会执行删除操作。
适用场景
综上honor_labels=true时
两端同时存在该标签且不为空时使用被采集端标签
两端同时存在该标签且被采集端为空时使用本地标签
被采集端不存在该标签时候使用本地标签
本文首发于我的公众号:
版权声明: 本文为 InfoQ 作者【陈思敏捷】的原创文章。
原文链接:【http://xie.infoq.cn/article/05f4bcaa6d8776581dd302edd】。文章转载请联系作者。
评论