springboot项目通过prometheus和grafana实现监控和报警

anlan

共 5462字,需浏览 11分钟

 ·

2022-08-10 10:38

  • 一、prometheus

  • 1.1、什么是prometheus?

prometheus是一套开源的监控和告警系统,基于go语言开发,它会定期从指定的目标处获取应用的性能指标信息,然后存储起来,以供查询及分析。

bdec03c797da9243215012bfa7342d81.webp

  • 1.2、安装prometheus

  • 1.2.1、下载

下载地址:https://prometheus.io/download/#prometheus,显示的是最新的版本,选择对应的系统直接下载就行,我这里下载的是windows版

6a9d51ecef14a39ce9fd16fb5505b7a9.webp

  • 1.2.2、安装

解压即可

1ceb5b61dac151755e6196d84378963f.webp

  • 1.2.3、将prometheus集成到应用中

1.2.3.1、用idea创建一个springboot项目依赖如下:
<dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter</artifactId>    </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
application.yml配置如下:
server:  port: 8080spring:  application:    name: data-analysis#actuator暴露的endpointmanagement:  endpoints:    web:      exposure:        include: "*"  metrics:    tags:      application: ${spring.application.name}
1.2.3.2、修改prometheus.yml,将应用信息添加进去

0048682c0ac84b0a2f054b7297f2a45f.webp

3b2b855950b72f2b7cb0dce79e2fa6ae.webp

  #应用名  - job_name: "data-analysis"    #只要添加了spring-boot-starter-actuator这个依赖就有,写死的/actuator/prometheus    metrics_path: /actuator/prometheus    static_configs:      #这是你应用的ip和端口号      - targets: ["127.0.0.1:8080"]
1.2.3.3、启动应用和prometheus双击prometheus.exe即可启动

03d64db6a0fc5de403eb1b246cb36386.webp

访问:http://localhost:9090/targets

0fe3585e82a52eeaa3e8e47912526913.webp

可以看到自己的应用已经被prometheus采集到了。点击链接http://127.0.0.1:8080/actuator/prometheus可以看到prometheus采集的应用数据

5a5f6bc846471ddf645fc72a87004a32.webp

b7544575f6d72d584f15d5dcb4f58809.webp

可以看到,非常的不直观,那如何直观地展现这些数据呢?有请grafana出场!
  • 二、grafana

grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。
  • 2.1、grafana下载

下载地址:https://grafana.com/grafana/download?pg=get&plcmt=selfmanaged-box1-cta1&platform=windows

f719b4ec9978d00b46b5c042223a2b4a.webp

msi为安装版,zip为解压缩版,我这里选择解压版,你们根据喜好选择即可。
  • 2.2、grafana安装

解压即可

1d49d6d4e2dfa9ac12d0922f6f0ee6f3.webp

  • 2.3、启动访问

728aa6b25e697cbb22fe83d219cf8f34.webp

访问http://localhost:3000/

253007643f66e095fa96bbd8191c0908.webp

初始账号密码都是admin,第一次登录后提示你修改密码,不想修改直接skip即可,下面是登录成功后的主界面

015f2ddbad29df418be04245609b2856.webp

  • 2.4、通过grafana展示prometheus采集到的数据

  • 2.4.1、展示应用的JVM信息

2.4.1.1、在启动类中注入以下bean后重启
@Bean  public MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName) {    return (registry -> registry.config().commonTags("application", applicationName));  }
2.4.1.2、添加数据源有个螺丝样子的按钮,鼠标放上去,会浮现出来一个下拉列表,点击Data sources

81f77ecd2d2ef444f0300206e9718698.webp

接着点Add data source

903d3ecb7b0e9a5a1e04c82e6e00a49a.webp

点Prometheus

aff49513e92eefda2de47f60c73723ee.webp

接着填下http://localhost:9090/

ee5c168cdcdd9a0486125cfdfd87cf80.webp

接着点save

b990d0694618365557d0ef59d26b118b.webp

数据源添加完毕!
2.4.1.3、导入一个视图模板鼠标放到左边的+号上,会浮动出一个下拉列表,点击其中的Import

57403efc905a527b8979aba906c0b10a.webp

填入https://grafana.com/dashboards/4701

9a735a41c7ce67ac19d794368515327e.webp

点击load,然后会让你选择一个数据源,选择刚才添加的prometheus数据源即可

448f8e354264567cca11d7f152e10098.webp

接着点击Import,然后出现的界面展示的就是你当前应用的JVM各种指标和参数情况,是不是直观多了?

c7b6cb7da74fc06b87101ec26c2072f0.webp

  • 2.4.2、自定义metrics,监控方法执行的次数和耗时

使用TimedAspect类,能获取方法的执行次数和总耗时,通过一点简单的计算也可以得到平均耗时2.4.2.1、改动工程
依赖中加上:
<!--TimedAspect中需要用到aop,所以需要导入--><dependency>      <groupId>org.aspectj</groupId>      <artifactId>aspectjweaver</artifactId>    </dependency>
启动类中注入一个TimedAspect类型的bean
@Bean  public TimedAspect timedAspect(MeterRegistry registry) {    return new TimedAspect(registry);  }
自定义一个service
package com.data.service;
import io.micrometer.core.annotation.Timed;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Service;
import java.util.Random;
@Servicepublic class TimeService {
@Scheduled(cron = "*/3 * * * * ?")    //@Timed注解可以收集到方法的执行次数和耗时 @Timed(description = "timeService.execute") public int execute() throws InterruptedException { int sleepTime = new Random().nextInt(100); Thread.sleep(sleepTime); return sleepTime; }}
加好后重启下你的应用,然后点击prometheus中的链接

3a454b01c3f68e0c2e07ab6366298b36.webp

搜索timeService.execute

3b30565497b03dee166d7e51c0795698.webp

红线框内的语句,等会要用
#execute方法执行的次数method_timed_seconds_count{application="data-analysis",class="com.data.service.TimeService",exception="none",method="execute",}#execute方法的总耗时method_timed_seconds_sum{application="data-analysis",class="com.data.service.TimeService",exception="none",method="execute",}#execute方法单次执行的最长耗时method_timed_seconds_max{application="data-analysis",class="com.data.service.TimeService",exception="none",method="execute",}
2.4.2.2、在grafana中展示这些参数将鼠标放到左边的加号位置,在浮动出来的下拉列表中点击Dashboard

ee876b55b10cd1da0fbdd0a5df6b370d.webp

接着点Add a new panel

605ac9d64500032f2ce7378258a27ed7.webp

这时候就用到2.4.2.1中说到的语句了,随便找一个,比如:
#execute方法执行的次数method_timed_seconds_count{application="data-analysis",class="com.data.service.TimeService",exception="none",method="execute",}
将其填入Metrics browser后面的框中,你会发现一个图形出现了

0002e40500ce5a1a882d0cd9130e985c.webp

这个图表示的就是execute方法已经执行的次数,随着时间递增的,很简单。

接着可以点击下面的+Query,把其它两条语句也加上

994248188d8eca1ceb0973a39577faac.webp

然后点击右上角的save按钮,将其保存起来,下次可以直接查看

cb6f84787077098cf673028b9f348dd7.webp

  • 2.4.3、grafana的报警功能

上面说了grafana展示监控数据的功能,但是开发和运维不可能7*24小时盯着监控看,那如果出现异常情况了怎么能让人及时知道呢?没错,利用grafana的报警功能,它支持钉钉、email等,这里演示下email告警2.4.3.1、添加告警配置修改grafana的defaults.ini文件,添加email相关信息

4059ef5f6a9419b80bbbabdce13122b4.webp

配置和我的保持一致即可,除了163邮箱地址和授权码,这个每个人都不一样的,至于怎么找到授权码,见下图,注意授权码只展示一次,需要记好

c3a0687dbccaef8ffa97a164e6f5a93e.webp

改完后重启grafana
2.4.3.2、添加channel

45cd2b4200950d8ea979837bac6b0087.webp

然后点击Add channel

8d9ad7abb99fc9391ff92a5844bfd19d.webp

然后填写channel信息,接着点击test,然后save

06910c1b910e0a9a9a2f74877a66d536.webp

去你的163邮箱里看下,你会发现收到了一个测试邮件

84bd13341e35d1c399ceaa5cfe871aff.webp

2.4.3.3、给timeService execute dashboard添加报警规则

147f9796fa754177e56c1c37fc667ce4.webp

打开这个dashboard,点击edit

152dcab0432e5af82c831a006051aa24.webp

之后点击Alert,然后点击Create Alert

6319f4d49c2b877fc9ce43b4c3c15baa.webp

填写配置如下

c0691cc2af7b5a508eaefb43684b8fa6.webp

这里大致解释下上面的意思
  • Rule

  1. Name:规则的名字

  2. Evaluate every:检测频率

  3. For:当触发了报警条件时,等过了For设置的时间后,再发送报警事件


  • Conditions

  1. WHEN:选择一个聚合函数

  2. OF:query的条件

  3. IS ABOVE:超过,也可选其他操作符

注意:WHEN max() OF ( query C,10s,now) IS ABOVE 5,这个规则大致含义是说:取10秒内的数据,如果最大值大于5就触发告警,那个C是获取数据的查询语句。


  • No Data & Error Handling

  1. if no data or all values are null:如果没有数据或值都为空

  2. if execution error or timeout:如果执行错误或超时


  • Notifications

  1. Send to:指定channel

  2. Message:报警内容

 

然后点击save

829af3611fe799bcad3be192830edd6e.webp

2.4.3.4、修改代码,让接口的执行时间超过5s,测试下告警

5fdc30fbb9a74301a28b66c3618eb3d3.webp

重启应用后等待一会就会收到告警邮件了

acca15c86f46e94417f37526ce8d6ad3.webp

浏览 103
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报