一、背景简介

虚拟机部署的Java应用没有集成SpringBoot自带监控Actuator,需要额外手动配置采集JVM监控。JMX-Exporter作为Prometheus生态系统中重要的组件,能够将JMX(Java Management Extensions)指标转换为Prometheus格式,实现对Java应用的深度监控。

核心解决问题

  • 传统Java应用缺乏现代化监控指标暴露
  • 需要统一监控数据格式对接Prometheus
  • 实现JVM性能指标的实时采集和分析

二、JMX Agent部署步骤

2.1. 部署文件

在开始部署之前,需要准备以下核心文件:

文件类型 文件名称 说明
JVM监控Agent jmx_prometheus_javaagent-1.2.0.jar JMX指标收集器
监控配置文件 exporter.yaml JMX指标采集规则配置

exporter.yaml

rules:
  - pattern: ".*"

版本说明

  • 建议使用JMX Prometheus JavaAgent 1.2.0或更新版本
  • 配置文件需要根据应用特点进行定制化调整

2.2. 部署步骤

(1)文件部署

  1. Agent部署:将jmx_prometheus_javaagent-1.2.0.jar文件添加到Java应用模块的lib目录下
  2. 配置文件部署:将exporter.yaml配置文件添加到应用模块的conf目录下
  3. 启动脚本修改:修改Java应用模块的启动脚本,增加jmx-agent的启动参数

(2)修改应用启动脚本配置

基础配置示例:

java -javaagent:./lib/jmx_prometheus_javaagent-1.2.0.jar=8585:./conf/exporter.yaml

完整启动脚本示例:

java -javaagent:./lib/jmx_prometheus_javaagent-1.2.0.jar=8585:./conf/exporter.yaml \
     ${JAVA_OPTS} \
     -cp ${CLASSPATH} \
     com.example.application.server.ApplicationServer \
     > ${SERVER_LOG} 2>&1 &

配置要点

  • 端口8585可根据实际情况调整,需确保端口未被占用
  • javaagent参数必须在主类之前指定
  • 路径必须与实际文件位置保持一致

2.3. 重启应用模块

修改启动脚本后,需要重启应用模块使配置生效:

# 停止应用
./stop.sh

# 启动应用
./start.sh

2.4. 验证Agent启动

使用浏览器或curl命令验证JMX-Exporter是否正常工作:

curl http://host:8585/metrics

验证成功标志

  • 返回Prometheus格式的指标数据
  • 包含JVM相关指标如jvm_memory_bytes_usedjvm_gc_duration_seconds
  • HTTP状态码为200

三、Prometheus监控采集配置

3.1. 配置Kubernetes Endpoints

创建应用名称-jmx-exporter-endpoints.yaml文件:

apiVersion: v1
kind: Endpoints
metadata:
  name: 应用名称-jmx-exporter
  namespace: monitoring
subsets:
- addresses:
  - ip: 192.168.1.10  # JMX服务器IP1
  - ip: 192.168.1.11  # JMX服务器IP2
  ports:
  - name: http
    port: 8585  # jmx-exporter端口
    protocol: TCP

配置说明

  • 替换应用名称为实际应用标识
  • ip字段填写部署JMX-Exporter的服务器IP地址
  • port需与启动脚本中配置的端口保持一致

3.2. 配置Kubernetes Service

创建应用名称-jmx-exporter-service.yaml文件:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: jmx-exporter
    platform: app-platform          # 应用所属平台
    modules: 应用名称        # 具体应用模块名
  name: jmx-exporter
  namespace: monitoring
spec:
  ports:
  - port: 8585              # jmx-exporter端口
    protocol: TCP
    targetPort: http
  type: ClusterIP

关键配置项

  • platform:标识应用所属的业务平台
  • modules:标识具体的应用模块名称
  • 这些标签将用于Prometheus的指标分类和查询

3.3. 配置ServiceMonitor

创建jmx-exporter-monitor.yaml文件:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: jmx-exporter
  namespace: monitoring
spec:
  endpoints:
  - interval: 15s           # 采集间隔
    path: /metrics          # 指标暴露路径
    port: http
  targetLabels:
  - platform
  - modules
  namespaceSelector:
    matchNames:
    - monitoring
  selector:
    matchLabels:
      app: jmx-exporter

ServiceMonitor功能

  • 自动发现符合条件的Service
  • 定时采集JMX指标数据
  • 将标签信息传递给Prometheus

3.4. 启用配置

按顺序执行以下命令启用监控配置:

# 创建Endpoints
kubectl apply -f 应用名称-jmx-exporter-endpoints.yaml

# 创建Service
kubectl apply -f 应用名称-jmx-exporter-service.yaml

# 创建ServiceMonitor
kubectl apply -f jmx-exporter-monitor.yaml

验证配置生效:

# 查看Endpoints状态
kubectl get endpoints -n monitoring | grep jmx-exporter

# 查看Service状态
kubectl get service -n monitoring | grep jmx-exporter

# 查看ServiceMonitor状态
kubectl get servicemonitor -n monitoring | grep jmx-exporter

四、监控指标说明

4.1. 核心JVM指标

JMX-Exporter采集的主要JVM指标包括:

内存指标

  • jvm_memory_bytes_used:JVM内存使用量
  • jvm_memory_bytes_max:JVM最大内存
  • jvm_memory_pool_bytes_used:内存池使用情况

垃圾回收指标

  • jvm_gc_duration_seconds:GC耗时统计
  • jvm_gc_collection_seconds:GC收集时间
  • jvm_memory_pool_allocated_bytes_total:内存分配总量

线程指标

  • jvm_threads_current:当前线程数
  • jvm_threads_peak:线程峰值
  • jvm_threads_daemon:守护线程数

4.2. 告警规则配置

基于JMX指标可以配置相应的告警规则:

groups:
- name: jvm_alerts
  rules:
  - alert: JVMMemoryHigh
    expr: jvm_memory_bytes_used / jvm_memory_bytes_max > 0.9
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "JVM内存使用率过高"
      description: "{{ $labels.instance }} JVM内存使用率超过90%"
      
  - alert: JVMGCTimeHigh
    expr: rate(jvm_gc_duration_seconds_sum[5m]) > 0.1
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "JVM GC时间过长"
      description: "{{ $labels.instance }} GC时间占比超过10%"

五、故障排查

5.1. 常见问题

Agent启动失败

  • 检查jar文件路径是否正确
  • 验证配置文件语法是否正确
  • 确认端口是否被占用

指标采集异常

  • 检查网络连通性
  • 验证ServiceMonitor配置
  • 查看Prometheus日志

5.2. 日志排查

# 查看应用启动日志
tail -f application.log

# 查看Prometheus采集日志
kubectl logs -n monitoring prometheus-xxx

# 检查ServiceMonitor状态
kubectl describe servicemonitor jmx-exporter -n monitoring

总结

JMX-Exporter为传统Java应用提供了现代化的监控能力,通过本方案可以实现:

  1. 统一监控体系:将JMX指标纳入Prometheus监控生态
  2. 自动化采集:通过Kubernetes原生组件实现自动发现和采集
  3. 灵活配置:支持自定义指标采集规则和告警策略
  4. 可扩展性:支持多实例、多应用的统一管理

通过标准化的部署流程,可以快速为现有Java应用添加完善的JVM监控能力,提升系统可观测性。

参考文档