第五部分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'依赖项:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
对于Gradle,使用声明:
dependencies { compile("org.springframework.boot:spring-boot-starter-actuator") }
47.终点
执行器端点允许您监视和与您的应用程序进行交互。Spring Boot包含许多内置端点,您也可以添加自己的端点。例如, health
端点提供基本的应用程序健康信息。
端点暴露的方式取决于您选择的技术类型。大多数应用程序选择HTTP监视,其中端点的ID映射到URL。例如,默认情况下,health
端点将被映射到/health
。
以下技术不可知的端点可用:
ID | Description | Sensitive Default | |
---|---|---|---|
| 为其他端点提供基于超媒体的“发现页面”。要求Spring HATEOAS在类路径上。 | true | |
| 公开当前应用程序的审计事件信息。 | true | |
| 显示一个自动配置报告,显示所有自动配置的候选人以及他们'为'或'未被'应用的原因。 | true | |
| 显示应用程序中所有Spring bean的完整列表。 | true | |
| 显示所有的整理列表@ConfigurationProperties 。 | true | |
| 执行线程转储。 | true | |
| 公开来自Spring的属性ConfigurableEnvironment 。 | true | |
|
| true | |
| 显示应用程序运行状况信息(应用程序安全时,通过未经身份验证的连接访问时的简单'状态'或身份验证时的完整邮件详细信息)。 | false | |
| 显示任意的应用信息。 | false | |
| 显示修改日志配置 | true | |
| 显示已应用的任何Liquibase数据库迁移。 | true | |
|
| true | |
| 显示所有@RequestMapping 路径的整理列表。 | true | |
| 允许应用程序正常关机(默认情况下未启用)。 | true | |
| 显示跟踪信息(默认情况下是最近的100个HTTP请求)。 | true |
如果您使用Spring MVC,还可以使用以下附加端点:
ID | Description | Sensitive Default |
---|---|---|
| Displays documentation, including example requests and responses, for the Actuator’s endpoints. Requires | false |
| Returns a GZip compressed | true |
| Exposes JMX beans over HTTP (when Jolokia is on the classpath). | true |
| Returns the contents of the logfile (if | true |
![]() |
根据端点的暴露方式,该 |
47.1定制endpoints
终端可以使用Spring属性进行自定义。您可以更改端点enabled
是否已经考虑sensitive
,甚至是否已考虑端点 id
。
例如,这是一个application.properties
改变beans
端点的灵敏度和ID 并且启用的例子shutdown
。
endpoints.beans.id=springbeans endpoints.beans.sensitive=false endpoints.shutdown.enabled=true
![]() |
前缀“ |
默认情况下,除了以外的所有端点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-browser
HAL浏览器形式的HTML“发现页面”提供。
47.3 CORS支持
跨源资源共享 (CORS)是W3C规范,允许您以灵活的方式指定哪种跨域请求得到授权。执行器的MVC端点可以配置为支持这种方案。
CORS支持默认是禁用的,只有在endpoints.cors.allowed-origins
属性设置后才能启用 。下面的配置允许 GET
和POST
来自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*
)来公开资源。
![]() |
如果你这样做是为库特征考虑增加带注释的配置类 |
47.5健康信息
健康信息可用于检查正在运行的应用程序的状态。如果生产系统停机,它通常被监控软件用来提醒某人。health
端点公开的默认信息取决于它如何被访问。对于安全应用程序中的未经身份验证的连接,将返回一个简单的“状态”消息,对于已验证的连接,还会显示其他详细信息(有关HTTP详细信息,请参见 第48.7节“HTTP健康端点格式和访问限制”)。
健康信息从您的所有HealthIndicator
bean中收集 ApplicationContext
。Spring Boot包含许多自动配置 HealthIndicators
,您也可以编写自己的。默认情况下,最终的系统状态是由HealthAggregator
每个状态HealthIndicator
根据状态的有序列表对状态进行排序得出的。排序列表中的第一个状态用作整体健康状态。如果没有HealthIndicator
返回一个已知状态 HealthAggregator
,一种UNKNOWN
是使用状态。
47.6安全与健康指标
返回的信息HealthIndicators
往往在某种程度上是敏感的。例如,您可能不想将数据库服务器的详细信息发布到全球。为此,默认情况下,只有健康状态通过未经身份验证的HTTP连接公开。如果您对完整的健康信息感到满意并始终可以接受,您可以设置endpoints.health.sensitive
为false
。
还会缓存健康响应以防止“拒绝服务”攻击。endpoints.health.time-to-live
如果您想更改1000毫秒的默认缓存时间段,请使用该 属性。
47.6.1自动配置的HealthIndicators
以下HealthIndicators
情况在适当时由Spring Boot自动配置:
名称 | 描述 |
---|---|
检查Cassandra数据库是否启动。 | |
检查磁盘空间不足。 | |
检查是否可以获得连接 | |
检查Elasticsearch集群是否启动。 | |
检查JMS代理是否启动。 | |
检查邮件服务器是否启动。 | |
检查Mongo数据库是否启动。 | |
检查Rabbit服务器是否启动。 | |
检查Redis服务器是否启动。 | |
检查Solr服务器是否已启动。 |
![]() |
可以使用该 |
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(); } }
|
除了Spring Boot的预定义Status
类型之外,还可以Health
返回Status
代表新系统状态的自定义。在这种情况下,HealthAggregator
还需要提供接口的自定义实现 ,或者必须使用management.health.status.order
配置属性来配置默认实现。
例如,假设在您的某个实现中使用 了新Status
的代码。要配置严重性顺序,请将以下内容添加到应用程序属性中:FATAL
HealthIndicator
management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP
响应中的HTTP状态代码反映整体健康状况(例如,UP
映射到200 OUT_OF_SERVICE
或DOWN
503)。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自动配置:
名称 | 描述 |
---|---|
公开钥匙 | |
如果 | |
如果 |
![]() |
可以使用该 |
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,你可以重写上面的例子,如下所示: info.app.encoding=@project.build.sourceEncoding@ info.app.java.source=@java.version@ info.app.java.target=@java.version@ |
47.7.3 Git提交信息
info
端点的另一个有用特性是它能够git
在构建项目时发布有关源代码库状态的信息。如果 GitProperties
豆可用,git.branch
,git.commit.id
和git.commit.time
属性将被暴露出来。
![]() |
|
如果你想显示完整的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.enabled
属性来做到这一点:
application.properties。
management.security.enabled=false
![]() |
默认情况下,执行器端点暴露在提供常规HTTP流量的同一端口上。注意不要在更改 |
如果您公开部署应用程序,则可能需要添加'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
。
![]() |
如果您没有用于向未经认证的用户公开基本健康信息的用例,并且您已经使用自定义安全保护了执行器端点,则可以设置 |
48.2自定义管理端点路径
有时将所有管理端点分组在单一路径下很有用。例如,您的应用程序可能已经/info
用于其他目的。您可以使用该 management.context-path
属性为您的管理端点设置前缀:
management.context-path=/manage
application.properties
上面的例子会将端点从(例如)/{id}
改为 。/manage/{id}
/manage/info
![]() |
除非管理端口已被配置为 使用不同的HTTP端口暴露端点, |
您还可以更改端点(使用endpoints.{name}.id
)的“id” ,然后更改MVC端点的默认资源路径。法定端点ID仅由字母数字字符组成(因为它们可能会暴露在许多地方,包括禁止使用特殊字符的JMX对象名称)。MVC路径可以通过配置单独更改endpoints.{name}.path
,并且不会验证这些值(因此您可以使用URL路径中合法的任何内容)。例如,要更改/health
端点的位置,/ping/me
您可以设置 endpoints.health.path=/ping/me
。
![]() |
即使端点路径分别配置,它仍然相对于 |
![]() |
如果您提供自定义 |
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.sensitive
为true
。以下是行为总结(默认 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你可以添加以下内容:
<dependency> <groupId>org.jolokia</groupId> <artifactId>jolokia-core</artifactId> </dependency>
然后可以/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进入 ssh
或telnet
运行正在运行的应用程序。要启用远程shell支持,请将以下依赖项添加到您的项目中:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-remote-shell</artifactId> </dependency>
![]() |
远程shell已弃用,并将在Spring Boot 2.0中删除。 |
![]() |
如果你还想启用telnet访问,你还需要依赖 |
![]() |
CRaSH需要在运行时编译命令时使用JDK运行。如果基本 |
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
命令列表。春季启动提供metrics
,beans
,autoconfig
和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命令依赖的任何类必须打包在嵌套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的版本 |
| 核心Spring框架的版本 |
| 进入春天 |
| 进入春天 |
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 }
在这里我们可以看到基本的memory
,heap
,class loading
,processor
和thread pool
一些HTTP度量标准的信息。在这种情况下,root
('/')和/metrics
URL分别返回HTTP 200
响应20
和3
时间。它也显示root
URL返回HTTP 401
(未授权)4
时间。double asterisks(star-star
)来自与Spring MVC匹配的请求/**
(通常是静态资源)。
该gauge
显示上次响应时间的请求。所以,最后一次请求root
了 2ms
回应,最后一个/metrics
了3ms
。
![]() |
在这个例子中,我们实际上是使用 |
52.1系统度量
Spring Boot公开以下系统度量标准:
- KB(
mem
)中的总系统内存 - 可用内存量(KB)(
mem.free
) - 处理器数量(
processors
) - 系统正常运行时间(毫秒)(
uptime
) - 以毫秒为单位的应用程序上下文正常运行时间(
instance.uptime
) - 平均系统负载(
systemload.average
) - 堆信息KB( ,
heap
,heap.committed
,)heap.init
heap.used
- 线程信息(
threads
,thread.peak
,thread.daemon
) - 类负载信息(
classes
,classes.loaded
,classes.unloaded
) - 垃圾收集信息(
gc.xxx.count
,gc.xxx.time
)
52.2数据源指标
针对DataSource
您的应用程序中定义的每个支持,公开以下指标:
- 活动连接的数量(
datasource.xxx.active
) - 连接池(
datasource.xxx.usage
)的当前使用情况。
所有数据源指标都共享datasource.
前缀。前缀进一步限定为每个数据源:
- 如果数据源是主数据源(即唯一可用的数据源或现有数据源中标记的数据源
@Primary
),则前缀为datasource.primary
。 - 如果数据源豆名称结尾
DataSource
,前缀是bean的无名称DataSource
(即datasource.batch
对batchDataSource
)。 - 在所有其他情况下,使用bean的名称。
通过注册一个具有自定义版本的bean可以覆盖部分或全部这些默认值DataSourcePublicMetrics
。默认情况下,Spring Boot为所有支持的数据源提供元数据; DataSourcePoolMetadataProvider
如果您最喜爱的数据源不受支持,您可以添加额外的bean。DataSourcePoolMetadataProvidersConfiguration
举例来看 。
52.3高速缓存指标
针对应用程序中定义的每个支持的缓存公开以下指标:
- 缓存的当前大小(
cache.xxx.size
) - 命中率(
cache.xxx.hit.ratio
) - 小姐比例(
cache.xxx.miss.ratio
)
![]() |
高速缓存提供程序不会以一致的方式显示命中/错过率。虽然一些暴露的聚集值(即自上次的统计信息被清除的命中率),其他暴露时间值(即最后一秒钟的命中率)。查看你的缓存提供者文档以获得更多细节。 |
如果两个不同的缓存管理器碰巧定义了相同的缓存,则缓存的名称前面加上了该CacheManager
bean 的名称。
通过注册一个具有自定义版本的bean可以覆盖部分或全部这些默认值CachePublicMetrics
。默认情况下,Spring Boot为EhCache,Hazelcast,Infinispan,JCache和Guava提供缓存统计信息。CacheStatisticsProvider
如果您最喜爱的缓存库不支持开箱即用,您可以添加额外的bean。CacheStatisticsAutoConfiguration
举例来看。
52.4 Tomcat会话度量
如果您使用Tomcat作为嵌入式servlet容器,会话度量标准将自动公开。在httpsessions.active
与httpsessions.max
键提供主动和最大会话数。
52.5记录您自己的指标
记录你自己的指标注入一个 CounterService
和/或 GaugeService
到你的bean中。的CounterService
自曝increment
,decrement
和reset
方法; 在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 的默认实现GaugeService
和CounterService
提供依赖于您使用的Java版本。使用Java 8(或更高版本),实现切换到针对快速写入优化的高性能版本,并由原子内存缓冲区支持,而不是由不可变但相对昂贵的 Metric<?>
类型(计数器速度快大约5倍,测试速度大约是基于存储库的实现速度的两倍)。即使对于Java 7(它们具有某些Java 8并发库的反向端口),Dropwizard度量服务(见下文)也非常有效,但它们不记录度量值的时间戳。如果衡量指标收集的性能是一个问题,那么始终建议使用其中一个高性能选项,并且只能不频繁地读取指标,以便写入在本地进行缓冲,并且只在需要时才读取。
![]() |
如果您使用的是Java 8或者如果您使用的是Dropwizard度量标准,则旧的 |
52.8度量编写者,出口商和聚合
Spring Boot提供了一个标记接口的实现,称为标记接口Exporter
,可用于将度量标准读数从内存缓冲区复制到可以分析和显示它们的位置。事实上,如果您提供了一个@Bean
实现MetricWriter
接口(或GaugeWriter
简单用例)的 接口并对其进行标记 @ExportMetricWriter
,那么它将自动连接到Exporter
每5秒更新的馈送度量标准(通过配置spring.metrics.export.delay-millis
)。另外,MetricReader
您定义并标记为的任何@ExportMetricReader
值都将由默认导出器导出其值。
![]() |
此功能在您的应用程序( |
默认导出器是一种MetricCopyExporter
通过不复制自上次调用以来未更改过的值(可以使用标志关闭优化)来优化自身的方法spring.metrics.export.send-latest
。另请注意,Dropwizard MetricRegistry
不支持时间戳,因此如果您使用Dropwizard度量标准(所有度量标准将在每个时间点上复制),则优化不可用。
对于出口触发的默认值(delay-millis
,includes
,excludes
和send-latest
)可以设置为spring.metrics.export.*
。对于特定个人的值MetricWriters
可以被设置为 spring.metrics.export.triggers.<name>.*
其中<name>
是一个bean名称(或图案匹配bean的名字)。
![]() |
如果关闭默认设置 |
52.8.1示例:导出到Redis
如果您提供了一个@Bean
类型RedisMetricRepository
并将其标记,@ExportMetricWriter
则度量标准将导出到Redis缓存中进行聚合。该RedisMetricRepository
有配置它用于此目的的两个重要参数:prefix
和key
(通过到它的构造)。最好使用对应用程序实例唯一的前缀(例如,使用随机值并可能使应用程序的逻辑名称与相同应用程序的其他实例相关联)。“键”用于保留所有度量名称的全局索引,因此它应该是“全局”唯一的,无论对于您的系统而言是什么意思(例如,如果具有不同的键,同一系统的两个实例可共享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构建的,因此可以轻松地用于稍后识别具有相同逻辑名称的一组进程。
![]() |
重要的是要设置 |
![]() |
上面的例子使用 |
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
@ExportMetricWriter
MBeanExporter
例:
@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; }
![]() |
上面的例子使用 |
![]() |
在 |
52.10 Dropwizard指标
MetricRegistry
当您向io.dropwizard.metrics:metrics-core
库声明依赖项时,将创建一个默认的Spring bean ; @Bean
如果您需要定制,您还可以注册您自己的实例。该用户 Dropwizard“指标”库会发现,春天开机指标会自动发布到com.codahale.metrics.MetricRegistry
。这些指标MetricRegistry
也会通过/metrics
端点自动公开
当Dropwizard指标都在使用,默认的CounterService
和GaugeService
被替换为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 |
|
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
路径提供了一条到所有NamedMvcEndpoint
bean 的替代安全路线。
扩展支持允许Cloud Foundry管理UI(例如可用于查看已部署应用程序的Web应用程序)通过Spring Boot执行程序信息进行扩展。例如,应用程序状态页面可能包含完整的健康信息,而不是典型的“正在运行”或“已停止”状态。
![]() |
|
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(); }