5

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

在处理CompositeType.

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

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

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

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

ETC...

谢谢!

4

3 回答 3

2

你是对的,关于这个主题的文档很少。但是,如果您查看源代码,您会发现具有复合数据类型的 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 已经以标准化的方式处理它们。

于 2020-03-15T16:03:10.960 回答
0

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

于 2019-11-19T22:43:17.107 回答
0

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

我目前正在将 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_usage{type="committed",} 1.27729664E8
hbase_heap_usage{type="init",} 1.32120576E8
hbase_heap_usage{type="max",} 2.087452672E9
hbase_heap_usage{type="used",} 2.8101728E7

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

  - pattern: java.lang<type=Memory><HeapMemoryUsage>(\w+)
    name: hbase_heap_usage
    labels:
      type: $1
于 2020-09-07T14:43:04.117 回答