Spring Boot包括Spring Boot执行器。本节回答了经常因使用而引起的问题。

13.1. 更改执行器端点的HTTP端口或地址

在独立应用程序中,Actuator HTTP端口默认与主HTTP端口相同。要使应用程序在其他端口上侦听,请设置外部属性:management.server.port。要侦听完全不同的网络地址(例如,当您有一个用于管理的内部网络而有一个用于用户应用程序的外部网络)时,还可以设置management.server.address为服务器可以绑定到的有效IP地址。
有关更多详细信息,请参见ManagementServerProperties源代码和“生产就绪功能”部分中的“ production-ready-features.html”。

13.2. 自定义“ whitelabel”错误页面

如果遇到服务器错误,Spring Boot会安装一个“ whitelabel”错误页面,您会在浏览器客户端中看到该错误页面(使用JSON和其他媒体类型的机器客户端应该看到带有正确错误代码的明智响应)。

设置server.error.whitelabel.enabled=false以关闭默认错误页面。这样做将还原您正在使用的servlet容器的默认值。请注意,Spring Boot仍然尝试解决错误视图,因此您应该添加自己的错误页面,而不是完全禁用它。

用自己的方法覆盖错误页面取决于您使用的模板技术。例如,如果您使用Thymeleaf,则可以添加error.html模板。如果您使用FreeMarker,则可以添加error.ftlh模板。通常,您需要View使用名称解析的error@Controller处理/error路径的。除非你更换了一些默认配置,你应该找一个BeanNameViewResolverApplicationContext,所以@Bean命名error是这样做的一种方式。请参阅ErrorMvcAutoConfiguration以获取更多选项。
有关如何在servlet容器中注册处理程序的详细信息,另请参见“错误处理”部分。

13.3. 消毒敏感值

envconfigprops端点返回的信息可能有些敏感,因此默认情况下会清理与某个模式匹配的键(即,它们的值将替换为******)。
可以分别使用management.endpoint.env.keys-to-sanitize和来定制要使用的模式management.endpoint.configprops.keys-to-sanitize
Spring Boot对此类密钥使用明智的默认设置:以单词“ password”,“ secret”,“ key”,“ token”,“ vcap_services”,“ sun.java.command”结尾的任何密钥都已完全清除。此外,将包含单词credentials作为键的一部分的任何键都进行清理(配置为正则表达式,即*credentials.*)。
此外,Spring Boot只对以“ uri”,“ uris”,“ address”或“ addresss”结尾的密钥的URI敏感部分进行清理。URI的敏感部分使用格式标识<scheme>://<username>:<password>@<host>:<port>/。例如,对于该属性myclient.uri=http://user1:password1@localhost:8081,最终的净化值是 http://user1:******@localhost:8081

13.4. 将健康指标映射到千分尺

Spring Boot运行状况指示器返回一个Status类型,以指示整个系统的运行状况。如果要监视或警告特定应用程序的运行状况,则可以通过千分尺将这些状态导出为度量。默认情况下,Spring Boot使用状态代码“ UP”,“ DOWN”,“ OUT_OF_SERVICE”和“ UNKNOWN”。要导出这些状态,您需要将这些状态转换为一组数字,以便它们可以与千分尺一起使用Gauge
以下示例显示了编写此类导出程序的一种方法:

  1. @Configuration
  2. public class HealthMetricsConfiguration {
  3. public HealthMetricsConfiguration(MeterRegistry registry, HealthEndpoint healthEndpoint) {
  4. // This example presumes common tags (such as the app) are applied elsewhere
  5. Gauge.builder("health", healthEndpoint, this::getStatusCode).strongReference(true).register(registry);
  6. }
  7. private int getStatusCode(HealthEndpoint health) {
  8. Status status = health.health().getStatus();
  9. if (Status.UP.equals(status)) {
  10. return 3;
  11. }
  12. if (Status.OUT_OF_SERVICE.equals(status)) {
  13. return 2;
  14. }
  15. if (Status.DOWN.equals(status)) {
  16. return 1;
  17. }
  18. return 0;
  19. }
  20. }