当前位置:   article > 正文

SpringBoot利用Actuator来监控应用的方法_templated:false

templated:false

Actuator是什么?

先从官网摘几句文绉绉的解释:

  • SpringBoot可以帮助你再将应用程序推向生产环境时对其进行监视和管理。
  • 你可以选择使用http断点或JMX来管理和监视应用程序。
  • 审计【auditing】、健康【health】和指标收集【metrics gathering】可以自动应用到你的应用程序中。

总结一下就是:Actuator就是用来监控你的应用程序的。

快速开始

引入依赖

  1. <!--Actuator-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-actuator</artifactId>
  5. </dependency>
  6. <!--Spring MVC 自动化配置-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>

一般来说这两个依赖都是相互配合的。

yml与自动配置

下面是一段yml的配置:

  1. server:
  2. port: 8081
  3. management:
  4. endpoints:
  5. web:
  6. base-path: /actuator # Actuator 提供的 API 接口的根目录
  7. exposure:
  8. include: '*' # 需要开放的端点
  9. exclude: # 需要排除的端点
  • management.endpoints.web对应的配置类是:org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties。
  • 相关的自动配置在org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration中完成,感兴趣的同学可以查看一下源码。
  • basePath是Actuator提供的API接口的根目录,默认配置就是/actuator。
  • Exposure.include表示需要开放的端点,默认只打开health和info两个断点,设置*可以开放所有端点 。
  • Exposure.include表示排除的端点,设置*为排除所有的端点。

主程序类

  1. @SpringBootApplication
  2. public class SpringBootActuatorApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(SpringBootActuatorApplication.class, args);
  5. }
  6. }

测试

访问http://localhost:8081/actuator/health,得到应用的健康信息如下:

  1. {
  2. status: "UP" // 开启
  3. }

Endpoints

由于我们设置开放了所有的Endpoints,启动程序时,我们能够看到控制台输出:

[  restartedMain] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 13 endpoint(s) beneath base path '/actuator'

说的很清楚,总共暴露了内置的13个端点,java培训这些端点,SpringBoot文档已经交代地非常详细啦。

其实内置的端点不止13个,官方文档说:每个端点可以被enabled or disabled和exposed over HTTP or JMX。只有当端点同时enabled和exposed的时候才可用,内置的端点也只有在自动配置生效的时候才可用。

大多数的应用程序会选择HTTP暴露端点,我们可以通过/actuator/health访问ID为health的端点。

官方列举的所有端点列表

JMX和web共有的

 

如果你的是web应用 (Spring MVC, Spring WebFlux, or Jersey),你可以使用下面这些额外的端点:

启动端点

如果你希望启动某个端点,你可以按照management.endpoint.<id>.enabled的配置启动,以shutdown端点为例:

  1. management:
  2. endpoint:
  3. shutdown:
  4. enabled: true

如果你只希望启动某个端点,你可以向下面这样:

  1. management:
  2. endpoints:
  3. enabled-by-default: false # 不启用默认配置
  4. endpoint:
  5. info:
  6. enabled: true

这个示例,只会启用info端点。

暴露端点

端点可能会包含铭感信息,考虑暴露的时候应当慎重考虑。

  • web程序默认暴露的端点有且仅有两个:health和info。
  • JMX程序默认暴露所有的端点。

我们可以使用include和exclude属性来控制端点是否需要暴露。下面是两个例子

一、不让JMX暴露所有端点,只让它暴露health和info两个端点。

  1. management:
  2. endpoints:
  3. jmx:
  4. exposure:
  5. include: "health,info"

二、暴露web除env和beans之外的所有端点。

  1. management:
  2. endpoints:
  3. web:
  4. exposure:
  5. include: "*"
  6. exclude: "env,beans"
  7. management.endpoints.web.exposure.include=*
  8. management.endpoints.web.exposure.exclude=env,beans

配置端点

端点将会自动缓存对不带任何参数的读取操作的响应。你可以使用cache.time-to-live属性配置。

以下示例将Bean端点的缓存的生存时间设置为10秒。

  1. management:
  2. endpoint:
  3. beans:
  4. cache:
  5. time-to-live: "10s"

发现页面

默认你可以访问/actuator页面获得所有的端点信息:

  1. {
  2. _links: {
  3. self: {
  4. href: "http://localhost:8081/actuator",
  5. templated: false
  6. },
  7. health: {
  8. href: "http://localhost:8081/actuator/health",
  9. templated: false
  10. },
  11. health-path: {
  12. href: "http://localhost:8081/actuator/health/{*path}",
  13. templated: true
  14. },
  15. info: {
  16. href: "http://localhost:8081/actuator/info",
  17. templated: false
  18. }
  19. }
  20. }

跨域支持

默认情况下,CORS支持是禁用的,并且仅在设置了management.endpoints.web.cors.allowed-origins属性后才启用。以下配置允许来自example.com域的GET和POST调用:

  1. management:
  2. endpoints:
  3. web:
  4. cors:
  5. allowed-origins: "https://example.com"
  6. allowed-methods: "GET,POST"

完整的选项可以查看:CorsEndpointProperties

实现一个定义的端点

我们直接来看一个例子吧:

  1. @Component // 让Spring容器管理
  2. @Endpoint(id = "myEndPoint") //web和jmx公用, @WebEndpoint表示指定web
  3. public class MyEndpoint {
  4. Runtime runtime = Runtime.getRuntime();
  5. @ReadOperation // 读操作
  6. public Map<String, Object> getData() {
  7. Map<String, Object> map = new HashMap<>();
  8. map.put("available-processors", runtime.availableProcessors());
  9. map.put("free-memory", runtime.freeMemory());
  10. map.put("max-memory", runtime.maxMemory());
  11. map.put("total-memory", runtime.totalMemory());
  12. return map;
  13. }
  14. }

  • @Component表明让这个bean给Spring容器管理。
  • @Endpoint标注这是个端点,类似的还有@WebEndpoint标注的是特指web程序。
  • id = "myEndPoint"限制访问端点的路径:/actuator/myEndPoint。
  • @ReadOperation规定HTTP请求的方法为GET,@ReadOperation为POST,@DeleteOperation为DELETE。

接下来我们测试一下,再测试之前,不要忘了yml中启动设置:

  1. server:
  2. port: 8081
  3. management:
  4. endpoints:
  5. web:
  6. exposure:
  7. include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 *
  8. enabled-by-default: false
  9. endpoint:
  10. myEndPoint:
  11. enabled: true

我们暂时关闭其他所有的端点,只关注myEndPoint端点,接着启动程序,访问:http://localhost:8081/actuator/myEndPoint,获得json信息。

  1. {
  2. max-memory: 3787980800,
  3. free-memory: 235775968,
  4. available-processors: 4,
  5. total-memory: 298844160
  6. }

实际上如果是用于SpringMVC或Spring WebFlux,我们可以使用@RestControllerEndpoint或@ControllerEndpoint注解,定义一个更符合我们平时web开发模式的端点,你可以看一下java培训下面这个例子。

  1. @Component
  2. @RestControllerEndpoint(id = "web")
  3. public class MyWebEndPoint {
  4. @GetMapping("/")
  5. public Map<String, Object> getData() {
  6. // ...
  7. return map;
  8. }
  9. }

Health端点

端点这么多,我们挑几个学习一下,health作为默认开放的端点之一,还是需要好好了解一下的。

设置何时显示信息

你可以使用得到的健康信息去检查你的应用程序,暴露的health信息依赖于下面两个属性配置:

  1. management.endpoint.health.show-details
  2. management.endpoint.health.show-components

这两个属性可以设置的值如下:

health端点通过健康指示器HealthIndicator获取不同的资源的健康信息,且Autuator内置了多个HealthIndicator的实现,太多啦太多啦,如果需要可以看看官网 Auto-configured HealthIndicators。

另外,如果你想启用或者禁用指定的指示器,你可以配置management.health.key.enabled,key需要被替换,官网表格上有。

如果你想设置全部的,你可以配置management.health.defaults.enabled

设置顺序

你可以通过以下设置显示顺序:

  1. management:
  2. endpoint:
  3. health:
  4. status:
  5. order: "fatal,down,out-of-service,unknown,up"

设置响应码

响应码反应了总体健康状态。默认情况下,OUT_OF_SERVICE和DOWN的映射为503,其他状态为200。你可以按照下面的方式设置映射:

  1. management:
  2. endpoint:
  3. health:
  4. status:
  5. http-mapping:
  6. down: 503
  7. fatal: 503
  8. out-of-service: 503

自定义健康信息

纵使,Actuator已经提供了许多内置实现,总会满足不了我们的需求,那如何去自定义呢?

  • 注册实现HealthIndicator接口的Spring Bean。
  • 提供health()方法的实现并返回健康响应,包括状态和其他需要显示的详细信息。

以下代码展示了一个案例:

  1. import org.springframework.boot.actuate.health.Health;
  2. import org.springframework.boot.actuate.health.HealthIndicator;
  3. import org.springframework.stereotype.Component;
  4. import java.util.Random;
  5. @Component
  6. public class MyHealthIndicator implements HealthIndicator {
  7. @Override
  8. public Health health() {
  9. // perform some specific health check
  10. boolean check = check();
  11. if (!check) {
  12. return Health.down().withDetail("Error Code", 0).build();
  13. }
  14. return Health.up().build();
  15. }
  16. private boolean check() {
  17. return new Random().nextBoolean();
  18. }
  19. }

id就是bena的名称去掉HealthIndicator后缀,这里id就是my。

看看相关的yml怎么配置?

  1. management:
  2. endpoints:
  3. web:
  4. exposure:
  5. include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
  6. enabled-by-default: false
  7. endpoint:
  8. health:
  9. enabled: true
  10. show-details: always # 何时显示完整的健康信息
  11. show-components: always
  12. status:
  13. http-mapping: # 设置不同健康状态对应的响应状态码
  14. DOWN: 503
  15. order: FATAL, DOWN, OUT_OF_SERVICE, UP, UNKNOWN # 状态排序

测试一下,访问:/actuator/health,可以尝试多点几次,会出现UP和DOWN的情况,得到以下信息:

  1. {
  2. status: "DOWN",
  3. components: {
  4. diskSpace: {
  5. status: "UP",
  6. details: {
  7. total: 267117391872,
  8. free: 130840469504,
  9. threshold: 10485760,
  10. exists: true
  11. }
  12. },
  13. my: {
  14. status: "DOWN",
  15. details: {
  16. Error Code: 0
  17. }
  18. },
  19. ping: {
  20. status: "UP"
  21. }
  22. }
  23. }

  • my对应的就是我们自定义的MyHealthIndicator,里面详细的信息有:状态status,信息details。
  • diskSpace对应DiskSpaceHealthIndicator,ping对应的是PingHealthIndicator。

其他的端点,感兴趣的小伙伴可以去到官网一一测试,总之,通过这些Actuator提供的端点,我们很容易就能够监控管理我们的应用程序。

来源互联网后端架构

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/334084
推荐阅读
相关标签
  

闽ICP备14008679号