springbootactuator端点⾼级进阶metris指标详解、git配置详
解、⾃定。。。
前⾔
  接着上⼀篇《》actuator的介绍,继续深挖actuator中关于监控⽅⾯的特性。
  Spring Boot包含很多其他的特性,它们可以帮你监控和管理发布到⽣产环境的应⽤。你可以选择使⽤HTTP端点,JMX或远程
shell(SSH或Telnet)来管理和监控应⽤。审计(Auditing),健康(health)和数据采集(metrics gathering)会⾃动应⽤到你的应⽤。执⾏器HTTP端点仅适⽤于基于Spring MVC的应⽤程序。
介绍
Metrics基本上是成熟公司⾥⾯必须做的⼀件事情,简单点来说就是对应⽤的监控,之前在⼀些技术不成熟的公司其实是不了解这种概念,因为业务跟技术是相关的当业务庞⼤起来,技术也会相对复杂起来,对这些复杂的系统进⾏监控就存在必要性了,特别是在soa化的系统中,完整⼀个软件的功能分布在各个系统中,针对这些功能进⾏监控就更必要了⽽Spring Boot Actuator 提供了metrics service,让监控变得统⼀化了,⽅便管理
开启production-ready特性
spring-boot-actuator模块提供了Spring Boot所有的production-ready特性。启⽤该特性的最简单⽅式就是添加对spring-boot-starter-actuator ‘Starter POM’的依赖。
执⾏器(Actuator)的定义:执⾏器是⼀个制造业术语,指的是⽤于移动或控制东西的⼀个机械装置。⼀个很⼩的改变就能让执⾏器产⽣⼤量的运动。
基于Maven的项⽬想要添加执⾏器只需添加下⾯的’starter’依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
端点
执⾏器端点允许你监控应⽤及与应⽤进⾏交互。Spring Boot包含很多内置的端点,你也可以添加⾃⼰的。例如,health端点提供了应⽤的基本健康信息。
端点暴露的⽅式取决于你采⽤的技术类型。⼤部分应⽤选择HTTP监控,端点的ID映射到⼀个URL。例如,默认情况下,health端点将被映射到/health。
下⾯的端点都是可⽤的:
ID描述敏感
(Sensitive)autoconfig显⽰⼀个auto-configuration的报告,该报告展⽰所有auto-configuration候选者及它们被应⽤或未被应⽤的原
true 因
beans显⽰⼀个应⽤中所有Spring Beans的完整列表true configprops显⽰⼀个所有@ConfigurationProperties的整理列表true
dump执⾏⼀个线程转储true
env暴露来⾃Spring ConfigurableEnvironment的属性true
health展⽰应⽤的健康信息(当使⽤⼀个未认证连接访问时显⽰⼀个简单的’status’,使⽤认证连接访问则显⽰全部
false 信息详情)
info显⽰任意的应⽤信息false
metrics展⽰当前应⽤的’指标’信息true
mappings显⽰⼀个所有@RequestMapping路径的整理列表true
shutdown允许应⽤以优雅的⽅式关闭(默认情况下不启⽤)true
trace显⽰trace信息(默认为最新的⼀些HTTP请求)true
如果您使⽤Spring MVC,还可以使⽤以下附加端点:
ID描述敏感默认
值docs显⽰Actuator端点的⽂档,包括⽰例请求和响应。需要spring-boot-actuator-docs在类路径上false
heapdump返回GZip压缩hprof堆转储⽂件。true jolokia通过HTTP暴露JMX bean(当Jolokia在类路径上时)。--《》true
logfile返回⽇志⽂件的内容(if logging.file或logging.path属性已设置)。⽀持使⽤HTTP Range标头来检索部分⽇志⽂件的内容。true
ID描述敏感默认
根据端点是如何暴露的,该sensitive属性可以⽤作安全提⽰。例如,敏感端点在通过HTTP访问时将需要⽤户名/密码(或者如果Web安全性未启⽤,则简单地禁⽤)。
健康信息
健康信息可以⽤来检查应⽤的运⾏状态。它经常被监控软件⽤来提醒⼈们⽣产系统是否停⽌。health端点暴露的默认信息取决于端点是如何被访问的。对于⼀个⾮安全,未认证的连接只返回⼀个简单的’status’信息。对于⼀个安全或认证过的连接其他详细信息也会展⽰
健康信息是从你的ApplicationContext中定义的所有HealthIndicator beans收集过来的。Spring Boot包含很多auto-configured的HealthIndicators,你也可以写⾃⼰的。
安全与HealthIndicators
HealthIndicators返回的信息常常性质上有点敏感。例如,你可能不想将数据库服务器的详情发布到外⾯。因此,在使⽤⼀个未认证的HTTP 连接时,默认只会暴露健康状态(health status)。如果想将所有的健康信息暴露出去,你可以把endpoints.health.sensitive设置为false。为防⽌’拒绝服务’攻击,Health响应会被缓存。你可以使⽤endpoints.health.time-to-live属性改变默认的缓存时间(1000毫秒)。
⾃动配置的HealthIndicators
下⾯的HealthIndicators会被Spring Boot⾃动配置(在合适的时候):
名称描述
DiskSpaceHealthIndicator低磁盘空间检测
DataSourceHealthIndicator检查是否能从DataSource获取连接
MongoHealthIndicator检查⼀个Mongo数据库是否可⽤(up)
RabbitHealthIndicator检查⼀个Rabbit服务器是否可⽤(up)
RedisHealthIndicator检查⼀个Redis服务器是否可⽤(up)
SolrHealthIndicator检查⼀个Solr服务器是否可⽤(up)
可以使⽤该management.abled 属性来禁⽤它们。
编写⾃定义HealthIndicators
想提供⾃定义健康信息,你可以注册实现了HealthIndicator接⼝的Spring beans。你需要提供⼀个health()⽅法的实现,并返回⼀个Health响应。Health响应需要包含⼀个status和可选的⽤于展⽰的详情。
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class MyHealth implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
}
除了Spring Boot预定义的Status类型,Health也可以返回⼀个代表新的系统状态的⾃定义Status。在这种情况下,需要提供⼀个HealthAggregator接⼝的⾃定义实现,或使⽤management.der属性配置默认的实现。
例如,假设⼀个新的,代码为FATAL的Status被⽤于你的⼀个HealthIndicator实现中。为了配置严重程
度,你需要将下⾯的配置添加到application属性⽂件中:
management.der: DOWN, OUT_OF_SERVICE, UNKNOWN, UP
如果使⽤HTTP访问health端点,你可能想要注册⾃定义的status,并使⽤HealthMvcEndpoint进⾏映射。例如,你可以将FATAL映射为HttpStatus.SERVICE_UNAVAILABLE。
info
应⽤程序信息显⽰从InfoContributor您定义的所有bean 收集的各种信息 ApplicationContext。Spring Boot包括⼀些⾃动配置InfoContributors,您也可以⾃⼰编写。
⾃动配置的InfoContributors
以下内容InfoContributors由Spring Boot⾃动配置:
以下内容InfoContributors由Spring Boot⾃动配置:
名称描述
EnvironmentInfoContributor从钥匙Environment下⽅隐藏任何info钥匙。
GitInfoContributor如果git.properties⽂件可⽤,则显⽰git 信息。
BuildInfoContributor如果META-INF/build-info.properties⽂件可⽤,则显⽰构建信息。
⾃定义应⽤信息信息
通过设置Spring属性info.*,你可以定义info端点暴露的数据。所有在info关键字下的Environment属性都将被⾃动暴露。例如,你可以将下⾯的配置添加到application.properties:
info.app.name=MyService
info.app.description=My awesome service
info.app.version=1.0.0
在构建时期⾃动扩展info属性
你可以使⽤已经存在的构建配置⾃动扩展info属性,⽽不是对在项⽬构建配置中存在的属性进⾏硬编码。这在Maven和Gradle都是可能的。使⽤Maven⾃动扩展属性
对于Maven项⽬,你可以使⽤资源过滤来⾃动扩展info属性。如果使⽤spring-boot-starter-parent,你可
以通过@..@占位符引⽤Maven
的’project properties’。
project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint
info.build.artifact=@project.artifactId@
info.build.name=@project.name@
info.build.description=@project.description@
info.build.version=@project.version@
注:在上⾯的⽰例中,我们使⽤project.*来设置⼀些值以防⽌由于某些原因Maven的资源过滤没有开启。Maven⽬标spring-
boot:run直接将src/main/resources添加到classpath下(出于热加载的⽬的)。这就绕过了资源过滤和⾃动扩展属性的特性。你可以使⽤exec:java替换该⽬标或⾃定义插件的配置,具体参考plugin usage page。
如果你不使⽤starter parent,在你的l你需要添加(处于元素内):
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
和(处于内):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
</configuration>
</plugin>
Git提交信息
info端点的另⼀个有⽤特性是,当项⽬构建完成后,它可以发布关于你的git源码仓库状态的信息。如果在你的jar中包含⼀个git.properties⽂
件,git.branch和gitmit属性将被加载。
对于Maven⽤户,spring-boot-starter-parent POM包含⼀个能够产⽣git.properties⽂件的预配置插件。只需要简单的将下⾯的声明添加到你的POM中:
<build>
<plugins>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
</plugin>
</plugins>
</build>
基于HTTP的监控和管理
果你正在开发⼀个Spring MVC应⽤,Spring Boot执⾏器⾃动将所有启⽤的端点通过HTTP暴露出去。默认约定使⽤端点的id作为URL路径,例如,health暴露为/health。
保护敏感端点
如果你的项⽬中添加的有Spring Security,所有通过HTTP暴露的敏感端点都会受到保护。默认情况下会使⽤基本认证(basic authentication,⽤户名为user,密码为应⽤启动时在控制台打印的密码)。
你可以使⽤Spring属性改变⽤户名,密码和访问端点需要的安全⾓⾊。例如,你可能会在application.properties中添加下列配置:
security.user.name=admin
security.user.password=secret
le=SUPERUSER
⾃定义管理服务器的上下⽂路径
有时候将所有的管理端⼝划分到⼀个路径下是有⽤的。例如,你的应⽤可能已经将/info作为他⽤。你可以⽤tPath属性为管理端⼝设置⼀个前缀:
上⾯的application.properties⽰例将把端⼝从/{id}改为/manage/{id}(⽐如,/manage/info)。
⾃定义管理服务器的端⼝
对于基于云的部署,使⽤默认的HTTP端⼝暴露管理端点(endpoints)是明智的选择。然⽽,如果你的应⽤是在⾃⼰的数据中⼼运⾏,那你可能倾向于使⽤⼀个不同的HTTP端⼝来暴露端点。
management.port属性可以⽤来改变HTTP端⼝:
git使用详解management.port=8081
由于你的管理端⼝经常被防⽕墙保护,不对外暴露也就不需要保护管理端点,即使你的主要应⽤是安全的。在这种情况下,classpath下会存在Spring Security库,你可以设置下⾯的属性来禁⽤安全管理策略(management security):
abled=false
(如果classpath下不存在Spring Security,那也就不需要显⽰的以这种⽅式来禁⽤安全管理策略,它甚⾄可能会破坏应⽤程序。)
⾃定义管理服务器的地址
你可以通过设置management.address属性来定义管理端点可以使⽤的地址。这在你只想监听内部或⾯向⽣产环境的⽹络,或只监听来⾃localhost的连接时⾮常有⽤。
下⾯的application.properties⽰例不允许远程管理连接:
management.port=8081
management.address=127.0.0.1
配置特定于管理的SSL
配置为使⽤⾃定义端⼝时,管理服务器也可以使⽤各种management.ssl.*属性配置⾃⼰的SSL 。例如,这允许管理服务器通过HTTP可⽤,
⽽主应⽤程序使⽤HTTPS:
server.port = 8443
abled = true
server.ssl.key-store = classpath:store.jks
server.ssl.key-password = secret
management.port = 8080
able = false
或者,主服务器和管理服务器都可以使⽤SSL,但使⽤不同的密钥存储:
server.port = 8443
abled = true
server.ssl.key-store = classpath:main.jks
server.ssl.key-password = secret
management.port = 8080
able = true
management.ssl。 key-store = classpath:management.jks
management.ssl.key-password = secret
禁⽤HTTP端点
如果不想通过HTTP暴露端点,你可以将管理端⼝设置为-1: management.port=-1
HTTP Health端点访问限制
通过health端点暴露的信息根据是否为匿名访问⽽不同。默认情况下,当匿名访问时,任何有关服务器的健康详情都被隐藏了,该端点只简单的指⽰服务器是运⾏(up)还是停⽌(down)。此外,当匿名访问时,响应会被缓存⼀个可配置的时间段以防⽌端点被⽤于’拒绝服务’攻击。endpoints.health.time-to-live属性被⽤来配置缓存时间(单位为毫秒),默认为1000毫秒,也就是1秒。
上述的限制可以被禁⽌,从⽽允许匿名⽤户完全访问health端点。想达到这个效果,可以将endpoints.health.sensitive设为false。
度量指标(Metrics)
Spring Boot执⾏器包括⼀个⽀持’gauge’和’counter’级别的度量指标服务。’gauge’记录⼀个单⼀值;’counter’记录⼀个增量(增加或减少)。同时,Spring Boot提供⼀个PublicMetrics接⼝,你可以实现它,从⽽暴露以上两种机制不能记录的指标。具体参考SystemPublicMetrics。
所有HTTP请求的指标都被⾃动记录,所以如果点击metrics端点,你可能会看到类似以下的响应:
{
"counter.": 20,
"counter.ics": 3,
"counter.status.200.star-star": 5,
"counter.": 4,
"sponse.star-star": 6,
"": 2,
"ics": 3,
"classes": 5808,
"classes.loaded": 5808,
"classes.unloaded": 0,
"heap": 3728384,
"heapmitted": 986624,
"heap.init": 262144,
"heap.used": 52765,
"mem": 986624,
"mem.free": 933858,
"processors": 8,
"threads": 15,
"threads.daemon": 11,
"threads.peak": 15,
"uptime": 494836,
"instance.uptime": 489782,
"datasource.primary.active": 5,
"datasource.primary.usage": 0.25
}
此处我们可以看到基本的memory,heap,class loading,processor和thread pool信息,连同⼀些HTTP指标。在该实例
中,root(‘/’),/metrics URLs分别返回20次,3次HTTP 200响应。同时可以看到root URL返回了4次HTTP 401(unauthorized)响应。双asterix(star-star)来⾃于被Spring MVC /**匹配到的⼀个请求(通常为⼀个静态资源)。
gauge级别展⽰了⼀个请求的最后响应时间。所以,root的最后请求被响应耗时2毫秒,/metrics耗时3毫秒。
对/metrics接⼝提供的信息进⾏简单分类如下表: