1. 程式人生 > >監控和管理生產環境spring boot actuator

監控和管理生產環境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
}

此處我們可以看到基本的 memoryheapclass loadingprocessorthread 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的官方文件