主要问题是使用这些类型的指标:
some_state_metric{name="something", state="active"} = 1
some_state_metric{name="something", state="inactive"} = 0
some_state_metric{name="something", state="failing"} = 0
我不知道它们叫什么,但我将它们称为“布尔指标”或“状态指标”
它们通过使用 1 和 0 作为布尔值来指示状态是否处于活动状态来跟踪超时状态。
据我所知,这用于解决 PromQL/Prometheus 没有有效的度量文本/枚举值,只有数字的事实。
实现者有两个选项,就是让值代表一种状态...(如 0=null、1=active、2=inactive、3=failing)
该解决方案的问题在于,它不能很好地转换为任何使用标签作为重要分区指示器的 PromQL 查询。
...或者,按照惯例,将每个状态表示为单独的标签,然后使用布尔值来指示哪个状态处于活动状态。
这也可以用来表示“组合”状态。
node_systemd_unit_state
kube_pod_status_phase
遗憾的是,普罗米修斯没有原生的方式来以有用的格式表示这些。 请参阅此处
我希望有一个特殊的函数可以处理这种类型的指标:
group(boolean_metric(some_state_metric, "state")) by(name)
产生数据框:
vector<something>(1708277100, "active")
vector<something>(1708277101, "active")
vector<something>(1708277102, "active")
vector<something>(1708277103, "active")
vector<something>(1708277104, "failing")
不要将此数据框表示视为福音,
我知道普罗米修斯是基于向量原理工作的,所以需要有 一个方向(我认为的时间)和一个幅度(我认为的值)然后 用特定标签将它们分组
但我不知道如何传达这些信息,也不知道它的内部是什么样子
它基本上返回标签(状态)的值,其中每个值都等于 1,在实例标签上分区。
但是不,这不存在。
问题是这两个都无法指定备用
Value
字段。它们都期望查询返回一个唯一的离散值来映射到一个状态,因此 1 和 0 实际上不起作用。
我确实尝试过将给定状态乘以偏移量:
some_state_metric{state="active"} * 10
or
some_state_metric{state="inactive"} * 100
or
some_state_metric{state="failing"} * 1000
然后您可以映射
10 -> active
和 100 -> inactive
和 1000 -> failing
但是我在合并查询时遇到了困难(我认为我做错了)。 这也是“坏”的,因为它涉及多个查询,而实际上,1 个查询就可以。
如何将 Prometheus“状态指标”/“布尔指标”转换为可与 Grafana 状态时间线或状态历史记录一起使用的格式?
想通了一些事情
使用新的按值分区转换!
实际上非常简单(虽然确实花了我一些时间)
我将使用节点导出器的 systemd 模块中的
。node_systemd_unit_state
第一步是将我们想要的标签分组:
记得将格式设置为“表格”
group(node_systemd_unit_state{} == 1) by(name, state)
第二步是从结果中删除“值”,只保留
Time
、name
和 state
您可以通过按名称过滤字段转换来执行此操作。
您可以使用 GUI 来设置它们,也可以指定正则表达式
/^(?!Value)/
,这应该删除 Value
字段
然后您在 name
字段上使用
按值分区进行分区。
记得设置“作为框架名称”
现在只需将“值映射”的颜色设置为所需的表示形式即可!
您可能希望将“最小间隔”设置为
30m
、1h
或 1d
,具体取决于您正在处理的比例。