Prometheus jmx 导出器模式匹配属性和项目

Posted

技术标签:

【中文标题】Prometheus jmx 导出器模式匹配属性和项目【英文标题】:Prometheus jmx exporter pattern match for attributes and items 【发布时间】:2020-03-15 05:25:06 【问题描述】:

我正在尝试使用 jmx_exporter java 代理 (https://github.com/prometheus/jmx_exporter) 对 prometheus 指标进行模式匹配和命名。

在处理CompositeType 时,没有太多关于如何对 MBean 属性和这些属性中的项目进行模式匹配的文档。

例如,我达到了我以这种方式进行模式的地步:

rules:
  - pattern: "java.lang<type=Memory><>HeapMemoryUsage"
    name: jmx_jvm_memory_HeapMemoryUsed

但是,如果您在 VisualVM 中查看 HeapMemoryUsed 属性。您还可以在openType 中的Attribute Description 中看到以下内容:

javax.management.openmbean.CompositeType(
    name=java.lang.management.MemoryUsage,
    items=(
            (itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
            (itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
            (itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),
            (itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long))
        )
    )

我希望能够根据这些项目命名指标。例如,我想要一个指标,例如:

jmx_jvm_memory_HeapMemoryUsed_used jmx_jvm_memory_HeapMemoryUsed_max

等等……

谢谢!

【问题讨论】:

【参考方案1】:

你说得对,关于这个主题的文档很少。但是,如果您查看源代码,您会发现具有复合数据类型的 bean 被展开为每个属性和值组合的指标 (JMXScraper.java:207-224)。


在您的情况下,您可以使用以下rules 项目达到预期的结果:

rules:
  # ... other rules
  - pattern: 'java.lang<type=Memory><(HeapMemoryUsage>(\w+): (.*)'
    name: jmx_jvm_memory_HeapMemoryUsed_$1
    help: "JVM heap memory $1"
    value: $2
    type: GAUGE

如果您在启用 JMXExporter 代理的情况下启动服务器并查询指标端点,您将看到类似于以下输出的内容

$ curl -s $server-url:$jmx-exporter-port/metrics | grep jmx_jvm
# HELP jmx_jvm_memory_HeapMemoryUsed_committed JVM heap memory committed
# TYPE jmx_jvm_memory_HeapMemoryUsed_committed gauge
jmx_jvm_memory_HeapMemoryUsed_committed 7.7856768E8
# HELP jmx_jvm_memory_HeapMemoryUsed_max JVM heap memory max
# TYPE jmx_jvm_memory_HeapMemoryUsed_max gauge
jmx_jvm_memory_HeapMemoryUsed_max 1.908932608E9
# HELP jmx_jvm_memory_HeapMemoryUsed_init JVM heap memory init
# TYPE jmx_jvm_memory_HeapMemoryUsed_init gauge
jmx_jvm_memory_HeapMemoryUsed_init 2.64241152E8
# HELP jmx_jvm_memory_HeapMemoryUsed_used JVM heap memory used
# TYPE jmx_jvm_memory_HeapMemoryUsed_used gauge
jmx_jvm_memory_HeapMemoryUsed_used 4.7050592E8

注意:正如 Brian 在他的回答中已经说过的那样,对于标准 JMX bean(例如 java.lang 域中的那些)没有必要这样做,因为 JMXExporter 已经在一种标准化的方式。

【讨论】:

【参考方案2】:

如果您查看指标输出中的 HELP,这就是您要匹配的内容。但是,您无需担心任何 java.lang 指标,jmx 导出器 java 代理会在 jvm_ 指标前缀下自动为您提供它们。

【讨论】:

指标输出中的HELP 是什么意思? @Berni 如果您没有为一组 bean 提供任何模式,则应用默认格式化程序。在默认格式化程序的输出中,# HELP ... 行将包含 JMXExporter 所需的 bean 模式,以匹配括号中的给定 bean。对于标准 JMX bean(例如域 java.lang),您不会看到这一点,因为它们似乎具有 JMXExporter 附带的格式。在您的情况下,这应该是 jvm_memory_bytes_usedarea="heap",jvm_memory_bytes_maxarea="heap",【参考方案3】:

对于遇到此问题并遇到困难的任何人。我设法让它工作。

我目前正在将 HBase JMX 指标移植到 Prometheus,并且正在研究如何使用复合值更新指标,让我们来看一个示例:


    "name": "java.lang:type=Memory",
    "modelerType": "sun.management.MemoryImpl",
    "ObjectPendingFinalizationCount": 0,
    "Verbose": false,
    "HeapMemoryUsage": 
        "committed": 127729664,
        "init": 132120576,
        "max": 2087452672,
        "used": 26782688
    ,
    "NonHeapMemoryUsage": 
        "committed": 50896896,
        "init": 2555904,
        "max": -1,
        "used": 49540216
    ,
    "ObjectName": "java.lang:type=Memory"
,

默认情况下,您的指标格式如下:

# HELP java_lang_Memory_HeapMemoryUsage_init java.lang.management.MemoryUsage (java.lang<type=Memory><HeapMemoryUsage>init)
# TYPE java_lang_Memory_HeapMemoryUsage_init untyped
java_lang_Memory_HeapMemoryUsage_init 1.32120576E8

但如果你像我一样,你可能想要这样:

# HELP hbase_heap_usage java.lang.management.MemoryUsage (java.lang<type=Memory><HeapMemoryUsage>committed)
# TYPE hbase_heap_usage untyped
hbase_heap_usagetype="committed", 1.27729664E8
hbase_heap_usagetype="init", 1.32120576E8
hbase_heap_usagetype="max", 2.087452672E9
hbase_heap_usagetype="used", 2.8101728E7

要做到这一点,文档不是很好,有点倒退,在使用VisualVM时,它会告诉你HeapMemoryUsage是属性,但是在这些复合情况下,键在里面 属性是属性,属性是关键......所以要实现上述目标,您的规则将如下所示:

  - pattern: java.lang<type=Memory><HeapMemoryUsage>(\w+)
    name: hbase_heap_usage
    labels:
      type: $1

【讨论】:

以上是关于Prometheus jmx 导出器模式匹配属性和项目的主要内容,如果未能解决你的问题,请参考以下文章

JMX导出器和Prometheus

kafka 和 JMX 导出器

如何将 Prometheus 与 Presto JMX 连接起来

如何使用 JMX 导出器将 JMX 指标从 Kafka 消费者推送到普罗米修斯

使用 Jmx Exporter for Prometheus 缺少 Kafka Connect 指标

Kafka 的 Prometheus JMX Exporter java 代理无法运行