Prometheus的标签
标签
标签提供了时间序列的维度。它们可以定义目标,并为时间序列提供上下文。但最重要的是,结合指标名称,它们构成了时间序列的标识,如果它们改变了,那么时间序列的标识也会跟着改变。
更改或添加标签会创建新的时间序列。
这意味着应该明智地使用标签并尽可能保持不变。如果不遵守这一规定,则可能产生新的时间序列,从而创建出一个动态的数据环境,使监控的数据源难以跟踪。想象一下,你有一个时间序列,用于跟踪服务的状态。你为该时间系列配置了一个警报,该警报依赖于指标的标签来评判。如果更改或添加标签,那么警报将变为无效。这同样适用于历史时间序列数据:更改或添加标签,我们会丢失先前时间序列的跟踪,破坏已有的图像和表达式,并可能导致混乱。
标签分类
与大多数监控分类法一样,在分层更加广泛时标签可能表现最好。一个设定分类标准的好办法是利用拓扑标签和模式标签。
拓扑标签(topological label)通过其物理或逻辑组成来切割服务组件,例如我们在上面看到的datacenter标签。每个指标都天然带有两个拓扑标签:job和instance。标签job是根据抓取配置中的作业名称设置的。我们倾向于使用job来描述正在监控的事物的类型。在之前的Node Exporter作业中,我们将其命名为node。这会为每个Node Exporter指标打上job标签node。instance标签可以标识目标,它通常是目标的IP地址和端口,并且来自__address__标签。
模式标签(schematic label)是url、error_code或user之类的东西,它们允许你将拓扑中同一级别的时间序列匹配在一起,例如创建数据间的比率。
为了删除标签,我们指定一个正则表达式,然后指定删除标签的操作labeldrop。这将删除与正则表达式匹配的所有标签。此操作还有一个对应的反向操作labelkeep,它将保留与正则表达式匹配的标签,并删除所有其他标签。
重新标记
-
删除不必要的指标。
-
从指标中删除敏感或不需要的标签。
-
添加、编辑或修改指标的标签值或标签格式。
这里__name__标签值将使用“,”进行分隔。它将匹配并捕获两个指标:container_tasks_state``container_memory_failures_total
如果指定了多个源标签,那么我们将使用分隔符隔开每个正则表达式,如regex1;regex2;regex3
多个标签通过分隔符连接在一起,默认分隔符为“;”,也可以使用separator参数覆盖分隔符配置。
测试结果:
替换标签值
我们还可以替换标签的值。举个例子,许多cAdvisor指标都有一个id标签,其中包含正在运行的进程的名称。如果该进程是一个容器,那么我们会看到类似如下的信息:
上面的内容有点冗长,我们想要从中获取容器ID:然后将其放入一个新标签container_id中,通过重新标记我们可以这样做:
我们的源标签是id。然后,指定匹配并捕获容器ID的正则表达式(regex)。replacement字段包含新标签值,在示例中使用的是匹配的结果$1。然后,在target_label参数中指定捕获信息的目标,此处为container_id。
删除标签
最后我们介绍一个删除标签的例子。这通常用于隐藏敏感信息或简化时间序列。在这个(为演示而创建的)示例中,我们将删除kernelVersion标签,隐藏Docker主机的内核版本。
为了删除标签,我们指定一个正则表达式,然后指定删除标签的操作labeldrop。这将删除与正则表达式匹配的所有标签。此操作还有一个对应的反向操作labelkeep,它将保留与正则表达式匹配的标签,并删除所有其他标签。
标签是时间序列的唯一性约束。如果你删除标签并导致时间序列重复,那么系统可能会出现问题!