我有几台机器上的节点导出器的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
在Grafana中查看时,这些实例被分配了相当无意义的IP地址;相反,我更愿意看到他们的主机名。我认为你应该能够重新标记instance
标签以匹配节点的主机名,所以我尝试使用这样的重新标记规则,不会产生任何影响:
relabel_configs:
- source_labels: ['nodename']
target_label: 'instance'
我可以手动重新标记每个目标,但这需要将每个主机名硬编码到Prometheus中,这不是很好。我看到节点导出器提供包含主机名的度量标准node_uname_info
,但是如何从那里提取它?
node_uname_info{domainname="(none)",machine="x86_64",nodename="myhostname",release="4.13.0-32-generic",sysname="Linux",version="..."} 1
答案 0 :(得分:5)
我刚遇到此问题,解决方法是使用group_left解决此问题。您不能在请求中使用不存在的值重新标记,您只能使用给普罗米修斯提供的不同参数,或者在模块中用于请求的参数(gcp,aws ...)。
因此,我使用的解决方案是将包含我们想要的值(主机名)的现有值与节点导出器的指标结合起来。我们的答案存在于node_uname_info度量标准之内,该度量标准包含nodename值。
我以帖子的答案作为我的请求的模型:https://stackoverflow.com/a/50357418。
解决方案是这个:
node_memory_Active * on(instance) group_left(nodename) (node_uname_info)
有了这个,默认情况下,node_memory_Active指标仅包含实例和作业,作为您可以在grafana的description字段中使用的第三个值节点名。
希望这对其他人有帮助。
答案 1 :(得分:2)
我找到了硬编码解决方案:
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'
结果:
node_load15{instance="camaro",job="camaro"} 0.16 node_load15{instance="shelby",job="shelby"} 0.4 node_load15{instance="verona",job="verona"} 0.07
答案 2 :(得分:2)
默认情况下,instance
设置为__address__
,which is $host:$port
。
为了将instance
标签设置为$host
,可以使用relabel_configs
摆脱端口:
- job_name: 'whatever'
static_configs:
- targets: [
'yourhost.lol:9001'
]
relabel_configs:
- source_labels: [__address__]
target_label: instance
regex: '([^:]+)(:[0-9]+)?'
replacement: '${1}'
但是上述操作也会覆盖这样设置的标签,例如file_sd_configs
:
[
{
"targets": ['yourhost.lol:9001'],
"labels": {
"instance": 'node42'
}
}
]
如果要保留这些标签,可以通过以下方式完成relabel_configs
:
- job_name: 'rolf'
metrics_path: /metric/rolf
file_sd_configs:
- files:
- rolf_exporter_targets.yml
relabel_configs:
- source_labels: [instance]
target_label: __tmp_instance
regex: '(.+)'
replacement: '${1};'
- source_labels: [__tmp_instance, __address__]
separator: ''
target_label: instance
regex: '([^:;]+)((:[0-9]+)?|;(.*))'
replacement: '${1}'
然后,从instance
手动设置的sd_configs
优先,但是如果未设置,则端口仍被剥夺。
答案 3 :(得分:1)
group_left
不幸的是,解决方案比解决方案更多。我已经在VAI中尝试了一个月,以找到有关group_left
的连贯解释,并且表达式不是标签。必须在每一个简单的表达上加上咒语会很烦人。弄清楚如何使用多个指标构建更复杂的PromQL查询是另一回事。期望我的任何用户,尤其是对于Grafana / PromQL完全陌生的用户,每次都编写一个复杂而难以理解的查询,也将不那么友好。
我的第一个刺是这样的:
- 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_relabel_configs
,但这似乎并不希望从其他指标(例如)复制标签。 node_uname_info{nodename}
-> instance
-启动时出现语法错误。
接下来,我遇到了一个问题,即如果收集器不提供值,并且出于某种原因,似乎< / em>好像我对instance
的抓取并没有得到。这似乎很奇怪。但是我发现真正有效的方法很简单,而且非常明显,以至于我什至不尝试尝试:
address
即,只需在scrape配置中应用目标标签。我正在从数据库转储中进行基于文件的服务发现,它将能够写出这些目标。
可能是我的环境没有有关节点的DNS A或PTR记录的一个因素。是的,我知道,请相信我我也不喜欢,但这是我无法控制的。但仍然没关系,我不知道为什么node_exporter
根本不提供任何 - job_name: 'node_exporter'
scrape_interval: 10s
static_configs:
- targets: ['1.2.3.4:9100']
labels:
cluster: 'rkv-image01'
ceph_role: 'mon'
instance: 'rkv1701'
...
标签,因为它确实找到了信息指标的主机名(这对我没有任何帮助)
node_exporter
答案 4 :(得分:0)
另一个答案是使用某些/ etc / hosts或本地dns(也许是dnsmasq)或诸如Service Discovery(由Consul或file_sd)之类的东西,然后删除如下端口:
relabel_configs:
- source_labels: ['__address__']
separator: ':'
regex: '(.*):.*'
target_label: 'instance'
replacement: '${1}'
答案 5 :(得分:0)
您可以在普罗米修斯工作描述中使用这样的重新标记规则:
- job_name: node-exporter
....
relabel_configs:
.....
# relable the label 'instance' with your pod_node_name
- source_labels: [__meta_kubernetes_pod_node_name]
target_label: instance
在prometheus Service Discovery中,您可以首先检查标签的正确名称。标签将以'.... pod_node_name'
结尾答案 6 :(得分:0)
您不必对其进行硬编码,也不需要连接两个标签。
您可以使用一些分隔符将所有逻辑放在 targets
部分 - 我使用 @
然后用正则表达式处理它。
请在下面找到其他出口商(黑盒)的示例,但同样的逻辑也适用于 node exporter
。
在您的情况下,请在以下位置包含列表项:
target_label: app_ip
target_label: instance
。- job_name: 'blackbox'
metrics_path: '/probe'
scrape_interval: 15s
params:
module: [ http_2xx ]
static_configs:
- targets:
- "1.2.3.4:8080@JupyterHub"
- "1.2.3.5:9995@Zeppelin"
- "1.2.3.6:8080@Airflow UI"
relabel_configs:
- source_labels: [ __address__ ]
regex: '(.*)@.*'
replacement: $1
target_label: __param_target
- source_labels: [ __address__ ]
regex: '(.*)@.*'
replacement: $1
target_label: app_ip
- source_labels: [ __address__ ]
regex: '.*@(.*)'
replacement: $1
target_label: instance
- target_label: __address__
replacement: '{{ blackbox_exporter_host }}:{{ blackbox_exporter_port }}'