转载于:https://www.jianshu.com/p/af9738634a21

Spring Boot 的 Actuator 提供了很多生产级的特性,比如监控和度量Spring Boot 应用程序。Actuator 的这些特性可以通过众多 REST 接口、远程 shell 和 JMX 获得。

一、Actuator 的 REST 接口

Spring Boot Actuator 的关键特性是在应用程序里提供众多 Web 接口,通过它们了解应用程序运行时的内部状况。Actuator 提供了 13 个接口,可以分为三大类:配置接口、度量接口和其它接口,具体如下表所示。

HTTP 方法 路径 描述
GET /autoconfig 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过
GET /configprops 描述配置属性(包含默认值)如何注入Bean
GET /beans 描述应用程序上下文里全部的Bean,以及它们的关系
GET /dump 获取线程活动的快照
GET /env 获取全部环境属性
GET /env/{name} 根据名称获取特定的环境属性值
GET /health 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供
GET /info 获取应用程序的定制信息,这些信息由info打头的属性提供
GET /mappings 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系
GET /metrics 报告各种应用程序度量信息,比如内存用量和HTTP请求计数
GET /metrics/{name} 报告指定名称的应用程序度量值
POST /shutdown 关闭应用程序,要求endpoints.shutdown.enabled设置为true
GET /trace 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等)

要启用 Actuator 的端点,只要在项目中引入 Actuator 的依赖即可。对于 Maven 依赖,引入的依赖是这样的:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-actuator</artifactId>
  4. </dependency>

1. 查看配置明细

Actuator 有一些接口不仅可以显示组件映射关系,还可以告诉你自动配置在配置 Spring 应用程序上下文时做了哪些决策。

1.1 获得 Bean 装配报告

要了解应用程序中 Spring 上下文的情况,最重要的接口就是 /beans。它会返回一个 JSON 文档,描述上下文里每个 bean 的情况,包括其 Java 类型以及注入的其它 bean。返回的信息如下所示:

  1. [
  2. {
  3. "context": "application",
  4. "parent": null,
  5. "beans": [
  6. {
  7. "bean": "demoApplication",
  8. "aliases": [],
  9. "scope": "singleton",
  10. "type": "com.example.DemoApplication$$EnhancerBySpringCGLIB$$88686e04",
  11. "resource": "null",
  12. "dependencies": []
  13. },
  14. {
  15. "bean": "org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory",
  16. "aliases": [],
  17. "scope": "singleton",
  18. "type": "org.springframework.core.type.classreading.CachingMetadataReaderFactory",
  19. "resource": "null",
  20. "dependencies": []
  21. }
  22. ]
  23. }
  24. ]

所有的 Bean 条目都有五类信息:

  • bean:Spring 应用程序上下文中的 Bean 名称或 ID。
  • resource:.class 文件的物理位置,通常是一个 URL,指向构建出的 JAR 文件。这会随着应用程序的构建和运行方式发生变化。
  • dependencies:当前 Bean 注入的 Bean ID 列表。
  • scope:Bean 的作用域(通常是单例,这也是默认作用域)。
  • type:Bean 的 Java 类型。
1.2 详解自动配置

/autoconfig接口能告诉你为什么会有这个 bean ,或者为什么没有这个 bean。

  1. {
  2. "positiveMatches": {
  3. "AuditAutoConfiguration#auditListener": [
  4. {
  5. "condition": "OnBeanCondition",
  6. "message": "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.listener.AbstractAuditListener; SearchStrategy: all) did not find any beans"
  7. }
  8. ],
  9. "MultipartAutoConfiguration#multipartConfigElement": [
  10. {
  11. "condition": "OnBeanCondition",
  12. "message": "@ConditionalOnMissingBean (types: javax.servlet.MultipartConfigElement; SearchStrategy: all) did not find any beans"
  13. }
  14. ]
  15. },
  16. "negativeMatches": {
  17. "AuditAutoConfiguration#authenticationAuditListener": {
  18. "notMatched": [
  19. {
  20. "condition": "OnClassCondition",
  21. "message": "@ConditionalOnClass did not find required class 'org.springframework.security.authentication.event.AbstractAuthenticationEvent'"
  22. }
  23. ],
  24. "matched": []
  25. },
  26. "AuditAutoConfiguration#authorizationAuditListener": {
  27. "notMatched": [
  28. {
  29. "condition": "OnClassCondition",
  30. "message": "@ConditionalOnClass did not find required class 'org.springframework.security.access.event.AbstractAuthorizationEvent'"
  31. }
  32. ],
  33. "matched": []
  34. }
  35. }
  36. }
1.3 查看配置属性

/env接口会生成应用程序可用的所有环境属性的列表,无论这些属性是否用到。这其中包括环境变量、JVM 属性、命令行参数,以及 application.properties 或 application.yml 文件提供的属性。

  1. {
  2. "profiles": [],
  3. "server.ports": {
  4. "local.server.port": 8080
  5. },
  6. "servletContextInitParams": {},
  7. "systemProperties": {
  8. "java.runtime.name": "Java(TM) SE Runtime Environment",
  9. "spring.output.ansi.enabled": "always",
  10. "sun.boot.library.path": "/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib",
  11. "java.vm.version": "25.121-b13",
  12. "gopherProxySet": "false",
  13. "java.vm.vendor": "Oracle Corporation",
  14. "java.vendor.url": "http://java.oracle.com/",
  15. "path.separator": ":",
  16. "idea.launcher.port": "7532",
  17. "java.vm.name": "Java HotSpot(TM) 64-Bit Server VM",
  18. "file.encoding.pkg": "sun.io",
  19. "user.country": "CN",
  20. "sun.java.launcher": "SUN_STANDARD",
  21. "sun.os.patch.level": "unknown",
  22. "PID": "2716",
  23. "java.vm.specification.name": "Java Virtual Machine Specification",
  24. "user.dir": "/Users/FlySheep/FlySheep/Code/ServerCode/SpringBoot_Demo/demo",
  25. "java.runtime.version": "1.8.0_121-b13",
  26. "java.awt.graphicsenv": "sun.awt.CGraphicsEnvironment",
  27. "org.jboss.logging.provider": "slf4j",
  28. "java.endorsed.dirs": "/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/endorsed",
  29. "os.arch": "x86_64",
  30. "visualvm.id": "11136812717769",
  31. "java.io.tmpdir": "/var/folders/d6/zn9yrwns46j4pwbl1_mv_6hw0000gn/T/",
  32. "line.separator": "\n",
  33. "java.vm.specification.vendor": "Oracle Corporation",
  34. "os.name": "Mac OS X",
  35. "sun.jnu.encoding": "UTF-8",
  36. "spring.beaninfo.ignore": "true",
  37. "java.library.path": "/Users/FlySheep/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.",
  38. "java.specification.name": "Java Platform API Specification",
  39. "java.class.version": "52.0",
  40. "sun.management.compiler": "HotSpot 64-Bit Tiered Compilers",
  41. "os.version": "10.11",
  42. "user.home": "/Users/FlySheep",
  43. "catalina.useNaming": "false",
  44. "user.timezone": "Asia/Shanghai",
  45. "java.awt.printerjob": "sun.lwawt.macosx.CPrinterJob",
  46. "file.encoding": "UTF-8",
  47. "idea.launcher.bin.path": "/Applications/IntelliJ IDEA.app/Contents/bin",
  48. "java.specification.version": "1.8",
  49. "catalina.home": "/private/var/folders/d6/zn9yrwns46j4pwbl1_mv_6hw0000gn/T/tomcat.6698906163877756728.8080",
  50. "java.class.path": "/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/lib/tools.jar:/Users/FlySheep/FlySheep/Code/ServerCode/SpringBoot_Demo/demo/target/classes:/Users/FlySheep/.m2/repository/org/springframework/boot/spring-boot-starter-web/1.5.2.RELEASE/spring-boot-starter-web-1.5.2.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/boot/spring-boot-starter/1.5.2.RELEASE/spring-boot-starter-1.5.2.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/boot/spring-boot/1.5.2.RELEASE/spring-boot-1.5.2.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/1.5.2.RELEASE/spring-boot-autoconfigure-1.5.2.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/boot/spring-boot-starter-logging/1.5.2.RELEASE/spring-boot-starter-logging-1.5.2.RELEASE.jar:/Users/FlySheep/.m2/repository/ch/qos/logback/logback-classic/1.1.11/logback-classic-1.1.11.jar:/Users/FlySheep/.m2/repository/ch/qos/logback/logback-core/1.1.11/logback-core-1.1.11.jar:/Users/FlySheep/.m2/repository/org/slf4j/jcl-over-slf4j/1.7.24/jcl-over-slf4j-1.7.24.jar:/Users/FlySheep/.m2/repository/org/slf4j/jul-to-slf4j/1.7.24/jul-to-slf4j-1.7.24.jar:/Users/FlySheep/.m2/repository/org/slf4j/log4j-over-slf4j/1.7.24/log4j-over-slf4j-1.7.24.jar:/Users/FlySheep/.m2/repository/org/yaml/snakeyaml/1.17/snakeyaml-1.17.jar:/Users/FlySheep/.m2/repository/org/springframework/boot/spring-boot-starter-tomcat/1.5.2.RELEASE/spring-boot-starter-tomcat-1.5.2.RELEASE.jar:/Users/FlySheep/.m2/repository/org/apache/tomcat/embed/tomcat-embed-core/8.5.11/tomcat-embed-core-8.5.11.jar:/Users/FlySheep/.m2/repository/org/apache/tomcat/embed/tomcat-embed-el/8.5.11/tomcat-embed-el-8.5.11.jar:/Users/FlySheep/.m2/repository/org/apache/tomcat/embed/tomcat-embed-websocket/8.5.11/tomcat-embed-websocket-8.5.11.jar:/Users/FlySheep/.m2/repository/org/hibernate/hibernate-validator/5.3.4.Final/hibernate-validator-5.3.4.Final.jar:/Users/FlySheep/.m2/repository/javax/validation/validation-api/1.1.0.Final/validation-api-1.1.0.Final.jar:/Users/FlySheep/.m2/repository/org/jboss/logging/jboss-logging/3.3.0.Final/jboss-logging-3.3.0.Final.jar:/Users/FlySheep/.m2/repository/com/fasterxml/classmate/1.3.3/classmate-1.3.3.jar:/Users/FlySheep/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.8.7/jackson-databind-2.8.7.jar:/Users/FlySheep/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.8.0/jackson-annotations-2.8.0.jar:/Users/FlySheep/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.8.7/jackson-core-2.8.7.jar:/Users/FlySheep/.m2/repository/org/springframework/spring-web/4.3.7.RELEASE/spring-web-4.3.7.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/spring-aop/4.3.7.RELEASE/spring-aop-4.3.7.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/spring-beans/4.3.7.RELEASE/spring-beans-4.3.7.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/spring-context/4.3.7.RELEASE/spring-context-4.3.7.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/spring-webmvc/4.3.7.RELEASE/spring-webmvc-4.3.7.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/spring-expression/4.3.7.RELEASE/spring-expression-4.3.7.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/boot/spring-boot-starter-actuator/1.5.2.RELEASE/spring-boot-starter-actuator-1.5.2.RELEASE.jar:/Users/FlySheep/.m2/repository/org/springframework/boot/spring-boot-actuator/1.5.2.RELEASE/spring-boot-actuator-1.5.2.RELEASE.jar:/Users/FlySheep/.m2/repository/org/slf4j/slf4j-api/1.7.24/slf4j-api-1.7.24.jar:/Users/FlySheep/.m2/repository/org/springframework/spring-core/4.3.7.RELEASE/spring-core-4.3.7.RELEASE.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar",
  51. "user.name": "FlySheep",
  52. "java.vm.specification.version": "1.8",
  53. "sun.java.command": "com.intellij.rt.execution.application.AppMain com.example.DemoApplication",
  54. "java.home": "/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre",
  55. "sun.arch.data.model": "64",
  56. "user.language": "zh",
  57. "java.specification.vendor": "Oracle Corporation",
  58. "awt.toolkit": "sun.lwawt.macosx.LWCToolkit",
  59. "java.vm.info": "mixed mode",
  60. "java.version": "1.8.0_121",
  61. "java.ext.dirs": "/Users/FlySheep/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java",
  62. "sun.boot.class.path": "/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/classes",
  63. "java.awt.headless": "true",
  64. "java.vendor": "Oracle Corporation",
  65. "catalina.base": "/private/var/folders/d6/zn9yrwns46j4pwbl1_mv_6hw0000gn/T/tomcat.6698906163877756728.8080",
  66. "file.separator": "/",
  67. "java.vendor.url.bug": "http://bugreport.sun.com/bugreport/",
  68. "sun.io.unicode.encoding": "UnicodeBig",
  69. "sun.cpu.endian": "little",
  70. "sun.cpu.isalist": ""
  71. },
  72. "systemEnvironment": {
  73. "PATH": "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin:/usr/local/mysql/bin:/Users/FlySheep/FlySheep/JavaTools/apache-maven-3.3.9/bin/bin",
  74. "SHELL": "/bin/zsh",
  75. "PAGER": "less",
  76. "LSCOLORS": "Gxfxcxdxbxegedabagacad",
  77. "OLDPWD": "/Applications/IntelliJ IDEA.app/Contents/bin",
  78. "USER": "FlySheep",
  79. "VERSIONER_PYTHON_PREFER_32_BIT": "no",
  80. "ZSH": "/Users/FlySheep/.oh-my-zsh",
  81. "TMPDIR": "/var/folders/d6/zn9yrwns46j4pwbl1_mv_6hw0000gn/T/",
  82. "SSH_AUTH_SOCK": "/private/tmp/com.apple.launchd.vZEKsGdZ1T/Listeners",
  83. "JAVA_MAIN_CLASS_2716": "com.intellij.rt.execution.application.AppMain",
  84. "XPC_FLAGS": "0x0",
  85. "VERSIONER_PYTHON_VERSION": "2.7",
  86. "__CF_USER_TEXT_ENCODING": "0x1F5:0x19:0x34",
  87. "Apple_PubSub_Socket_Render": "/private/tmp/com.apple.launchd.5VgRuDCQ5D/Render",
  88. "LOGNAME": "FlySheep",
  89. "LESS": "-R",
  90. "LC_CTYPE": "",
  91. "PWD": "/Users/FlySheep/FlySheep/Code/ServerCode/SpringBoot_Demo/demo",
  92. "XPC_SERVICE_NAME": "com.jetbrains.intellij.136992",
  93. "HOME": "/Users/FlySheep"
  94. },
  95. "applicationConfig: [classpath:/application.properties]": {
  96. "management.security.enabled": "false"
  97. }
  98. }

基本上,任何能给Spring Boot 应用程序提供属性的属性源都会列在 /env 的结果里,同时会显示具体的属性。
  为了避免敏感信息暴露到 /env 里,所有名为password、secret、key(或者名字中最后一段是这些)的属性在 /env 里都会加上“*”。举个例子,如果有一个属性名字是database.password,那么它在/env中的显示效果是这样的:

  1. "database.password":"******"

/env 接口还能用来获取单个属性的值,只需要在请求时在 /env 后加上属性名即可。

1.4 查看属性的使用方法

/configprops 接口会生成一个报告,说明属性如何进行设置(注入或其他方式)。

  1. {
  2. "endpoints-org.springframework.boot.actuate.endpoint.EndpointProperties": {
  3. "prefix": "endpoints",
  4. "properties": {
  5. "enabled": true,
  6. "sensitive": null
  7. }
  8. },
  9. "management.info-org.springframework.boot.actuate.autoconfigure.InfoContributorProperties": {
  10. "prefix": "management.info",
  11. "properties": {
  12. "git": {
  13. "mode": "SIMPLE"
  14. }
  15. }
  16. },
  17. "metricsEndpoint": {
  18. "prefix": "endpoints.metrics",
  19. "properties": {
  20. "id": "metrics",
  21. "sensitive": true,
  22. "enabled": true
  23. }
  24. },
  25. "spring.jackson-org.springframework.boot.autoconfigure.jackson.JacksonProperties": {
  26. "prefix": "spring.jackson",
  27. "properties": {
  28. "propertyNamingStrategy": null,
  29. "defaultPropertyInclusion": null,
  30. "dateFormat": null,
  31. "timeZone": null,
  32. "locale": null,
  33. "jodaDateTimeFormat": null
  34. }
  35. },
  36. "heapdumpMvcEndpoint": {
  37. "prefix": "endpoints.heapdump",
  38. "properties": {
  39. "path": "/heapdump",
  40. "sensitive": true,
  41. "enabled": true
  42. }
  43. },
  44. "endpoints.cors-org.springframework.boot.actuate.autoconfigure.EndpointCorsProperties": {
  45. "prefix": "endpoints.cors",
  46. "properties": {
  47. "allowedOrigins": [],
  48. "maxAge": 1800,
  49. "exposedHeaders": [],
  50. "allowedHeaders": [],
  51. "allowedMethods": [],
  52. "allowCredentials": null
  53. }
  54. },
  55. "environmentMvcEndpoint": {
  56. "prefix": "endpoints.env",
  57. "properties": {
  58. "path": "/env"
  59. }
  60. },
  61. "environmentEndpoint": {
  62. "prefix": "endpoints.env",
  63. "properties": {
  64. "id": "env",
  65. "sensitive": true,
  66. "enabled": true
  67. }
  68. },
  69. "spring.http.multipart-org.springframework.boot.autoconfigure.web.MultipartProperties": {
  70. "prefix": "spring.http.multipart",
  71. "properties": {
  72. "maxRequestSize": "10MB",
  73. "fileSizeThreshold": "0",
  74. "location": null,
  75. "maxFileSize": "1MB",
  76. "enabled": true,
  77. "resolveLazily": false
  78. }
  79. },
  80. "spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties": {
  81. "prefix": "spring.info",
  82. "properties": {
  83. "build": {
  84. "location": {}
  85. },
  86. "git": {
  87. "location": {}
  88. }
  89. }
  90. },
  91. "auditEventsEndpoint": {
  92. "prefix": "endpoints.auditevents",
  93. "properties": {
  94. "enabled": true
  95. }
  96. },
  97. "traceEndpoint": {
  98. "prefix": "endpoints.trace",
  99. "properties": {
  100. "id": "trace",
  101. "sensitive": true,
  102. "enabled": true
  103. }
  104. },
  105. "metricsMvcEndpoint": {
  106. "prefix": "endpoints.metrics",
  107. "properties": {
  108. "path": "/metrics"
  109. }
  110. },
  111. "infoEndpoint": {
  112. "prefix": "endpoints.info",
  113. "properties": {
  114. "id": "info",
  115. "sensitive": false,
  116. "enabled": true
  117. }
  118. },
  119. "auditEventMvcEndpoint": {
  120. "prefix": "endpoints.auditevents",
  121. "properties": {
  122. "path": "/auditevents",
  123. "sensitive": true,
  124. "enabled": true
  125. }
  126. },
  127. "management.trace-org.springframework.boot.actuate.trace.TraceProperties": {
  128. "prefix": "management.trace",
  129. "properties": {
  130. "include": [
  131. "COOKIES",
  132. "REQUEST_HEADERS",
  133. "RESPONSE_HEADERS",
  134. "ERRORS"
  135. ]
  136. }
  137. },
  138. "spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties": {
  139. "prefix": "spring.resources",
  140. "properties": {
  141. "cachePeriod": null,
  142. "addMappings": true,
  143. "chain": {
  144. "cache": true,
  145. "htmlApplicationCache": false,
  146. "gzipped": false,
  147. "strategy": {
  148. "fixed": {
  149. "enabled": false,
  150. "paths": [
  151. "/**"
  152. ],
  153. "version": null
  154. },
  155. "content": {
  156. "enabled": false,
  157. "paths": [
  158. "/**"
  159. ]
  160. }
  161. }
  162. },
  163. "staticLocations": [
  164. "/",
  165. "classpath:/META-INF/resources/",
  166. "classpath:/resources/",
  167. "classpath:/static/",
  168. "classpath:/public/"
  169. ]
  170. }
  171. },
  172. "management.health.status-org.springframework.boot.actuate.autoconfigure.HealthIndicatorProperties": {
  173. "prefix": "management.health.status",
  174. "properties": {
  175. "order": null
  176. }
  177. },
  178. "healthMvcEndpoint": {
  179. "prefix": "endpoints.health",
  180. "properties": {
  181. "path": "/health"
  182. }
  183. },
  184. "serverProperties": {
  185. "prefix": "server",
  186. "properties": {
  187. "address": null,
  188. "maxHttpPostSize": 0,
  189. "undertow": {
  190. "maxHttpPostSize": 0,
  191. "bufferSize": null,
  192. "buffersPerRegion": null,
  193. "ioThreads": null,
  194. "workerThreads": null,
  195. "directBuffers": null,
  196. "accesslog": {
  197. "enabled": null,
  198. "pattern": "common",
  199. "prefix": "access_log.",
  200. "suffix": "log",
  201. "dir": "/Users/FlySheep/FlySheep/Code/ServerCode/SpringBoot_Demo/demo/logs",
  202. "rotate": true
  203. }
  204. },
  205. "tomcat": {
  206. "accesslog": {
  207. "enabled": false,
  208. "pattern": "common",
  209. "directory": "logs",
  210. "prefix": "access_log",
  211. "suffix": ".log",
  212. "rotate": true,
  213. "renameOnRotate": false,
  214. "requestAttributesEnabled": false,
  215. "buffered": true
  216. },
  217. "internalProxies": "10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|192\\.168\\.\\d{1,3}\\.\\d{1,3}|169\\.254\\.\\d{1,3}\\.\\d{1,3}|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}",
  218. "protocolHeader": null,
  219. "protocolHeaderHttpsValue": "https",
  220. "portHeader": "X-Forwarded-Port",
  221. "remoteIpHeader": null,
  222. "basedir": null,
  223. "backgroundProcessorDelay": 30,
  224. "maxThreads": 0,
  225. "minSpareThreads": 0,
  226. "maxHttpPostSize": 0,
  227. "redirectContextRoot": null,
  228. "uriEncoding": null,
  229. "maxConnections": 0,
  230. "acceptCount": 0,
  231. "additionalTldSkipPatterns": []
  232. },
  233. "displayName": "application",
  234. "session": {
  235. "timeout": null,
  236. "trackingModes": null,
  237. "persistent": false,
  238. "storeDir": null,
  239. "cookie": {
  240. "name": null,
  241. "domain": null,
  242. "path": null,
  243. "comment": null,
  244. "httpOnly": null,
  245. "secure": null,
  246. "maxAge": null
  247. }
  248. },
  249. "contextPath": null,
  250. "error": {
  251. "path": "/error",
  252. "includeStacktrace": "NEVER"
  253. },
  254. "ssl": null,
  255. "serverHeader": null,
  256. "useForwardHeaders": null,
  257. "port": null,
  258. "maxHttpHeaderSize": 0,
  259. "servletPath": "/",
  260. "jspServlet": null,
  261. "jetty": {
  262. "maxHttpPostSize": 0,
  263. "acceptors": null,
  264. "selectors": null
  265. },
  266. "connectionTimeout": null
  267. }
  268. },
  269. "spring.metrics.export-org.springframework.boot.actuate.metrics.export.MetricExportProperties": {
  270. "prefix": "spring.metrics.export",
  271. "properties": {
  272. "excludes": null,
  273. "statsd": {
  274. "host": null,
  275. "port": 8125,
  276. "prefix": null
  277. },
  278. "includes": null,
  279. "enabled": true,
  280. "redis": {
  281. "prefix": "spring.metrics.application.7a5b013db041f4a1b6c45b6456487d05",
  282. "key": "******"
  283. },
  284. "aggregate": {
  285. "prefix": "application.7a5b013db041f4a1b6c45b6456487d05",
  286. "keyPattern": "k.d"
  287. }
  288. }
  289. },
  290. "configurationPropertiesReportEndpoint": {
  291. "prefix": "endpoints.configprops",
  292. "properties": {
  293. "id": "configprops",
  294. "sensitive": true,
  295. "enabled": true
  296. }
  297. },
  298. "healthEndpoint": {
  299. "prefix": "endpoints.health",
  300. "properties": {
  301. "timeToLive": 1000,
  302. "id": "health",
  303. "sensitive": false,
  304. "enabled": true
  305. }
  306. },
  307. "loggersMvcEndpoint": {
  308. "prefix": "endpoints.loggers",
  309. "properties": {
  310. "path": "/loggers"
  311. }
  312. },
  313. "loggersEndpoint": {
  314. "prefix": "endpoints.loggers",
  315. "properties": {
  316. "id": "loggers",
  317. "sensitive": true,
  318. "enabled": true
  319. }
  320. },
  321. "endpoints.metrics.filter-org.springframework.boot.actuate.autoconfigure.MetricFilterProperties": {
  322. "prefix": "endpoints.metrics.filter",
  323. "properties": {
  324. "counterSubmissions": [
  325. "MERGED"
  326. ],
  327. "gaugeSubmissions": [
  328. "MERGED"
  329. ]
  330. }
  331. },
  332. "dumpEndpoint": {
  333. "prefix": "endpoints.dump",
  334. "properties": {
  335. "id": "dump",
  336. "sensitive": true,
  337. "enabled": true
  338. }
  339. },
  340. "autoConfigurationReportEndpoint": {
  341. "prefix": "endpoints.autoconfig",
  342. "properties": {
  343. "id": "autoconfig",
  344. "sensitive": true,
  345. "enabled": true
  346. }
  347. },
  348. "endpoints.jmx-org.springframework.boot.actuate.autoconfigure.EndpointMBeanExportProperties": {
  349. "prefix": "endpoints.jmx",
  350. "properties": {
  351. "uniqueNames": false,
  352. "enabled": true,
  353. "domain": ""
  354. }
  355. },
  356. "spring.http.encoding-org.springframework.boot.autoconfigure.web.HttpEncodingProperties": {
  357. "prefix": "spring.http.encoding",
  358. "properties": {
  359. "charset": "UTF-8",
  360. "force": false,
  361. "mapping": null,
  362. "forceRequest": false,
  363. "forceResponse": false
  364. }
  365. },
  366. "shutdownEndpoint": {
  367. "prefix": "endpoints.shutdown",
  368. "properties": {
  369. "id": "shutdown",
  370. "sensitive": true,
  371. "enabled": false
  372. }
  373. },
  374. "beansEndpoint": {
  375. "prefix": "endpoints.beans",
  376. "properties": {
  377. "id": "beans",
  378. "sensitive": true,
  379. "enabled": true
  380. }
  381. },
  382. "managementServerProperties": {
  383. "prefix": "management",
  384. "properties": {
  385. "security": {
  386. "enabled": false,
  387. "roles": [
  388. "ACTUATOR"
  389. ],
  390. "sessions": "STATELESS"
  391. },
  392. "address": null,
  393. "port": null,
  394. "addApplicationContextHeader": true,
  395. "contextPath": "",
  396. "ssl": null
  397. }
  398. },
  399. "requestMappingEndpoint": {
  400. "prefix": "endpoints.mappings",
  401. "properties": {
  402. "id": "mappings",
  403. "sensitive": true,
  404. "enabled": true
  405. }
  406. },
  407. "endpoints.health-org.springframework.boot.actuate.autoconfigure.HealthMvcEndpointProperties": {
  408. "prefix": "endpoints.health",
  409. "properties": {
  410. "mapping": {}
  411. }
  412. },
  413. "spring.mvc-org.springframework.boot.autoconfigure.web.WebMvcProperties": {
  414. "prefix": "spring.mvc",
  415. "properties": {
  416. "dateFormat": null,
  417. "servlet": {
  418. "loadOnStartup": -1
  419. },
  420. "staticPathPattern": "/**",
  421. "dispatchOptionsRequest": true,
  422. "dispatchTraceRequest": false,
  423. "locale": null,
  424. "ignoreDefaultModelOnRedirect": true,
  425. "logResolvedException": false,
  426. "async": {
  427. "requestTimeout": null
  428. },
  429. "messageCodesResolverFormat": null,
  430. "mediaTypes": {},
  431. "view": {
  432. "prefix": null,
  433. "suffix": null
  434. },
  435. "localeResolver": "ACCEPT_HEADER",
  436. "throwExceptionIfNoHandlerFound": false
  437. }
  438. },
  439. "diskSpaceHealthIndicatorProperties": {
  440. "prefix": "management.health.diskspace",
  441. "properties": {
  442. "path": "/Users/FlySheep/FlySheep/Code/ServerCode/SpringBoot_Demo/demo/.",
  443. "threshold": 10485760
  444. }
  445. }
  446. }
1.5 生成接口道控制器的映射

在应用程序相对较小的时候,很容易搞清楚控制器都映射到了哪些接口上。如果Web界面的控制器和请求处理方法数量多,那最好能有一个列表,罗列出应用程序发布的全部接口。/mappings 接口就提供了这么一个列表。

  1. {
  2. "/webjars/**": {
  3. "bean": "resourceHandlerMapping"
  4. },
  5. "/**": {
  6. "bean": "resourceHandlerMapping"
  7. },
  8. "/**/favicon.ico": {
  9. "bean": "faviconHandlerMapping"
  10. },
  11. "{[/error]}": {
  12. "bean": "requestMappingHandlerMapping",
  13. "method": "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)"
  14. },
  15. "{[/error],produces=[text/html]}": {
  16. "bean": "requestMappingHandlerMapping",
  17. "method": "public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)"
  18. },
  19. "{[/env/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  20. "bean": "endpointHandlerMapping",
  21. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String)"
  22. },
  23. "{[/env || /env.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  24. "bean": "endpointHandlerMapping",
  25. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
  26. },
  27. "{[/beans || /beans.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  28. "bean": "endpointHandlerMapping",
  29. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
  30. },
  31. "{[/auditevents || /auditevents.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  32. "bean": "endpointHandlerMapping",
  33. "method": "public org.springframework.http.ResponseEntity<?> org.springframework.boot.actuate.endpoint.mvc.AuditEventsMvcEndpoint.findByPrincipalAndAfterAndType(java.lang.String,java.util.Date,java.lang.String)"
  34. },
  35. "{[/autoconfig || /autoconfig.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  36. "bean": "endpointHandlerMapping",
  37. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
  38. },
  39. "{[/loggers/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  40. "bean": "endpointHandlerMapping",
  41. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.LoggersMvcEndpoint.get(java.lang.String)"
  42. },
  43. "{[/loggers/{name:.*}],methods=[POST],consumes=[application/vnd.spring-boot.actuator.v1+json || application/json],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  44. "bean": "endpointHandlerMapping",
  45. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.LoggersMvcEndpoint.set(java.lang.String,java.util.Map<java.lang.String, java.lang.String>)"
  46. },
  47. "{[/loggers || /loggers.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  48. "bean": "endpointHandlerMapping",
  49. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
  50. },
  51. "{[/heapdump || /heapdump.json],methods=[GET],produces=[application/octet-stream]}": {
  52. "bean": "endpointHandlerMapping",
  53. "method": "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"
  54. },
  55. "{[/mappings || /mappings.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  56. "bean": "endpointHandlerMapping",
  57. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
  58. },
  59. "{[/trace || /trace.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  60. "bean": "endpointHandlerMapping",
  61. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
  62. },
  63. "{[/configprops || /configprops.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  64. "bean": "endpointHandlerMapping",
  65. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
  66. },
  67. "{[/dump || /dump.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  68. "bean": "endpointHandlerMapping",
  69. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
  70. },
  71. "{[/metrics/{name:.*}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  72. "bean": "endpointHandlerMapping",
  73. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String)"
  74. },
  75. "{[/metrics || /metrics.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  76. "bean": "endpointHandlerMapping",
  77. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
  78. },
  79. "{[/health || /health.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  80. "bean": "endpointHandlerMapping",
  81. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint.invoke(javax.servlet.http.HttpServletRequest,java.security.Principal)"
  82. },
  83. "{[/info || /info.json],methods=[GET],produces=[application/vnd.spring-boot.actuator.v1+json || application/json]}": {
  84. "bean": "endpointHandlerMapping",
  85. "method": "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
  86. }
  87. }

这里我们可以看到不少接口的映射。每个映射的键都是一个字符串,其内容就是 Spring MVC 的 @RequestMapping 注解上设置的属性。实际上,这个字符串能让你清晰地了解控制器是如何映射的,哪怕不看源代码。每个映射的值都有两个属性:bean 和 method。bean 属性标识了 Spring Bean 的名字,映射源自这个Bean。method属性是映射对应方法的全限定方法签名。

2. 运行时指标

对运行时指标情况做一个快照,这对评估应用程序的健康情况很有帮助。Actuator 提供了一系列接口,让你能在运行时快速检查应用程序。

2.1 查看应用程序的指标值

关于运行中的应用程序,有很多有趣而且有用的信息。举个例子,了解应用程序的内存情况 (可用或空闲)有助于决定给JVM分配多少内存。对Web应用程序而言,不用查看Web服务器日志,如果请求失败或者是耗时太长,就可以大概知道内存的情况了。运行中的应用程序有诸多计数器和度量器,/metrics 接口提供了这些东西的快照。

  1. {
  2. "mem": 365004,
  3. "mem.free": 153938,
  4. "processors": 8,
  5. "instance.uptime": 852279,
  6. "uptime": 855002,
  7. "systemload.average": 3.509765625,
  8. "heap.committed": 316928,
  9. "heap.init": 262144,
  10. "heap.used": 162989,
  11. "heap": 3728384,
  12. "nonheap.committed": 50816,
  13. "nonheap.init": 2496,
  14. "nonheap.used": 48077,
  15. "nonheap": 0,
  16. "threads.peak": 18,
  17. "threads.daemon": 16,
  18. "threads.totalStarted": 23,
  19. "threads": 18,
  20. "classes": 5974,
  21. "classes.loaded": 5974,
  22. "classes.unloaded": 0,
  23. "gc.ps_scavenge.count": 4,
  24. "gc.ps_scavenge.time": 35,
  25. "gc.ps_marksweep.count": 1,
  26. "gc.ps_marksweep.time": 27,
  27. "httpsessions.max": -1,
  28. "httpsessions.active": 0,
  29. "gauge.response.mappings": 4,
  30. "gauge.response.configprops": 155,
  31. "counter.status.200.mappings": 1,
  32. "counter.status.200.configprops": 1
  33. }

对 /metrics 接口提供的信息进行简单分类如下表:

分类 前缀 报告内容
垃圾收集器 gc.* 已经发生过的垃圾收集次数,以及垃圾收集所耗费的时间,适用于标记-清理垃圾收集器和并行垃圾收集器(数据源自java.lang.management. GarbageCollectorMXBean)
内存 mem.* 分配给应用程序的内存数量和空闲的内存数量(数据源自java.lang. Runtime)
heap.* 当前内存用量(数据源自java.lang.management.MemoryUsage)
类加载器 classes.* JVM类加载器加载与卸载的类的数量(数据源自java.lang. management.ClassLoadingMXBean)
系统 processors、instance.uptime、uptime、systemload.average 系统信息,例如处理器数量(数据源自java.lang.Runtime)、运行时间(数据源自java.lang.management.RuntimeMXBean)、平均负载(数据源自java.lang.management.OperatingSystemMXBean)
线程池 thread.* 线程、守护线程的数量,以及JVM启动后的线程数量峰值(数据源自 java.lang .management.ThreadMXBean)
数据源 datasource.* 数据源连接的数量(源自数据源的元数据,仅当Spring应用程序上下文里存在 DataSource Bean 的时候才会有这个信息)
Tomcat 会话 httpsessions.* Tomcat的活跃会话数和最大会话数(数据源自嵌入式Tomcat的Bean,仅在使用嵌入式Tomcat服务器运行应用程序时才有这个信息)
HTTP counter.status.、gauge.response. 多种应用程序服务HTTP请求的度量值与计数器

请注意,这里的一些度量值,比如数据源和Tomcat会话,仅在应用程序中运行特定组件时才有数据。你还可以注册自己的度量信息。
  HTTP的计数器和度量值需要做一点说明。counter.status 后的值是HTTP状态码,随后是所请求的路径。举个例子,counter.status.200.metrics 表明/metrics端点返回 200(OK) 状态码的次数。
  HTTP的度量信息在结构上也差不多,却在报告另一类信息。它们全部以gauge.response 开头,,表明这是HTTP响应的度量信息。前缀后是对应的路径。度量值是以毫秒为单位的时间,反映了最近处理该路径请求的耗时。
  这里还有几个特殊的值需要注意。root路径指向的是根路径或/。star-star代表了那些Spring 认为是静态资源的路径,包括图片、JavaScript和样式表,其中还包含了那些找不到的资源。这就是为什么你经常会看到 counter.status.404.star-star,这是返回了HTTP 404 (NOT FOUND) 状态的请求数。  
  /metrics 接口会返回所有的可用度量值,但你也可能只对某个值感兴趣。要获取单个值,请求时可以在URL后加上对应的键名。例如,要查看空闲内存大小,可以向/metrics/mem.free发一 个GET请求。

2.2 追踪 Web 请求

/trace 接口能报告所有Web请求的详细信息,包括请求方法、路径、时间戳以及请求和响应的头信息。

  1. [
  2. {
  3. "timestamp": 1491279254447,
  4. "info": {
  5. "method": "GET",
  6. "path": "/metrics",
  7. "headers": {
  8. "request": {
  9. "host": "localhost:8080",
  10. "connection": "keep-alive",
  11. "upgrade-insecure-requests": "1",
  12. "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36",
  13. "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
  14. "accept-encoding": "gzip, deflate, sdch, br",
  15. "accept-language": "zh-CN,zh;q=0.8,en;q=0.6",
  16. "cookie": "JSESSIONID=24CCB83195B2A35F5193C97D2CD51D69"
  17. },
  18. "response": {
  19. "X-Application-Context": "application",
  20. "Content-Type": "application/vnd.spring-boot.actuator.v1+json;charset=UTF-8",
  21. "Transfer-Encoding": "chunked",
  22. "Date": "Tue, 04 Apr 2017 04:14:14 GMT",
  23. "status": "200"
  24. }
  25. }
  26. }
  27. }
  28. ]
2.3 导出线程活动

在确认应用程序运行情况时,除了跟踪请求,了解线程活动也会很有帮助。/dump 接口会生成当前线程活动的快照。

2.4 监控应用程序健康状况

如果你想知道自己的应用程序是否在运行,可以直接访问/health 接口。在最简单的情况下,该端点会显示一个简单的JSON,内容如下:

  1. {
  2. "status": "UP",
  3. "diskSpace": {
  4. "status": "UP",
  5. "total": 48978722816,
  6. "free": 8812167168,
  7. "threshold": 10485760
  8. }
  9. }

二、定制 Actuator

虽然Actuator提供了很多运行中Spring Boot应用程序的内部工作细节,但难免和你的需求有所偏差。也许你并不需要它提供的所有功能,想要关闭一些也说不定。或者,你需要对Actuator 稍作扩展,增加一些自定义的度量信息,以满足你对应用程序的需求。

1. 修改接口 ID

每个Actuator 接口都有一个ID用来决定接口的路径,比方说,/beans接口的默认ID就是beans。比如要修改 /beans 为 /instances,则设置如下:

  1. endpoints.beans.id = instances
2. 启用和禁用接口

虽然Actuator的接口都很有用,但你不一定需要全部这些接口。默认情况下,所有接口(除 了/shutdown)都启用。比如要禁用 /metrics 接口,则可以设置如下:

  1. endpoints.metrics.enabled = false

如果你只想打开一两个接口,那就先禁用全部接口,然后启用那几个你要的,这样更方便。

  1. endpoints.enabled = false
  2. endpoints.metrics.enabled = true

3. 添加自定义度量信息

Actuator 自动配置有两个实例 CounterService 和 GaugeService 可以用来计数使用,我们所要做的就是把它们的实例注入所需的 bean 然后调用相应的方法。除此之外,我们还可以实现 PublicMetrics 接口,提供自己需要的度量信息。

4. 创建自定义跟踪仓库

默认情况下,/trace 接口报告的跟踪信息都存储在内存仓库里,100个条目封顶。一旦仓库满了,就开始移除老的条目,给新的条目腾出空间。在开发阶段这没什么问题,但在生产环境中,大流量会造成跟踪信息还没来得及看就被丢弃。我们可以将那些跟踪条目存储在其他地方——既不消耗内存,又能长久保存的地方。只需实现Spring Boot的TraceRepository接口即可。

5. 插入自定义的健康指示器

实现 HealthIndicator 接口则可以实现自定义的健康指示器。

6. 保护 Actuator 接口

很多Actuator端点发布的信息都可能涉及敏感数据,还有一些端点,(比如/shutdown)非常危险,可以用来关闭应用程序。因此,保护这些端点尤为重要,能访问它们的只能是那些经过授权的客户端。

Spring Boot Actuator 使用的更多相关文章

  1. Complete Guide for Spring Boot Actuator

    You are here to learn about Spring Boot Actuator for collecting metrics about your production grade ...

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

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

  3. spring boot admin + spring boot actuator + erueka 微服务监控

    关于spring boot actuator简单使用,请看 简单的spring boot actuator 使用,点击这里 spring boot admin 最新的正式版本是1.5.3 与 spri ...

  4. spring boot actuator 简单使用

    spring boot admin + spring boot actuator + erueka 微服务监控 简单的spring boot actuator 使用 POM <dependenc ...

  5. 使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控

    由于最近在做监控方面的工作,因此也读了不少相关的经验分享.其中有这样一篇文章总结了一些基于Spring Boot的监控方案,因此翻译了一下,希望可以对大家有所帮助. 原文:Near real-time ...

  6. spring boot actuator专题

    spring-boot-starter-actuator模块的实现对于实施微服务的中小团队来说,可以有效地减少监控系统在采集应用指标时的开发量.当然,它也并不是万能的,有时候我们也需要对其做一些简单的 ...

  7. 使用Spring Boot Actuator将指标导出到InfluxDB和Prometheus

    使用Spring Boot Actuator将指标导出到InfluxDB和Prometheus   Spring Boot Actuator是Spring Boot 2发布后修改最多的项目之一.它经过 ...

  8. (转)Spring Boot (十九):使用 Spring Boot Actuator 监控应用

    http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html 微服务的特点决定了功能模块的部署是分布式的,大部分功能 ...

  9. 朱晔和你聊Spring系列S1E7:简单好用的Spring Boot Actuator

    阅读PDF版本 本文会来看一下Spring Boot Actuator提供给我们的监控端点Endpoint.健康检查Health和打点指标Metrics等所谓的Production-ready(生产环 ...

随机推荐

  1. Python中的正则表达式(re)

    import re re.match #从开始位置开始匹配,如果开头没有则无 re.search #搜索整个字符串 re.findall #搜索整个字符串,返回一个list 举例: r(raw)用在p ...

  2. RestExpress response中addHeader 导致stackOverflow

    问题描述: 最近在项目使用中要在restExpress的header中增加一个键值对,同事在使用的时候没有对header的value进行非空判断,于是在测试环境测试的时候就出现了一个异常

  3. virtual 函数只有在用指针或引用的方式访问,才会导致多态。

    只有用指针和引用,才会动态绑定.才会在运行时候从虚表中找对应的成员函数. 如果只是用.访问成员函数,是静态绑定,在编译时刻就固定好的. 另外,父类的虚函数,子类不管加不加virtual关键字,都是虚函 ...

  4. wget 网站扒取

    wget --mirror --page-requisites --adjust-extension --no-parent --convert-links  http://target.com

  5. C++继承中关于子类构造函数的写法

    构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法).因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需 ...

  6. oracle 查询索引和主键

    ORACLE: 1.查主键名称: select * from user_constraints where table_name = 'AAA' and constraint_type ='P'; 查 ...

  7. POJ 1741 Tree(点分治点对<=k)

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  8. vue绑定html的class属性的方法

    一.对象语法绑定class属性 class的属性代码如下 <style type="text/css"> .red{ color: red; width: 100px; ...

  9. 725. Split Linked List in Parts把链表分成长度不超过1的若干部分

    [抄题]: Given a (singly) linked list with head node root, write a function to split the linked list in ...

  10. Python数据分析--Pandas知识点(三)

    本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘. Python数据分析--Pandas知识点(一) Python数据分析--Pandas知识点(二) 下面将是在知识点一, ...