配置 jmx-prometheus-exporter docker 容器以读取 jmx 本地应用程序的指标

Posted

技术标签:

【中文标题】配置 jmx-prometheus-exporter docker 容器以读取 jmx 本地应用程序的指标【英文标题】:Configuring a jmx-prometheus-exporter docker container to read jmx local application's metrics 【发布时间】:2019-08-23 16:59:34 【问题描述】:

我正在尝试使用 grafana 可视化我的 Spring 应用程序(直到现在仍在本地主机上)指标。 为此,我首先使用 HikariCP 配置了一个连接池,并使用 Jmx (MBean) 添加了监控功能。直到这一步,一切正常。

然后我启动了 Grafana、一个 Prometheus 和一个 jmx-prometheus-exporter docker 容器。

这是我的 docker compose 文件

版本:'3'

服务:

  grafana:
    image: grafana/grafana:latest
    ports:
      - 3000:3000

  prometheus:
    image: prom/prometheus:latest
    ports:
      - 9090:9090
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  jmx-exporter:
    image: sscaling/jmx-prometheus-exporter
    ports:
      - 5556:5556

这里是prometheus配置文件

scrape_configs:
  - job_name: 'prometheus'

    static_configs:
      - targets: ['localhost:9090']
        labels:
          group: 'prometheus'

  - job_name: 'app-server'

    static_configs:
      - targets: ['localhost:8080']


  - job_name: 'jmx-exporter'

    static_configs:
      - targets: ['jmx-exporter:5556']

在 prometheus 中:"http://localhost:9090/targets" 我可以将 jmx-prometheus-exporter 和 prometheus 本身视为健康服务。

访问http://localhost:5556/ 时,我看到了一些值,但没有任何东西表明它们是特定于我的应用程序的(我没有看到我设置的池名称......),这似乎是合乎逻辑的,因为我没有t 查看 jmx 容器如何配置以从我的应用程序读取指标(本地 jmx)

# TYPE java_lang_MemoryPool_UsageThresholdSupported untyped
java_lang_MemoryPool_UsageThresholdSupportedname="Metaspace", 1.0
java_lang_MemoryPool_UsageThresholdSupportedname="PS Old Gen", 1.0
java_lang_MemoryPool_UsageThresholdSupportedname="PS Eden Space", 0.0
java_lang_MemoryPool_UsageThresholdSupportedname="Code Cache", 1.0
java_lang_MemoryPool_UsageThresholdSupportedname="Compressed Class Space", 1.0
java_lang_MemoryPool_UsageThresholdSupportedname="PS Survivor Space", 0.0
# HELP java_lang_Threading_ThreadContentionMonitoringEnabled ThreadContentionMonitoringEnabled (java.lang<type=Threading><>ThreadContentionMonitoringEnabled)
# TYPE java_lang_Threading_ThreadContentionMonitoringEnabled untyped
java_lang_Threading_ThreadContentionMonitoringEnabled 0.0
# HELP java_lang_OperatingSystem_CommittedVirtualMemorySize CommittedVirtualMemorySize (java.lang<type=OperatingSystem><>CommittedVirtualMemorySize)

我的问题是,我想公开我的应用程序指标以便在 jmx-prometheus-exporter 容器 ( https://github.com/sscaling/docker-jmx-prometheus-exporter) 中读取,但我不知道如何配置它,(出口商 java 代理解决方案可能有效但我想要一些码头化的东西)

【问题讨论】:

【参考方案1】:

您必须为 jmx 导出器添加配置文件,您将在其中提及 jmx url 以使用其中的指标并映射配置文件以覆盖 jmx 导出器中存在的文件

例如:撰写文件

version: '2'
services:
  jmx-exporter:
    image: sscaling/jmx-prometheus-exporter
    ports:
      - "9072:9072"
    environment:
      SERVICE_PORT: 9072
    volumes:
      - ./config.yml:/opt/jmx_exporter/config.yml

这里 /opt/jmx_exporter/config.yml 是图像中存在的默认文件,而 ./config.yml 是您必须提及配置的文件。一旦映射您定义的配置文件将覆盖默认图像文件。

例如:配置文件

startDelaySeconds: 0
lowercaseOutputName: false
lowercaseOutputLabelNames: false
ssl: false
jmxUrl: service:jmx:rmi:///jndi/rmi://[jmxhost:port]/jmxrmi

[jmxhost:port] - 你必须用 jmx 主机和 jmx 端口的实际名称替换它。 config.yml 中还可以根据自己的需求添加其他配置。

【讨论】:

【参考方案2】:

我正在做类似的事情。 您的 prometheus 配置文件似乎是正确的。

我发现的唯一方法是使用 javaagent。你可以从https://github.com/prometheus/jmx_exporter下载javaagent jar。

然后将此行添加到您的 java 应用程序中:

javaagent:/YOUR_PATH/jmx_prometheus_javaagent-0.3.0.jar=PORT:/ANOTHER_PATH/config-jmx-tomcat.yaml"

我认为,如果您看不到您的数据,那么您的 jmx 导出器的配置设置不正确。检查这个 github 的语法:https://github.com/pentachore/jmx_exporter_hikaricp

【讨论】:

【参考方案3】:

您需要为 jmx 导出器提供一个配置文件:refer link

例如,如果您的应用程序在端口 8080 上运行,则提供类似配置

hostPort: 127.0.0.1:8080

config.yaml 中用于 jmx 导出器。

【讨论】:

以上是关于配置 jmx-prometheus-exporter docker 容器以读取 jmx 本地应用程序的指标的主要内容,如果未能解决你的问题,请参考以下文章

(4.19)SQL server 2008一些常见配置之一(基本配置,权限配置远程访问配置和内存配置。)

Tomcat卷五---Web 应用配置,管理配置和JVM配置

SpringBoot:配置文件的作用配置文件的格式properties配置文件yml配置文件

IDEA的常用配置,maven配置,git配置操作

SpringCloud Nacos配置管理 -- 统一配置管理(添加配置微服务配置拉取)

Android Gradle 插件LintOptions 配置 ⑦ ( explainIssues 属性配置 | htmlOutput 属性配置 | htmlReport 属性配置 )