SpringCloud学习2-Springboot监控模块(actuator)

前言

学习一项新技术最大的困难是什么? 是资料。让人高兴的是找到了一本系统学习Spring Cloud的教程,《Spring Cloud微服务实战》, 接下来的学习目标将以此书顺序演进。

虽然Springboot 2.0刚刚发布,鉴于当下资料都是基于1.x的,对于初学者,站在前人的肩膀上会少踩坑。因此,接下来都将采用1.5.10.RELEASE

上一节,SpringCloud入门1-服务注册与发现(Eureka) 中已经尝试使用了spring-boot-starter-actuator模块中的健康检查端点,接下来将系统的学习该模块的功能。

Spring Boot includes a number of additional features to help you monitor and manage your application when it’s pushed to production. You can choose to manage and monitor your application using HTTP endpoints, with JMX or even by remote shell (SSH or Telnet). Auditing, health and metrics gathering can be automatically applied to your application.

引入

测试代码: https://github.com/Ryan-Miao/actuator-demo

如同上一节中所引入的方式一样。创建一个springboot项目,并添加依赖

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

actuator 美 ['æktʃʊˌeɪtə]

接下来,启动项目。

 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v1.5.10.RELEASE)

2018-03-04 12:15:52.611  INFO 18468 --- [           main] com.test.actuator.ActuatorApplication    : Starting ActuatorApplication on DESKTOP-4MOUU2Q with PID 18468 (D:\workspace\learn\springcloud\actuator-demo\target\classes started by Ryan in D:\workspace\learn\springcloud\actuator-demo)
2018-03-04 12:15:52.615  INFO 18468 --- [           main] com.test.actuator.ActuatorApplication    : No active profile set, falling back to default profiles: default
2018-03-04 12:15:52.709  INFO 18468 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1efee8e7: startup date [Sun Mar 04 12:15:52 CST 2018]; root of context hierarchy
2018-03-04 12:15:55.125  INFO 18468 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-03-04 12:15:55.140  INFO 18468 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2018-03-04 12:15:55.140  INFO 18468 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.27
2018-03-04 12:15:55.265  INFO 18468 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2018-03-04 12:15:55.265  INFO 18468 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2588 ms
2018-03-04 12:15:55.512  INFO 18468 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2018-03-04 12:15:55.512  INFO 18468 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'metricsFilter' to: [/*]
2018-03-04 12:15:55.512  INFO 18468 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-03-04 12:15:55.512  INFO 18468 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-03-04 12:15:55.512  INFO 18468 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-03-04 12:15:55.512  INFO 18468 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2018-03-04 12:15:55.512  INFO 18468 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'webRequestLoggingFilter' to: [/*]
2018-03-04 12:15:55.512  INFO 18468 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'applicationContextIdFilter' to: [/*]
2018-03-04 12:15:55.926  INFO 18468 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1efee8e7: startup date [Sun Mar 04 12:15:52 CST 2018]; root of context hierarchy
2018-03-04 12:15:56.004  INFO 18468 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2018-03-04 12:15:56.004  INFO 18468 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2018-03-04 12:15:56.051  INFO 18468 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-03-04 12:15:56.051  INFO 18468 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-03-04 12:15:56.097  INFO 18468 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-03-04 12:15:56.387  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/env/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String)
2018-03-04 12:15:56.387  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/env || /env.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-03-04 12:15:56.387  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/info || /info.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-03-04 12:15:56.387  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/health || /health.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint.invoke(javax.servlet.http.HttpServletRequest,java.security.Principal)
2018-03-04 12:15:56.387  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/mappings || /mappings.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-03-04 12:15:56.387  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/trace || /trace.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-03-04 12:15:56.387  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/dump || /dump.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-03-04 12:15:56.403  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/loggers/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.LoggersMvcEndpoint.get(java.lang.String)
2018-03-04 12:15:56.403  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/loggers/{name:.*}],methods=[POST],consumes=[application/vnd.spring-boot.actuator.v1+json || application/json],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.LoggersMvcEndpoint.set(java.lang.String,java.util.Map<java.lang.String, java.lang.String>)
2018-03-04 12:15:56.403  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/loggers || /loggers.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-03-04 12:15:56.403  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-03-04 12:15:56.403  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/metrics/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String)
2018-03-04 12:15:56.403  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/metrics || /metrics.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-03-04 12:15:56.403  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/auditevents || /auditevents.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.boot.actuate.endpoint.mvc.AuditEventsMvcEndpoint.findByPrincipalAndAfterAndType(java.lang.String,java.util.Date,java.lang.String)
2018-03-04 12:15:56.403  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/configprops || /configprops.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-03-04 12:15:56.403  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/beans || /beans.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2018-03-04 12:15:56.403  INFO 18468 --- [           main] o.s.b.a.e.mvc.EndpointHandlerMapping     : Mapped "{[/heapdump || /heapdump.json],methods=[GET],produces=[application/octet-stream]}" onto public void org.springframework.boot.actuate.endpoint.mvc.HeapdumpMvcEndpoint.invoke(boolean,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.io.IOException,javax.servlet.ServletException
2018-03-04 12:15:56.512  INFO 18468 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-03-04 12:15:56.512  INFO 18468 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Starting beans in phase 0
2018-03-04 12:15:56.747  INFO 18468 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2018-03-04 12:15:56.747  INFO 18468 --- [           main] com.test.actuator.ActuatorApplication    : Started ActuatorApplication in 4.615 seconds (JVM running for 5.11)

可以看到url mapping多了几个。接下来,分别看看这几个接口的内容。

访问这几个接口的时候发现啥也没有,然后看到控制台提示,这些敏感信息需要加密。所以,必须引入security模块。

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

设置用户名密码:

security.user.name=admin
security.user.password=123456

然后,重启,访问http://localhost:8080/health 得到

{
    "status": "UP",
    "diskSpace": {
        "status": "UP",
        "total": 126702579712,
        "free": 71547412480,
        "threshold": 10485760
    }
}

端点endpoint

Actuator endpoints可以让我们监控和与我们的应用(application)交互。Spring Boot actuator包含了大量的内置endpoints, 当然,我们也可以添加我们自己的。

如何暴露端口取决与你采用的技术。大多数应用采用HTTP监控,这时,endpoint的ID就映射为一个接口URL。比如,默认health映射为/health. (2.0貌似不是这样,后面再看)

自带的内置endpoint大概有这些(sensitive是指需要密码):

ID

Description

Sensitive Default

actuator

提供端点基本信息,"discovery page"

true

auditevents

提供审计事件信息

true

autoconfig

提供auto-configuration报告,显示所有的自动配置项以及生效和不生效的原因

true

beans

显示应用中所有的bean

true

configprops

显示整理过的@ConfigurationProperties

true

dump

显示线程dump信息

true

env

显示Spring的ConfigurableEnvironment属性

true

flyway

显示应用的所有Flyway database迁移

true

health

显示系统健康状态(登陆后显示详细信息)

false

info

显示一些自定义信息

false

loggers

显示和更改应用的logger配置

true

liquibase

显示所有的Liquibase database迁移

true

metrics

显示当前的metrics信息

true

mappings

显示所有@RequestMapping

true

shutdown

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

true

trace

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

true

如果是Spring MVC, 还有以下几个:

ID

Description

Sensitive Default

docs

显示actuator的文档。需要引入spring-boot-actuator-docs

false

heapdump

返回hprof 文件

true

jolokia

通过HTTP公开JMX bean(当Jolokia位于类路径中时)。

true

logfile

返回日志文件的内容(如果logging.file或logging.path属性已设置)。支持使用HTTP范围头来检索部分日志文件的内容。

true

根据endpoint的作用,可以将原生endpoint分为3类

  1. 应用配置类: 获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
  2. 度量指标类: 获取应用程序运行过程中用于监控的度量指标,比如内存信息、线程池信息、HTTP请求统计等。
  3. 操作控制类:提供对应用的关闭等操作类功能。

应用配置类

由于Spring Boot为了改善传统Spring应用复杂的配置,采用了包扫描和自动化配置机制来加载原来集中与XML的内容。虽然这样做让我们代码变得简洁,但整个应用的实例创建和依赖关系等信息都被离散到了各个配置类的注解上。这使我们分析整个应用中资源和实例的各种关系变得非常困难。而这类endpoint可以帮助我们轻松获取一系列关于Spring配置内容的详细报告,比如自动化配置的报告、Bean创建的报告、环境属性的报告等。

/env: 对于密码属性,属性名中包含password、secret、key这些关键词,会返回**代替value。

/info: 自定义

info.app.name=spring boot demo
info.app.version=1.0

度量指标类

/metrics: 返回内存信息、线程信息、垃圾回收信息等。

{
    "mem": 437985,
    "mem.free": 342068,
    "processors": 4,
    "instance.uptime": 19821025,
    "uptime": 19812936,
    "systemload.average": -1,
    "heap.committed": 382464,
    "heap.init": 131072,
    "heap.used": 40395,
    "heap": 1846272,
    "nonheap.committed": 56848,
    "nonheap.init": 2496,
    "nonheap.used": 55521,
    "nonheap": 0,
    "threads.peak": 25,
    "threads.daemon": 21,
    "threads.totalStarted": 28,
    "threads": 23,
    "classes": 6792,
    "classes.loaded": 6843,
    "classes.unloaded": 51,
    "gc.ps_scavenge.count": 8,
    "gc.ps_scavenge.time": 98,
    "gc.ps_marksweep.count": 3,
    "gc.ps_marksweep.time": 322,
    "httpsessions.max": -1,
    "httpsessions.active": 0,
    "gauge.response.actuator": 224,
    "gauge.response.loggers": 23,
    "gauge.response.env": 12,
    "gauge.response.docs.star-star": 19,
    "gauge.response.autoconfig": 67,
    "gauge.response.trace": 17,
    "gauge.response.metrics": 8,
    "gauge.response.heapdump.root": 2656,
    "gauge.response.docs": 3,
    "gauge.response.configprops": 167,
    "gauge.response.star-star": 8,
    "counter.status.302.docs": 2,
    "counter.status.200.actuator": 1,
    "counter.status.200.loggers": 1,
    "counter.status.200.docs.star-star": 4,
    "counter.status.200.metrics": 2,
    "counter.status.200.configprops": 1,
    "counter.status.404.star-star": 5,
    "counter.status.200.autoconfig": 1,
    "counter.status.200.heapdump.root": 1,
    "counter.status.200.env": 1,
    "counter.status.200.trace": 1
}
  1. 系统信息:包括处理器数量processors,运行时间uptime和instance.uptime,系统平均负载systemload.average.
  2. mem.*: 内存概要信息。包括分配给应用的总内存数量以及当前空闲的内存数量。这些信息来自java.lang.Runtime。
  3. heap.*: 堆内存使用情况。 这些信息来自 java.lang.management.MemoryMXBean 接口中 getHeapMemoryUsage 方法获取的 java.lang.management.MemoryUsage。
  4. nonheap. *: 非堆内存使用情况。 这些信息来自 java.lang.management.MemoryMXBean接口中ge七NonHeapMemoryUsage方法获取的java.lang.managemen七.MemoryUsage。
  5. threads.*: 线程使用情况,包括线程数、守护线程数(daemon汃线程峰值(peak)等,这些数据均来自java.lang.management.ThreadMXBean。
  6. classes.*: 应用加载和卸载的类统计。这些数据均来自java.lang.management.ClassLoadingMXBean。
  7. gc. *: 垃圾收集器的详细信息,包括垃圾回收次数gc.ps—scavenge.count、垃圾回收消耗时间 gc.ps _ scavenge.time、 标记-清除算法的次数 gc.psmarksweep.count、 标记-清除算法的消耗时间gc.ps_marksweep.time。这些数据均来自java.lang.managemen七.GarbageCollectorMXBean。
  8. httpsessions. * : Tomcat容 器 的会话使用情况。包括最大会话数httpsessions.max和活跃会话数httpsessions.ac巨ve。 该度量指标信息仅在引入嵌入式Tomcat作为应用容器的时候才会提供。
  9. gauge.*: HTTP请求的性能指标之 一 ,它主要用来反映 一 个绝对数值。 比如上面示例中的gauge.response.hello: 5, 它表示上一次hello请求的延迟时间为5毫秒。
  10. counter.*: HTTP 请求的性能指标之 一 ,它主要作为计 数器来使用,记录了增加量和减少量。 上述示例中的counter.s七红us.200.hello: 11, 它代表了 hello请求返回200状态的次数为11。

对于gauge.和counter.的统计, 这里有一 个特殊的内容请求 star-star,它代表了对静态资源的访问。 这两类度量指标非常有用,我们不仅可以使用它默认的统计指标,还可以在程序中轻松地增加自定义 统计 值。只需要通过注org.springframework.boot.actuate.metrics.CounterService和org.springframework.boot.actuate.metrics.GaugeService 来实现自定义的统计指标信息。比如我们可以像下面这样自定义实现对hello接口的访问次数统计。

@RestController
public class HelloController {

    @Qualifier("counterService")
    @Autowired
    private CounterService counterService;

    @RequestMapping(value = "hello", method = RequestMethod.GET)
    public String hello(){
        counterService.increment("test.hello.count");

        return counterService.toString();
    }


}

/metrics端点可以提供应用运行状态的完整度量指标报告,这项功能 非常实用,但是对千监控系 统中的各项监控功能,它们的监控内容、 数据收集频率都有所不同,如果每次都通过全量获取报告的方式来收集,略显粗暴。 所以,我们还可以通过/metrics/{name}接口来更细粒度地获取度量信息 , 比如可以通过访问/metrics/mem.free来获取当前可用内存数量。

/health: 在spring-boot-s七arter-ac七uator模块中自带实现了一 些常用资源的健康指标检测器。这些检测器 都通过Hea巨hindicator接口实现,并且会根据依赖关系的引入实现自动化装配, 比如下面列出的这些。

CassandraHealthIndicator,DiskSpaceHealthIndicator,DataSourceHealthIndicator,ElasticsearchHealthIndicator,JmsHealthIndicator,MailHealthIndicator,MongoHealthIndicator,RabbitHealthIndicator,RedisHealthIndicator,SolrHealthIndicator

可以通过management.health.defaults.enabled来控制上述健康检查是否生效。

也可以自定义,

@Component
public class RocketMQHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        int errorCode = check();
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }

        return Health.up().build();
    }

    private int check() {
        // 自定义健康检查
        return 0;
    }
}

/dump: 该端点用来暴露程序运行中的线程信息。它使用 java.lang.rnanagernent.ThreadMXBean 的 durnpAllThreads 方法来返回所有含有同步信息的活动线程详情。

/trace: 该端点用来返回基本的 HTTP 跟踪信息。 默认情况下, 跟踪信息的存储采用org.springfrarnework.boo七.ac七uate.trace.InMernoryTraceRepository实现的内存方式, 默认始终保留最近的100条请求记录。

修改endpoint配置

上述的自带属性可以通过配置文件修改默认配置。key前缀为endpoints.*

比如,修改beansshutdown

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

默认所有的endpoint可用,除了shutdown。当然,可以是全部关闭,然后单独打开。

endpoints.enabled=false
endpoints.info.enabled=true

可以设置全局属性

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

设置跨域

如果想在别的域名下调用,则需要设置允许跨域。当然可以自己手动写跨域拦截。但actuator也提供了配置文件。

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

添加自定义endpoint

配置@BeanEndpoint对象即可。

@Bean
public Endpoint myEndpoint(){
    return new Endpoint<Map<String,Object>>() {
        @Override
        public String getId() {
            return "my-endpoint";
        }

        @Override
        public boolean isEnabled() {
            return true;
        }

        @Override
        public boolean isSensitive() {
            return false;
        }

        @Override
        public Map<String,Object> invoke() {
            final Map<String, Object> dataToDisplay = new HashMap<>();
            dataToDisplay.put("some", "thing");
            dataToDisplay.put("you", "want");
            return dataToDisplay;
        }
    };
}

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏格子的个人博客

Java定时发布文章简单方案

早上迷迷糊糊地开始了春节后的一天上班日程,脑袋还在噼里啪啦放烟花,项目管理部和SEO小伙伴就提了一桶凉水过来,往我头上一浇,瞬间烟花都湮灭了。

671
来自专栏大数据互联网思维

SpringCloud学习2-Springboot监控模块

学习一项新技术最大的困难是什么? 是资料。让人高兴的是找到了一本系统学习Spring Cloud的教程,《Spring Cloud微服务实战》, 接下来的学习目...

730
来自专栏菩提树下的杨过

spring-boot 速成(3) actuator

actuator 通过暴露一系列的endpoints可以让开发者快速了解spring boot的各项运行指标,比如:线程数,jvm剩余内存等一系列参数。 启用方...

1956
来自专栏程序员的SOD蜜

使用微服务架构思想,设计部署OAuth2.0授权认证框架

1.5K2
来自专栏张善友的专栏

Visual Studio 2008 SP1和.NET FX 3.5 SP1发布了

NET Framework 3.5 SP1提供了以下新功能和改进: 1、ASP.NET 动态数据,它提供了丰富的框架,从而使用户可以快速进行数据驱动的开发,而...

1698
来自专栏yukong的小专栏

【SpringBoot系列04】SpringBoot之使用JPA完成简单的rest api

【SpringBoot2.0系列02】SpringBoot之使用Thymeleaf视图模板

1536
来自专栏圣杰的专栏

eShopOnContainers 知多少[3]:Identity microservice

通常,服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问。那进行 API 级别信任决策的第一步就是身份认证——确定用户身份是否可靠。

662
来自专栏杨建荣的学习笔记

清理session的小插曲(二) (r6笔记第4天)

在上周巡检系统的时候发现session列表中显示有一个session的状态为“KILLED",当时没有太在意,等到周一回来做检查的时候,发现那个session的...

2706
来自专栏java思维导图

mybatis-plus思维导图,让mybatis-plus不再难懂

1 mybatis-plus与mybatis mybatis Mybatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis...

3278
来自专栏纯洁的微笑

springboot(十九):使用Spring Boot Actuator监控应用

微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了...

3097

扫码关注云+社区