Prometheus结合JMX export监控java应用程序
JMX export简介
1.1、什么是jmx export
jmx exporter是prometheus官方提供的用于采集JMV数据的exporter,而且新出jmx exporter有两种监控方式,分别为“java agent”模式和“http server”模式。
1.2、什么是 “java agent”监控模式?
“java agent”监控模式是jmx exproter的最初的形式,该模式是将jmx exporter的这个jar包集成在tomcat内,在tomcat启动时jmx exporter也会一起启动,然后变成一个展示JVM数据的代理。最后由prometheus采集代理展示出来的数据。
1.3、什么是 “http server”监控模式?
“http server”监控模式,顾名思义就是让jmx exporter变成一个采集JVM数据的server。然后jmx exporter会通过http来采集远程的tomcat服务的数据
安装JMX export
下载地址:https://github.com/prometheus/jmx_exporter
特别说明:由于本次测试使用的版本为最新的。导致获取参数值,仪表盘等大多无法使用。官方文档:https://github.com/prometheus/jmx_exporter/tree/release-1.0.1/docs 官方推荐使用agent方法使用。 官方使用说明: https://prometheus.github.io/client_java/migration/simpleclient/#jvm-metrics
2、以Java Agent方式使用
2.1、下载和配置
下载文件:jmx_prometheus_javaagent-1.0.1.jar
创建config.yaml:
lowercaseOutputLabelNames: false
lowercaseOutputName: false
rules:
- pattern: ".*"
2.2、运行
在启动的java应用中添加-javaagent:./jmx_prometheus_javaagent-1.0.1.jar=9400:config.yaml参数,如下:
java -javaagent:./jmx_prometheus_javaagent-1.0.1.jar=9400:config.yaml -jar my-app.jar
在其它容器内使用也是类似,比如在tomcat中,在catalina.sh启动脚本中添加以下配置
set "JAVA_OPTS=-javaagent:./jmx_prometheus_javaagent-1.0.1.jar=9400:./config.yaml"
注意在tomcat 容器中jmx_prometheus_javaagent-1.0.1.jar和config.yaml两个文件也需要放在$TOMCAT_HOME/bin目录内。
如果使用的是基于JDK的docker容器需要注意将jmx_prometheus_javaagent-1.0.1.jar
、config.yaml
、my-app.jar(自己的应用)
放到一个目录内。给一个DOCKERFILE的示例:FROM freshworks/oraclejdk8:latest MAINTAINER seven COPY ./my-app.jar /opt/server/bootstrap.jar COPY ./jmx_prometheus_javaagent-1.0.1.jar /opt/server/jmx_prometheus_javaagent-1.0.1.jar COPY ./config.yaml /opt/server/config.yaml ENV JAVA_OPTS="-server -Xms256m -Xmx256m -Xmn128m -Dspring.profiles.active=test -Dserver.connection-timeout=60000 -Dserver.tomcat.accept-count=100 -Dserver.tomcat.max-threads=300" RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone WORKDIR /opt/server CMD ["/bin/sh","-c","java -javaagent:./jmx_prometheus_javaagent-1.0.1.jar=9400:config.yaml -jar $JAVA_OPTS /opt/server/bootstrap.jar"]
对上说明:本次测试网络模式使用了HOST。
2.3、配置prometheus拉取数据
vim prometheus.yml
- job_name: "prometheus"
static_configs:
- targets: ["xxx.xxx.xxx.xxx:9400"]
重启prometheus生效配置。
3、以独立http服务方式使用
3.1、下载和配置
下载文件:jmx_prometheus_httpserver-1.0.1.jar
创建config.yaml
---
hostPort: xxx.xxx.xxx.xxx:9799 #应用JAR包运行的IP地址及JMX的端口
username:
password:
rules:
- pattern: ".*"
3.2、运行
3.2.1、启动java应用,需要先开启应用的jmx
java -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9799 -Dcom.sun.management.jmxremote.authenticate=false -jar my-app.jar
3.2.2、启动jmx_prometheus_httpserver通过应用暴露的jmx 9799端口,采集应用的jvm数据,并把采集到的数据通过9400端口暴露给prometheus拉取
java -jar jmx_prometheus_httpserver-0.17.1.jar 9400 config.yaml
3.3、访问jmx_exporter监控的数据
http://xxx.xxx.xxx.xxx:9400/metrics #jmx_exporter所在IP
3.4、与prometheus集成
vi /usr/local/prometheus-2.37.0.linux-amd64/prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: 'jmx'
static_configs:
- targets:["xxx.xxx.xxx.xxx:9400"]
3 配置Grafana仪表盘
官网上对jmx_prometheus_httpserver的仪表盘真的很少,大多数都对于Agent方式。有时间可以自己去配置一下。这里给几个JMX的:ID:8563、ID:14845、ID:3066 、ID:7727。
我这次测试并未加入仪表盘。
最后扩展:
JMX参数配置
配置 | 说明 | 参数 |
---|---|---|
-Dcom.sun.management.jmxremote.authenticate | 开启鉴权 (鉴权) | false/ture |
-Dcom.sun.management.jmxremote.ssl | 启用ssl连接 | false/ture |
-Dcom.sun.management.jmxremote.local.only | 是否只接受本地连接 | false/ture |
-Dcom.sun.management.jmxremote.host | jmx绑定指定地址,默认绑定到所有地址 | 绑定ip |
-Dcom.sun.management.jmxremote.port | jmx绑定端口 | 19006 |
-Dcom.sun.management.jmxremote.rmi.port | rmi绑定端口,可以与jmx端口一致 | 19006 |
-Djava.rmi.server.hostname | 多选择 IP/域名 | 绑定ip |
-Dcom.sun.management.jmxremote.access.file | 远程访问角色文件路径 | 路径 |
-Dcom.sun.management.jmxremote.password.file | 身份验证配置启用文件路径时的远程身份验证文件 | 验证文件 |
基于kubernetes 安装jmx_exporter
prometheus自动发现并拉取数据:
https://cloud.tencent.com/document/practice/457/48724
评论区