springboot实战之prometheus监控整合
- 2019 年 12 月 13 日
- 笔记
前言
在介绍springboot如何与prometheus整合监控之前,先介绍几个待会整合会用到的工具。
prometheus
1、什么是prometheus
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本
2、prometheus的特点
- 多维度数据模型
- 灵活的查询语言
- 不依赖分布式存储,单个服务器节点是自主的
- 通过基于HTTP的pull方式采集时序数据
- 可以通过中间网关进行时序列数据推送
- 通过服务发现或者静态配置来发现目标服务对象
- 支持多种多样的图表和界面展示,比如Grafana等
3、prometheus集成的组件
- prometheus server:主要用于抓取数据和存储时序数据,另外还提供查询和 Alert Rule 配置管理
- client libraries:用于对接 Prometheus Server, 可以查询和上报数据
- push gateway:用于批量,短期的监控数据的汇总节点,主要用于业务数据汇报等
- exporters:各种汇报exporter,例如nodeexporter,mysqlexporter,mongodb_exporter
- alertmanager:告警通知管理
4、prometheus架构图
5、prometheus适用场景
prometheus在记录纯数字时间序列方面表现非常好。它既适用于面向服务器等硬件指标的监控,也适用于高动态的面向服务架构的监控。对于现在流行的微服务,prometheus的多维度数据收集和数据筛选查询语言也是非常的强大。prometheus是为服务的可靠性而设计的,当服务出现故障时,它可以使你快速定位和诊断问题。它的搭建过程对硬件和服务没有很强的依赖关系。
6、prometheus不适用场景
prometheus重视可靠性。即使在故障情况下,您也始终可以查看有关系统的可用统计信息。如果您需要100%的准确性(例如按请求计费),则prometheus并不是一个不错的选择,因为所收集的数据可能不会足够详细和完整。在这种情况下,最好使用其他系统来收集和分析计费数据,并使用prometheus进行其余的监视。
7、prometheus安装
可以查看之前我的一篇文章:运维监控之Prometheus入门安装篇
8、prometheus监控告警
prometheus的警报分为两个部分。prometheus服务器中的警报规则将警报发送到Alertmanager。然后,警报管理器通过电子邮件,通话通知系统和聊天平台等方法管理这些警报,包括静默,禁止,聚合和发出通知。
设置警报和通知的主要步骤是:
- 设置和配置Alertmanager
- 配置prometheus与Alertmanager对话
- 在prometheus中创建警报规则
9、prometheus安装Alertmanager集成
因为篇幅关系,prometheus 安装Alertmanager集成可以参考如下链接进行安装
https://www.cnblogs.com/xiangsikai/p/11289757.html
Grafana
1、什么是Grafana
Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。Grafana允许您查询,可视化,警报和了解指标,无论它们存储在哪里
2、Grafana的特点
- 可视化:快速和灵活的客户端图形具有多种选项。面板插件为许多不同的方式可视化指标和日志。
- 报警:可视化地为最重要的指标定义警报规则。Grafana将持续评估它们,并发送通知。
- 通知:警报更改状态时,它会发出通知。接收电子邮件通知。
- 动态仪表盘:使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板顶部。
- 混合数据源:在同一个图中混合不同的数据源!可以根据每个查询指定数据源。这甚至适用于自定义数据源。
- 注释:注释来自不同数据源图表。将鼠标悬停在事件上可以显示完整的事件元数据和标记。
- 过滤器:过滤器允许您动态创建新的键/值过滤器,这些过滤器将自动应用于使用该数据源的所有查询。
3、Grafana安装
Grafana官网有提供很详细的安装教程,安装可以查看如下链接,本文就不再论述
https://grafana.com/docs/installation/rpm/
micrometer
1、什么是micrometer
micrometer号称监控界的SLF4J,主要用来以极低极低的消耗来给Java程序提供对指标的监控。micrometer为 Java平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。micrometer会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。micrometer还支持推送数据到多个不同的监控系统。
2、micrometer的核心组成模块
- 包含数据收集 SPI 和基于内存的实现的核心模块 micrometer-core。
- 针对不同监控系统的实现模块,如针对 Prometheus 的 micrometer-registry-prometheus。
- 与测试相关的模块 micrometer-test。
正文
springboot整合prometheus
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: '[email protected]' smtp_auth_username: '[email protected]' 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: '[email protected]'
注:qq授权码获取如下
打开QQ邮箱-设置-账户-帐户安全-开启服务-POP3/SMTP服务-生成授权码-发个短信
8、在prometheus.yml中配置告警服务
alerting: alertmanagers: - static_configs: - targets: - localhost:9093
9、grafana上配置prometheus数据库
- 通过http://localhost:3000/login访问grafana,其默认登录用户名和密码都是admin
- 通过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
demo链接
https://github.com/lyb-geek/springboot-learning/tree/master/springboot-prometheus