我们知道 Spring Boot 是一个用于快速开发Java Web 的框架,不需要太多的配置即可使用 Spring 的大量功能。Spring Boot 遵循“约定大于配置的理念”,采用包扫描和自动化配置的机制来加载依赖 Jar 中的 Spring Bean,不需要任何 Xml 配置,就可以实现 Spring 的所有配置。虽然这样做的好处在于我们不需要像使用 Spring 那样编写一大堆的 XML 配置代码,能让我们的代码变得非常简洁,但整个应用的实例创建与依赖关系都被分散到了注解上,使得我们分析整个应用中资源和实例的各种关系变得非常的困难。
不过,Spring Boot 提供了 Actuator 来监控应用,Actuator 提供了一系列的 RESTful API 让我们可以查看应用配置信息,如自动化配置信息、Spring Bean 信息。
Actuator 提供了 13 个接口,可以分为三大类:应用配置接口、度量接口和操作控制接口。
接口列表如下:
HTTP 方法 | 路径 | 作用 |
---|---|---|
GET | /auditevents | 查看应用的自动配置的使用情况,记录哪些自动配置条件通过了,哪些没通过。 |
GET | /beans | 显示应用程序中所有 Spring Bean 的完整列表 |
GET | /conditions | 提供一份自动配置生效的条件情况,记录哪些自动配置条件通过了,哪些没通过。 |
GET | /configprops | 显示所有配置信息。 |
GET | /env | 显示所有的环境属性。 |
GET | /env/{name} | 根据名称获取特定的环境属性值。 |
GET | /flyway | 显示已应用的所有 Flyway 数据库迁移。需要一个或多个 Flyway Bean。 |
GET | /health | 显示应用程序运行状况信息。up 表示成功,down 表示失败。 |
GET | /httptrace | 显示 HTTP 跟踪信息(默认情况下,最近 100 个HTTP 请求-响应) |
GET | /info | 获取应用程序的定制信息,这些信息由 info 打头的属性提供。 |
GET | /loggers | 显示和修改应用程序中 Logger 的配置。 |
GET | /metrics | 显示当前应用程序的“度量指标信息”,如内存用量和 HTTP 请求计数。 |
GET | /metrics/{name} | 显示指定名称的应用程序的度量指标信息。 |
GET | /mappings | 显示所有 @RequestMapping 的 url 整理列表。 |
GET | /shutdown | 使应用程序正常关闭。默认禁用。 |
GET | /threaddump | 获取线程活动的快照。 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Boot Actuator 对外暴露应用的监控信息,Jolokia 提供使用 HTTP 接口获取 JSON 格式的数据 --> <dependency> <groupId>org.jolokia</groupId> <artifactId>jolokia-core</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1</version> </dependency> 复制代码
server.port=8080 # 项目名称 info.app.name=Spring-Boot-Actuator info.app.version= 1.0.0 info.app.test=test ####### Actuator 配置 ####### # 打开所有监控端点,默认仅公开 health 和 info 端点 management.endpoints.web.exposure.include=* # management.endpoint.health.show-details=always # Actuator 的访问路径,为了安全起见,一般使用独立的地址访问监控信息,同时也避免和自己应用的路径映射地址重复 management.endpoints.web.base-path=/monitor # 关掉安全认证,但一般为了安全起见,不建议关闭 management.security.enabled=false # 开启使用接口关闭 Spring Boot 应用 management.endpoint.shutdown.enabled=true 复制代码
查看 Spring 容器管理的所有 Bean,展示了 Bean 的别名、类型、是否单例、类的地址、依赖等信息。访问 http://localhost/monitor/beans
,返回部分信息如下:
{ "contexts": { "application": { "beans": { "org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration$ReactiveWebHealthConfiguration": { "aliases": [], "scope": "singleton", "type": "org.springframework.boot.actuate.autoconfigure.health.HealthEndpointWebExtensionConfiguration$ReactiveWebHealthConfiguration$$EnhancerBySpringCGLIB$$ae52c267", "resource": null, "dependencies": [] }, "endpointCachingOperationInvokerAdvisor": { "aliases": [], "scope": "singleton", "type": "org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor", "resource": "class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/EndpointAutoConfiguration.class]", "dependencies": [ "environment" ] } } } } } 复制代码
使用 conditions 可以在应用运行时查看代码了某个配置在什么条件下生效,或者某个自动配置为什么没有生效。访问 http://localhost:8080/monitor/conditions
,返回部分信息如下:
{ "contexts": { "application": { "positiveMatches": { "AdminServerWebConfiguration.ReactiveRestApiConfiguration": [ { "condition": "OnWebApplicationCondition", "message": "found ReactiveWebApplicationContext" } ], "AuditAutoConfiguration#auditListener": [ { "condition": "OnBeanCondition", "message": "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.listener.AbstractAuditListener; SearchStrategy: all) did not find any beans" } ], "AuditAutoConfiguration.AuditEventRepositoryConfiguration": [ { "condition": "OnBeanCondition", "message": "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.AuditEventRepository; SearchStrategy: all) did not find any beans" } ] } } } } 复制代码
health 主要用来检查应用的运行状态,这是我们使用最高频的一个监控点。通常使用此接口提醒我们应用实例的运行状态,以及应用不”健康“的原因,比如数据库连接、磁盘空间不够等。健康状态分为UP(正常)和DOWN(故障)状态。访问 http://localhost:8080/actuator/health
,返回信息如下:
{ "status": "UP" } 复制代码
info 就是我们自己配置在 application.properties 文件中以 info 开头的配置信息。访问 http://localhost:8080/actuator/info
,返回信息如下:
{ "app": { "name": "Spring-Boot-Actuator", "version": "1.0.0", "test": "test" } } 复制代码
显示所有通过注解 @RequestMapping 设置的 URL 映射,可以通过此来查看 URL 对应的控制器。访问 http://localhost:8080/monitor/mappings
,显示部分信息如下:
{ "contexts": { "application": { "mappings": { "dispatcherHandlers": { "webHandler": [ { "predicate": "{[/monitor/auditevents],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}", "handler": "public org.reactivestreams.Publisher<org.springframework.http.ResponseEntity<java.lang.Object>> org.springframework.boot.actuate.endpoint.web.reactive.AbstractWebFluxEndpointHandlerMapping$ReadOperationHandler.handle(org.springframework.web.server.ServerWebExchange)", "details": { "handlerMethod": { "className": "org.springframework.boot.actuate.endpoint.web.reactive.AbstractWebFluxEndpointHandlerMapping.ReadOperationHandler", "name": "handle", "descriptor": "(Lorg/springframework/web/server/ServerWebExchange;)Lorg/reactivestreams/Publisher;" }, "handlerFunction": null, "requestMappingConditions": { "consumes": [], "headers": [], "methods": [ "GET" ], "params": [], "patterns": [ "/monitor/auditevents" ], "produces": [ { "mediaType": "application/vnd.spring-boot.actuator.v2+json", "negated": false }, { "mediaType": "application/json", "negated": false } ] } } } } } } } } 复制代码
metrics 可以显示 Spring Boot 的指标,如己有内存、未占用内存、垃圾回收次数、类信息等。访问 http://localhost/monitor/metrics
,返回部分信息如下:
{ "names": [ "jvm.buffer.memory.used", "jvm.memory.used", "jvm.gc.memory.allocated", "jvm.memory.committed", "http.server.requests", "jvm.gc.max.data.size", "logback.events", "system.cpu.count", "jvm.memory.max", "jvm.buffer.total.capacity", "jvm.buffer.count", "process.files.max", "jvm.threads.daemon", "process.start.time", "jvm.gc.live.data.size", "process.files.open", "process.cpu.usage", "jvm.gc.pause", "process.uptime", "system.load.average.1m", "system.cpu.usage", "jvm.threads.live", "jvm.classes.loaded", "jvm.classes.unloaded", "jvm.threads.peak", "jvm.gc.memory.promoted" ] } 复制代码
根据指标名称进行访问,可以获取每个指标的信息。访问 http://localhost/monitor/metrics/jvm.memory.used
,返回信息如下:
{ "name": "jvm.memory.used", "measurements": [ { "statistic": "VALUE", "value": 1.6202468E8 } ], "availableTags": [ { "tag": "area", "values": [ "heap", "nonheap" ] }, { "tag": "id", "values": [ "Compressed Class Space", "PS Old Gen", "PS Survivor Space", "Metaspace", "PS Eden Space", "Code Cache" ] } ] } 复制代码
默认情况下,除 shutdown 之外的所有端点均处于启用状态。要配置端点的启用,可以使用其 management.endpoint.<id>.enabled
属性。以下示例启用 shutdown 端点:
management.endpoint.shutdown.enabled=true 复制代码
如果你只想打开一两个接口,那就先禁用全部接口,然后启用那几个你要的,这样更方便。以下示例启用 info 端点并禁用所有其他端点:
management.endpoints.enabled-by-default=false management.endpoint.info.enabled=true 复制代码
由于端点可能包含敏感信息,Actuator 默认了公开公开 health 和 info 端点。我们可以使用 management.endpoints.web.exposure.<include/eclude>
属性配置哪些端点公开,哪些端点不公开。 include
属性列出了公开的端点的 ID。 exclude
属性列出了不应公开的端点的 ID。
例如,要通过 HTTP 公开除 env 和 beans 端点之外的所有内容:
management.endpoints.web.exposure.include=* management.endpoints.web.exposure.exclude=env,beans 复制代码