笔记:Spring Boot 监控与管理

在微服务架构中,我们将原本庞大的单体系统拆分为多个提供不同服务的应用,虽然,各个应用的内部逻辑因分解而简化,但由于部署的应用数量成倍增长,使得系统的维护复杂度大大提升,为了让运维系统能够获取各个为服务应用的相关指标以及实现一些常规操作控制,我们需要开发一套专门用于植入各个微服务的接口供监控系统采集信息,而这些接口往往有很大一部分指标都是类似的,Spring Boot 作为微服务框架时,除了强大的快速开发能力之外,还提供了一个特殊的模块 spring-boot-starter-actuator ,该模块能够自动为 Spring Boot 构建的应用提供一系列用于监控的端点。

引入Actuator

在现有的 Spring Boot 应用中引入该模块非常简单,只需要在 pom.xml 中增加 spring-boot-starter-actuator 依赖即可,代码如下:

????????<dependency>

????????????<groupId>org.springframework.boot</groupId>

????????????<artifactId>spring-boot-starter-actuator</artifactId>

????????</dependency>

增加该依赖之后,重新启动应用,此时,我们可以在控制台中看到如下图所示的输出:

上图显示了一批端点定义,这些端点是由 spring-boot-starter-actuator 模块根据应用依赖和配置自动创建出来的监控和管理端点,通过这些端点我们可以实时获取应用的各项监控指标

原生端点

根据端点的作用,可以将原生端点分为以下三大类:

  • 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与
    Spring
    Boot应用密切相关的配置类信息
  • 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如内存信息、线程池信息、HTTP请求统计等
  • 操作控制类:提供了对应用的关闭等操作类功能

应用配置类

由于Spring
Boot
为了改善传统Spring应用繁杂的配置,采用了包扫描和自动化配置的机制来加载原本集中与XML文件中的各项内容,应用配置类可以帮助我们轻松获取一系列关于Spring应用配置内容的详细报告,比如自动化配置的报告、Bean
创建报告、环境属性报告等。

  • /autoconfig:该端点用来获取应用的自动化配置报告,其中包含所以自动化配置的候选项,同时还列出了每个候选项是否满足自动化配置的各个先觉条件,所以,该端点可以帮助我们方便的找到一些自动化配置为什么没有生效的具体原因,该报告内容分为以下两个部分:

    • postitiveMatches
      中返回的时条件匹配成功的自动化配置
    • negativeMatches中返回的时条件匹配不成功的自动化配置
  • /beans:该端点用来获取应用上下文中创建的所有Bean,其中每个bean都包含以下节点:

    • bean
      :标识Bean的名称;
    • scope
      :标识Bean的作用域;
    • type
      :标识
      Bean

      Java类型;
    • resource:class
      文件的具体路径
    • dependencies:依赖的Bean名称
  • /configprops:该端点用来获取应用中配置的属性报告,返回部分JSON如下:

    "environmentMvcEndpoint": {

    ????????????????"prefix": "endpoints.env",

    ????????????????"properties": {

    ????????????????????????"path": "/env"

    ????????????????}

    ????????}

    可以看到 /env 端点的属性配置为 endpoints.env.path 可以设置端点访问路径等。

  • /env:该端点与configprops 不同,用来获取应用所有可用的环境属性报告,包含环境变量、JVM属性、应用的配置属性、命令行参数,如果返回信息的属性名称中,包含
    password、secret、key
    这些关键字,在返回时,会以*来替代实际的属性值,返回部分JSON如下:

    ??"profiles": [ ],

    ????????"server.ports": {

    ????????????????"local.server.port": 8080

    ????????},

    ????????"servletContextInitParams": { },

  • /mappings:该端点用来返回所有
    Spring
    MVC
    的控制器映射关系报告,示例片段如下:

    ????"{[/hello/get]}": {

    ????????????????"bean": "requestMappingHandlerMapping",

    ????????????????"method": "public java.lang.String com.example.actuator.HelloController.get()"

    ????????},

    ????????"{[/error]}": {

    ????????????????"bean": "requestMappingHandlerMapping",

    ????????????????"method": "public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)"

    ????????},

  • /info:该端点用来返回一些应用自定义的信息,默认情况下,该端点只会返回一个空的JSON内容,我们可以在 application.properties 配置文件中通过 info前缀来设置一些属性,在访问该端点时,就会将设置的属性返回,示例如下:

    • application.properties中增加以下内容:

      info.app.name=spring-boot-hello

      info.app.version=1.0

    • 示例返回如下:

      {

      ????????"app": {

      ????????????????"name": "spring-boot-hello",

      ????????????????"version": "1.0"

      ????????}

      }

度量指标类

度量指标类端点提供的报告内容是动态变化的,这些端点提供了一弄程序在运行过程中的一些快照信息,比如内存使用情况、HTTP请求统计、外部资源指标等。

  • /mertrics:该端点用来返回当前应用的各类重要度量指标,比如内容信息、线程信息、垃圾回收信息等,返回结果如下:

????????????{

????????????

"mem": 230900,

????????"mem.free": 139265,

????????"processors": 4,

????????"instance.uptime": 88119,

????????"uptime": 102055,

????????"systemload.average": -1,

????????"heap.committed": 191488,

????????"heap.init": 129024,

????????"heap.used": 52222,

????????"heap": 1829888,

????????"nonheap.committed": 40192,

????????"nonheap.init": 2496,

????????"nonheap.used": 39414,

????????"nonheap": 0,

????????"threads.peak": 25,

????????"threads.daemon": 21,

????????"threads.totalStarted": 28,

????????"threads": 23,

????????"classes": 5728,

????????"classes.loaded": 5728,

????????"classes.unloaded": 0,

????????"gc.ps_scavenge.count": 9,

????????"gc.ps_scavenge.time": 145,

????????"gc.ps_marksweep.count": 1,

????????"gc.ps_marksweep.time": 81,

????????"httpsessions.max": -1,

????????"httpsessions.active": 0,

"gauge.response.hello.get": 17,

????????"gauge.response.star-star": 116,

"counter.status.200.hello.get": 1

????????"counter.status.404.star-star": 1

}

  • 系统信息,包括处理其数量 processors、运行时间 uptime 和 instance.uptime、系统平均负载 systemload.average。
  • 内存信息,内存概要信息包括分配给应用的总内存数量 mem 以及当前空闲的内容数量 mem.free
  • 堆内存信息,堆内存使用情况 heap.* ,这些信息来自 java.lang.management.MemoryMXBean 接口中 getHeapMemoryUsage 方法获取的 java.lang.management.MemoryUsage
  • 非堆内存信息,非堆内存使用情况,nonheap.*,这些信息来自 java.lang.management.MemoryMXBean 接口中 getNonHeapMemoryUsage 方法获取的 java.lang.management.MemoryUsage
  • 线程使用情况,包括线程数
    threads、守护线程数量 thread.daemon、线程峰值 threads.peak 这些数据来自 java.lang.management.ThreadMXBean
  • 应用加载和卸载类统计,类统计数量 classes、类加载数量 classes.loaded 和 类卸载数量 classes.unloaded
  • 垃圾收集器信息,垃圾回收次数 gc.ps_scavenge.count、垃圾回收消耗时间 gc.ps_scavenge.time、标记清除算法的次数 gc.ps_marksweep.count、标记清除算法的消耗时间 gc.ps_marksweep.time
  • Tomcat容器会话使用情况,最大会话数量 httpsession.max 和活跃会话数量 httpsessions.active,该度量指标必须在引入嵌入式 Tomcat 作为容器的时候才会提供
  • HTTP请求性能指标,gauge.* 表示上一次请求返回的延迟时间(单位:毫秒),比如示例中的 gauge.response.hello.get:17 表示上一次 hello请求的延迟为 17 毫秒;counter.* 主要做为计数器来使用,记录了增加量和减少量,上述示例中的 counter.status.200.hello.get:1 表示 hello 请求返回 200 状态的次数为 1 次

对于 gauge.* 和 counter.*的统计,这里有一个特殊的内容请求 star-star,他代表了对静态资源的访问,这两类度量指标非常有用,我们不仅可以使用默认的统计指标,还可以在程序中增加自定义统计值,只需要通过注入 org.springframework.boot.actuate.metrics.CounterService 和 org.springframework.boot.actuate.mertics.GaugeService 来实现自定义的统计指标信息,示例代码如下:

@RestController

@RequestMapping ("/hello")

public class HelloController {

?
?

????????@Autowired

????????private CounterService counterService;

?
?

????????@RequestMapping ("getCount")

????????public String getCount() {

????????????????counterService.increment("hello.get.count");

????????????????return
"ok";

????????}

}

metrics 可以提供应用运行状态的完整度量指标报告,这项功能非常实用,但是对于监控系统中的各项监控功能,其监控内容、数据收集频率都有所不同,如果每次都通过全量获取报告的方式来收集,颗粒度有些粗,我们还可以通过 /metrics/{name} 的接口来更细粒度获取度量信息,其中 {name} 中可以使用 * 作为通配符来获取匹配的度量信息,示例如下:

请求:

http://localhost:8080/metrics/counter.*

返回:

{

????????"counter.hello.get.count": 3,

????????"counter.status.200.metrics": 2,

????????"counter.status.200.hello.getCount": 3

}

  • /health:该端点用来获取应用的各类健康指标信息,在
    spring-boot-starter-actuator
    模块中值带实现了一些常用资源的健康指标检测器,这些检测器都通过
    HealthIndicator
    接口实现,并且会根据依赖关系的引入实现自动化装配

检测器


功能


DiskSpaceHealthIndicator


低磁盘空间检测


DataSourceHealthIndicator


检测
DataSource
的连接是否可用


MongoHealthIndicator


检测
Mongo
数据库是否可用


RabbitHealthIndicator


检测
Rabbit
服务器是否可用


RedisHealthIndicator


检测
Redis
服务器是否可用

如果需要实现自定义的检测器,需要实现 org.springframework.boot.actuate.health.HealthIndicator接口,示例代码如下:

@Component

public class CustomHealthIndicator implements HealthIndicator {

????????@Override

????????public Health health() {

????????????????int errorCode = check();

????????????????if (errorCode != 0) {

????????????????????????return Health.down().withDetail("error code", errorCode).build();

????????????????}

?
?

????????????????return Health.up().build();

????????}

?
?

????????private
int
check() {

????????????????// 对监控对象的检测操作

????????????????return -9;

????????}

}

请求返回(HTTP 503):

{

????????"status": "DOWN",

????????"custom": {

????????????????"status": "DOWN",

????????????????"error code": -9

????????},

????????"diskSpace": {

????????????????"status": "UP",

????????????????"total": 570705309696,

????????????????"free": 533198258176,

????????????????"threshold": 10485760

????????}

}

  • /dump:该端点用来暴露程序运行中的线程信息,使用 java.lang.management.ThreadMXBean 的 dumpAllThreads 方法来返回所有含有同步信息的活动线程详情
  • /trace:该端点用来返回基本的HTTP跟踪信息,默认情况下,跟踪信息的存储采用 org.springframework.boot.actuate.trace.InMemoryTraceRepository 实现的内存方式,始终保留最近的100条请求记录

操作控制类

操作控制类端点拥有更强大的控制能力,如果需要使用他们的话,需要通过属性来配置开启操作,在原生端点中,只提供了一个用来关闭应用的端点:

  • /shutdown:关闭应用,需要在配置中开启 endpoints.shutdown.enabled=true,需要使用POST请求访问
时间: 2024-11-06 21:29:24

笔记:Spring Boot 监控与管理的相关文章

spring boot 监控与管理(actuator)

Spring POMs 中提供了一个特殊的依赖模块,即spring-boot-starter-actuator,我们只需要在我们的POM中添加依赖即可 <!-- 监控 管理 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency&g

spring boot shiro -权限管理

spring boot shiro -权限管理 定义 java最常用的框架有spring security 和Apache shiro,因为spring security 庞大和负责,一般使用都是Apache shiro. Apache shiro 是一个功能强大,灵活,开源的安全框架,它可以处理身份验证,授权,企业会话管理,加密等. shiro 易于理解和使用,一个好的框架 应该屏蔽复杂性,向外提供简单,直观的api,简化开发人员实行应用程序安全所发费的时间和精力. shiro 可以做什么:

Spring Boot Shiro 权限管理 【转】

http://blog.csdn.net/catoop/article/details/50520958 主要用于备忘 本来是打算接着写关于数据库方面,集成MyBatis的,刚好赶上朋友问到Shiro权限管理,就先总结下发出来了. 使用Shiro之前用在spring MVC中,是通过XML文件进行配置. 既然现在在写Spring Boot的帖子,就将Shiro应用到Spring Boot中,我本地已经完成了SpringBoot使用Shiro的实例,将配置方法共享一下. 先简单介绍一下Shiro,

十、 Spring Boot Shiro 权限管理

使用Shiro之前用在spring MVC中,是通过XML文件进行配置. 将Shiro应用到Spring Boot中,本地已经完成了SpringBoot使用Shiro的实例,将配置方法共享一下. 先简单介绍一下Shiro,对于没有用过Shiro的朋友,也算是做个简介吧. Shiro是Apache下的一个开源项目,我们称之为Apache Shiro.它是一个很易用与Java项目的的安全框架,提供了认证.授权.加密.会话管理,与 Spring Security 一样都是做一个权限的安全框架,但是与S

Spring Boot 监控利器 —— Actutor

参考 CSDN-学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator 使用Actuator监控Spring Boot应用 程序猿DD-Spring Boot Actuator监控端点小结 官宣-Spring Boot Actuator Web API Documentation Spring Boot Admin Spring Boot Admin 2.0开箱体验 纯洁的微笑-Spring Boot(二十):使用 spring-boot-admin 对

Spring Boot的事务管理注解@EnableTransactionManagement的使用

Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可. 关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例.如果你添加的是 spr

spring boot监控之prometheus配置

1,spring boot工程引入jar包 compile 'org.springframework.boot:spring-boot-starter-actuator' compile 'io.micrometer:micrometer-core:1.3.5' compile 'io.micrometer:micrometer-registry-prometheus:1.3.5' 2,修改spring boot工程配置 management: server: port: 10091 endpo

Spring Boot学习笔记——Spring Boot与Redis的集成

一.添加Redis缓存 1.添加Redis起步依赖 在pom.xml中添加Spring Boot支持Redis的依赖配置,具体如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.7.RELEASE</version> </

spring boot aop日志管理(MongoDB)

aop拦截的是controller层请求,正常的请求用@Before来拦截, 异常的请求用@AfterThrowing来拦截 1.引用aop jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.0.3.RELEASE</version>