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

时间:2019-11-19 16:08:20

标签: jmx prometheus mbeans jmx-exporter mbeanexporter

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

在处理CompositeType时,关于如何在MBean属性和这些属性中的项目之间进行模式匹配的文档很少。

例如,我达到了以这种方式进行图案化的程度:

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

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

openType

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

  • jmx_jvm_memory_HeapMemoryUsed_used
  • jmx_jvm_memory_HeapMemoryUsed_max

等...

谢谢!

3 个答案:

答案 0 :(得分: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在回答中所说的那样,由于JMXExporter已经处理过,因此不需要对标准JMX Bean(例如java.lang域中的那些)执行此操作他们以标准化的方式。

答案 1 :(得分:0)

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

答案 2 :(得分: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是属性,但是在这些复合情况下,键 inside < / strong>属性是属性,属性是键...因此,要实现上述目标,您的规则将如下所示:

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