这里是小奏,觉得文章不错可以关注公众号小奏技术
背景
最近可能要对一些java应用进行JVM监控,比如一些中间件
实际如果是普通应用比较简单的就是上相对来说重量一点的skywalking
、armas
这种监控比较全,啥都有。
当然如果我们要轻量一点只监控JVM
就可以用如下方式
组件说明
本次用到的核心组件有如下几个
- Grafana:主要是数据可视化,提供一些好看的
dashboard
,更方便查看数据,然后支持配置一些报警 - Prometheus:时序数据库,主要用来存储一些监控数据
- jmx_exporter:java应用将JVM数据暴露出来
可以看到三个组件各有用处,相互配合。
应用通过jmx_exporter
暴露出JVM
相关的监控指标
然后Prometheus
对这些数据进行收集存储。
最后Grafana
对这些数据进行页面展示,然后可以添加一些报警
java应用jvm监控数据导出
这里我们使用prometheus
官方提供的jmx_exporter
github
版本我们使用最新的1.0.1
好了
然后去下载相关的agent
doc/agent下载地址
下载完后之后将放入一个文件夹,并在同级目录新增一个config.yaml
config.yaml
中的内容可以用官方默认的
rules:
- pattern: ".*"
也可以使用grafana
中jvm-dashboard
中提供的
https://grafana.com/grafana/dashboards/8563-jvm-dashboard/
lowercaseOutputLabelNames: true
lowercaseOutputName: true
whitelistObjectNames: ["java.lang:type=OperatingSystem"]
blacklistObjectNames: []
rules:
- pattern: 'java.lang<type=OperatingSystem><>(committed_virtual_memory|free_physical_memory|free_swap_space|total_physical_memory|total_swap_space)_size:'
name: os_$1_bytes
type: GAUGE
attrNameSnakeCase: true
- pattern: 'java.lang<type=OperatingSystem><>((?!process_cpu_time)\w+):'
name: os_$1
type: GAUGE
attrNameSnakeCase: true
这里我们使用的是jvm-dashboard
提供的
然后启动你的java应用,挂载上这个agent
就行
java -javaagent:./jmx_prometheus_javaagent-1.0.1.jar=12345:config.yaml -jar yourJar.jar
我这里是idea直接启动,所以在VM参数里面添加下面参数即可
-javaagent:/Users/xiaozou/Downloads/java_agent/jmx_prometheus_javaagent-1.0.1.jar=12345:/Users/xiaozou/Downloads/java_agent/config.yaml
启动成功后我们访问
http://localhost:12345/metrics
就可以看到相关的JVM数据了
Docker compose 部署 Prometheus + Grafana
这里我们使用Docker compose
一件部署Prometheus
+ Grafana
文件结构
配置文件准备
主要包含三个文件
- compose.yaml
services:
prometheus:
image: prom/prometheus
container_name: prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
ports:
- 9090:9090
restart: unless-stopped
volumes:
- ./prometheus:/etc/prometheus
- prom_data:/prometheus
grafana:
image: grafana/grafana
container_name: grafana
ports:
- 3000:3000
restart: unless-stopped
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=grafana
volumes:
- ./grafana:/etc/grafana/provisioning/datasources
volumes:
prom_data:
- datasource.yml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus:9090
isDefault: true
access: proxy
editable: true
- prometheus.yml
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: []
scheme: http
timeout: 10s
api_version: v1
scrape_configs:
- job_name: prometheus
honor_timestamps: true
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- localhost:9090
- job_name: jmx
honor_timestamps: true
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: /metrics
scheme: http
static_configs:
- targets:
- host.docker.internal:12345
这里主要添加了jmx
相关的job
需要注意的是这里使用的ip
地址使用的是host.docker.internal:12345
并不是localhost:12345
因为我的JVM应用在宿主机直接启动的。而prometheus
在docker中,使用localhost
应该是访问不到
部署
部署很简单
进入到compose.yaml
所在的目录,执行如下命令
docker compose up -d
等待启动并运行完镜像后我们可以使用
docker ps
查看是否启动成功
访问
http://localhost:3000/
是访问grafana
http://localhost:9090/
是访问prometheus
如果我们要确认prometheus
是否采集到我们的JVM
上报的数据。我们可以访问
http://localhost:9090/targets
这里可以看到状态是UP
grafana新增prometheus数据源
grafana
这里我们可以首先新增一个数据源
主要是填写一下prometheus
地址和数据源名字
因为是在docker
中,所以填写http://prometheus:9090
即可
填写完后点击测试和保存
然后会显示成功
grafana新增JVM监控面板
这里我们新增dashboard
然后选择import
然后选择通过URL导入模板
这里我用8563
这个模板。自己也可以看看其他的是不是有更好的
导入后即可查看JVM相关的监控了
由于我们使用最新的agent
有一些指标的key
产生了一些变化,所以一些面板获取不到数据
这个自己慢慢调整就好了
总结
本次我们使用agent
+grafana
+prometheus
进行了JVM相关的监控。
可以看出来相对来说还是比较轻量的。如果有grafana
+prometheus
。应用仅需接入agent
即可,并且这个agent
相对来说也是比较轻量。
如果是一些中间件之类的监控可以使用这种方式来做监控,比如RocketMQ
等
比较麻烦的是grafana
的dashboard
有些维护没维护,需要手动去调整一些指标的key。
想要完善好看的dashboard
面板还是需要慢慢调整,然后报警自己也可以去慢慢添加