Spring Boot Admin的使用

上一篇文章中了解了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
  1. Ops組選項中選擇Actuator
  2. 選擇Generate Project下載應用
  3. 使用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>
  1. SpringBootAdminWebApplication.java文件中添加@EnableAdminServer注解
@SpringBootApplication
@EnableAdminServer
public class SpringBootAdminWebApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminWebApplication.class, args);
    }
}
  1. 在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
  1. 啟動應用程序,在后臺給定如下提示:


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


    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;
    }
}
  1. DbCountAutoConfiguration定義對應的Bean,由Spring Boot完成自動注冊
@Bean
public PublicMetrics dbCountMetrics(Collection<CrudRepository> repositories) {
    return new DbCountMetrics(repositories);
}
  1. 啟動BookPub應用,訪問http://localhost:8080/metrics,可以看到DbCountMetrics已經添加到metrics列表中了。
    新添加的DbCountMetrics
  2. 在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>
  1. 在BookPub應用下的application.properties中配置下列屬性值
spring.application.name=@project.description@
server.port=8080
spring.boot.admin.url=http://localhost:8090
  1. 啟動BookPub應用,然后在瀏覽器中訪問http://localhost:8090
    監控BookPub應用
  2. 點擊右側的“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>
  1. 在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() + "");
    }
}
  1. 在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);
}
  1. 然后在Spring Boot Admin后臺可以看到對應接口的調用延遲


    統計接口的調用延時

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

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

參考資料

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

本號專注于后端技術、JVM問題排查和優化、Java面試題、個人成長和自我管理等主題,為讀者提供一線開發者的工作和成長經驗,期待你能在這里有所收獲。


javaadu
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容