Spring Boot Actuator詳解深入應用(一):Actuator 1.x

      網友投稿 1025 2022-05-29

      寫在前面

      《Spring Boot Actuator詳解與深入應用》預計包括三篇,第一篇重點講Spring Boot Actuator 1.x的應用與定制端點;第二篇將會對比Spring Boot Actuator 2.x 與1.x的區別,以及應用和定制2.x的端點;第三篇將會介紹Actuator metric指標與Prometheus和Grafana的使用結合。這部分內容很常用,且較為入門,歡迎大家的關注。

      Actuator是什么

      Spring Boot Actuator提供了生產上經常用到的功能(如健康檢查,審計,指標收集,HTTP跟蹤等),幫助我們監控和管理Spring Boot應用程序。這些功能都可以通過JMX或HTTP端點訪問。

      通過引入相關的依賴,即可監控我們的應用程序,收集指標、了解流量或數據庫的狀態變得很簡單。該庫的主要好處是我們可以獲得生產級工具,而無需自己實際實現這些功能。與大多數Spring模塊一樣,我們可以通過多種方式輕松配置或擴展它。

      Actuator還可以與外部應用監控系統集成,如Prometheus,Graphite,DataDog,Influx,Wavefront,New Relic等等。 這些系統為您提供出色的儀表板,圖形,分析和警報,以幫助我們在一個統一界面監控和管理應用服務。

      本文將會介紹Spring Boot Actuator 1.x 包括其中的端點(HTTP端點)、配置管理以及擴展和自定義端點。

      快速開始

      引入如下的依賴:

      org.springframework.boot spring-boot-starter-actuator

      Spring Boot Actuator 1.x

      在1.x中,Actuator遵循讀寫模型,這意味著我們可以從中讀取信息或寫入信息。我們可以檢索指標或我們的應用程序的健康狀況,當然我們也可以優雅地終止我們的應用程序或更改我們的日志配置。Actuator通過Spring MVC暴露其HTTP端點。

      端點

      當引入的Actuator的版本為1.x時,啟動應用服務,可以控制臺輸出如下的端點信息:

      我們介紹一下常用的endpoints:

      /health:顯示應用程序運行狀況信息(通過未經身份驗證的連接訪問時的簡單“狀態”或經過身份驗證時的完整消息詳細信息),它默認不敏感

      /info:顯示應用程序信息,默認情況下不敏感

      Spring Boot Actuator詳解與深入應用(一):Actuator 1.x

      /metrics:顯示當前應用程序的“指標”信息,它默認也很敏感

      /trace:顯示跟蹤信息(默認情況下是最后幾個HTTP請求)

      有些端點默認并不會被開啟,如/shutdown。

      配置端點

      我們可以自定義每個端點的屬性,按照如下的格式:

      endpoints.[endpoint name].[property to customize]

      可以自定義的屬性有如下三個:

      id,暴露的http端點地址

      enabled,是否開啟

      sensitive,當為true時,需要認證之后才會通過http獲取到敏感信息

      我們在配置文件中增加如下的配置,將會定制/beans端點。

      endpoints.beans.id=springbeans endpoints.beans.sensitive=false endpoints.beans.enabled=true

      /health端點

      /health端點用于監控運行的服務實例狀態,當服務實例下線或者因為其他的原因變得異常(如DB連接不上,磁盤缺少空間)時,將會及時通知運維人員。

      在默認未授權的情況下,通過HTTP的方式僅會返回如下的簡單信息:

      { "status": "UP" }

      我們進行如下的配置:

      endpoints: health: id: chealth sensitive: false management.security.enabled: false

      如上一小節所述,我們更改了/health端點的訪問路徑為/chealth,并將安全授權關閉。訪問http://localhost:8005/chealth將會得到如下的結果。

      { "status": "UP", "healthCheck": { "status": "UP" }, "diskSpace": { "status": "UP", "total": 999995129856, "free": 762513104896, "threshold": 10485760 } }

      我們還可以定制實現health指示器。它可以收集特定于應用程序的任何類型的自定義運行狀況數據,并通過/health端點訪問到定義的信息。

      @Component public class HealthCheck implements HealthIndicator { @Override public Health health() { int errorCode = check(); // perform some specific health check if (errorCode != 0) { return Health.down() .withDetail("Error Code", errorCode).build(); } return Health.up().build(); } public int check() { // Our logic to check health return 0; } }

      實現HealthIndicator接口,并覆寫其中的health()方法即可自定義我們的/health端點。

      /info端點

      通過/info端點,我們可以為應用服務定義一些基本信息:

      info.app.name=Spring Sample Application info.app.description=This is my first spring boot application info.app.version=1.0.0

      我們在如上的配置中定義了服務名、描述和服務的版本號。

      /metrics端點

      /metrics端點展示了OS、JVM和應用級別的指標信息。當開啟之后,我們可以獲取內存、堆、線程、線程池、類加載和HTTP等信息。

      { "mem": 417304, "mem.free": 231678, "processors": 4, "instance.uptime": 248325, "uptime": 250921, "systemload.average": 1.9541015625, "heap.committed": 375296, "heap.init": 393216, "heap.used": 143617, "heap": 5592576, "nonheap.committed": 43104, "nonheap.init": 2496, "nonheap.used": 42010, "nonheap": 0, "threads.peak": 30, "threads.daemon": 18, "threads.totalStarted": 46, "threads": 20, "classes": 6020, "classes.loaded": 6020, "classes.unloaded": 0, "gc.ps_scavenge.count": 3, "gc.ps_scavenge.time": 35, "gc.ps_marksweep.count": 1, "gc.ps_marksweep.time": 29, "httpsessions.max": -1, "httpsessions.active": 0, "gauge.response.info": 38.0, "counter.status.200.info": 1 }

      為了收集自定義的metrics,Actuator支持單數值記錄的功能,簡單的增加/減少計數功能。如下的實現,我們將登錄成功和失敗的次數作為自定義指標記錄下來。

      @Service public class LoginServiceImpl implements LoginService { private final CounterService counterService; @Autowired public LoginServiceImpl(CounterService counterService) { this.counterService = counterService; } @Override public Boolean login(String userName, char[] password) { boolean success; if (userName.equals("admin") && "secret".toCharArray().equals(password)) { counterService.increment("counter.login.success"); success = true; } else { counterService.increment("counter.login.failure"); success = false; } return success; } }

      再次訪問/metrics,發現多了如下的指標信息。登錄嘗試和其他安全相關事件在Actuator中可用作審計事件。

      { "gauge.response.metrics": 2.0, "gauge.response.test": 3.0, "gauge.response.star-star.favicon.ico": 1.0, "counter.status.200.star-star.favicon.ico": 10, "counter.status.200.test": 6, "counter.login.failure": 6, "counter.status.200.metrics": 4 }

      自定義端點

      除了使用Spring Boot Actuator提供的端點,我們也可以定義一個全新的端點。

      首先,我們需要實現Endpoint接口:

      @Component public class CustomEndpoint implements Endpoint> { @Override public String getId() { return "custom"; } @Override public boolean isEnabled() { return true; } @Override public boolean isSensitive() { return false; } @Override public List invoke() { // Custom logic to build the output List messages = new ArrayList(); messages.add("This is message 1"); messages.add("This is message 2"); return messages; } }

      getId()方法用于匹配訪問這個端點,當我們訪問/custom時,將會調用invoke()我們自定義的邏輯。

      另外兩個方法,用于設置是否開啟和是否為敏感的端點。

      [ "This is message 1", "This is message 2" ]

      進一步定制

      出于安全考慮,我們可能選擇通過非標準端口暴露Actuator端點。通過management.port屬性來配置它。

      另外,正如我們已經提到的那樣,在1.x. Actuator基于Spring Security配置自己的安全模型,但獨立于應用程序的其余部分。

      因此,我們可以更改management.address屬性以限制可以通過網絡訪問端點的位置:

      #port used to expose actuator management.port=8081 #CIDR allowed to hit actuator management.address=127.0.0.1

      此外,除了/info端點,其他所有的端點默認都是敏感的,如果引入了Spring Security,我們通過在配置文件中定義這些安全的屬性(username, password, role)來確保內置端點的安全。

      總結

      Spring Boot Actuator為我們的應用服務在生產環境提供了很多開箱即用的功能。本文主要講解了Spring Boot Actuator 1.x的深入使用。我們既可以使用內置的端點(如/health,/info等),可以在這些端點的基礎進行擴展和定制,還可以自定義全新的端點,在使用方式上顯得非常靈活。

      參考

      Actuator docs

      Spring Boot Actuator

      Spring Spring Boot

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:從輸入網址到瀏覽器呈現頁面內容,中間發生了什么?
      下一篇:《云計算技術系列叢書 云原生分布式存儲基石: etcd深入解析》—2為什么使用etcd
      相關文章
      亚洲a∨无码一区二区| 亚洲无人区视频大全| 亚洲中文字幕乱码一区| 日本久久久久亚洲中字幕| 亚洲av无码一区二区乱子伦as| 国产成人精品日本亚洲专区61 | 亚洲国产主播精品极品网红| 亚洲AV无码一区二区三区性色| 亚洲国产乱码最新视频| 亚洲xxxxxx| 亚洲香蕉久久一区二区三区四区| 亚洲成人福利在线观看| 18gay台湾男同亚洲男同| 亚洲精品视频久久| 亚洲成人黄色在线观看| 亚洲人成毛片线播放| 亚洲人成影院77777| 亚洲免费二区三区| 亚洲人成激情在线播放| 亚洲偷自拍另类图片二区| 亚洲熟妇丰满xxxxx| 亚洲av成人中文无码专区| 亚洲AⅤ男人的天堂在线观看| 亚洲第一se情网站| 亚洲中文字幕无码专区| 亚洲人成网77777亚洲色| 久久精品国产精品亚洲色婷婷 | 久久精品国产精品亚洲艾草网 | 亚洲精品高清国产一久久| 亚洲成色在线影院| 亚洲免费福利视频| 亚洲AV永久无码精品一福利| 国产成人 亚洲欧洲| 久久青青草原亚洲av无码| 国产亚洲综合一区柠檬导航| 亚洲成人在线电影| 亚洲一级免费视频| 亚洲国产精品嫩草影院| 亚洲国产成人精品女人久久久| 色久悠悠婷婷综合在线亚洲| 久久亚洲免费视频|