天天看點

Spring Actuator源碼分析

actuator子產品通過endpoint暴露一些接口,可以是rest方式,也可以是jmx等其他方式.

如果使用rest方式,通常springmvc是使用@requestmapping,以及@controller标注一個控制器方法,如果不使用springmvc,即沒引入springmvc的包,那麼springboot就會出錯.是以為了不走正常的springmvc機制,actuator用endpointhandlermapping重寫了requestmappinginfohandlermapping,比對的是實作了mvcendpoint接口的”控制器”

Spring Actuator源碼分析

<code>endpoint和mvcendpoint兩個的差別?</code>

mvcendpoint是對endpoint springmvc層的裝飾,添加了@requestmapping,以及@responsebody.具體邏輯委托給endpoint處理,.endpoint的id即為url.

現在通路 health endpoint 是這樣的:

healthindicatorautoconfiguration會在endpointautoconfiguration之前,自動配置所有的healthindicator

actuator已經自帶了一些healthindicator,自動啟用部分:

Spring Actuator源碼分析

多個healchindicator會由compositehealthindicator調用healthaggregator做aggregate(聚合),目前隻有orderedhealthaggregator,用于排序

這個endpoint展示metrics資訊,具體的metrics是由實作了publicmetrics接口的類處理.

metricsendpoint維護着一份publicmetrics清單,actuator已經實作了如下:

Spring Actuator源碼分析

所有被激活的publicmetrics,都可以通過通路<code>/metrics</code>檢視:

通過這個publicmetrics可以擷取到控制器通路情況:

分别為hi接口響應時間,通路次數.

整個過程:

metricrepositoryautoconfiguration -&gt; counterbuffers,gaugebuffers用于儲存計數資料

metricrepositoryautoconfiguration -&gt; 初始化gaugeservice + counterservice(内含counterbuffers,gaugebuffers)

metricfilterautoconfiguration -&gt; 初始化metricsfilter,該<code>過濾器</code>使用gaugeservice + counterservice統計通路次數以及響應時間

publicmetricsautoconfiguration -&gt; 初始化metricreaderpublicmetrics,塞入compositemetricreader(counterbuffers,gaugebuffers).

metricreaderpublicmetrics讀取counterbuffers,gaugebuffers儲存的統計資料

我們重點來看下<code>metricsfilter</code>這個過濾器:

當然也可以使用aop做一個method level的統計.但是我希望做一個與業務無關,內建到架構裡的metrics統計

<a href="http://kielczewski.eu/2015/01/application-metrics-with-spring-boot-actuator/">http://kielczewski.eu/2015/01/application-metrics-with-spring-boot-actuator/</a>