当前位置: 首页 > 知识库问答 >
问题:

在Prometheus中将实例重新标记为主机名

尉迟阳煦
2023-03-14

我有普罗米修斯从几个机器上的节点导出器中抓取指标,配置如下:

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地址;相反,我更愿意看到他们的主机名。我认为您应该能够重新标记实例标签以匹配节点的主机名,因此我尝试使用如下重新标记规则,但没有任何效果:

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

共有3个答案

王岳
2023-03-14

该解决方案在刮擦时存储具有所需标签的数据,不需要有趣的PromQL查询或硬编码黑客。它通过用relabel_configs替换正则表达式刮取的数据的标签来做到这一点。

默认情况下,实例设置为地址,即$host:$port

为了将实例标签设置为$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}'

但上述内容也会覆盖这样设置的标签,例如文件\u sd\u configs

[
    {
        "targets": ['yourhost.lol:9001'],
        "labels": {
            "instance": 'node42'
        }
    }
]

如果要保留这些标签,可以通过以下方式执行重新标签\u 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}'

然后从sd_configs手动设置的实例优先,但是如果没有设置,端口仍然被剥离。

公冶谦
2023-03-14

我找到了硬代码解决方案:


    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

方河
2023-03-14

我只是遇到了这个问题,解决办法是用group_left来解决这个问题。您不能在请求中使用不存在的值重新标记,您只能使用您给prometheus的不同参数或请求的模块使用中存在的参数(gcp,aws...)。

因此,我使用的解决方案是将包含我们想要的内容(host nmame)的现有值与节点导出器中的度量值相结合。我们的答案存在于包含节点名值的node_uname_info指标中。

我用这篇文章的答案作为我请求的范本:https://stackoverflow.com/a/50357418 .

解决办法是这样的:

node_memory_Active * on(instance) group_left(nodename) (node_uname_info)

这样,node_memory_Active度量标准默认只包含实例和作业作为第三个值节点名,您可以在grafana的描述字段中使用它。

希望这对其他人有所帮助。

 类似资料:
  • 我有一个带有普罗米修斯的k8s集群和几个带有web应用程序的豆荚。我想从这些网络应用程序中收集度量标准。我使用Prometheus blackbox_exporter来实现这一点。 我配置了服务监视器,部署,工作由普罗米修斯操作员。普罗米修斯收集了度量,但我无法区分它们。例如, 我应该做什么来为每个endpoint添加额外的标签? 如何向probe_success度量标准添加诸如target之类的

  • 我刚刚升级到spring-boot 2.1.3.release,由于这个新的类/方法,我不能拥有多个StreamsBuilderFactoryBean(只需要一个): 我得到这个错误: 我在想,也许使构造的bean成为一个主要的bean。任何帮助都超过感激! 编辑:我通过删除和来规避这个问题。因此,不起作用。

  • 问题内容: 我有一个问题,为什么将main方法标记为 public ? 根据关于stackoverflow的回答,它声明为 静态 “该方法是静态的,因为否则会产生歧义:应调用哪个构造函数?” 但是,任何人都可以解释为什么总是将其宣布为 公开 吗? 问题答案: 启动程序的初始化软件必须能够看到以便可以调用它。

  • 问题内容: 我试图将整个段落输入到我的文字处理器中,然后先分成句子,然后再分成单词。 我尝试了以下代码,但它不起作用, 但是,这不起作用,并给我错误。那么,如何将段落标记为句子,然后再标记为单词? 一个示例段落: 这东西似乎使那只黑褐色的小狗感到吃惊和震惊,使他伤心。 他绝望地沉在孩子的脚下。当重击一声再加上幼稚的训诫时,他转过身来,用独特的方式握住了爪子。同时,他用耳朵和眼睛向孩子祈祷。 警告:

  • 我正在尝试使用用户id,该id作为主要属性存储在HTML标记中的Spring Security Authentication令牌中,例如: 我只知道有两种方法可以使用Spring Security主体对象的id: > 使用专用标记库的身份验证标记(在这里不起作用,因为据我所知JSP不允许嵌套标记)。 使用scriptlet,这是我真正想要避免的。如果有人知道一个优雅的人在做这项工作,我还是会感兴趣

  • 我一直在和Hyperledger Fabric一起工作。通常,当my chaincode实例化失败时(由于Go代码中的一些错误),或者当我只是想更新它时,我需要停止所有的执行,然后重新读取CA、Orderer、CouchDB和对等点。这确实很有问题,也很耗时。 我想知道有没有什么直接的方法可以做到这一点?我无法找到任何解决方案在网上的语言简单到足以理解。 提前谢谢你。