在介绍springboot如何与prometheus整合监控之前,先介绍几个待会整合会用到的工具。
1、什么是prometheus
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本
2、prometheus的特点
3、prometheus集成的组件
4、prometheus架构图
5、prometheus适用场景
prometheus在记录纯数字时间序列方面表现非常好。它既适用于面向服务器等硬件指标的监控,也适用于高动态的面向服务架构的监控。对于现在流行的微服务,prometheus的多维度数据收集和数据筛选查询语言也是非常的强大。prometheus是为服务的可靠性而设计的,当服务出现故障时,它可以使你快速定位和诊断问题。它的搭建过程对硬件和服务没有很强的依赖关系。
6、prometheus不适用场景
prometheus重视可靠性。即使在故障情况下,您也始终可以查看有关系统的可用统计信息。如果您需要100%的准确性(例如按请求计费),则prometheus并不是一个不错的选择,因为所收集的数据可能不会足够详细和完整。在这种情况下,最好使用其他系统来收集和分析计费数据,并使用prometheus进行其余的监视。
7、prometheus安装
可以查看之前我的一篇文章:运维监控之Prometheus入门安装篇
8、prometheus监控告警
prometheus的警报分为两个部分。prometheus服务器中的警报规则将警报发送到Alertmanager。然后,警报管理器通过电子邮件,通话通知系统和聊天平台等方法管理这些警报,包括静默,禁止,聚合和发出通知。
设置警报和通知的主要步骤是:
9、prometheus安装Alertmanager集成
因为篇幅关系,prometheus 安装Alertmanager集成可以参考如下链接进行安装
https://www.cnblogs.com/xiangsikai/p/11289757.html
1、什么是Grafana
Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。Grafana允许您查询,可视化,警报和了解指标,无论它们存储在哪里
2、Grafana的特点
3、Grafana安装
Grafana官网有提供很详细的安装教程,安装可以查看如下链接,本文就不再论述
https://grafana.com/docs/installation/rpm/
1、什么是micrometer
micrometer号称监控界的SLF4J,主要用来以极低极低的消耗来给Java程序提供对指标的监控。micrometer为 Java平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。micrometer会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。micrometer还支持推送数据到多个不同的监控系统。
2、micrometer的核心组成模块
1、整合的前置条件
服务器上已经安装了prometheus、grafana、alertmanager(可选)。本文的安装使用docker-compose来构建相关服务,具体的安装过程可以参考如下文章
https://blog.51cto.com/msiyuetian/2369130
如果懒得看,也可以拿我已经准备好的脚本,扔到服务器上执行吧,相关的脚本可以查看如下链接
http://1t.click/beth
2、pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
</dependencies>
3、application.yml
management:
endpoints:
web:
exposure:
include: '*'
spring:
application:
name: springboot_prometheus
4、prometheus.yml中配置需要采集的服务
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
- job_name: 'springboot-prometheus'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8081']
5、编写告警规则
本文以服务宕机超过一分钟就进行告警为例
groups:
- name: node_down
rules:
- alert: InstanceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."
6、在prometheus.yml中引入告警规则文件路径node_down.yml
注:node_down.yml和prometheus.yml配置在同一目录下
rule_files:
- "node_down.yml"
7、在alertmanager.yml中配置通知告警
注:本文以邮件通知告警为例
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: 'xxx@qq.com'
smtp_auth_username: 'xxx@qq.com'
smtp_auth_password: '这个不是填邮箱密码,而是qq授权码'
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_interval: 1m
repeat_interval: 1m
receiver: 'mail-receiver'
receivers:
- name: 'mail-receiver'
email_configs:
- to: 'xxx@qq.com'
注:qq授权码获取如下
打开QQ邮箱-设置-账户-帐户安全-开启服务-POP3/SMTP服务-生成授权码-发个短信
8、在prometheus.yml中配置告警服务
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
9、grafana上配置prometheus数据库
10、配置grafana界面上需要展示的dashborad
a、通过访问https://grafana.com/grafana/dashboards这个链接去挑选dashborad,比如下图
b、点击grafana上的import按钮,并填入访问https://grafana.com/grafana/dashboards得来的编号,比如
c、选择我们刚才配置好的prometheus数据库,点击import
d、dashborad展示
11、告警
首先关闭服务,然后通过访问http://localhsot:9091/alerts,可以看到如下
说明我们配置的告警规则生效,现在有个实例宕机了
11、告警
通过访问http://localhost:9093/#/alerts,可以看到如下信息
ps:图中马赛克为我的服务ip+端口
打开接收告警的邮箱,会收到默认的告警邮件信息,如下图
有时候我们想要做一些自定义指标监控,比如登录在线人数啥的,这时候我们可以通过Prometheus提供的指标来进行自定义监控。prometheus的指标类型有如下几种
Counter
Counter类型代表一种样本数据单调递增的指标,即只增不减,除非监控系统发生了重置
Guage
Guage类型代表一种样本数据可以任意变化的指标,即可增可减
Histogram
Histogram 由bucket{le=""},bucket{le="+Inf"},sum,count 组成,主要用于表示一段时间范围内对数据进行采样(通常是请求持续时间或响应大小),并能够对其指定区间以及总数进行统计,通常它采集的数据展示为直方图。
Summary
Summary 和 Histogram 类似,由{quantile="<φ>"},sum,count 组成,主要用于表示一段时间内数据采样结果(通常是请求持续时间或响应大小),它直接存储了 quantile 数据,而不是根据统计区间计算出来的。
本文就以counter来实现一个统计api接口请求次数的监控
1、编写自定义counter
@Component
public class HttpConterHelper {
private final Counter counter;
public HttpConterHelper(MeterRegistry registry) {
this.counter = registry.counter("custom_api_http_requests_total");
}
public void count() {
this.counter.increment();
}
}
2、编写接口统计拦截器
@Slf4j
public class PrometheusInterceptor implements HandlerInterceptor {
@Autowired
private HttpConterHelper httpConterHelper;
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
httpConterHelper.count();
}
}
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {
@Bean
public PrometheusInterceptor prometheusInterceptor() {
return new PrometheusInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(prometheusInterceptor()).addPathPatterns("/**");
}
}
3、访问http://localhost:8081/actuator/prometheus,查看自定义counter是否配置成功
ps:那个7.0代表访问接口的次数
4、通过grafana展示自定义指标
a、点击仪表盘上的Add panel
b、选择add Query
c、metrics填写相应的PromQL
ps:如果对PromQL不熟悉可以查看如下链接(第一个是官网的例子,第二个是其他网友整理的例子)
https://prometheus.io/docs/prometheus/latest/querying/examples/ 或者https://www.jianshu.com/p/3bdc4cfa08da
d:dashborad展示
springboot与prometheus整合就先讲那么多,本文的springboot版本是使用2版本,springboot2默认已经集成micrometer了,所以使用上基本上就是开箱即用,如果是springboot1版本,其集成可以参考如下链接
https://micrometer.io/docs/ref/spring/1.5.
其次如果自定义监控指标的话,除了上述的使用拦截器的方式,还可以采用自定义注解加AOP来等方式来实现。然后本文的监控告警规则配置以及告警基本上都是入门级别的,对这块内容感兴趣的朋友,可以参考如下链接
https://prometheus.io/docs/alerting/notification_examples/
https://prometheus.io/ https://grafana.com https://micrometer.io/
docker-compose快速搭建 Prometheus+Grafana监控系统
https://blog.51cto.com/msiyuetian/2369130
Grafana的介绍与使用
https://www.jianshu.com/p/0d82c7ccc85a
使用Micrometer记录Java应用性能指标
https://www.ibm.com/developerworks/cn/java/j-using-micrometer-to-record-java-metric/index.html
https://github.com/lyb-geek/springboot-learning/tree/master/springboot-prometheus