SpringBoot集成Actuator端点配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot集成Actuator端点配置相关的知识,希望对你有一定的参考价值。

参考技术A Actuator端点可以监控应用程序并与之交互。
Spring Boot包括许多内置的端点,
比如health端点提供基本的应用程序运行状况信息,
并允许添加自定义端点。

可以控制每个单独的端点启用或禁用,
也可以通过include和exclude属性通配,
这会影响端点的Bean创建。
要远程访问端点,还必须通过JMX或HTTP公开。
大多数应用程序选择HTTP方式对外开放,
其中/actuator前缀和端点的ID组成了对外暴露的URL。
比如默认情况下,health端点映射到/actuator/health。

本文主要介绍通过HTTP进行监控和管理。

以下是与技术无关的端点:

如果你的应用程序是 web 应用程序(Spring MVC、Spring WebFlux或Jersey),则可以使用以下附加端点:

由于端点可能包含敏感信息,
因此要仔细考虑何时公开它们。
下表显示了内置端点对于JMX或HTTP,
是否默认对外公开的情况:

从上表可以看到HTTP默认对外公开2个端点,
只有health和info。

实际上公开的端点受到include和exclude属性控制,
下表显示了这两个属性的默认配置,
和上表能够一一对应起来,
其中包含web的属性对应的是HTTP的配置。

只公开loggers端点:

公开所有端点,但是要排除loggers和env端点:

注意*在YAML中具有特殊含义,
如果要包括(或排除)所有端点,
请务必添加引号。
另外如果想在公开端点时实现自定义策略,
可以注册EndpointFilter bean。

通过修改配置,公开所有端点后,
浏览器访问Actuator提供的管理URL:

返回结果:

发现对外开放了14个端点,
没有对外开放的端点还有9个:
auditevents, flyway, integrationgraph, jolokia, logfile,
liquibase, prometheus, sessions, shutdown。

上面介绍了公开端点的配置,
但是即使公开了所有端点,
也不一定能看到对应的端点。
上面还有9个端点没有对外开放,
原因是有2个,
一个端点是没有启用,
另一个是端点因为没有相关的功能实现,
所以暴露出去也没有用。
而且除shutdown以外,
所有端点是默认启用的。

下面演示启用shutdown端点:

禁用端点可以通过设置对应ID为faslse,
下面演示关闭logger端点:

也可以通过设置所有端点的开启默认值为fasle,
从而禁用所有端点,
然后再启用特定端点,
下面演示禁用所有端点,
只启用shutdown端点:

同样的启用所有端点,
只禁用shutdown端点:

只有一个端点同时公开和启用了才能访问到;
一个端点启用后,
可以选择在JMX公开,
而不在HTTP公开;
一个端点禁用后,
不管在JMX或者HTTP是否公开,
都无法被访问到。
从而实现更细致的控制管理。

可以为管理端点自定义前缀,
特别是已经将/actuator用于其他目的,
下面修改管理端点的前缀为/manage:

重启服务后,原来的管理URL不能再访问:

应该访问新的管理URL:

而且其下的health等其他端点也变成新的URL:

如果把管理端点路径设置为/或者空时,
将禁用管理URL,
以防止与其他映射发生冲突。

可以将端点映射到不同的路径,
下面以健康检查为例,
演示将/actuator/health映射到/actuator/healthcheck:

重启服务后,原来的健康URL不能再访问:

应该访问新的健康URL:

进一步修改管理端点路径设置为/:

虽然不能访问管理URL,
但是可以访问更短的健康URL:

SpringBoot - 构建监控体系01_使用 Actuator 组件实现及扩展系统监控

在这里插入图片描述


Pre

这里我们将介绍 Spring Boot 中一个非常有特色的主题——系统监控。

系统监控是 Spring Boot 中引入的一项全新功能,它对应用程序运行状态的管理非常有效。而 Spring Boot Actuator 组件主要通过一系列 HTTP 端点提供的系统监控功能来实现系统监控。

因此,接下来我们将引入 Spring Boot Actuator 组件,介绍如何使用它进行系统监控,以及如何对 Actuator 端点进行扩展。


引入 Spring Boot Actuator 组件

在初始化 Spring Boot 系统监控功能之前,首先我们需要引入 Spring Boot Actuator 组件,具体操作为在 pom 中添加如下所示的 Maven 依赖:

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>

Warning: 引入 Spring Boot Actuator 组件后,并不是所有的端点都对外暴露。

启动boot工程

在这里插入图片描述

Exposing 2 endpoint(s) beneath base path '/actuator'

访问 http://localhost:8080/actuator 端点后,我们也会得到如下所示结果。

在这里插入图片描述


这种结果就是 HATEOAS 风格的 HTTP 响应。如果我们想看到默认情况下看不到的所有端点,则需要在配置文件中添加如下所示的配置信息。

management:
  endpoints:
    web:
      exposure:
        include: "*"

重启应用后,
在这里插入图片描述

我们就能获取到 Spring Boot Actuator 暴露的所有端点,如下代码所示:

在这里插入图片描述


原生端点

根据端点所起到的作用,我们把 Spring Boot Actuator 提供的原生端点分为如下三类。

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

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

  • 操作控制类: 在原生端点中只提供了一个关闭应用的端点,即 /shutdown 端点。

根据 Spring Boot Actuator 默认提供的端点列表,我们将部分常见端点的类型、路径和描述梳理在如下表格中,仅供参考。

在这里插入图片描述


应用更详细的健康状态

通过访问上表中的各个端点,我们就可以获取自己感兴趣的监控信息了。例如访问了http://localhost:8080/actuator/health端点,我们就可以得到应用的 基本状态。

在这里插入图片描述

此时,我们看到这个健康状态信息非常简单。

那有没有什么办法可以获取更详细的状态信息呢? 我们只需要在配置文件中添加如下所示的配置项即可。

management: 
  endpoint:
    health:
      show-details: always

在这里插入图片描述
在这里插入图片描述


如何在现有的监控端点上添加定制化功能

如果 Spring Boot Actuator 默认提供的端点信息不能满足业务需求,我们可以对其进行修改和扩展。此时,常见实现方案有两种,一种是扩展现有的监控端点,另一种是自定义新的监控端点。 后面会讲这一部分,我们先来关注如何在现有的监控端点上添加定制化功能。

在这里插入图片描述

扩展 Actuator 端点

Spring Boot 默认暴露了日常开发中最常见的两个端点:Info 端点和 Health 端点。接下来,我们讨论下如何对这两个端点进行扩展。


扩展 Info端点 (InfoContributor )

Info 端点用于暴露 Spring Boot 应用的自身信息。在 Spring Boot 内部,它把这部分工作委托给了一系列 InfoContributor 对象,而 Info 端点会暴露所有 InfoContributor 对象所收集的各种信息。

在Spring Boot 中包含了很多自动配置的 InfoContributor 对象,常见的 InfoContributor 及其描述如下表所示:

在这里插入图片描述

以上表中的 EnvironmentInfoContributor 为例,通过在配置文件中添加格式以“info”作为前缀的配置段,我们就可以定义 Info 端点暴露的数据。添加完成后,我们将看到所有在“info”配置段下的属性都将被自动暴露。

方式一: 配置文件

比如可以将如下所示配置信息添加到配置文件 application.yml 中:

info:
	app:
	    encoding: UTF-8
	    java:
	        source: 1.8.0_31
	        target: 1.8.0_31

现在访问 Info 端点, http://localhost:8080/actuator/info 我们就能得到如下的 Environment 信息。
在这里插入图片描述

同时,我们还可以在服务构建时扩展 Info 属性,而不是硬编码这些值。假设使用 Maven,我们就可以按照如下所示的配置重写前面的示例并得到同样的效果。

在这里插入图片描述

在这里插入图片描述


方式二:实现 InfoContributor 接口 重写contribute() 方法

很多时候,Spring Boot 自身提供的 Info 端点并不能满足我们的业务需求,这就需要我们编写一个自定义的 InfoContributor 对象。

方法也很简单,我们直接实现 InfoContributor 接口的 contribute() 方法即可。例如,我们希望在 Info 端点中暴露该应用的构建时间,就可以采用如下所示的代码进行操作。

package com.artisan.admin;

import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.Date;

/**
 * @author 小工匠
 * @version 1.0
 * @description: TODO
 * @date 2021/5/30 17:30
 * @mark: show me the code , change the world
 */

@Component
public class ArtisanInfoContributor implements InfoContributor {


    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("build", Collections.singletonMap("timestamp", new Date()));
    }
}
    

重新构建应用并访问 Info 端口后,我们就能获取如下所示信息。

在这里插入图片描述
这里我们可以看到,ArtisanInfoContributor 为 Info 端口新增了时间属性。


扩展 Health 端点

Health 端点用于检查正在运行的应用程序健康状态,而健康状态信息由 HealthIndicator 对象从 Spring 的 ApplicationContext 中获取。

和 Info 端点一样,Spring Boot 内部也提供了一系列 HealthIndicator 对象供我们实现定制化。在默认情况下,HealthAggregator 会根据 HealthIndicator 的有序列表对每个状态进行排序,从而得到最终的系统状态。

常见的 HealthIndicator

常见的 HealthIndicator 如下表所示:

在这里插入图片描述

Health 端点信息的丰富程度取决于当下应用程序所处的环境,而一个真实的 Health 端点信息如下代码所示:

{
     "status":"UP",
     "components":{
         "db":{
             "status":"UP",
             "details":{
                 "database":"MySQL",
                 "result":1,
                 "validationQuery":"/* ping */ SELECT 1"
             }
         },
         "diskSpace":{
             "status":"UP",
             "details":{
                 "total":201649549312,
                 "free":3491287040,
                 "threshold":10485760
             }
         },
         "ping":{
             "status":"UP"
         }
	}
}

通过以上这些信息,我们就可以判断该环境中是否包含了 MySQL 数据库。


实现HealthIndicator 接口 重写 health方法

现在,我们还想在 Health 端点中暴露 customer-service 当前运行时状态。

为了进一步明确该服务的状态,我们可以自定义一个 CustomerServiceHealthIndicator 端点专门展示 应用 的状态信息,CustomerServiceHealthIndicator 的定义如下所示:

@Component

public class CustomerServiceHealthIndicator implements 

	HealthIndicator {

 
    @Override
    public Health health() {
        try {
				URL url = new  URL("http://localhost:8083/health/");

				HttpURLConnection conn = (HttpURLConnection) url.openConnection();
           		int statusCode = conn.getResponseCode();
            	if (statusCode >= 200 && statusCode < 300) {
               		 return Health.up().build();
            	} else {
                return Health.down().withDetail("HTTP Status Code", statusCode).build();
            }
        } catch (IOException e) {
            return Health.down(e).build();
        }
    }
}

我们需要提供 health() 方法的具体实现并返回一个 Health 结果。该 Health 结果应该包括一个状态,并且可以根据需要添加任何细节信息。

以上代码中,我们使用了一种简单且直接的方式判断配置中心服务“customerservice”是否正在运行。然后我们构建一个 HTTP 请求,并根据 HTTP 响应得出了健康诊断的结论。

如果 HTTP 响应的状态码处于 200~300 之间,我们认为该服务正在运行,此时,Health.up().build() 方法就会返回一种 Up 响应,如下代码所示:

{
    "status": "UP",
    "details": {
        "customerservice":{
            "status": "UP"
        }}
}

如果状态码不处于这个区间(例如返回 404,代表服务不可用),Health.down().withDetail().build() 方法就会返回一个 Down 响应,并给出具体的状态码,如下代码所示:

{
    "status": "DOWN",
    "details": {
        "customerservice":{
            "status": "DOWN",
            "details": {
                "HTTP Status Code": "404"
            }
        },}
}

如果 HTTP 请求直接抛出了异常,Health.down().build() 方法同样会返回一个 Down 响应,并返回异常信息,效果如下代码所示:

{
    "status": "DOWN",
    "details": {
        "customerservice":{
            "status": "DOWN",
            "details": {
                "error": "java.net.ConnectException: Connection refused: connect"
            }
        },}
}

显然,通过扩展 Health 端点为我们实时监控系统中各个服务的正常运行状态提供了很好的支持,我们也可以根据需要构建一系列有用的 HealthIndicator 实现类,并添加报警等监控手段。


小结

Spring Boot 内置的 Actuator 组件使得开发人员在管理应用程序运行的状态有了更加直接且高效的手段。

我们引入了 Actuator 组件并介绍了该组件提供的一系列核心端点,同时重点分析了 Info 和 Health 这两个基础端点,并给出了对它们进行扩展的系统方法。

系统监控的一大目标是收集和分析系统运行时的度量指标,并基于这些指标判断当前的运行时状态。

在这里插入图片描述

以上是关于SpringBoot集成Actuator端点配置的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot2.x系列教程(七十一)Spring Boot Actuator,每一个端点都有案例

SpringBoot2.x系列教程(七十)Spring Boot Actuator集成及自定义Endpoint详解

springboot的actuator/info端点不显示问题

重学SpringBoot系列应用程序监控管理

Spring Boot Actuator

Spring Boot:为执行器端点禁用 https