在Prometheus中将实例重新标记为主机名
我有普罗米修斯从几个机器上的节点导出器中提取度量值,配置如下:在Prometheus中将实例重新标记为主机名,prometheus,Prometheus,我有普罗米修斯从几个机器上的节点导出器中提取度量值,配置如下: scrape_configs: - job_name: node_exporter static_configs: - targets: - 1.2.3.4:9100 - 2.3.4.5:9100 - 3.4.5.6:9100 relabel_configs: - source_labels: ['__address__'] separator:
scrape_configs:
- job_name: node_exporter
static_configs:
- targets:
- 1.2.3.4:9100
- 2.3.4.5:9100
- 3.4.5.6:9100
relabel_configs:
- source_labels: ['__address__']
separator: ':'
regex: '(.*):.*'
target_label: 'instance'
replacement: '${1}'
- job_name: 'node_exporter'
scrape_interval: 10s
static_configs:
- targets: ['1.2.3.4:9100']
labels:
cluster: 'rkv-image01'
ceph_role: 'mon'
instance_node: 'rkv1701'
在Grafana中查看时,这些实例被分配了毫无意义的IP地址;相反,我更愿意看到他们的主机名。我认为您应该能够重新标记实例
标签以匹配节点的主机名,因此我尝试使用如下重新标记规则,但没有任何效果:
relabel_configs:
- source_labels: ['nodename']
target_label: 'instance'
我可以手动重新标记每个目标,但这需要将每个主机名硬编码到Prometheus中,这不是很好。我看到节点导出器提供了包含主机名的度量值node\u uname\u info
,但是如何从中提取它呢
node_uname_info{domainname="(none)",machine="x86_64",nodename="myhostname",release="4.13.0-32-generic",sysname="Linux",version="..."} 1
我刚刚遇到了这个问题,解决的办法是用剩下的一组人来解决这个问题。您不能在请求中使用不存在的值重新标记,您仅限于您提供给普罗米修斯的不同参数或用于请求的模块中存在的参数(gcp、aws…) 因此,我使用的解决方案是将包含所需内容的现有值(hostnmame)与节点导出器中的度量组合起来。我们的答案存在于包含nodename值的node_uname_info度量中 我使用此帖子的答案作为我请求的模型: 解决方案是:
node_memory_Active * on(instance) group_left(nodename) (node_uname_info)
这样,节点_memory _activemetrics(默认情况下仅包含实例和作业)作为第三个值节点名,可以在grafana的description字段中使用
希望这能帮助其他人。我找到了硬代码解决方案: global: scrape_interval: 5s scrape_timeout: 5s external_labels: monitor: 'Prometheus' scrape_configs: - job_name: 'shelby' static_configs: - targets: - 10.100.0.01:9100 relabel_configs: - source_labels: [__address__] regex: '.*' target_label: instance replacement: 'shelby' - job_name: 'camaro' static_configs: - targets: - 10.101.0.02:9100 relabel_configs: - source_labels: [__address__] regex: '.*' target_label: instance replacement: 'camaro' - job_name: 'verona' static_configs: - targets: - 10.101.0.03:9100 relabel_configs: - source_labels: [__address__] regex: '.*' target_label: instance replacement: 'verona' 全球的: 刮除间隔:5s 刮擦超时:5s 外部标签: 监视器:“普罗米修斯” 刮取_配置: -工作名称:“谢尔比” 静态\u配置: -目标: - 10.100.0.01:9100 重新标记配置: -来源标签:[[地址] 正则表达式:'.' 目标标签:实例 替换:“谢尔比” -工作名称:“卡马罗” 静态\u配置: -目标: - 10.101.0.02:9100 重新标记配置: -来源标签:[[地址] 正则表达式:'.' 目标标签:实例 替换:“camaro” -工作名称:“维罗纳” 静态\u配置: -目标: - 10.101.0.03:9100 重新标记配置: -来源标签:[[地址] 正则表达式:'.' 目标标签:实例 替换:“维罗纳” 结果: node_load15{instance="camaro",job="camaro"} 0.16 node_load15{instance="shelby",job="shelby"} 0.4 node_load15{instance="verona",job="verona"} 0.07 node_load15{instance=“camaro”,job=“camaro”}0.16 node_load15{instance=“shelby”,job=“shelby”}0.4 node_load15{instance=“verona”,job=“verona”}0.07
另一种解决方法是使用一些/etc/hosts或本地dns(可能是dnsmasq)或类似服务发现(由Consor或file_sd)的方法,然后删除如下端口:
scrape_configs:
- job_name: node_exporter
static_configs:
- targets:
- 1.2.3.4:9100
- 2.3.4.5:9100
- 3.4.5.6:9100
relabel_configs:
- source_labels: ['__address__']
separator: ':'
regex: '(.*):.*'
target_label: 'instance'
replacement: '${1}'
- job_name: 'node_exporter'
scrape_interval: 10s
static_configs:
- targets: ['1.2.3.4:9100']
labels:
cluster: 'rkv-image01'
ceph_role: 'mon'
instance_node: 'rkv1701'
左组
不幸的是,与其说是一个解决方案,不如说是一个有限的解决办法。我在vai已经试了一个月,试图找到一个关于组左
的连贯解释,表达式不是标签。在每一个简单的表达上都加上咒语是令人讨厌的;弄清楚如何使用多个度量构建更复杂的PromQL查询完全是另一回事。期望我的任何用户——特别是那些对Grafana/PromQL完全陌生的用户——每次都编写一个复杂而难以捉摸的查询也不那么友好
我的第一次尝试是这样的:
scrape_configs:
- job_name: node_exporter
static_configs:
- targets:
- 1.2.3.4:9100
- 2.3.4.5:9100
- 3.4.5.6:9100
relabel_configs:
- source_labels: ['__address__']
separator: ':'
regex: '(.*):.*'
target_label: 'instance'
replacement: '${1}'
- job_name: 'node_exporter'
scrape_interval: 10s
static_configs:
- targets: ['1.2.3.4:9100']
labels:
cluster: 'rkv-image01'
ceph_role: 'mon'
instance_node: 'rkv1701'
上游不赞成将其视为“反模式”,因为显然人们期望instance
是作业中所有度量值唯一的标签。我从来没有遇到过这样的情况,但嘿,如果有更好的方法,为什么不呢。有一种观点认为出口商应该是“固定”的,但我不太愿意在一个广泛使用的项目中进行潜在的突破性变更。我也不愿意分岔,必须与上游保持平行,我既没有时间也没有业力
接下来,我尝试了metrics\u relabel\u configs
,但似乎不想从其他度量复制标签,即node\u uname\u info{nodename}
->实例
--我在启动时遇到语法错误
接下来,我遇到了一件事,说如果收集器不提供值,Prom将用地址的值填充实例
,事实上,出于某种原因,我的节点导出器
似乎没有得到一个值。这似乎很奇怪。但我发现真正起作用的是简单的很明显,我甚至不想尝试:
- job_name: 'node_exporter'
scrape_interval: 10s
static_configs:
- targets: ['1.2.3.4:9100']
labels:
cluster: 'rkv-image01'
ceph_role: 'mon'
instance: 'rkv1701'
...
也就是说,只需在scrape配置中应用一个目标标签。我正在从一个DB转储中进行基于文件的服务发现,该转储将能够写出这些目标
这可能是我的环境中没有相关节点的DNS a或PTR记录的一个因素。是的,我知道,相信我,我不喜欢这两种记录,但这都是我无法控制的。但这也不重要,我不知道为什么node\u exporter
根本不提供任何实例
标签,因为它确实找到了info me的主机名特里克(这对我没有任何好处)
默认情况下,实例
设置为地址
要将实例
标签设置为$host
,可以使用relabel\u configs
删除端口:
-作业名称:'whatever'
静态\u配置:
-目标:[
“你的主人。哈哈:9001”
]
重新标记配置:
-来源标签:[[地址]
目标标签:实例
正则表达式:'([^::]+)(:[0-9]+)?'
替换:“${1}”
但上述内容也会覆盖这样设置的标签,例如文件\u sd\u configs
:
[
{
“目标”:['yourhost.lol:9001'],
“标签”:{
“实例”:“节点42”
}
}
]
如果要保留这些标签,relab