springboot项目通过prometheus和grafana实现监控和报警
一、prometheus
1.1、什么是prometheus?
1.2、安装prometheus
1.2.1、下载
1.2.2、安装
1.2.3、将prometheus集成到应用中
application.yml配置如下:<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>
1.2.3.2、修改prometheus.yml,将应用信息添加进去server:
port: 8080
spring:
application:
name: data-analysis
#actuator暴露的endpoint
management:
endpoints:
web:
exposure:
include: "*"
metrics:
tags:
application: ${spring.application.name}
1.2.3.3、启动应用和prometheus双击prometheus.exe即可启动访问:http://localhost:9090/targets可以看到自己的应用已经被prometheus采集到了。点击链接http://127.0.0.1:8080/actuator/prometheus可以看到prometheus采集的应用数据可以看到,非常的不直观,那如何直观地展现这些数据呢?有请grafana出场!#应用名
- job_name: "data-analysis"
#只要添加了spring-boot-starter-actuator这个依赖就有,写死的/actuator/prometheus
metrics_path: /actuator/prometheus
static_configs:
#这是你应用的ip和端口号
- targets: ["127.0.0.1:8080"]
二、grafana
2.1、grafana下载
2.2、grafana安装
2.3、启动访问
2.4、通过grafana展示prometheus采集到的数据
2.4.1、展示应用的JVM信息
2.4.1.2、添加数据源有个螺丝样子的按钮,鼠标放上去,会浮现出来一个下拉列表,点击Data sources@Bean
public MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName) {
return (registry -> registry.config().commonTags("application", applicationName));
}
接着点Add data source
点Prometheus
接着填下http://localhost:9090/
接着点save数据源添加完毕!
2.4.1.3、导入一个视图模板鼠标放到左边的+号上,会浮动出一个下拉列表,点击其中的Import填入https://grafana.com/dashboards/4701点击load,然后会让你选择一个数据源,选择刚才添加的prometheus数据源即可接着点击Import,然后出现的界面展示的就是你当前应用的JVM各种指标和参数情况,是不是直观多了?
2.4.2、自定义metrics,监控方法执行的次数和耗时
依赖中加上:
启动类中注入一个TimedAspect类型的bean<!--TimedAspect中需要用到aop,所以需要导入-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
自定义一个service@Bean
public TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
加好后重启下你的应用,然后点击prometheus中的链接搜索timeService.execute红线框内的语句,等会要用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;
@Service
public 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;
}
}
2.4.2.2、在grafana中展示这些参数将鼠标放到左边的加号位置,在浮动出来的下拉列表中点击Dashboard接着点Add a new panel#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.1中说到的语句了,随便找一个,比如:
将其填入Metrics browser后面的框中,你会发现一个图形出现了这个图表示的就是execute方法已经执行的次数,随着时间递增的,很简单。#execute方法执行的次数
method_timed_seconds_count{application="data-analysis",class="com.data.service.TimeService",exception="none",method="execute",}
接着可以点击下面的+Query,把其它两条语句也加上
然后点击右上角的save按钮,将其保存起来,下次可以直接查看2.4.3、grafana的报警功能
改完后重启grafana
2.4.3.2、添加channel然后点击Add channel然后填写channel信息,接着点击test,然后save去你的163邮箱里看下,你会发现收到了一个测试邮件
2.4.3.3、给timeService execute dashboard添加报警规则打开这个dashboard,点击edit之后点击Alert,然后点击Create Alert
填写配置如下这里大致解释下上面的意思
Rule
Name:规则的名字
Evaluate every:检测频率
For:当触发了报警条件时,等过了For设置的时间后,再发送报警事件
Conditions
WHEN:选择一个聚合函数
OF:query的条件
IS ABOVE:超过,也可选其他操作符
注意:WHEN max() OF ( query C,10s,now) IS ABOVE 5,这个规则大致含义是说:取10秒内的数据,如果最大值大于5就触发告警,那个C是获取数据的查询语句。
No Data & Error Handling
if no data or all values are null:如果没有数据或值都为空
if execution error or timeout:如果执行错误或超时
Notifications
Send to:指定channel
Message:报警内容
评论