Spring Boot微服务监控告警简单介绍
创始人
2024-06-02 10:53:00
0

1、Spring Boot监控机制

在 Spring 2.x 之前,SpringBoot 使用 Actuator 模块进行监控,而在 Spring 2.x 之后,SpringBoot 使用了 Micrometer 进行监控。

Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,HTTP 跟踪等,帮助我们监控和管理 Spring Boot 应用。这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过 HTTP 和 JMX 访问。

在 Spring 2.x 之后,Actuator 使用 Micrometer 与这些外部应用程序监视系统集成。这样一来,只需很少的配置即可轻松集成外部的监控系统。

那什么是 Micrometer 呢?

Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,应用程序只需要使用 Micrometer 的通用 API 来收集性能指标即可。Micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。

简单地说,actuator 是真正去采集数据的模块,而 Micrometer 更像是一个适配器,将 actuator 采集到的数据适配给各种监控工具。

2、Spring Boot Actuator

作为SpringBoot的四大核心之一,Actuator让你时刻探知SpringBoot服务运行状态信息,是保障系统正常运行必不可少的组件。
  spring-boot-starter-actuator提供的是一系列HTTP或者JMX监控端点,通过监控端点我们可以获取到系统的运行统计信息,同时,我们可以自己选择开启需要的监控端点,也可以自定义扩展监控端点。
  Actuator通过端点对外暴露的监控信息是JSON格式数据,我们需要使用界面来展示,目前使用比较多的就是Spring Boot Admin或者Prometheus + Grafana的方式;

  • Spring Boot Admin实现起来相对比较简单,不存在数据库,不能存储和展示历史监控数据;
  • Prometheus(时序数据库) + Grafana(界面)的方式相比较而言功能更丰富,提供历史记录存储,界面展示也比较美观。
      相比较而言,Prometheus + Grafana的方式更为流行一些,现在的微服务及Kubernetes基本是采用这种方式的。但是对于小的项目或者单体应用,Spring Boot Admin会更加方便快捷一些。

2.1、Actuator endpoints

Spring Boot 提供了所谓的 endpoints (下文翻译为端点)给外部来与应用程序进行访问和交互。

打比方来说,/health 端点 提供了关于应用健康情况的一些基础信息。metrics 端点提供了一些有用的应用程序指标(JVM 内存使用、系统CPU使用等)。

这些 Actuator 模块本来就有的端点我们称之为原生端点。根据端点的作用的话,我们大概可以分为三大类:

  • 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。

  • 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。

  • 操作控制类:提供了对应用的关闭等操作类功能。

Actuator 提供的所有 endpoint:

此处使用的是SpringBoot 2.2.8

下面介绍几个核心的端点

2.2、/health 端点

当我们开启health的健康端点时,我们能够查到应用健康信息是一个汇总的信息,健康信息包含磁盘空间、redis、DB,如果启用监控的这个spring boot应用确实是连接了redis和mysql DB,那actuator就自动给监控起来了,很方便、很有用。

  • /health原理
    Spring boot的健康信息都是从ApplicationContext中的各种HealthIndicator Beans中收集到的,Spring boot框架中包含了大量的HealthIndicators的实现类,当然你也可以实现自己认为的健康状态。

    默认情况下,最终的spring boot应用的状态是由HealthAggregator汇总而成的,汇总的算法是:

  1. 设置状态码顺序:setStatusOrder(Status.DOWN, Status.OUT_OF_SERVICE, Status.UP, Status.UNKNOWN)。
  2. 过滤掉不能识别的状态码。
  3. 如果无任何状态码,整个spring boot应用的状态是 UNKNOWN。
  4. 将所有收集到的状态码按照 1 中的顺序排序。
  5. 返回有序状态码序列中的第一个状态码,作为整个spring boot应用的状态。
//配置  always:对所有用户暴露详细信息
management.endpoint.health.show-details=always{"status": "UP","details": {"diskSpace": {"status": "UP","details": {"total": 250685575168,"free": 172252426240,"threshold": 10485760}},"redis": {"status": "UP","details": {"version": "3.2.11"}},"db": {"status": "UP","details": {"database": "Mysql","hello": "Hello"}}}
}
  • 自定义 HealthIndicator

有时候需要提供自定义的健康状态检查信息,你可以通过实现HealthIndicator的接口来实现,并将该实现类注册为spring bean。

你需要实现其中的health()方法,并返回自定义的健康状态响应信息,该响应信息应该包括一个状态码和要展示详细信息。demo 如下

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;@Component
public class MyHealthIndicator implements HealthIndicator {@Overridepublic Health health() {int errorCode = check(); // perform some specific health checkif (errorCode != 0) {return Health.down().withDetail("Error Code", errorCode).build();}return Health.up().build();}}

2.3、/metrics 端点

/metrics端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息、tomcat、数据库连接池等。

 

 

除了使用 metrics 端点默认的这些统计指标外,我们还可以实现自定义统计指标。具体实现以后有机会再详细描述

2.4、/heapdump 端点

访问: http://localhost:8080/actuator/heapdump 会自动生成一个 Jvm 的堆文件 heapdump。我们可以使用 JDK 自带的 Jvm 监控工具 VisualVM 打开此文件查看内存快照。

2.5、/threaddump 端点

查看线程的情况。 主要展示了线程名、线程ID、线程的状态、是否等待锁资源、线程堆栈等信息。就是可能查看起来不太直观。

2.6、自定义Endpoint

默认的端点虽然可以满足大多数的需求,但一些特殊的需求还是需要能够支持自定义端点的。

自定义 Endpoint 端点,只需要在我们的新建Bean上使用 @Endpoint 注解即可, Bean 中的方法就可以通过 JMX 或者 HTTP 公开。

// id属性代表新增的端点名称
// 利用@ReadOperation @WritOperation注解,在端点中添加信息
@Component
@Endpoint(id = "myservice")
public class MyServiceEndPoint {@ReadOperationpublic Map getDockerInfo () {//端点的读操作return Collections.singletonMap("dockerInfo", "docker start...");}@WriteOperationprivate void restartDocker(){System.out.println("docker restarted....");}
}

2.8、导入依赖

        org.springframework.bootspring-boot-starter-actuator

3、Promethues + Grafana

3.1、Prometheus介绍

Prometheus: 是一款开源的系统和服务监控系统,属于云原生计算基金会项目。它可以通过设置的时间间隔从配置的目标系统采集指标数据,保存指标数据(时序数据库),评估规则表达式,显示结果,并在检测到指定条件时触发警报。

  • 多维数据模型:Prometheus 实现了一个高维数据模型,它从根本上将所有数据存储为时间序列:属于同一指标和同一组标记维度的时间戳值。 除了存储的时间序列,Prometheus 可能会生成临时派生的时间序列作为查询的结果。
  • 高效存储:Prometheus 以高效的自定义格式将时间序列存储在内存和本地磁盘上(内置TSDB数据库,同时也提供了远程存储接口),扩展是通过功能分片和联合来实现的。
  • PromQL:一种强大且灵活的查询语言,PromQL 允许对收集的时间序列数据进行切片和切块,以生成临时图形、表格和警报。
  • 不依赖分布式存储,操作简单:每台服务器的可靠性都是独立的,仅依赖于本地存储。用 Go 编写,所有二进制文件都是静态链接的,易于部署。
  • HTTP拉取模型: 通过抓取HTTP端点采集时序数据。
  • 通过用于批处理作业的中间网关支持推送时间序列数据。
  • 通过服务发现或静态配置发现目标。
  • 出色的可视化:Prometheus 有多种数据可视化模式,内置表达式浏览器、Grafana 集成和控制台模板语言。
  • 支持分层和水平联合。

3.2、Grafana介绍

虽然Prometheus也支持可视化界面展示,但是界面不美观,更多人选择使用Grafana来展示Prometheus的监控数据。

Grafana:Grafana是一款开源的数据可视化工具。它提供对数据指标的查询、可视化和告警,它可以实现无论数据存储在哪里,都可以与您的团队创建、探索和共享十分美观的仪表盘数据可视化,并培养数据驱动的文化。

  • 可视化:具有多种选项的快速灵活的客户端图表。面板插件提供了许多不同的方式来可视化指标和日志。
  • 动态仪表板:使用在仪表板顶部显示为下拉列表的模板变量创建动态和可重复使用的仪表板。
  • 探索指标:通过即席查询(是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表)和动态钻取探索您的数据。拆分视图并并排比较不同的时间范围、查询和数据源。
  • 探索日志:体验从指标切换到带有保留标签过滤器的日志的魔力。快速搜索所有日志或实时流式传输它们。
  • 告警:为您最重要的指标直观地定义告警规则。Grafana 将持续评估并向 Slack、PagerDuty、VictorOps、OpsGenie 等系统发送通知。
  • 混合数据源:在同一个图中混合不同的数据源!您可以基于每个查询指定数据源。这甚至适用于自定义数据源。

3.3、Prometheus+Grafana

我们使用Docker来安装需要的Prometheus+Grafana,通常情况下,我们会根据业务需求来安装需要的组件,在这里健康监控系统也是这样,如果我们的微服务部署在Docker容器中,那么我们需要安装cAdvisor组件来监控Docker相关数据指标,如果要采集系统环境数据,那么需要安装 Node Exporter 组件,而且告警组件也是和Prometheus分开的,如果需要告警功能,同样需要安装Alertmanager组件,这一连串组件的组合,我们可以使用docker-compose来安装我们需要所有组件。

这里只做简单介绍,不搞这么复杂了。prometheus都可以支持

我们可以在应用端安装下列组件,

  • cadvisor用于监控Docker相关数据指标;
  • Alertmanager用于告警管理;
  • snmp_exporter用于监控网络设备;
  • node-exporter用于采集本机数据;
  • mysqld_exporter用于监控mysql服务;

更多exporter可在prometheus官网下载

3.3.1、下载安装Prometheus

3.3.2、下载安装Grafana

3.3.3、安装成功后访问链接查看是否成功

  • Prometheus: http://192.168.0.10:9090/

  • Grafana:http://192.168.0.10:3000/

 

 

3.3.4、微服务相关配置及添加Prometheus支持

  • 微服务引入prometheus依赖

......
......io.micrometermicrometer-registry-prometheus1.5.14
  • 开启prometheus抓取端点
# 性能监控端点配置
management:security:enabled: truerole: ACTUATOR_ADMINendpoint:health:show-details: alwaysendpoints:enabled-by-default: trueweb:base-path: /actuatorexposure:include: '*'
metrics:tags:application: ${spring.application.name}export:prometheus:enabled: trueserver:servlet:context-path: /actuatorhealth:mail:enabled: false

3.3.5、配置Prometheus

1、编辑prometheus配置文件prometheus.yml,设置采集微服务端点scrape_configs:

scrape_configs:- job_name: 'actuator-gitegg'basic_auth:username: userpassword: passwordscrape_interval: 15sscrape_timeout: 10smetrics_path: '/actuator/prometheus'static_configs:- targets: ['192.168.0.2:80','192.168.0.2:8002']
  • basic_auth:设置采集端点的basic认证信息
  • metrics_path:设置prometheus采集端点的路径
  • static_configs.targets: 设置prometheus采集端点的地址

2、重启prometheus,访问界面status -> targets,查看采集端点状态。

3.3.6、配置Grafana,添加prometheus数据源并展示JVM监控图表

 

 

相关内容

热门资讯

四年级作文假期伤心事【优质6... 四年级作文假期伤心事 篇一假期中的一个伤心事今年的暑假,我和爸爸妈妈一起去了一个美丽的海滩度假村。我...
小学四年级作文魔法屋【优秀3... 小学四年级作文魔法屋 篇一我有一个魔法屋,它是一个神奇的地方。每当我进入魔法屋,就会发生许多有趣的事...
四年级作文介绍花果山【精彩6... 四年级作文介绍花果山 篇一花果山是一个神奇的地方。它位于中国的浙江省,是中国古代神话《西游记》中的一...
我的花园四年级作文【优质6篇... 我的花园四年级作文 篇一我的花园我家有一个美丽的花园,我非常喜欢在花园里玩耍和观赏花朵。我的花园里有...
一二三,木头人四年级作文(经... 一二三,木头人四年级作文 篇一我最喜欢的玩具——木头人我最喜欢的玩具是一个木头人。这个木头人是我四岁...
小学四年级作文,最简易的马戏... 小学四年级作文,最简易的马戏表演 篇一最近,我们班上举行了一场最简易的马戏表演,我感到非常兴奋和激动...
四年级作文回外婆家【最新6篇... 四年级作文回外婆家 篇一回到外婆家,我感到非常兴奋。外婆家离我们家有一段距离,但是我每次去都觉得很开...
四年级的学生作文一个熟悉的人... 四年级的学生作文一个熟悉的人 篇一我的奶奶我要介绍一个非常熟悉的人,那就是我的奶奶。奶奶是一个温柔、...
四年级下册400字自我作文大... 四年级下册400字自我作文大全 篇一我喜欢的运动我是一个活泼好动的孩子,喜欢各种各样的运动。在四年级...
我的同学四年级作文500字(... 我的同学四年级作文500字 篇一我的好朋友小明我有一个好朋友,他叫小明。小明是我同班同学,我们从一年...
美丽的采荷一小四年级作文【优... 美丽的采荷一小四年级作文 篇一我们班级的花园我所在的班级是采荷一小四年级三班,我们班级有一个美丽的花...
参观消防队作文(实用3篇) 参观消防队作文 篇一我校五年级的同学们近日有幸参观了当地的消防队。这次参观不仅让我们了解了消防队员的...
新老师作文400字四年级44... 新老师作文400字四年级44篇 篇一:我的新老师我是四年级的小学生,今年迎来了一位新老师。她姓李,给...
地球的心声小学四年级作文【优... 地球的心声小学四年级作文 篇一亲爱的孩子们,我是你们生活的地球,我有一些话想对你们说。作为你们的家园...
四年级作文游庐山(精简6篇) 四年级作文游庐山 篇一庐山位于江西省九江市,是中国著名的风景名胜区之一。我有幸和爸爸妈妈一起去游览了...
三年级作文教学目标(经典5篇... 三年级作文教学目标 篇一在三年级的作文教学中,我们的目标是培养学生的写作能力,提高他们的语言表达能力...
介绍一个好地方四年级作文(精... 篇一:我的家乡-一个好地方我的家乡是一个好地方,它位于美丽的山水之间,被誉为“江南水乡”。家乡有着丰...
暑假里的一处景三年级350字... 暑假里的一处景三年级350字作文 篇一:盛夏里的河畔暑假里的一处景,是我最喜欢的地方,那就是我的家乡...
三年级作文快乐暑假100字(... 三年级作文快乐暑假100字 篇一快乐暑假暑假终于来了,我迫不及待地和家人一起出去玩。我们决定去海边度...
三年级下册第八单元同步作文:... 三年级下册第八单元同步作文:我想变成小鸟 篇一我想变成小鸟我是一个三年级的小学生,最近我们学习了有关...