Docker compose 部署Grafana+Prometheus实现java应用JVM监控

1,353 阅读4分钟

这里是小奏,觉得文章不错可以关注公众号小奏技术

背景

最近可能要对一些java应用进行JVM监控,比如一些中间件

实际如果是普通应用比较简单的就是上相对来说重量一点的skywalkingarmas

这种监控比较全,啥都有。

当然如果我们要轻量一点只监控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: ".*"

也可以使用grafanajvm-dashboard中提供的

grafana.com/grafana/das…

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

比较麻烦的是grafanadashboard有些维护没维护,需要手动去调整一些指标的key。

想要完善好看的dashboard面板还是需要慢慢调整,然后报警自己也可以去慢慢添加