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类
- 应用配置类: 获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
- 度量指标类: 获取应用程序运行过程中用于监控的度量指标,比如内存信息、线程池信息、HTTP请求统计等。
- 操作控制类:提供对应用的关闭等操作类功能。
应用配置类
由于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
}
- 系统信息:包括处理器数量processors,运行时间uptime和instance.uptime,系统平均负载systemload.average.
- mem.*: 内存概要信息。包括分配给应用的总内存数量以及当前空闲的内存数量。这些信息来自java.lang.Runtime。
- heap.*: 堆内存使用情况。 这些信息来自 java.lang.management.MemoryMXBean 接口中 getHeapMemoryUsage 方法获取的 java.lang.management.MemoryUsage。
- nonheap. *: 非堆内存使用情况。 这些信息来自 java.lang.management.MemoryMXBean接口中ge七NonHeapMemoryUsage方法获取的java.lang.managemen七.MemoryUsage。
- threads.*: 线程使用情况,包括线程数、守护线程数(daemon汃线程峰值(peak)等,这些数据均来自java.lang.management.ThreadMXBean。
- classes.*: 应用加载和卸载的类统计。这些数据均来自java.lang.management.ClassLoadingMXBean。
- gc. *: 垃圾收集器的详细信息,包括垃圾回收次数gc.ps—scavenge.count、垃圾回收消耗时间 gc.ps _ scavenge.time、 标记-清除算法的次数 gc.psmarksweep.count、 标记-清除算法的消耗时间gc.ps_marksweep.time。这些数据均来自java.lang.managemen七.GarbageCollectorMXBean。
- httpsessions. * : Tomcat容 器 的会话使用情况。包括最大会话数httpsessions.max和活跃会话数httpsessions.ac巨ve。 该度量指标信息仅在引入嵌入式Tomcat作为应用容器的时候才会提供。
- gauge.*: HTTP请求的性能指标之 一 ,它主要用来反映 一 个绝对数值。 比如上面示例中的gauge.response.hello: 5, 它表示上一次hello请求的延迟时间为5毫秒。
- 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.*
比如,修改beans
和shutdown
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
配置@Bean
的Endpoint
对象即可。
@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;
}
};
}
参考
- https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#production-ready
- 《Spring Cloud微服务实战》
SpringCloud学习2-Springboot监控模块(actuator)的更多相关文章
- SpringCloud学习第二章-SpringBoot
SpringCloud 学习前提 SpringCloud是基于SpringBoot构建的,因此他延续了SpringBoot的契约模式以及开发方式.下面将讲到SpringBoot的构建方式. S ...
- SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)
前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...
- SpringCloud学习(二):微服务入门实战项目搭建
一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...
- SpringCloud学习目录
Spring Cloud直接建立在Spring Boot的企业Java创新方法上,它通过实现经过验证的模式来简化分布式.微服务风格的体系结构,从而为您的微服务带来弹性.可靠性和协调. 以上来自spri ...
- SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理
前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...
- SpringCloud学习笔记(5):Hystrix Dashboard可视化监控数据
简介 上篇文章中讲了使用Hystrix实现容错,除此之外,Hystrix还提供了近乎实时的监控.本文将介绍如何进行服务监控以及使用Hystrix Dashboard来让监控数据图形化. 项目介绍 sc ...
- SpringCloud学习笔记(6):使用Zuul构建服务网关
简介 Zuul是Netflix提供的一个开源的API网关服务器,SpringCloud对Zuul进行了整合和增强.服务网关Zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可 ...
- SpringCloud学习笔记(7):使用Spring Cloud Config配置中心
简介 Spring Cloud Config为分布式系统中的外部化配置提供了服务器端和客户端支持,服务器端统一管理所有配置文件,客户端在启动时从服务端获取配置信息.服务器端有多种配置方式,如将配置文件 ...
- 006 SpringCloud 学习笔记2-----SpringCloud基础入门
1.SpringCloud概述 微服务是一种架构方式,最终肯定需要技术架构去实施. 微服务的实现方式很多,但是最火的莫过于Spring Cloud了.SpringCloud优点: - 后台硬:作为Sp ...
- SpringCloud学习心得—1.3—Eureka与REST API
SpringCloud学习心得—1.3—Eureka与REST API Eureka的REST API接口 API的基本访问 Eureka REST APIEureka 作为注册中心,其本质是存储 ...
随机推荐
- poj1426_kuagnbin带你飞专题一
Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 30659 Accepted: 127 ...
- 在node环境使用axios发送文件
yarn add form-data (async () => { const l = console.log; const axios = require("axios") ...
- linux的基本操作(LAMP环境搭建)
LAMP 环境搭建 经过前部分章节的学习,你已经掌握了linux的基础知识了.但是想成为一名系统管理员恐怕还有点难度,因为好多单位招聘这个职位的时候都要求有一定的工作经验.然而真正的经验一天两天是学不 ...
- vue文件中引入外部js
1.在项目的入口文件中(app.js)定义remoteScript标签 Vue.component('remote-script', { render: function (createElement ...
- eclipse安装反编译decompiler方式一
(转发位置:https://www.cnblogs.com/zs-notes/p/8991503.html) eclipse安装JD-eclipse反编译插件 1.在eclipse的help中选择In ...
- eclipse哪个版本好
Eclipse IDE for Java EE Developers (企业级开发软件,干啥都足够了,300MB左右)
- NYOJ - 矩形嵌套(经典dp)
矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...
- 如何在vscode中调试python scrapy爬虫
本文环境为 Win10 64bit+VS Code+Python3.6,步骤简单罗列下,此方法可以不用单独建一个Py入口来调用命令行 安装Python,从官网下载,过程略,这里主要注意将python目 ...
- 2018今日头条杯 E-Jump a Jump
Problem E. Jump A JumpInput file: standard inputOutput file: standard outputTime limit: 1 secondsMemor ...
- WPF ComboBox SelectionChanged事件里赋值Text的解决方法
string sCountry ; private void cbCountry_SelectionChanged(object sender, SelectionChangedEventArgs e ...