概述
当你的 Java 应用运行起来之后,如果对其进行监控呢?Prometheus 社区开发了 JMX Exporter 来导出 JVM 的监控指标和自定义指标(自定义MBean),以便使用 Prometheus 来采集监控数据。本文将介绍如何利用 Prometheus 与 JMX Exporter 来监控你 Java 应用,并使用Grafana和Alertmanager对指标进行监控和告警。
动手之前,容我先简单介绍一下Prometheus和JmxExporter
Prometheus简介
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。

Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation)将Prometheus纳入其下第二大开源项目。Prometheus目前在开源社区相当活跃。Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据。)相比功能更完善、更全面。Prometheus性能也足够支撑上万台规模的集群。
系统架构图

从上图可以看出,Prometheus的主要模块包括:Prometheus server,Pushgateway,exporters,PromQL,Alertmanager以及图形界面。
- Prometheus Server 主要负责数据采集和存储,提供PromQL查询语言的支持。
- Alertmanager 警告管理器,用来进行报警。
- Push Gateway 支持临时性Job主动推送指标的中间网关。
- Exporters 输出被监控组件信息的HTTP接口。
- Grafana 监控数据展示Web UI。
基本原理
Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。其大概的工作流程是:
- Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
- Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
- Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。
- 在Grafana图形界面中,可视化查看采集数据。
JmxExporter介绍
什么是JmxExporter?
JMX Exporter 利用 Java 的 JMX 机制来读取 JVM 运行时的一些监控数据,然后将其转换为 Prometheus 所认知的 metrics 格式,以便让 Prometheus 对其进行监控采集。
如何使用JmxExporter暴露监控指标?
下面介绍如何通过 JMX Exporter 来暴露 Java 应用的 JVM 监控指标。JMX-Exporter 提供了两种用法:
- 启动独立进程。JVM 启动时指定参数,暴露 JMX 的 RMI 接口,JMX-Exporter 调用 RMI 获取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。
- JVM 进程内启动。JVM 启动时指定参数,通过 -javaagent 的形式运行 JMXExporter 的 jar 包,进程内读取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。
官方不推荐使用第一种方式,一方面配置复杂,另一方面因为它需要一个单独的进程,而这个进程本身的监控又成了新的问题,所以本文使用第二种用法暴露监控指标。
部署配置
Prometheus
本文使用docker的方式部署Prometheus,直接使用官方镜像运行。
提前在/Users/zero/Endless/ZhoujPractice/spring-boot-prometheus/config路径下创建Prometheus配置文件prometheus.yml和Prometheus规则文件prometheus_rules.yml,然后通过如下命令挂载到官方镜像中运行:
docker run \
-p 9090:9090 \
--name=prometheus \
-v /Users/zero/Endless/ZhoujPractice/spring-boot-prometheus/config:/etc/prometheus/ \
prom/prometheus
prometheus.yml配置文件
global:
scrape_interval: 10s
evaluation_interval: 10s
##告警组件配置
alerting:
alertmanagers:
- static_configs:
- targets: [ '192.168.164.xx:9093' ]
rule_files:
- "prometheus_rules.yml"
##数据采集Job配置
scrape_configs:
###以下内容为prometheus自身配置
- job_name: 'prometheus'
static_configs

本文介绍了如何利用Prometheus与JMXExporter监控Java应用,包括Prometheus的系统架构、工作原理以及JMXExporter的使用。通过配置JMXExporter在Java应用内部暴露JVM指标,Prometheus定期抓取并存储数据。同时,展示了如何设置Grafana进行数据可视化和告警配置,以及Alertmanager的部署和邮件告警的设定。整个流程覆盖了从监控数据采集到告警通知的完整链路。
2233

被折叠的 条评论
为什么被折叠?



