我有几台具有这样配置的机器上的节点导出器从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
Run Code Online (Sandbox Code Playgroud)
在Grafana中查看时,这些实例被分配了相当无意义的IP地址。相反,我希望查看其主机名。我认为您应该能够重新标记instance标签以匹配节点的主机名,因此我尝试使用这样的重新标记规则,无论如何都无效:
relabel_configs:
- source_labels: ['nodename']
target_label: 'instance'
Run Code Online (Sandbox Code Playgroud)
我可以手动重新标记每个目标,但是这需要将每个主机名硬编码到Prometheus中,这并不是很好。我看到节点导出器提供了node_uname_info包含主机名的度量,但是如何从中提取它呢?
node_uname_info{domainname="(none)",machine="x86_64",nodename="myhostname",release="4.13.0-32-generic",sysname="Linux",version="..."} 1
Run Code Online (Sandbox Code Playgroud)
我找到了硬编码解决方案:
全球的:
刮擦间隔:5s
刮擦超时:5 秒
外部标签:
监视器:'普罗米修斯'
刮配置:
- 工作名称:'谢尔比'
静态配置:
- 目标:
- 10.100.0.01:9100
relabel_configs:
- source_labels: [__address__]
正则表达式:'.*'
目标标签:实例
替换:'谢尔比'
- 工作名称:'camaro'
静态配置:
- 目标:
- 10.101.0.02:9100
relabel_configs:
- source_labels: [__address__]
正则表达式:'.*'
目标标签:实例
替换:'camaro'
- 工作名称:'维罗纳'
静态配置:
- 目标:
- 10.101.0.03:9100
relabel_configs:
- source_labels: [__address__]
正则表达式:'.*'
目标标签:实例
替换:'维罗纳'
结果:
node_load15{instance="camaro",job="camaro"} 0.16
node_load15{instance="shelby",job="shelby"} 0.4
node_load15{instance="verona",job="verona"} 0.07
我只是遇到了这个问题,解决方案是使用group_left解决此问题。您不能在请求中使用不存在的值来重新标记,您只能使用提供给Prometheus的不同参数或模块中用于请求的参数(gcp,aws ...)。
因此,我使用的解决方案是将包含我们想要的值(主机名)的现有值与节点导出器的指标结合起来。我们的答案存在于node_uname_info度量标准之内,该度量标准包含nodename值。
我使用此帖子的答案作为我的请求的模型:https : //stackoverflow.com/a/50357418。
解决方法是:
node_memory_Active * on(instance) group_left(nodename) (node_uname_info)
Run Code Online (Sandbox Code Playgroud)
这样,默认情况下,node_memory_Active指标仅包含实例和作业,作为可在grafana的description字段中使用的第三值节点名。
希望这对别人有帮助。
该解决方案在抓取时使用所需的标签存储数据,无需有趣的 PromQL 查询或硬编码的黑客攻击。它通过将正则表达式的抓取数据的标签替换为relabel_configs.
默认情况下,instance设置为__address__,即$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}'
Run Code Online (Sandbox Code Playgroud)
但是上面的内容也会覆盖这样设置的标签,例如file_sd_configs:
[
{
"targets": ['yourhost.lol:9001'],
"labels": {
"instance": 'node42'
}
}
]
Run Code Online (Sandbox Code Playgroud)
如果要保留这些标签,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}'
Run Code Online (Sandbox Code Playgroud)
然后手动设置的instancefromsd_configs优先,但如果未设置,端口仍会被剥离。
您不必对其进行硬编码,也不需要连接两个标签。targets您可以使用一些分隔符将所有逻辑放置在该部分中 - 我使用过@,然后使用正则表达式对其进行处理。请在下面找到来自其他导出器(黑盒)的示例,但同样的逻辑node exporter也适用。在您的情况下,请仅包含以下列表项:
target_label: app_iptarget_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 }}'
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您使用 Prometheus Operator,请将此部分添加到您的 ServiceMonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
...
spec:
endpoints:
- relabelings:
- sourceLabels: [__meta_kubernetes_pod_node_name]
targetLabel: instance
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6897 次 |
| 最近记录: |