Endpoint
SpringBoot的Endpoint主要是用來監控應用服務的運行狀況,並集成在Mvc中提供查看接口。內置的Endpoint比如HealthEndpoint會監控dist和db的狀況,MetricsEndpoint則會監控內存和gc的狀況。 Endpoint的接口如下,其中*invoke()*是主要的方法,用于返回監控的內容,*isSensitive()*用于權限控制。
public interface Endpoint {
String getId();
boolean isEnabled();
boolean isSensitive();
T invoke();
}
Endpoint的加載還是依靠spring.factories實現的。spring-boot-actuator包下的META-INF/spring.factories配置了EndpointAutoConfiguration。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
…
org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration,\
…
EndpointAutoConfiguration就會注入必要的Endpoint。有些Endpoint需要外部的收集類,比如TraceEndpoint。
@Bean
@ConditionalOnMissingBean
public TraceEndpoint traceEndpoint() {
return new TraceEndpoint(this.traceRepository);
}
TraceEndpoint會記錄每次請求的Request和Response的狀態,需要嵌入到Request的流程中,這裏就主要用到了3個類。
1.TraceRepository用于保存和獲取Request和Response的狀態。
public interface TraceRepository {
List findAll();
void add(Map traceInfo);
}
2.WebRequestTraceFilter用于嵌入web request,收集請求的狀態並保存在TraceRepository中。 3.TraceEndpoint,invoke()方法直接調用TraceRepository保存的數據。
自定義Endpoint
自定義Endpoint也是類似的原理。這裏自定義Endpoint實現應用內存的定時收集。完整的代碼放在Github上了。
收集內存,MemStatus是內存的存儲結構,MemCollector是內存的收集類,使用Spring內置的定時功能,每5秒收集當前內存。
2.自定義Endpoint,getId是EndPoint的唯一標識,也是Mvc接口對外暴露的路徑。invoke方法,取出maxMemory和totalMemory和對應的時間。