SpringBoot 项目中集成 Prometheus 和 Grafana
创始人
2024-05-29 21:07:03
0

项目上线后,除了能保障正常运行以外,也需要服务运行的各个指标进行监控,例如 服务器CPU、内存使用占比,Full GC 执行时间等,针对一些指标出现异常,可以加入一些报警机制能及时反馈给开发运维。这样,对于一些突发异常,能提前预知、并及时修复,避免服务宕机造成的损失。

针对 SpringBoot 项目,Spring 团队提供了对应 stater , spring-boot-actuator 模块通过 HTTP endpoints 来获取 SpringBoot 项目中的审计、健康状况以及一些配置项、容器注册 bean 以及heapdump 等信息,

actuator 通过开放 http 接口方式来表示各个指标详情,但这种方式并不直观,并且针对一些指标阈值并没有提供一些报警规则,因此需要引入另外一个服务Prometheus ,专用于事件监视以及报警的开源工具。

Prometheus 指标是基于事件戳方式进行记录的,通过 key、value 方式存储,记录指标在时间维度方面颗粒度更小;除了Prometheus 外,针对指标可视化还需要一个工具Grafana,专用于数据查询、以及指标可视化

SpringBoot

创建一个 SpringBoot 项目,加入 spring-boot-starter-actuator 以及 micrometer-registry-prometheus 依赖,对外暴露 /actuator/permetheus 端口服务,让Prometheus 用于数据抓取;

项目 pom 依赖


4.0.0org.springframework.bootspring-boot-starter-parent2.1.8.RELEASE com.exampledemo0.0.1-SNAPSHOTdemoDemo project for Spring Boot1.8org.springframework.bootspring-boot-starter-webcom.alibabadruid-spring-boot-starter1.1.17mysqlmysql-connector-java8.0.15org.springframework.bootspring-boot-starter-data-jpaorg.springframework.bootspring-boot-starter-actuatorio.micrometermicrometer-registry-prometheusorg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-maven-plugin2.1.8.RELEASEorg.projectlomboklombok

服务 yml 配置项,除了将 actuator 的 metrics、health 等接口暴露给 prometheus 服务外,服务还加入了 druid 数据连接池,监控 MYSQL数据库的运行,密码是经过 Druid 加密后处理的。

server:port: 8082spring:application:name: metricsLocalAppredis:host: localhostport: 6379password: 123456datasource:url: jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=falseusername: rootpassword: YjHh36LKJ62yxE9RhYVQLDDWK2QseZ/S7OgtBC7sv1Yzi6YLUOZMN8BcFrAbzLJmjXtmXW2f9nISSReTob+qZQ==driver-class-name: com.mysql.cj.jdbc.Driver#    开启druid驱动type: com.alibaba.druid.pool.DruidDataSourcedruid:filter:config:enabled: true#      初始化建立物理连接个数initial-size: 3#      最凶奥连接池min-idle: 3#      连接池最大连接数max-active: 20# 获取连接时最大等待时间,单位毫秒max-wait: 60000# 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。test-while-idle: true# 既作为检测的间隔时间又作为testWhileIdel执行的依据time-between-connect-error-millis: 60000# 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接min-evictable-idle-time-millis: 30000# 用来检测连接是否有效的sql 必须是一个查询语句# mysql中为 select 'x'# oracle中为 select 1 from dualvalidation-query: select 'x'# 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为truetest-on-borrow: false# 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为truetest-on-return: false# 是否缓存preparedStatement,mysql5.5+建议开启pool-prepared-statements: true# 当值大于0时poolPreparedStatements会自动修改为truemax-pool-prepared-statement-per-connection-size: 20# 合并多个DruidDataSource的监控数据use-global-data-source-stat: false# 配置扩展插件filters: stat,wall,slf4j# 通过connectProperties属性来打开mergeSql功能;慢SQL记录connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=2000# 定时输出统计信息到日志中,并每次输出日志会导致清零(reset)连接池相关的计数器。time-between-log-stats-millis: 300000# 配置DruidStatFilterweb-stat-filter:enabled: trueurl-pattern: '/*'exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'# 配置DruidStatViewServletstat-view-servlet:# 是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)url-pattern: '/druid/*'# 禁用HTML页面上的“Reset All”功能reset-enable: false
#        # druid登录名login-username: admin# 登录密码login-password: adminenabled: trueconnection-properties: config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOuIUu/iVnxlfq9EYCmu9CVVEYrjwMjI8/DZ7zMwVnLov9cNxRnK3TV94SDL6p5C0EjFx1NKW5ntJwVoe8jZxV8CAwEAAQ==management:server:port: 9001
#  开启 actator 服务endpoints:web:exposure:include: '*'
# 暴露 metrics 端口endpoint:metrics:enabled: true
#    配置 prometheus 服务prometheus:enabled: truemetrics:export:prometheus:enabled: truetags:application: ${spring.application.name}

此外,SpringBoot启动入口,将服务名注册到 micrometer 中的 application,用于prometheus 数据抓取

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@BeanMeterRegistryCustomizer configurer(@Value("${spring.application.name}") String applicationName){return (registry) -> registry.config().commonTags("application",applicationName);}
}

项目启动,浏览器输入 http://localhost:9001/actuator/prometheus,就可以看到如下基本指标,包含jvm、tomcat 以及 系统cpu、线程及内存信息

image-20230306212012208

Prometheus 配置

以下操作,都以假设你的电脑已经安装好 Docker 工具为前提;

本机环境 OS :Windows10

  • 1,从dockerhub 拉取 prometheus 镜像
docker pull prom/prometheus:v2.37.5
  • 2,在合适文件中创建 prometheus.yml 配置文件
global:
# 数据抓取频率scrape_interval:     60s# 数据评估频率evaluation_interval: 60s# 抓取配置项 
scrape_configs:# 指定 springboot name标签- job_name: "metricsLocalApp"# 设定metrics 的路径metrics_path: "/actuator/prometheus"static_configs:# 配置目标关联 host,如果是本机的话,建议用  内网ip,而不用 localhost;- targets: ['192.168.0.108:9001']

3,打开 terminal,启动刚刚拉取的 permetheus 镜像;注意 D:/programCoding/Docker/permetheus/config/prometheus.yml 为我的电脑中 permetheus 的安装路径,这里目的是要挂载到镜像中的配置文件夹中;

docker run  -d -p 9090:9090 -v D:/programCoding/Docker/permetheus/config/prometheus.yml:/etc/prometheus/prometheus.yml  prom/prometheus:v2.37.5

镜像启动成功后,浏览器输入http://localhost:9090,点击上方菜单栏中的 status 下选框,点击 Targets,就能看到类似于下面的页面效果;第一个对应上文中的 SpringBoot 项目;

image-20230306215345279

Grafana 安装

prometheus 配置完成之后,下面需要配置 Grafana ,这里也是借助 Docker 镜像;

  • docker 拉取 grafana 镜像
docker pull grafana/grafana:9.2.13
  • 运行镜像
docker run -d -p 3000:3000 --name=grafana -v D:/programCoding/Docker/grafana/storage:/var/lib/grafana grafana/grafana:9.2.13

启动成功后,浏览器输入http://localhost:3000;Grafana 初始账号和密码都为 admin

image-20230306220449444

首先,创建数据源

image-20230306220715005

然后,创建dashboard

image-20230306220909194

选取数据源,指定metrics 指标

image-20230306221454379

然后 Grafana 就能根据你的设置,生成N个可视化面板。

image-20230306221832943

相关内容

热门资讯

森林里的声音作文500六年级... 森林里的声音作文600六年级 篇一:探秘神奇的森林森林里的声音,是如此的多样而又神奇。每当我进入森林...
我和谁过一天四年级作文300... 我和谁过一天四年级作文300字 篇一我和妈妈过一天今天是星期天,我和妈妈一起度过了愉快的一天。早上,...
春天的小学四年级作文300字... 春天的小学四年级作文300字 篇一春天的美景春天是一年四季中最美丽的季节,大自然仿佛换上了新装,到处...
四年级作文师恩(精选6篇) 四年级作文师恩 篇一师恩如山老师是我们成长道路上最重要的人之一,她们默默耕耘,用自己的爱和智慧引导我...
四年级妈妈作文【优选6篇】 四年级妈妈作文 篇一:我的宝贝女儿亲爱的女儿,你已经四年级了,成长得如此快速。回想起你的成长历程,我...
校园的春天四年级作文300字... 校园的春天四年级作文300字 篇一校园的春天春天是一个美丽的季节,也是我最喜欢的季节之一。在校园里,...
童年令我高兴的事作文400字... 童年令我高兴的事作文400字作文四年级 篇一标题:我和小伙伴们的足球比赛我最喜欢的童年回忆之一是和小...
四年级作文评语(通用3篇) 四年级作文评语 篇一爱国之情这篇作文写得非常好!作者以“我的祖国”为题,用朴实的语言表达了对祖国的深...
四年级雨中畅想作文(优质6篇... 四年级雨中畅想作文 篇一雨中的畅想天空阴沉沉的,暗示着即将来临的雨季。我喜欢雨天,因为雨天给我带来了...
游白鹿温泉四年级暑假作文【优... 游白鹿温泉四年级暑假作文 篇一夏天到了,我迫不及待地和家人一起来到了白鹿温泉度假村。这是一个位于山脚...
给老师的一封信小学四年级作文... 给老师的一封信小学四年级作文 篇一亲爱的老师:您好!我是您班上的学生小明,我想通过这封信表达我的感激...
一起来造兵马俑四年级作文【最... 一起来造兵马俑四年级作文 篇一兵马俑,是我国古代的一项伟大发明,也是世界上独一无二的文化遗产。它们以...
中国梦小学四年级作文(通用5... 中国梦小学四年级作文 篇一:我的中国梦中国梦小学四年级作文 篇一我的中国梦中国梦,是每个中国人共同的...
畅想美好新生活四年级作文47... 畅想美好新生活四年级作文47篇 篇一标题:我梦想的未来城市我梦想的未来城市是一个充满科技和绿色环保的...
生活教会了我什么作文四年级3... 篇一:生活教会了我勇敢面对困难生活是一所最好的学校,它教会了我许多宝贵的经验和知识。在我四年级的时候...
四年级妈妈的爱作文400字(... 四年级妈妈的爱作文400字 篇一妈妈是我们生命中最重要的人,她的爱无时无刻不在我们身边。我是一个四年...
四年级介绍自己可爱的我作文怎... 四年级介绍自己可爱的我作文怎么写作文 篇一标题:我是一个可爱的四年级小学生大家好!我是一名四年级的小...
四年级下册语文第四单元作文(... 四年级下册语文第四单元作文 篇一我的家乡我生活在一个美丽的小城市,它叫做阳光城。阳光城有着湛蓝的天空...
四年级我的老师400字作文(... 四年级我的老师400字作文 篇一我喜爱的老师我喜欢的老师是我们班的班主任,她叫李老师。李老师是一个非...
调皮的我小学400字作文四年... 调皮的我小学400字作文四年级 篇一我是一个调皮的小学生,常常给老师和家长带来不少麻烦。我喜欢和同学...