操作场景
Prometheus 社区开发了 JMX Exporter 用于导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据。当您的 Java 业务容器化至 Kubernetes 后,可通过本文了解如何使用 Prometheus 与 JMX Exporter 来监控 Java 应用。
JMX Exporter 简介
Java Management Extensions,JMX 是管理 Java 的一种扩展框架,JMX Exporter 基于此框架读取 JVM 的运行时状态。JMX Exporter 利用 Java 的 JMX 机制来读取 JVM 运行时的监控数据,然后将其转换为 Prometheus 可辨识的 metrics 格式,以便让 Prometheus 对其进行监控采集。
JMX Exporter 提供启动独立进程及 JVM 进程内启动(in-process)两种方式暴露 JVM 监控指标:
1. 启动独立进程 JVM 启动时指定参数,暴露 JMX 的 RMI 接口。JMX Exporter 调用 RMI 获取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。
2. JVM 进程内启动(in-process) JVM 启动时指定参数,通过 javaagent 的形式运行 JMX Exporter 的 jar 包,进程内读取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。
说明:
官方不建议使用启动独立进程方式,该方式配置复杂且需单独的进程,进程本身的监控又引发了新的问题。本文以 JVM 进程内启动(in-process)方式为例,在 Kubernetes 环境下使用 JMX Exporter 暴露 JVM 监控指标。
这里使用第二种用法,启动 JVM 时需要指定 JMX Exporter 的 jar 包文件和配置文件。 jar 包是二进制文件,不好通过 configmap 挂载,配置文件我们几乎不需要修改, 所以建议是直接将 JMX Exporter 的 jar 包和配置文件都打包到业务容器镜像中。
其中,第二种方式我们可以选择将 JMX Exporter 的 jar 文件放在业务应用镜像中, 也可以选择在部署的时候挂载进去。这里分别对两种方式做一个介绍:
方式一:将 JMX Exporter JAR 文件构建至业务镜像中
prometheus-jmx-config.yaml 内容如下:
然后准备 jar 包文件,可以在 jmx_exporter 的 Github 页面找到最新的 jar 包下载地址并参考如下 Dockerfile:
注意:
- 启动参数格式:-javaagent:=:
- 这里使用了 8088 端口暴露 JVM 的监控指标,如果和 Java 应用冲突,可自行更改
下面是自己编写的Dockerfile
方式二: 通过 init container 容器挂载
我们需要先将 JMX exporter 做成 Docker 镜像, 以下 Dockerfile 仅供参考:
根据上面 Dockerfile 构建镜像:docker build -t my-jmx-exporter .
在 Java 应用部署 Yaml 中加入如下 init container:
经过如上的改造之后,示例应用 my-demo-app 具备了暴露 JVM 指标的能力。 运行服务之后,我们可以通过 http://lcoalhost:8088
访问服务暴露出来的 prometheus 格式的指标。
操作步骤
使用 JMX Exporter 暴露 JVM 监控指标
打包镜像
使用 JVM 进程内启动(in-process)方式,启动 JVM 需指定 JMX Exporter 的 jar 包文件和配置文件。jar 包为二进制文件,不便通过 configmap 挂载,建议直接将 JMX Exporter 的 jar 包和配置文件都打包到业务容器镜像中。步骤如下:
(1) 准备一个制作镜像的目录,放入 JMX Exporter 配置文件 prometheus-jmx-config.yaml
。
(2) 准备 jar 包文件,可前往 jmx_exporter 的 Github 页面获取最新的 jar 包下载地址。执行以下命令,下载到当前目录。 https://github.com/prometheus/jmx_exporter
https://github.com/prometheus/jmx_exporter(3) 准备 Dockerfile 文件,本文以 Tomcat 为例。
(4) 执行以下命令,编译镜像。
至此已完成镜像打包,您还可利用 docker 多阶段构建,省略手动下载 jar 包的步骤。Dockerfile 示例如下:
部署 Java 应用
部署应用至 Kubernetes 时,需修改 JVM 启动参数以便启动时加载 JMX Exporter。JVM 启动时会读取 JAVA_OPTS
环境变量,作为额外的启动参数,部署时可为应用增加该环境变量。示例如下:
- 启动参数格式:
-javaagent:<jar>=<port>:<config>
- 该示例使用8088端口暴露 JVM 的监控指标,您可按需自行更改。
为 JAVA 服务组件添加环境变量 :
JAVA_OPTS = -javaagent:/tmp/agent/jmx_prometheus_javaagent-0.16.1.jar=5556:/tmp/agent/prometheus-jmx-config.yaml
[root@jenkins dockerfile]# curl 192.168.254.110:12345/metrics
添加 Prometheus 监控配置
配置 Prometheus,使监控数据可被采集。示例如下:
若已安装 prometheus-operator,则可通过创建 ServiceMonitor 的 CRD 对象配置 Prometheus。示例如下:
添加 Grafana 监控面板
采集数据后可进行数据展示。若熟悉 Prometheus 和 Grafana,则可自行根据指标设计所需面板。您也可直接使用社区提供面板,例如 JVM dashboard。可直接导入使用,面板效果图如下: