前提
项目重要技术栈主要是Spring cloud 2.x + docker
现状
项目中使用到Spring boot admin ,zipkin,以及http上报等形式收集数据,mysql持久化必要数据,在superset上连接数据源,以图表的形式展示数据
改进目标
目前有多个纬度,不同的监控平台,需要登陆多个地址去查看不同的数据,稍显繁琐,并且数据统计形式比较乱,查看也不方便,希望有一个统一的监控平台
选型
最后选择Prometheus和Grafna
监控产品有很多,比如Prometheus,Graphite,InfluxDB,OpenTSDB等有很多时间序列数据库。有兴趣可以去官网看下Prometheus和其他产品的对比。
快速搭建过程
这个仅仅是一个快速上手的描述,如果有需要请按照官方文档说下进行按需配置。
- 项目中改动:
引入Jar包,最新版本可以去maven仓库寻找
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.0.8</version>
</dependency>
</dependencies>
yml文件中添加配置:
management:
security:
enabled: false
endpoints:
web:
exposure:
include: '*'
ps:这个改动是因为Spring boot 2.x 默认只暴露info和health接口,需要暴露出其他接口。(*是图测试省事,如果服务暴露公网的情况,自己酌情暴露需要的服务,一般情况下是不需要暴露公网的)
这两步过后,启动服务,就会采集一些监控信息,并且通过http://localhost:8080/actuator/prometheus进行暴露出来,可以看到metric数据。原理就是prometheus定时去扫描配置文件中配置的targets,获取metric然后存入prometheus中。
- docker启动prometheus+grafna
编写prometheus.xml的简单配置文件,配置项有很多,详情参考官方文档:
global:
scrape_interval: 5s
evaluation_interval: 5s
scrape_configs:
- job_name: 'metric_job'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080'] #Provide your ip and Do not give localhost as we are running the Prometheus in docker
labels:
application: demo-service
ps:注意事项
在docker环境下,promethus 配置job扫描机器和 grafna配置数据源都需要使用真实IP。上面targets是写死的机器IP和端口,这个为了灵活性最好配置成类似consul注册中心的形式,prometheus支持主流的配置中心,请移步文档查看。还有生产中请不要单机运行,查看文档如何集群部署。
- 编写docker-compose文件
version: '3'
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- 9090:9090
grafana:
image: grafana/grafana
ports:
- 3000:3000
depends_on:
- prometheus
- 启动docker容器
docker-compose up -d
启动完成后校验一下:
prometheus访问:http://localhost:9090
grafna 访问:http://localhost:3000
grafna配置监控项
主要配置监控内容:
-
Basic
应用启动时间,运行时长,cpu使用率,内存使用率等
-
JVM
Eden,Survivor,Old,MetaData 等Space,classload数,线程数,gc数,gc停顿时长等信息
-
Http
Http请求数,Http响应时长,各个状态码等请求数,请求速率(QPS)等
Log
各种级别log等数量,主要关注error和warn~其他
根据actuator/prometheus接口的收集的内容,结合prometheus提供的各种函数,可以根据需求显示自己想要的监控信息。
ps: 重点!!!理清自己的需求,需要监控那些信息,熟悉prometheus的各种使用方式和函数。官方文档~!
比如:
topk(5, sum(rate(http_requests_total[$__range])) by (instance))
比如$__range == 1m,统计instance这个实例1m内请求速率等top5
- 统计机器信息
通过在本地安装node_exporter这个go服务,可以收集本地机器的监控信息。具体信息详情查看官方文档
配置grafna等小技巧(官方文档中有):
-
配置变量
在dashboard等setting中配置,下图配置都prometheus都两个变量,application 和 instance,instance根据application来获取的,很方便灵活
使用变量,通过$variable来使用
最后是使用效果,根据配置的变量,选择变量,下面的dashboard会相应的变动。