上一篇文章中瞭解了Spring Boot提供的監控接口,例如:/health、/info等等,實際上除了以前提到的信息,還有其餘信息業須要監控:當前處於活躍狀態的會話數量、當前應用的併發數、延遲以及其餘度量信息。此次咱們瞭解如何利用Spring-boot-admin對應用信息進行可視化,如何添加度量信息。html
spring-boot-admin的Github地址在:https://github.com/codecentric/spring-boot-admin,它在Spring Boot Actuator的基礎上提供簡潔的可視化WEB UI。java
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server-ui</artifactId> <version>1.3.2</version> </dependency>
@SpringBootApplication @EnableAdminServer public class SpringBootAdminWebApplication { public static void main(String[] args) { SpringApplication.run(SpringBootAdminWebApplication.class, args); } }
server.port = 8090 spring.application.name=Spring Boot Admin Web spring.boot.admin.url=http://localhost:${server.port} spring.jackson.serialization.indent_output=true endpoints.health.sensitive=false
啓動應用程序,在後臺給定以下提示:git
在瀏覽器中訪問上圖中提示的地址,能夠看到下圖的信息github
public class DbCountMetrics implements PublicMetrics { private Collection<CrudRepository> repositories; public DbCountMetrics(Collection<CrudRepository> repositories) { this.repositories = repositories; } @Override public Collection<Metric<?>> metrics() { List<Metric<?>> metrics = new LinkedList<>(); for (CrudRepository repository: repositories) { String name = DbCountRunner.getRepositoryName(repository.getClass()); String metricName = "counter.datasource." + name; metrics.add(new Metric(metricName, repository.count())); } return metrics; } }
@Bean public PublicMetrics dbCountMetrics(Collection<CrudRepository> repositories) { return new DbCountMetrics(repositories); }
<dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>1.3.2</version> </dependency>
spring.application.name=@project.description@ server.port=8080 spring.boot.admin.url=http://localhost:8090
點擊右側的「Details」,能夠看到該應用的詳細信息web
Spring Boot Admin就是將Spring Boot Actuator中提供的endpoint信息可視化表示,在BookPub應用(被監控)的這一端,只須要進行一點配置便可。spring
若是但願經過Web控制系統的日誌級別,則須要在應用中添加Jolokia JMX庫(org.jolokia:jolokia-core),同時在項目資源目錄下添加logback.xml文件,內容以下:數據庫
<configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <jmxConfigurator/> </configuration>
而後再次啓動BookPub應用,而後在Spring Boot Admin的頁面中查看LOGGING,則能夠看到以下頁面:編程
Spring Boot提供的度量工具功能強大且具有良好的擴展性,除了咱們配置的DbCountMetrics,還監控BookPub應用的其餘信息,例如內存消耗、線程數量、系統時間以及http會話數量。瀏覽器
gague和counter度量經過GagueService和CountService實例提供,這些實例能夠導入到任何Spring管理的對象中,用於度量應用信息。例如,咱們能夠統計某個方法的調用次數,若是要統計全部RESTful接口的調用次數,則能夠經過AOP實現,在調用指定的接口以前,首先調用counterService.increment("objectName.methodName.invoked");,某個方法被調用以後,則對它的統計值+1。具體的實驗步驟以下:服務器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
@Aspect @Component public class ServiceMonitor { @Autowired private CounterService counterService; @Before("execution(* com.test.bookpub.controller.*.*(..))") public void countServiceInvoke(JoinPoint joinPoint) { counterService.increment(joinPoint.getSignature() + ""); } }
spring.aop.auto=true
http://localhost:8080/books/9876-5432-1111
,而後再去Spring Boot Admin後臺查看對應信息,發現該方法的調用次數已經被統計好了若是但願統計每一個接口的調用時長,則須要藉助GagueService來實現,一樣使用AOP實現,則須要環繞通知:在接口調用以前,利用long start = System.currentTimeMillis();,在接口調用以後,計算耗費的時間,單位是ms,而後使用gugeService.submit(latency)更新該接口的調用延時。
@Autowired private GaugeService gaugeService; @Around("execution(* com.test.bookpub.controller.*.*(..))") public void latencyService(ProceedingJoinPoint pjp) throws Throwable { long start = System.currentTimeMillis(); pjp.proceed(); long end = System.currentTimeMillis(); gaugeService.submit(pjp.getSignature().toString(), end - start); }
而後在Spring Boot Admin後臺能夠看到對應接口的調用延遲
這兩個service能夠應付大多數應用需求,若是須要監控其餘的度量信息,則能夠定製咱們本身的Metrics,例如在以前的例子中咱們要統計四個數據庫接口的調用狀態,則咱們定義了DbCountMetrics,該類實現了PublishMetrics,在這個類中咱們統計每一個數據庫接口的記錄數量。
PublishMetrics這個接口只有一個方法:Collection<Metric<?>> metrics();,在該方法中定義具體的監控信息;該接口的實現類須要在配置文件中經過@Bean註解,讓Spring Boot在啓動過程當中初始化,並自動註冊到MetricsEndpoint處理器中,這樣每次有訪問/metrics的請求到來時,就會執行對應的metrics方法。