監控和管理生產環境spring boot actuator
spring-boot-actuator模組提供了一個監控和管理生產環境的模組,可以使用http、jmx、ssh、telnet等拉管理和監控應用。審計(Auditing)、
健康(health)、資料採集(metrics gathering)會自動加入到應用裡面。
首先,寫一個最基本的spring boot專案。
基於Maven的專案新增‘starter’依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId >
</dependency>
啟動資訊裡面可以看到這樣一些日誌
2015-08-28 09:57:40.953 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/trace],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc .EndpointMvcAdapter.invoke()
2015-08-28 09:57:40.954 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/mappings],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter .invoke()
2015-08-28 09:57:40.955 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/env/{name:.*}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String)
2015-08-28 09:57:40.956 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/env],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2015-08-28 09:57:40.957 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/configprops],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2015-08-28 09:57:40.958 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/info],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2015-08-28 09:57:40.958 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/dump],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2015-08-28 09:57:40.959 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/health],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint.invoke(java.security.Principal)
2015-08-28 09:57:40.961 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/autoconfig],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
2015-08-28 09:57:40.962 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/metrics/{name:.*}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint.value(java.lang.String)
2015-08-28 09:57:40.963 INFO 4064 --- [ main] o.s.b.a.e.mvc.EndpointHandlerMapping : Mapped "{[/metrics],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()
具體的描述:
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 |
health
比如:http://localhost:7231/health
你可以得到結果
{
status: "UP",
}
在應用配置加上
endpoints.health.sensitive=false
在次訪問http://localhost:7231/health
{
status: "UP",
diskSpace: {
status: "UP",
free: 32516145152,
threshold: 10485760
},
db: {
status: "UP",
database: "Microsoft SQL Server",
hello: 1440729256277
}
}
可以檢查的其他一些情況的健康資訊。下面的HealthIndicators會被Spring Boot自動配置(在合適的時候):
名稱 | 描述 |
---|---|
DiskSpaceHealthIndicator | 低磁碟空間檢測 |
DataSourceHealthIndicator | 檢查是否能從DataSource獲取連線 |
MongoHealthIndicator | 檢查一個Mongo資料庫是否可用(up) |
RabbitHealthIndicator | 檢查一個Rabbit伺服器是否可用(up) |
RedisHealthIndicator | 檢查一個Redis伺服器是否可用(up) |
SolrHealthIndicator | 檢查一個Solr伺服器是否可用(up) |
自定義當然也可以,你可以註冊實現了HealthIndicator介面的Spring beans,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();
}
}
trace
訪問http://localhost:7231/trace
可以看到結果,預設為最新的一些HTTP請求
[
{
timestamp: 1440728799269,
info: {
method: "GET",
path: "/health",
headers: {
request: {
host: "localhost:7231",
connection: "keep-alive",
accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
user-agent: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36",
accept-encoding: "gzip,deflate,sdch",
accept-language: "zh-CN,zh;q=0.8,en;q=0.6",
ra-ver: "3.0.7",
ra-sid: "74E754D8-20141117-085628-93e7a4-1dd60b"
},
response: {
X-Application-Context: "executecount:integration:7231",
Content-Type: "application/json;charset=UTF-8",
Transfer-Encoding: "chunked",
Content-Encoding: "gzip",
Vary: "Accept-Encoding",
Date: "Fri, 28 Aug 2015 02:26:39 GMT",
status: "200"
}
}
}
}
]
看看 InMemoryTraceRepository
,預設是100個事件,如果需要可以定義自己的 InMemoryTraceRepository 例項。如果需要,你可以建立自己的替代 TraceRepository 實現。
/**
* In-memory implementation of {@link TraceRepository}.
*
* @author Dave Syer
* @author Olivier Bourgain
*/
public class InMemoryTraceRepository implements TraceRepository {
private int capacity = 100;
private boolean reverse = true;
如果需要追蹤其他的事件,你可以將一個TraceRepository注入到你的Spring Beans中。
info
當執行 http://localhost:7231/info
的時候,結果什麼沒有
但是,單加入加入一些配置
info.app.name=ecs
info.app.version=1.0.0
info.build.artifactId[email protected].artifactId@
info.build.version[email protected].version@
執行/info
{
app: {
version: "1.0.0",
name: "ecs"
},
build: {
artifactId: "execute-count-server",
version: "0.0.3"
}
}
/info
是用來在構建的時候,自動擴充套件屬性的。對於Maven專案,可以通過 @[email protected] 佔位符引用Maven的’project properties’。
env
通過/env
可以訪問環境資訊
{
profiles: [
"integration"
],
servletContextInitParams: { },
systemProperties: {
java.runtime.name: "Java(TM) SE Runtime Environment",
java.vm.version: "25.25-b02",
java.vm.vendor: "Oracle Corporation",
java.vendor.url: "http://java.oracle.com/",
path.separator: ";",
idea.launcher.port: "7532",
java.vm.name: "Java HotSpot(TM) 64-Bit Server VM",
file.encoding.pkg: "sun.io",
user.country: "CN",
user.script: "",
sun.java.launcher: "SUN_STANDARD",
sun.os.patch.level: "Service Pack 1",
PID: "7416",
java.vm.specification.name: "Java Virtual Machine Specification",
...
通過/env/{name:.*}
可以訪問特定的環境屬性
比如:
http://localhost:7231/env/java.vm.name
Java HotSpot(TM) 64-Bit Server VM
metrics
/metrics
顯示了應用當前的指標資訊
{
mem: 348672,
mem.free: 264831,
processors: 4,
instance.uptime: 1859584,
uptime: 1870818,
systemload.average: -1,
heap.committed: 348672,
heap.init: 124928,
heap.used: 83840,
heap: 1773568,
threads.peak: 23,
threads.daemon: 21,
threads: 23,
classes: 7269,
classes.loaded: 7272,
classes.unloaded: 3,
gc.ps_scavenge.count: 7,
gc.ps_scavenge.time: 379,
gc.ps_marksweep.count: 2,
gc.ps_marksweep.time: 283,
httpsessions.max: -1,
httpsessions.active: 0,
datasource.primary.active: 0,
datasource.primary.usage: 0,
counter.status.200.autoconfig: 1,
counter.status.200.dump.root: 1,
counter.status.200.env: 2,
counter.status.200.env.name:.-star-: 4,
counter.status.200.env.root: 3,
counter.status.200.health: 2,
counter.status.200.info: 1,
counter.status.200.mappings: 1,
counter.status.200.trace: 1,
counter.status.404.env.name:.-star-: 1,
gauge.response.autoconfig: 43,
gauge.response.dump.root: 89,
gauge.response.env: 21,
gauge.response.env.name:.-star-: 14,
gauge.response.env.root: 17,
gauge.response.health: 19,
gauge.response.info: 5,
gauge.response.mappings: 13,
gauge.response.trace: 52
}
此處我們可以看到基本的 memory
, heap
, class loading
, processor
和 thread pool
資訊,連同一些HTTP指標。在該例項
中,可以使用 /metrics/{name:.*}
訪問單個屬性。
- 系統記憶體總量(mem),單位:Kb
- 空閒記憶體數量(mem.free),單位:Kb
- 處理器數量(processors)
- 系統正常執行時間(uptime),單位:毫秒
- 應用上下文(就是一個應用例項)正常執行時間(instance.uptime),單位:毫秒
- 系統平均負載(systemload.average)
- 堆資訊(heap,heap.committed,heap.init,heap.used),單位:Kb
- 執行緒資訊(threads,thread.peak,thead.daemon)
- 類載入資訊(classes,classes.loaded,classes.unloaded)
- 垃圾收集資訊(gc.xxx.count, gc.xxx.time)
- 最大連線數(datasource.xxx.max)
- 最小連線數(datasource.xxx.min)
- 活動連線數(datasource.xxx.active)
- 連線池的使用情況(datasource.xxx.usage)
dump
/dump
執行一個執行緒轉儲,這是一個例子。
[
{
threadName: "http-nio-7231-exec-10",
threadId: 32,
blockedTime: -1,
blockedCount: 0,
waitedTime: -1,
waitedCount: 3,
lockName: "java.u[email protected]7cf8ed03",
lockOwnerId: -1,
lockOwnerName: null,
inNative: false,
suspended: false,
threadState: "WAITING",
stackTrace: [
{
methodName: "park",
fileName: null,
lineNumber: -2,
className: "sun.misc.Unsafe",
nativeMethod: true
},
...
mappings
/mappings
顯示一個所有@RequestMapping路徑的整理列表,一切盡在眼中。
{
/webjars/**: {
bean: "resourceHandlerMapping"
},
/**: {
bean: "resourceHandlerMapping"
},
/**/favicon.ico: {
bean: "faviconHandlerMapping"
},
{[/mappings],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: {
bean: "endpointHandlerMapping",
method: "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
},
{[/info],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: {
bean: "endpointHandlerMapping",
method: "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
},
{[/env/{name:.*}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: {
bean: "endpointHandlerMapping",
method: "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint.value(java.lang.String)"
},
{[/env],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: {
bean: "endpointHandlerMapping",
method: "public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()"
},
...
autoconfig
autoconfig
顯示一個auto-configuration的報告,該報告展示所有auto-configuration候選者及它們被應用或未被應用的原因
{
positiveMatches: {
AuditAutoConfiguration.AuditEventRepositoryConfiguration: [
{
condition: "OnBeanCondition",
message: "@ConditionalOnMissingBean (types: org.springframework.boot.actuate.audit.AuditEventRepository; SearchStrategy: all) found no beans"
}
],
EndpointAutoConfiguration#autoConfigurationAuditEndpoint: [
{
condition: "OnBeanCondition",
message: "@ConditionalOnBean (types: org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport; SearchStrategy: all) found the following [autoConfigurationReport] @ConditionalOnMissingBean (types: org.springframework.boot.actuate.endpoint.AutoConfigurationReportEndpoint; SearchStrategy: current) found no beans"
}
],
...
configprops
/configprops
顯示一個所有@ConfigurationProperties的整理列表.
{
management.health.status.CONFIGURATION_PROPERTIES: {
prefix: "management.health.status",
properties: {
order: null
}
},
spring.datasource.CONFIGURATION_PROPERTIES: {
prefix: "spring.datasource",
properties: {
schema: null,
data: null,
xa: {
dataSourceClassName: null,
properties: { }
},
separator: ";",
url: "jdbc:sqlserver://192.168.x.x:xxxx;DatabaseName=xxxx;sendStringParametersAsUnicode=false",
platform: "all",
continueOnError: false,
jndiName: null,
sqlScriptEncoding: null,
password: "******",
driverClassName: "com.microsoft.sqlserver.jdbc.SQLServerDriver",
initialize: false,
username: "Monitor"
}
},
...
更多的細節和探索,需要自己看看原始碼和spring boot的官方文件