Spring Boot Admin的使用


http://www.jianshu.com/p/e20a5f42a395

*******************************

上一篇文章中了解了Spring Boot提供的監控接口,例如:/health、/info等等,實際上除了之前提到的信息,還有其他信息業需要監控:當前處於活躍狀態的會話數量、當前應用的並發數、延遲以及其他度量信息。這次我們了解如何利用Spring-boot-admin對應用信息進行可視化,如何添加度量信息。

准備

spring-boot-admin的Github地址在:https://github.com/codecentric/spring-boot-admin,它在Spring Boot Actuator的基礎上提供簡潔的可視化WEB UI。

  1. 首先在start.spring.io中創建簡單的admin應用,主要步驟如下:
    • Group: org.sample.admin
    • Artifact: spring-boot-admin-web
    • Name: Spring Boot Admin Web
    • Description: Spring Boot Admin Web Application
    • Package Name: org.sample.admin
    • Type: Maven Project
    • Packaging: Jar
    • Java Version: 1.8
    • Language: Java
    • Spring Boot Version: 1.3.1
  2. Ops組選項中選擇Actuator
  3. 選擇Generate Project下載應用
  4. 使用IDEA打開工程,在pom.xml文件中添加下列依賴
    <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>
  5. SpringBootAdminWebApplication.java文件中添加@EnableAdminServer注解
    @SpringBootApplication @EnableAdminServer public class SpringBootAdminWebApplication { public static void main(String[] args) { SpringApplication.run(SpringBootAdminWebApplication.class, args); } }
  6. 在application.properties文件中添加如下配置
    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
  7. 啟動應用程序,在后台給定如下提示:

    spring-boot-admin應用啟動日志
  8. 在瀏覽器中訪問上圖中提示的地址,可以看到下圖的信息

    spring-boot-admin應用

How Do

  1. 啟動Admin Web應用后,現在可以添加針對BookPub應用的度量信息了。在文章Spring Boot應用的健康監控中,我們曾定制自己的Health Indicator,用來監控四個數據庫接口的健康狀態,這次我將利用spring-boot-admin對這些信息進行可視化管理。
  2. 在db-count-starter模塊下添加代碼,首先在db-count-starter/src/main/java/com/test/bookpubstarter/dbcount目錄下添加DbCountMetrics類:
    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; } }
  3. DbCountAutoConfiguration定義對應的Bean,由Spring Boot完成自動注冊
    @Bean public PublicMetrics dbCountMetrics(Collection<CrudRepository> repositories) { return new DbCountMetrics(repositories); }
  4. 啟動BookPub應用,訪問http://localhost:8080/metrics,可以看到DbCountMetrics已經添加到metrics列表中了。

    新添加的DbCountMetrics
  5. 在db-count-starter模塊下的pom文件中添加spring-boot-admin-starter-client依賴,
    <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-client</artifactId> <version>1.3.2</version> </dependency>
  6. 在BookPub應用下的application.properties中配置下列屬性值
    spring.application.name=@project.description@ server.port=8080 spring.boot.admin.url=http://localhost:8090
  7. 啟動BookPub應用,然后在瀏覽器中訪問http://localhost:8090

    監控BookPub應用
  8. 點擊右側的“Details”,可以看到該應用的詳細信息

    BookPub應用的詳細信息

分析

Spring Boot Admin就是將Spring Boot Actuator中提供的endpoint信息可視化表示,在BookPub應用(被監控)的這一端,只需要進行一點配置即可。

  • spring-boot-admin-starter-client,作為客戶端,用於與Spring Boot Admin Web的服務器溝通;
  • spring.boot.admin.url=http:localhost:8090用於將當前應用注冊到Spring Boot Admin。

如果希望通過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 Admin修改日志級別

Spring Boot提供的度量工具功能強大且具備良好的擴展性,除了我們配置的DbCountMetrics,還監控BookPub應用的其他信息,例如內存消耗、線程數量、系統時間以及http會話數量。

gague和counter的定制

gague和counter度量通過GagueServiceCountService實例提供,這些實例可以導入到任何Spring管理的對象中,用於度量應用信息。例如,我們可以統計某個方法的調用次數,如果要統計所有RESTful接口的調用次數,則可以通過AOP實現,在調用指定的接口之前,首先調用counterService.increment("objectName.methodName.invoked");,某個方法被調用之后,則對它的統計值+1。具體的實驗步驟如下:

  1. 在pom文件中添加AOP依賴
    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
  2. 在BookPub應用中添加Aspect組件,表示在每個Controller的方法調用之前,首先增加調用次數。
    @Aspect @Component public class ServiceMonitor { @Autowired private CounterService counterService; @Before("execution(* com.test.bookpub.controller.*.*(..))") public void countServiceInvoke(JoinPoint joinPoint) { counterService.increment(joinPoint.getSignature() + ""); } }
  3. 在application.properties中設置打開AOP功能:spring.aop.auto=true
    然后啟動BookPub應用,通過瀏覽器訪問http://localhost:8080/books/9876-5432-1111,然后再去Spring Boot Admin后台查看對應信息,發現該方法的調用次數已經被統計好了

    統計接口的調用次數

如果希望統計每個接口的調用時長,則需要借助GagueService來實現,同樣使用AOP實現,則需要環繞通知:在接口調用之前,利用long start = System.currentTimeMillis();,在接口調用之后,計算耗費的時間,單位是ms,然后使用gugeService.submit(latency)更新該接口的調用延時。

  1. ServiceMonitor類中添加對應的監控代碼
    @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); }
  2. 然后在Spring Boot Admin后台可以看到對應接口的調用延遲

    統計接口的調用延時

這兩個service可以應付大多數應用需求,如果需要監控其他的度量信息,則可以定制我們自己的Metrics,例如在之前的例子中我們要統計四個數據庫接口的調用狀態,則我們定義了DbCountMetrics,該類實現了PublishMetrics,在這個類中我們統計每個數據庫接口的記錄數量。

PublishMetrics這個接口只有一個方法:Collection<Metric<?>> metrics();,在該方法中定義具體的監控信息;該接口的實現類需要在配置文件中通過@Bean注解,讓Spring Boot在啟動過程中初始化,並自動注冊到MetricsEndpoint處理器中,這樣每次有訪問/metrics的請求到來時,就會執行對應的metrics方法。

參考資料

  1. Chapter 6. 使用Spring進行面向切面編程(AOP)



文/杜琪(簡書作者)
原文鏈接:http://www.jianshu.com/p/e20a5f42a395
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM