Spring Boot文档(006)-第五部分

第五部分Spring Boot Actuator:生产就绪功能

Spring Boot包含许多附加功能,可帮助您在应用程序投入生产时监视和管理应用程序。您可以选择使用HTTP端点,JMX甚至远程shell(SSH或Telnet)来管理和监控您的应用程序。审计,健康和指标收集可以自动应用于您的应用程序。

执行器HTTP端点仅适用于基于Spring MVC的应用程序。尤其是,除非启用Spring MVC,否则它将不能与Jersey一起使用。


46.启用生产就绪功能

spring-boot-actuator模块提供了Spring Boot的所有production-ready特性。启用这些特性的最简单的方法是向增加starters依赖项:spring-boot-starter-actuator。

Actuator的定义

actuator 是制造术语,指的是用于移动或控制某物的机械装置。Actuators可以从一个小的变化中产生大量的运动。

要将actuator添加到基于Maven的项目中,请添加以下'Starter'依赖项:


    
        org.springframework.boot
        spring-boot-starter-actuator
    

对于Gradle,使用声明:

dependencies {
    compile("org.springframework.boot:spring-boot-starter-actuator")
}

47.终点

执行器端点允许您监视和与您的应用程序进行交互。Spring Boot包含许多内置端点,您也可以添加自己的端点。例如, health端点提供基本的应用程序健康信息。

端点暴露的方式取决于您选择的技术类型。大多数应用程序选择HTTP监视,其中端点的ID映射到URL。例如,默认情况下,health端点将被映射到/health

以下技术不可知的端点可用:

ID Description Sensitive Default

actuator

为其他端点提供基于超媒体的“发现页面”。要求Spring HATEOAS在类路径上。

true

auditevents

公开当前应用程序的审计事件信息。

true

autoconfig

显示一个自动配置报告,显示所有自动配置的候选人以及他们'为'或'未被'应用的原因。

true

beans

显示应用程序中所有Spring bean的完整列表。

true

configprops

显示所有的整理列表@ConfigurationProperties

true

dump

执行线程转储。

true

env

公开来自Spring的属性ConfigurableEnvironment

true

flyway


显示已应用的所有Flyway数据库迁移。

true

health

显示应用程序运行状况信息(应用程序安全时,通过未经身份验证的连接访问时的简单'状态'或身份验证时的完整邮件详细信息)。

false

info

显示任意的应用信息。

false

loggers

显示修改日志配置

true

liquibase

显示已应用的任何Liquibase数据库迁移。

true

metrics


显示当前应用程序的“指标”信息。

true

mappings

显示所有@RequestMapping路径的整理列表。

true

shutdown

允许应用程序正常关机(默认情况下未启用)。

true

trace

显示跟踪信息(默认情况下是最近的100个HTTP请求)。

true

如果您使用Spring MVC,还可以使用以下附加端点:

ID Description Sensitive Default

docs

Displays documentation, including example requests and responses, for the Actuator’s endpoints. Requires spring-boot-actuator-docs to be on the classpath.

false

heapdump

Returns a GZip compressed hprof heap dump file.

true

jolokia

Exposes JMX beans over HTTP (when Jolokia is on the classpath).

true

logfile

Returns the contents of the logfile (if logging.file or logging.path properties have been set). Supports the use of the HTTP Range header to retrieve part of the log file’s content.

true

 

根据端点的暴露方式,该sensitive属性可以用作安全提示。例如,敏感端点在通过HTTP访问时将需要用户名/密码(或者如果未启用Web安全性,则仅需禁用)。

47.1定制endpoints

终端可以使用Spring属性进行自定义。您可以更改端点enabled是否已经考虑sensitive,甚至是否已考虑端点 id

例如,这是一个application.properties改变beans端点的灵敏度和ID 并且启用的例子shutdown

endpoints.beans.id=springbeans
endpoints.beans.sensitive=false
endpoints.shutdown.enabled=true

前缀“ endpoints.name”用于唯一标识正在配置的端点。

默认情况下,除了以外的所有端点shutdown都已启用。如果您更愿意专门选择“启用”端点启用,则可以使用该endpoints.enabled属性。例如,以下将禁用除以下所有端点之外的所有端点info

endpoints.sensitive=true
endpoints.info.sensitive=false

47.2用于执行器MVC端点的超媒体

如果endpoints.hypermedia.enabled设置为,true并且 Spring HATEOAS位于类路径中(例如通过spring-boot-starter-hateoas或如果您使用的是Spring Data REST),那么来自Actuator的HTTP端点会通过超媒体链接进行增强,并且会添加一个“发现页面”端点。“发现页面” /actuator默认可用。它被实现为一个端点,允许使用属性来配置它的路径(endpoints.actuator.path)以及它是否被启用(endpoints.actuator.enabled)。

在配置自定义管理上下文路径时,“发现页面”将自动移至/actuator管理上下文的根目录。例如,如果管理上下文路径是/management可用的,那么发现页面将可用/management

如果HAL浏览器通过其webjar(org.webjars:hal-browser)位于类路径中,或者通过spring-data-rest-hal-browserHAL浏览器形式的HTML“发现页面”提供。

47.3 CORS支持

跨源资源共享 (CORS)是W3C规范,允许您以灵活的方式指定哪种跨域请求得到授权。执行器的MVC端点可以配置为支持这种方案。

CORS支持默认是禁用的,只有在endpoints.cors.allowed-origins属性设置后才能启用 。下面的配置允许 GETPOST来自example.com域的请求

endpoints.cors.allowed-origins=http://example.com
endpoints.cors.allowed-methods=GET,POST

检查EndpointCorsProperties 以获取完整的选项列表。

47.4添加自定义端点

如果添加一个@Bean类型Endpoint,它将自动通过JMX和HTTP公开(如果有可用的服务器)。可以通过创建类型的bean来进一步定制HTTP端点MvcEndpoint。你MvcEndpoint不是,@Controller但它可以使用@RequestMapping(和@Managed*)来公开资源。

如果你这样做是为库特征考虑增加带注释的配置类@ManagementContextConfiguration/META-INF/spring.factories下键org.springframework.boot.actuate.autoconfigure.ManagementContextConfiguration。如果你这样做,那么如果你的用户要求一个单独的管理端口或地址,那么端点将与所有其他MVC端点一起移动到子上下文。以这种方式声明的配置可以是a,WebConfigurerAdapter如果它想要将静态资源(例如)添加到管理端点。

47.5健康信息

健康信息可用于检查正在运行的应用程序的状态。如果生产系统停机,它通常被监控软件用来提醒某人。health端点公开的默认信息取决于它如何被访问。对于安全应用程序中的未经身份验证的连接,将返回一个简单的“状态”消息,对于已验证的连接,还会显示其他详细信息(有关HTTP详细信息,请参见 第48.7节“HTTP健康端点格式和访问限制”)。

健康信息从您的所有HealthIndicatorbean中收集 ApplicationContext。Spring Boot包含许多自动配置 HealthIndicators,您也可以编写自己的。默认情况下,最终的系统状态是由HealthAggregator每个状态HealthIndicator 根据状态的有序列表对状态进行排序得出的。排序列表中的第一个状态用作整体健康状态。如果没有HealthIndicator返回一个已知状态 HealthAggregator,一种UNKNOWN是使用状态。

47.6安全与健康指标

返回的信息HealthIndicators往往在某种程度上是敏感的。例如,您可能不想将数据库服务器的详细信息发布到全球。为此,默认情况下,只有健康状态通过未经身份验证的HTTP连接公开。如果您对完整的健康信息感到满意并始终可以接受,您可以设置endpoints.health.sensitivefalse

还会缓存健康响应以防止“拒绝服务”攻击。endpoints.health.time-to-live如果您想更改1000毫秒的默认缓存时间段,请使用该 属性。

47.6.1自动配置的HealthIndicators

以下HealthIndicators情况在适当时由Spring Boot自动配置:

名称 描述

CassandraHealthIndicator

检查Cassandra数据库是否启动。

DiskSpaceHealthIndicator

检查磁盘空间不足。

DataSourceHealthIndicator

检查是否可以获得连接DataSource

ElasticsearchHealthIndicator

检查Elasticsearch集群是否启动。

JmsHealthIndicator

检查JMS代理是否启动。

MailHealthIndicator

检查邮件服务器是否启动。

MongoHealthIndicator

检查Mongo数据库是否启动。

RabbitHealthIndicator

检查Rabbit服务器是否启动。

RedisHealthIndicator

检查Redis服务器是否启动。

SolrHealthIndicator

检查Solr服务器是否已启动。

 

可以使用该management.health.defaults.enabled 属性全部禁用它们。

47.6.2编写自定义HealthIndicators

要提供自定义健康信息,您可以注册实现该HealthIndicator接口的Spring bean 。您需要提供health()方法的实现并返回Health 响应。的Health响应应该包括一个状态,并且可以任选地包括另外的细节被显示。

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 {

    @Override
    public Health health() {
        int errorCode = check(); // perform some specific health check
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }

}


给定的标识符HealthIndicator是没有HealthIndicator后缀的bean的名称( 如果存在)。在上面的示例中,健康信息将在名为的条目中可用my

除了Spring Boot的预定义Status 类型之外,还可以Health返回Status代表新系统状态的自定义。在这种情况下,HealthAggregator 还需要提供接口的自定义实现 ,或者必须使用management.health.status.order配置属性来配置默认实现。

例如,假设在您的某个实现中使用 了新Status的代码。要配置严重性顺序,请将以下内容添加到应用程序属性中:FATALHealthIndicator

management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP

响应中的HTTP状态代码反映整体健康状况(例如,UP 映射到200 OUT_OF_SERVICEDOWN503)。HealthMvcEndpoint如果您通过HTTP访问健康端点,您可能还需要注册自定义状态映射。例如,以下映射FATAL到503(服务不可用):

endpoints.health.mapping.FATAL=503

内置状态的默认状态映射为:

Status Mapping

DOWN

SERVICE_UNAVAILABLE (503)

OUT_OF_SERVICE

SERVICE_UNAVAILABLE (503)

UP

No mapping by default, so http status is 200

UNKNOWN

No mapping by default, so http status is 200

47.7.1自动配置InfoContributors

以下InfoContributors情况在适当时由Spring Boot自动配置:

名称 描述

EnvironmentInfoContributor

公开钥匙Environment下的任何info钥匙。

GitInfoContributor

如果git.properties文件可用,请暴露git信息。

BuildInfoContributor

如果META-INF/build-info.properties文件可用,则公开构建信息。

可以使用该management.info.defaults.enabled 属性全部禁用它们。

47.7.2自定义应用程序信息信息

您可以info通过设置info.*Spring属性来自定义端点公开的数据。Environment信息键下的所有属性将自动公开。例如,您可以将以下内容添加到您的application.properties

info.app.encoding=UTF-8
info.app.java.source=1.8
info.app.java.target=1.8

您可以在构建时展开信息属性,而不是对这些值进行硬编码 。

假设你正在使用Maven,你可以重写上面的例子,如下所示:

[email protected]@
[email protected]@
[email protected]@

47.7.3 Git提交信息

info端点的另一个有用特性是它能够git在构建项目时发布有关源代码库状态的信息。如果 GitProperties豆可用,git.branchgit.commit.idgit.commit.time属性将被暴露出来。

GitProperties如果git.properties文件在类路径的根目录中可用,则会自动配置一个bean 。有关更多详细信息,请参阅 生成git信息。

如果你想显示完整的git信息(即完整的内容 git.properties),使用management.info.git.mode属性:

management.info.git.mode=full

47.7.4构建信息

info如果BuildProperties bean可用,端点还可以发布关于您的构建的信息。如果META-INF/build-info.properties文件在类路径中可用,则会发生这种情况。

Maven和Gradle插件都可以生成该文件,请参阅 生成构建信息以获取更多详细信息。

47.7.5编写自定义InfoContributors

要提供自定义应用程序信息,您可以注册实现该InfoContributor接口的Spring bean 。

以下示例example为单个值提供了条目:

import java.util.Collections;

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

@Component
public class ExampleInfoContributor implements InfoContributor {

    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("example",
                Collections.singletonMap("key", "value"));
    }

}

如果您点击了info端点,您应该看到一个包含以下附加条目的响应:

{
    "example": {
        "key" : "value"
    }
}

48.通过HTTP进行监控和管理

如果您正在开发Spring MVC应用程序,Spring Boot Actuator会自动配置所有已启用的端点以通过HTTP进行公开。默认约定是 id将该端点用作URL路径。例如,health被暴露为/health

48.1访问敏感端点

默认情况下,所有敏感的HTTP端点都是安全的,只有具有ACTUATOR角色的用户才能 访问它们。安全性是使用标准 HttpServletRequest.isUserInRole方法实施的。

management.security.roles如果您想要与其他东西不同,请使用该属性 ACTUATOR

如果您在防火墙后面部署应用程序,您可能更喜欢所有的执行器端点都可以在不需要验证的情况下进行访问。你可以通过改变management.security.enabled属性来做到这一点:

application.properties。 

management.security.enabled=false

默认情况下,执行器端点暴露在提供常规HTTP流量的同一端口上。注意不要在更改management.security.enabled属性时意外暴露敏感信息。

如果您公开部署应用程序,则可能需要添加'Spring Security'来处理用户身份验证。当添加“Spring Security”时,默认情况下,“基本”身份验证将与用户名user和生成的密码一起使用(在应用程序启动时在控制台上打印)。

生成的密码在应用程序启动时记录。搜索'使用默认安全密码'。

您可以使用Spring属性更改用户名和密码,并更改访问端点所需的安全角色。例如,您可以在您的设置中设置以下内容application.properties

security.user.name=admin
security.user.password=secret
management.security.roles=SUPERUSER

如果您的应用程序具有自定义安全配置,并且希望所有执行器端点无需身份验证即可访问,则需要在安全配置中明确配置该端点。除此之外,您需要将management.security.enabled 属性更改为false

如果您的自定义安全配置保护您的执行器端点,则还需要确保经过身份验证的用户具有在下指定的角色management.security.roles

如果您没有用于向未经认证的用户公开基本健康信息的用例,并且您已经使用自定义安全保护了执行器端点,则可以设置management.security.enabled 为false。这将通知Spring Boot跳过额外的角色检查。

48.2自定义管理端点路径

有时将所有管理端点分组在单一路径下很有用。例如,您的应用程序可能已经/info用于其他目的。您可以使用该 management.context-path属性为您的管理端点设置前缀:

management.context-path=/manage

application.properties上面的例子会将端点从(例如)/{id}改为 。/manage/{id}/manage/info

除非管理端口已被配置为 使用不同的HTTP端口暴露端点,management.context-path相对于server.context-path

您还可以更改端点(使用endpoints.{name}.id)的“id” ,然后更改MVC端点的默认资源路径。法定端点ID仅由字母数字字符组成(因为它们可能会暴露在许多地方,包括禁止使用特殊字符的JMX对象名称)。MVC路径可以通过配置单独更改endpoints.{name}.path,并且不会验证这些值(因此您可以使用URL路径中合法的任何内容)。例如,要更改/health端点的位置,/ping/me您可以设置 endpoints.health.path=/ping/me

即使端点路径分别配置,它仍然相对于 management.context-path

如果您提供自定义MvcEndpoint记住要包含一个可设置的path属性,并且/{id}如果您希望您的代码像标准MVC端点一样运行,那么将其默认设置为。(看看HealthMvcEndpoint你会怎么做。)如果你的自定义端点是一个Endpoint(而不是MvcEndpoint),那么Spring Boot将为你处理路径。

48.3自定义管理服务器端口

使用默认的HTTP端口公开管理端点是基于云的部署的明智选择。但是,如果您的应用程序在您自己的数据中心内运行,则您可能更愿意使用不同的HTTP端口公开端点。

management.port属性可用于更改HTTP端口。

management.port=8081

由于您的管理端口通常受防火墙保护,并且不向公众公开,即使您的主应用程序是安全的,您也可能不需要管理端点上的安全性。在这种情况下,您将在类路径中拥有Spring Security,并且可以像这样禁用管理安全性:

management.security.enabled=false

(如果你在类路径中没有Spring Security,那么就没有必要用这种方式显式地禁用管理安全性,甚至可能会破坏应用程序。)

48.4配置特定于管理的SSL

配置为使用自定义端口时,管理服务器也可以使用各种management.ssl.*属性使用自己的SSL进行配置。例如,这允许管理服务器通过HTTP可用,而主应用程序使用HTTPS:

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.port=8080
management.ssl.enabled=false

或者,主服务器和管理服务器都可以使用SSL,但使用不同的密钥存储区:

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.port=8080
management.ssl.enabled=true
management.ssl.key-store=classpath:management.jks
management.ssl.key-password=secret

48.5自定义管理服务器地址

您可以通过设置management.address属性来自定义管理端点可用的地址。如果您只想在内部或面向操作的网络上进行监听,或者仅侦听来自其的连接,这会非常有用localhost

如果端口与主服务器端口不同,则只能监听其他地址。

这是一个application.properties不允许远程管理连接的例子:

management.port=8081
management.address=127.0.0.1

48.6禁用HTTP端点

如果您不想通过HTTP公开端点,则可以将管理端口设置为-1

management.port=-1

48.7 HTTP健康端点格式和访问限制

健康端点公开的信息取决于是否匿名访问,以及封闭应用程序是否安全。默认情况下,当在安全应用程序中匿名访问时,隐藏有关服务器健康状况的任何详细信息,端点将仅指示服务器是启动还是关闭。此外,响应会缓存一段可配置的时间,以防止终端用于拒绝服务攻击。该endpoints.health.time-to-live 属性用于配置以毫秒为单位的缓存周期。它默认为1000,即一秒。

汇总的HTTP响应示例(匿名请求的缺省值):

$ curl -i localhost:8080/health
HTTP/1.1 200
X-Application-Context: application
Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
Content-Length: 15

{"status":"UP"}

汇总状态为“DOWN”的HTTP响应示例(请注意503状态码)

curl -i localhost:8080/health
HTTP/1.1 503
X-Application-Context: application
Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
Content-Length: 17

示例详细的HTTP响应:

$ curl -i localhost:8080/health
HTTP/1.1 200 OK
X-Application-Context: application
Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
Content-Length: 221

{
  "status" : "UP",
  "diskSpace" : {
    "status" : "UP",
    "total" : 63251804160,
    "free" : 31316164608,
    "threshold" : 10485760
  },
  "db" : {
    "status" : "UP",
    "database" : "H2",
    "hello" : 1
  }
}

可以增强上述限制,从而只允许经过认证的用户完全访问安全应用程序中的运行状况端点。为此,请设置 endpoints.health.sensitivetrue。以下是行为总结(默认 sensitive标志值“false”以粗体显示):

management.security.enabled endpoints.health.sensitive Unauthenticated Authenticated (with right role)

false

*

Full content

Full content

true

false

Status only

Full content

true

true

No content

Full content

 

49.监控和管理JMX

Java管理扩展(JMX)提供了一个标准机制来监视和管理应用程序。默认情况下,Spring Boot会将管理端点公开为org.springframework.boot域下的JMX MBean 。

49.1定制MBean名称

MBean的名称通常是从id端点生成的。例如,health端点被暴露为org.springframework.boot/Endpoint/healthEndpoint

如果您的应用程序包含多个Spring,ApplicationContext您可能会发现名称冲突。要解决此问题,可以将endpoints.jmx.unique-names属性设置为true使MBean名称始终唯一。

您还可以自定义公开端点的JMX域。这里是一个例子application.properties

endpoints.jmx.domain=myapp
endpoints.jmx.unique-names=true

49.2禁用JMX端点

如果您不想通过JMX公开端点,则可以将该endpoints.jmx.enabled 属性设置为false

endpoints.jmx.enabled=false

49.3使用Jolokia进行JMX over HTTP

Jolokia是一个JMX-HTTP桥梁,它提供了访问JMX bean的另一种方法。要使用Jolokia,只需添加依赖项即可org.jolokia:jolokia-core。例如,使用Maven你可以添加以下内容:


    org.jolokia
    jolokia-core
 

然后可以/jolokia在管理HTTP服务器上访问Jolokia 。

49.3.1定制Jolokia

Jolokia有许多您通常会使用servlet参数进行配置的设置。使用Spring Boot,你可以使用你application.properties的参数,只需在参数前加上jolokia.config.

jolokia.config.debug=true

49.3.2禁用Jolokia

如果您使用的是Jolokia,但您不希望Spring Boot配置它,只需将该endpoints.jolokia.enabled属性设置 为false

endpoints.jolokia.enabled=false

50.使用远程shell进行监视和管理(不建议使用)

Spring Boot支持一个名为'CRaSH'的集成Java外壳。您可以使用CRaSH进入 sshtelnet运行正在运行的应用程序。要启用远程shell支持,请将以下依赖项添加到您的项目中:


    org.springframework.boot
    spring-boot-starter-remote-shell
 

远程shell已弃用,并将在Spring Boot 2.0中删除。

如果你还想启用telnet访问,你还需要依赖org.crsh:crsh.shell.telnet

CRaSH需要在运行时编译命令时使用JDK运行。如果基本 help命令失败,那么您可能正在运行JRE。

50.1连接到远程外壳

默认情况下,远程shell会侦听端口上的连接2000。默认用户是user,并且默认密码将随机生成并显示在日志输出中。如果您的应用程序使用Spring Security,则默认情况下,shell将使用 相同的配置。如果不是,将应用一个简单的身份验证,您应该看到如下消息:

Using default password for shell access: ec03e16c-4cf4-49ee-b745-7c8255c1dd7e

Linux和OSX用户可以使用ssh连接到远程shell,Windows用户可以下载并安装PuTTY。

$ ssh -p 2000 user@localhost

user@localhost's password:
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v1.5.14.RELEASE) on myhost

键入help命令列表。春季启动提供metricsbeansautoconfig 和endpoint命令。

50.1.1远程外壳凭证

您可以使用management.shell.auth.simple.user.name和 management.shell.auth.simple.user.password属性来配置自定义连接凭证。也可以使用'Spring Security' AuthenticationManager来处理登录职责。见 CrshAutoConfiguration 和ShellProperties Javadoc文档的全部细节。

50.2扩展远程shell

远程shell可以用很多有趣的方式进行扩展。

50.2.1远程shell命令

您可以使用Groovy编写其他shell命令(有关详细信息,请参阅CRaSH文档)。由于CRaSH的Java编译器的限制,不支持用Java编写的命令。默认情况下,Spring Boot将在以下位置搜索命令:

  • classpath*:/commands/**
  • classpath*:/crash/commands/**

您可以通过设置shell.command-path-patterns属性来更改搜索路径。

如果您使用的是可执行档案,则shell命令依赖的任何类必须打包在嵌套jar中,而不是直接放在可执行jar或war中。

这是一个简单的'hello'命令,可以从中加载 src/main/resources/commands/hello.groovy

package commands

import org.crsh.cli.Command
import org.crsh.cli.Usage
import org.crsh.command.InvocationContext

class hello {

    @Usage("Say Hello")
    @Command
    def main(InvocationContext context) {
        return "Hello"
    }

}

Spring Boot为InvocationContext您可以从命令访问的附加属性添加一些附加属性:

属性名称 描述

spring.boot.version

Spring Boot的版本

spring.version

核心Spring框架的版本

spring.beanfactory

进入春天 BeanFactory

spring.environment

进入春天 Environment

50.2.2远程shell插件

除了新命令外,还可以扩展其他CRaSH shell功能。所有延伸的Spring Beans org.crsh.plugin.CRaSHPlugin将自动注册到shell中。

有关更多信息,请参阅CRaSH参考文档。


51.loggers

 

Spring Boot Actuator包含在运行时查看和配置应用程序日志级别的功能。您可以查看整个列表或单个记录器的配置,该配置由明确配置的记录级别以及记录框架赋予的有效记录级别组成。这些级别可以是:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • OFF
  • null

null指出没有明确的配置。

51.1配置记录器

为了配置一个给定的记录器,你需要POST一个部分实体到资源的URI:

{
    "configuredLevel": "DEBUG"
}

52.Metrics

Spring Boot Actuator包含一个带“量规”和“柜台”支持的度量服务。“量表”记录单个值; '计数器'记录增量(增量或减量)。Spring Boot Actuator还提供了一个PublicMetrics可以实现的 界面,用于公开您无法通过这两种机制之一记录的指标。看SystemPublicMetrics 一个例子。

所有HTTP请求的度量标准都会自动记录下来,所以如果你点击了metrics 端点,你应该看到类似这样的响应:

{
    "counter.status.200.root": 20,
    "counter.status.200.metrics": 3,
    "counter.status.200.star-star": 5,
    "counter.status.401.root": 4,
    "gauge.response.star-star": 6,
    "gauge.response.root": 2,
    "gauge.response.metrics": 3,
    "classes": 5808,
    "classes.loaded": 5808,
    "classes.unloaded": 0,
    "heap": 3728384,
    "heap.committed": 986624,
    "heap.init": 262144,
    "heap.used": 52765,
    "nonheap": 0,
    "nonheap.committed": 77568,
    "nonheap.init": 2496,
    "nonheap.used": 75826,
    "mem": 986624,
    "mem.free": 933858,
    "processors": 8,
    "threads": 15,
    "threads.daemon": 11,
    "threads.peak": 15,
    "threads.totalStarted": 42,
    "uptime": 494836,
    "instance.uptime": 489782,
    "datasource.primary.active": 5,
    "datasource.primary.usage": 0.25
}

在这里我们可以看到基本的memoryheapclass loadingprocessorthread pool 一些HTTP度量标准的信息。在这种情况下,root('/')和/metrics URL分别返回HTTP 200响应203时间。它也显示rootURL返回HTTP 401(未授权)4时间。double asterisks(star-star)来自与Spring MVC匹配的请求/**(通常是静态资源)。

gauge显示上次响应时间的请求。所以,最后一次请求root了 2ms回应,最后一个/metrics3ms

在这个例子中,我们实际上是使用/metricsURL 通过HTTP访问端点 ,这解释了为什么会metrics出现在响应中

52.1系统度量

Spring Boot公开以下系统度量标准:

  • KB(mem)中的总系统内存
  • 可用内存量(KB)(mem.free
  • 处理器数量(processors
  • 系统正常运行时间(毫秒)(uptime
  • 以毫秒为单位的应用程序上下文正常运行时间(instance.uptime
  • 平均系统负载(systemload.average
  • 堆信息KB( ,heapheap.committed,)heap.initheap.used
  • 线程信息(threadsthread.peakthread.daemon
  • 类负载信息(classesclasses.loadedclasses.unloaded
  • 垃圾收集信息(gc.xxx.countgc.xxx.time

52.2数据源指标

针对DataSource您的应用程序中定义的每个支持,公开以下指标:

  • 活动连接的数量(datasource.xxx.active
  • 连接池(datasource.xxx.usage)的当前使用情况。

所有数据源指标都共享datasource.前缀。前缀进一步限定为每个数据源:

  • 如果数据源是主数据源(即唯一可用的数据源或现有数据源中标记的数据源@Primary),则前缀为 datasource.primary
  • 如果数据源豆名称结尾DataSource,前缀是bean的无名称DataSource(即datasource.batchbatchDataSource)。
  • 在所有其他情况下,使用bean的名称。

通过注册一个具有自定义版本的bean可以覆盖部分或全部这些默认值DataSourcePublicMetrics。默认情况下,Spring Boot为所有支持的数据源提供元数据; DataSourcePoolMetadataProvider 如果您最喜爱的数据源不受支持,您可以添加额外的bean。DataSourcePoolMetadataProvidersConfiguration举例来看 。

52.3高速缓存指标

针对应用程序中定义的每个支持的缓存公开以下指标:

  • 缓存的当前大小(cache.xxx.size
  • 命中率(cache.xxx.hit.ratio
  • 小姐比例(cache.xxx.miss.ratio

高速缓存提供程序不会以一致的方式显示命中/错过率。虽然一些暴露的聚集值(即自上次的统计信息被清除的命中率),其他暴露时间值(即最后一秒钟的命中率)。查看你的缓存提供者文档以获得更多细节。

如果两个不同的缓存管理器碰巧定义了相同的缓存,则缓存的名称前面加上了该CacheManagerbean 的名称。

通过注册一个具有自定义版本的bean可以覆盖部分或全部这些默认值CachePublicMetrics。默认情况下,Spring Boot为EhCache,Hazelcast,Infinispan,JCache和Guava提供缓存统计信息。CacheStatisticsProvider如果您最喜爱的缓存库不支持开箱即用,您可以添加额外的bean。CacheStatisticsAutoConfiguration举例来看。

52.4 Tomcat会话度量

如果您使用Tomcat作为嵌入式servlet容器,会话度量标准将自动公开。在httpsessions.activehttpsessions.max键提供主动和最大会话数。

52.5记录您自己的指标

记录你自己的指标注入一个 CounterService和/或 GaugeService到你的bean中。的CounterService自曝incrementdecrementreset方法; 在GaugeService提供了一个submit方法。

下面是一个简单的例子,它计算一个方法被调用的次数:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.metrics.CounterService;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private final CounterService counterService;

    @Autowired
    public MyService(CounterService counterService) {
        this.counterService = counterService;
    }

    public void exampleMethod() {
        this.counterService.increment("services.system.myservice.invoked");
    }

}

您可以使用任何字符串作为度量标准名称,但应遵循所选商店/制图技术的指导原则。关于Graphite的一些很好的指导可以在 Matt Aimonetti的Blog上找到。

52.6添加您自己的公开指标

要添加每次调用度量标准端点时计算出的附加度量标准,只需注册其他的PublicMetrics实施bean 即可。默认情况下,所有这些bean都由端点收集。你可以通过定义你自己的方法来轻松改变它 MetricsEndpoint

52.7 Java 8的特殊功能

Spring Boot 的默认实现GaugeServiceCounterService提供依赖于您使用的Java版本。使用Java 8(或更高版本),实现切换到针对快速写入优化的高性能版本,并由原子内存缓冲区支持,而不是由不可变但相对昂贵的 Metric类型(计数器速度快大约5倍,测试速度大约是基于存储库的实现速度的两倍)。即使对于Java 7(它们具有某些Java 8并发库的反向端口),Dropwizard度量服务(见下文)也非常有效,但它们不记录度量值的时间戳。如果衡量指标收集的性能是一个问题,那么始终建议使用其中一个高性能选项,并且只能不频繁地读取指标,以便写入在本地进行缓冲,并且只在需要时才读取。

如果您使用的是Java 8或者如果您使用的是Dropwizard度量标准,则旧的MetricRepository和其InMemoryMetricRepository实现不会默认使用。

52.8度量编写者,出口商和聚合

Spring Boot提供了一个标记接口的实现,称为标记接口Exporter ,可用于将度量标准读数从内存缓冲区复制到可以分析和显示它们的位置。事实上,如果您提供了一个@Bean实现MetricWriter接口(或GaugeWriter简单用例)的 接口并对其进行标记 @ExportMetricWriter,那么它将自动连接到Exporter每5秒更新的馈送度量标准(通过配置spring.metrics.export.delay-millis)。另外,MetricReader您定义并标记为的任何@ExportMetricReader值都将由默认导出器导出其值。

此功能在您的应用程序(@EnableScheduling)中启用计划,如果您运行集成测试,因为您的计划任务将启动,这可能会造成问题。您可以通过设置spring.metrics.export.enabled为禁用此行为false

默认导出器是一种MetricCopyExporter通过不复制自上次调用以来未更改过的值(可以使用标志关闭优化)来优化自身的方法spring.metrics.export.send-latest。另请注意,Dropwizard MetricRegistry不支持时间戳,因此如果您使用Dropwizard度量标准(所有度量标准将在每个时间点上复制),则优化不可用。

对于出口触发的默认值(delay-millisincludesexcludes 和send-latest)可以设置为spring.metrics.export.*。对于特定个人的值MetricWriters可以被设置为 spring.metrics.export.triggers..*其中是一个bean名称(或图案匹配bean的名字)。

如果关闭默认设置MetricRepository(例如,使用Dropwizard度量标准),则会自动导出度量 标准。你可以返回相同的功能,声明一个你自己类型的bean MetricReader并声明它是@ExportMetricReader

52.8.1示例:导出到Redis

如果您提供了一个@Bean类型RedisMetricRepository并将其标记,@ExportMetricWriter 则度量标准将导出到Redis缓存中进行聚合。该RedisMetricRepository有配置它用于此目的的两个重要参数:prefixkey(通过到它的构造)。最好使用对应用程序实例唯一的前缀(例如,使用随机值并可能使应用程序的逻辑名称与相同应用程序的其他实例相关联)。“键”用于保留所有度量名称的全局索引,因此它应该是“全局”唯一的,无论对于您的系统而言是什么意思(例如,如果具有不同的键,同一系统的两个实例可共享Redis缓存) 。

例:

@Bean
@ExportMetricWriter
MetricWriter metricWriter(MetricExportProperties export) {
    return new RedisMetricRepository(connectionFactory,
        export.getRedis().getPrefix(), export.getRedis().getKey());
}

application.properties。 

spring.metrics.export.redis.prefix: metrics.mysystem.${spring.application.name:application}.${random.value:0000}
spring.metrics.export.redis.key: keys.metrics.mysystem

该前缀是在末尾使用应用程序名称和ID构建的,因此可以轻松地用于稍后识别具有相同逻辑名称的一组进程。

重要的是要设置keyprefix。密钥用于所有存储库操作,并可由多个存储库共享。如果多个存储库共享一个密钥(就像在需要聚合它们的情况下一样),那么通常有一个只读的“主”存储库,它有一个简短但可识别的前缀(如“metrics.mysystem”),以及许多只有以主前缀开头的前缀的只写存储库(metrics.mysystem.*如上例所示)。从这样的“主”存储库中读取所有密钥是有效的,但是读取具有较长前缀的子集(例如使用其中一个写入存储库)效率低下。

上面的例子使用MetricExportProperties注入和提取密钥和前缀。这是作为Spring Boot的一个方便提供给您的,它配置了合理的默认值。只要他们遵循这些建议,没有什么可以阻止你使用自己的价值观。

52.8.2示例:导出到打开TSDB

如果您提供一种@Bean类型OpenTsdbGaugeWriter并将其标记 @ExportMetricWriter为导出到打开TSDB进行聚合。该OpenTsdbGaugeWriter有一个url,你需要设置为打开TSDB“/放”端点,例如物业localhost:4242/api/put)。它还有一个 namingStrategy可以自定义或配置以使指标与您在服务器上需要的数据结构相匹配的指标。默认情况下,它只是将度量标准名称作为Open TSDB度量标准名称进行传递,并将标记“domain”(值为“org.springframework.metrics”)和“process”(值等于命名对象哈希值战略)。因此,在运行应用程序并生成一些指标后,您可以检查TSD UI中的指标(默认为localhost:4242)。

例:

curl localhost:4242/api/query?start=1h-ago&m=max:counter.status.200.root
[
    {
        "metric": "counter.status.200.root",
        "tags": {
            "domain": "org.springframework.metrics",
            "process": "b968a76"
        },
        "aggregateTags": [],
        "dps": {
            "1430492872": 2,
            "1430492875": 6
        }
    }
]

52.8.3示例:导出为Statsd

要将度量标准导出到Statsd,首先确保您已添加 com.timgroup:java-statsd-client为项目的依赖项(Spring Boot为其提供依赖项管理)。然后spring.metrics.export.statsd.host 为您的application.properties文件添加一个值。8125 除非提供spring.metrics.export.statsd.port覆盖,否则连接将打开到端口。spring.metrics.export.statsd.prefix如果你想要一个自定义前缀,你可以使用 。

或者,您可以提供一种@Bean类型StatsdMetricWriter并标记它 @ExportMetricWriter

@Value("${spring.application.name:application}.${random.value:0000}")
private String prefix = "metrics";

@Bean
@ExportMetricWriter
MetricWriter metricWriter() {
    return new StatsdMetricWriter(prefix, "localhost", 8125);
}

52.8.4示例:导出到JMX

如果您提供了标记@Bean类型的度量标准,则会将度量标准导出为本地服务器的MBean(只要打开它即可由Spring Boot JMX自动配置提供)。然后可以使用任何了解JMX的工具(例如JConsole或JVisualVM)来检查,绘制度量标准,提醒等等。JmxMetricWriter@ExportMetricWriterMBeanExporter

例:

@Bean
@ExportMetricWriter
MetricWriter metricWriter(MBeanExporter exporter) {
    return new JmxMetricWriter(exporter);
}

每个度量都作为单独的MBean导出。该格式ObjectNames由一个ObjectNamingStrategy可以注入到JmxMetricWriter(默认分割度量标准名称并以JVisualVM或JConsole中的度量值组很好的方式标记前两个由句点分隔的部分)中给出。

52.9汇总来自多个来源的指标

有一个AggregateMetricReader,你可以用它来整合来自不同物理源指标。相同逻辑度量标准的源只需要用句点分隔的前缀来发布它们,阅读器就会聚合在一起(通过截断度量标准名称和删除前缀)。计数器被汇总,其他所有数据(例如量表)都取最近的值。

如果多个应用程序实例提供给中央(例如Redis)存储库并且要显示结果,这非常有用。特别建议与a MetricReaderPublicMetrics连接以将结果连接到“/ metrics”端点。

例:

@Autowired
private MetricExportProperties export;

@Bean
public PublicMetrics metricsAggregate() {
    return new MetricReaderPublicMetrics(aggregatesMetricReader());
}

private MetricReader globalMetricsForAggregation() {
    return new RedisMetricRepository(this.connectionFactory,
        this.export.getRedis().getAggregatePrefix(), this.export.getRedis().getKey());
}

private MetricReader aggregatesMetricReader() {
    AggregateMetricReader repository = new AggregateMetricReader(
        globalMetricsForAggregation());
    return repository;
}

上面的例子使用MetricExportProperties注入和提取密钥和前缀。Spring Boot为您提供了一个便利,默认值是明智的。他们被安置在MetricExportAutoConfiguration

MetricReaders上述不@Beans和没有标记为 @ExportMetricReader,因为他们只是收集和分析来自其他存储库的数据,并且不希望出口他们的价值观。

52.10 Dropwizard指标

MetricRegistry当您向io.dropwizard.metrics:metrics-core库声明依赖项时,将创建一个默认的Spring bean ; @Bean 如果您需要定制,您还可以注册您自己的实例。该用户 Dropwizard“指标”库会发现,春天开机指标会自动发布到com.codahale.metrics.MetricRegistry。这些指标MetricRegistry也会通过/metrics 端点自动公开

当Dropwizard指标都在使用,默认的CounterServiceGaugeService被替换为DropwizardMetricServices,这是围绕着一个包装MetricRegistry (这样你就可以@Autowired其中的一个服务,并以此为正常)。您还可以创建“特殊”Dropwizard指标,方法是在指标名称前面添加适当的类型(例如timer.*histogram.*计量器和meter.*计数器)。

52.11消息通道集成

如果MessageChannel调用的bean metricsChannel存在,MetricWriter则会创建一个将度量标准写入该频道的a。发送到该频道的每条消息将包含一个Delta或 一个Metric有效载荷并具有一个metricName 标题。作者会自动连接到导出器(所有作者),因此所有度量值都将显示在通道上,并且可以通过订阅者进行额外的分析或操作(您可以根据需要提供您需要的频道和任何订阅者)。

53.Auditing

Spring Boot Actuator有一个灵活的audit框架,一旦Spring Security发挥作用就会发布事件(默认为'认证成功','失败'和'拒绝访问'异常)。这对报告非常有用,并且可以基于身份验证失败实施锁定策略。要定制发布的安全事件,您可以提供自己的AbstractAuthenticationAuditListener和 的实现AbstractAuthorizationAuditListener

您也可以选择将审计服务用于您自己的业务事件。要做到这一点,您可以将现有AuditEventRepository注入到自己的组件中,直接使用它,也可以AuditApplicationEvent通过Spring ApplicationEventPublisher(使用ApplicationEventPublisherAware)进行简单发布。

54.Tracing

所有HTTP请求都会自动启用跟踪。您可以查看trace端点并获取有关最近100次请求的基本信息:

[{
    "timestamp": 1394343677415,
    "info": {
        "method": "GET",
        "path": "/trace",
        "headers": {
            "request": {
                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
                "Connection": "keep-alive",
                "Accept-Encoding": "gzip, deflate",
                "User-Agent": "Mozilla/5.0 Gecko/Firefox",
                "Accept-Language": "en-US,en;q=0.5",
                "Cookie": "_ga=GA1.1.827067509.1390890128; ..."
                "Authorization": "Basic ...",
                "Host": "localhost:8080"
            },
            "response": {
                "Strict-Transport-Security": "max-age=31536000 ; includeSubDomains",
                "X-Application-Context": "application:8080",
                "Content-Type": "application/json;charset=UTF-8",
                "status": "200"
            }
        }
    }
},{
    "timestamp": 1394343684465,
    ...
}]

以下内容默认包含在跟踪中:

Name Description

Request Headers

Headers from the request.

Response Headers

Headers from the response.

Cookies

Cookie from request headers and Set-Cookie from response headers.

Errors

The error attributes (if any).

Time Taken

The time taken to service the request in milliseconds.

54.1自定义跟踪

如果您需要跟踪其他事件,则可以将注入 TraceRepository到Spring bean中。该add方法接受Map将被转换为JSON并记录的单个结构。

默认情况下InMemoryTraceRepository会使用存储最近100次事件的事件。InMemoryTraceRepository如果需要扩展容量,则可以定义自己的bean 实例。TraceRepository如果需要,您也可以创建自己的替代实现。

55.过程监控

在Spring Boot Actuator中,您可以找到几个类来创建对进程监视有用的文件:

  • ApplicationPidFileWriter创建一个包含应用程序PID的文件(默认情况下位于具有文件名的应用程序目录中application.pid)。
  • EmbeddedServerPortFileWriter创建一个包含嵌入式服务器端口的文件(默认情况下在应用程序目录中具有文件名 application.port)。

这些编写器默认情况下不会被激活,但您可以按照下述方式之一启用它们。

55.1扩展配置

META-INF/spring.factories文件中,您可以激活写入PID文件的侦听器。例:

org.springframework.context.ApplicationListener=\
org.springframework.boot.system.ApplicationPidFileWriter,\
org.springframework.boot.actuate.system.EmbeddedServerPortFileWriter

55.2以编程方式

您也可以通过调用SpringApplication.addListeners(…​) 方法并传递适当的Writer对象来激活侦听器。此方法还允许您通过Writer构造函数自定义文件名和路径。

56. Cloud Foundry支持

Spring Boot的执行器模块包含额外的支持,当您部署到兼容的Cloud Foundry实例时,该支持会被激活。该/cloudfoundryapplication路径提供了一条到所有NamedMvcEndpointbean 的替代安全路线。

扩展支持允许Cloud Foundry管理UI(例如可用于查看已部署应用程序的Web应用程序)通过Spring Boot执行程序信息进行扩展。例如,应用程序状态页面可能包含完整的健康信息,而不是典型的“正在运行”或“已停止”状态。

/cloudfoundryapplication常规用户无法直接访问此路径。为了使用端点,必须将有效的UAA令牌与请求一起传递。

56.1禁用扩展Cloud Foundry执行器支持

如果您想完全禁用/cloudfoundryapplication端点,则可以将以下内容添加到application.properties文件中:

application.properties。 

management.cloudfoundry.enabled=false

56.2 Cloud Foundry自签名证书

默认情况下,/cloudfoundryapplication端点的安全验证会对各种Cloud Foundry服务进行SSL调用。如果您的Cloud Foundry UAA或云控制器服务使用自签名证书,则需要设置以下属性:

application.properties。 

management.cloudfoundry.skip-ssl-validation=true

56.3自定义安全配置

如果您定义自定义安全配置,并且希望扩展Cloud Foundry执行器支持,则应确保/cloudfoundryapplication/**路径已打开。如果没有直接开放路线,您的Cloud Foundry应用程序管理器将无法获取端点数据。

对于Spring Security,您通常会mvcMatchers("/cloudfoundryapplication/**").permitAll()在您的配置中包含如下内容 :

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .mvcMatchers("/cloudfoundryapplication/**")
                .permitAll()
            .mvcMatchers("/mypath")
                .hasAnyRole("SUPERUSER")
            .anyRequest()
                .authenticated().and()
        .httpBasic();
}

57.接下来要读什么

如果你想探索本章讨论的一些概念,你可以看一下执行器的示例应用。您也可能想阅读Graphite等图形工具。

否则,您可以继续阅读“部署选项”,或者继续阅读关于Spring Boot 构建工具插件的深入信息 。

转载于:https://my.oschina.net/u/128964/blog/1831781

你可能感兴趣的:(Spring Boot文档(006)-第五部分)