<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Boot 服務監(jiān)控,健康檢查,線程信息,JVM堆信息,指標收集...

          共 8673字,需瀏覽 18分鐘

           ·

          2020-03-13 23:22

          來自:掘金(作者:Richard_Yi)

          原文鏈接:

          https://juejin.im/post/5e2179def265da3e152d2561

          去年我們項目做了微服務1.0的架構(gòu)轉(zhuǎn)型,但是服務監(jiān)控這塊卻沒有跟上。這不,最近我就被分配了要將我們核心的微服務應用全部監(jiān)控起來的任務。我們的微服務應用都是SpringBoot 應用,因此就自然而然的想到了借助Spring Boot 的Actuator 模塊。

          本篇是我在完成這個工單之后,對Spring Boot Actuator模塊 學習應用的總結(jié)。在本篇文章中,你可以學習到:

          1、Spring Boot Actuator 的快速使用入門
          2、Spring Boot Actuator 的一些重要的endpoints的介紹
          3、如何通過Actuator 模塊實時查看當前應用的線程 dump信息
          4、如何通過Actuator 模塊實時查看當前應用的堆信息
          5、如何通過Actuator 模塊實時修改當前應用的日志打印等級
          6、...

          之后我還會介紹:

          TODO:SpringBoot 微服務應用集成Prometheus + Grafana實現(xiàn)監(jiān)控告警

          一、什么是 Spring Boot Actuator

          Spring Boot Actuator 模塊提供了生產(chǎn)級別的功能,比如健康檢查,審計,指標收集,HTTP 跟蹤等,幫助我們監(jiān)控和管理Spring Boot 應用、Bean加載情況、環(huán)境變量、日志信息、線程信息,JVM 堆信息等?。這個模塊是一個采集應用內(nèi)部信息暴露給外部的模塊,上述的功能都可以通過HTTP 和 JMX 訪問。

          因為暴露內(nèi)部信息的特性,Actuator 也可以和一些外部的應用監(jiān)控系統(tǒng)整合(Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等)。這些監(jiān)控系統(tǒng)提供了出色的儀表板,圖形,分析和警報,可幫助你通過一個統(tǒng)一友好的界面,監(jiān)視和管理你的應用程序。

          Actuator使用Micrometer與這些外部應用程序監(jiān)視系統(tǒng)集成。這樣一來,只需很少的配置即可輕松集成外部的監(jiān)控系統(tǒng)。

          Micrometer 為 Java 平臺上的性能數(shù)據(jù)收集提供了一個通用的 API,應用程序只需要使用 Micrometer 的通用 API 來收集性能指標即可。Micrometer 會負責完成與不同監(jiān)控系統(tǒng)的適配工作。這就使得切換監(jiān)控系統(tǒng)變得很容易。

          對比 Slf4j 之于 Java Logger 中的定位。

          二、快速開始,創(chuàng)建一個Spring Boot Actuator Demo

          我們先創(chuàng)建一個demo應用。

          你可以通過Spring Boot CLI 創(chuàng)建:

          1. spring init -d=web,actuator -n=actuator-demo actuator-demo

          或者通過Spring Initializr 創(chuàng)建:

          9a712b475b27aa3cb349611179f4d868.webp

          對應的maven依賴:

          1. ...

          2. org.springframework.boot

          3. spring-boot-starter-actuator

          4. ...

          對應的Gradle 依賴:

          1. dependencies {

          2. compile("org.springframework.boot:spring-boot-starter-actuator")

          3. }

          三、Endpoints 介紹

          Spring Boot 提供了所謂的 endpoints (下文翻譯為端點)給外部來與應用程序進行訪問和交互。

          打比方來說, /health 端點 提供了關(guān)于應用健康情況的一些基礎(chǔ)信息。metrics 端點提供了一些有用的應用程序指標(JVM 內(nèi)存使用、系統(tǒng)CPU使用等)。

          這些 Actuator 模塊本來就有的端點我們稱之為原生端點。根據(jù)端點的作用的話,我們大概可以分為三大類:

          應用配置類:獲取應用程序中加載的應用配置、環(huán)境變量、自動化配置報告等與Spring Boot應用密切相關(guān)的配置類信息。

          度量指標類:獲取應用程序運行過程中用于監(jiān)控的度量指標,比如:內(nèi)存信息、線程池信息、HTTP請求統(tǒng)計等。

          操作控制類:提供了對應用的關(guān)閉等操作類功能。

          詳細的原生端點介紹,請以官網(wǎng)為準,這里就不贅述徒增篇幅。

          需要注意的就是:

          1、每一個端點都可以通過配置來單獨禁用或者啟動

          2、不同于Actuator 1.x,Actuator 2.x 的大多數(shù)端點默認被禁掉。Actuator 2.x 中的默認端點增加了 /actuator前綴。默認暴露的兩個端點為 /actuator/health/actuator/info

          四、端點暴露配置

          我們可以通過以下配置,來配置通過JMX 和 HTTP 暴露的端點。

          PropertyDefault
          management.endpoints.jmx.exposure.exclude
          management.endpoints.jmx.exposure.include*
          management.endpoints.web.exposure.exclude
          management.endpoints.web.exposure.includeinfo,healt

          可以打開所有的監(jiān)控點

          1. management.endpoints.web.exposure.include=*

          也可以選擇打開部分,"*" 代表暴露所有的端點,如果指定多個端點,用","分開

          1. management.endpoints.web.exposure.exclude=beans,trace

          Actuator 默認所有的監(jiān)控點路徑都在 /actuator/*,當然如果有需要這個路徑也支持定制。

          1. management.endpoints.web.base-path=/minitor

          設(shè)置完重啟后,再次訪問地址就會變成 /minitor/*

          現(xiàn)在我們按照如下配置:

          1. # "*" 代表暴露所有的端點 如果指定多個端點,用","分開

          2. management.endpoints.web.exposure.include=*

          3. # 賦值規(guī)則同上

          4. management.endpoints.web.exposure.exclude=

          啟動DEMO程序,訪問 http://localhost:8080/actuator,查看暴露出來的端點:

          06fc6927812c5de6da4997ac23f5a823.webp


          上面這樣顯示是因為chrome 瀏覽器安裝了 JSON-handle 插件,實際上就是返回一大段json

          下面,我會著重介紹幾個比較重要的端點。

          五、重要端點解析

          5.1?/health端點

          /health端點會聚合你程序的健康指標,來檢查程序的健康情況。端點公開的應用健康信息取決于:

          1. management.endpoint.health.show-details=always

          該屬性可以使用以下值之一進行配置:

          NameDescription
          never不展示詳細信息,up或者down的狀態(tài),默認配置
          when-authorized詳細信息將會展示給通過認證的用戶。授權(quán)的角色可以通過?management.endpoint.health.roles配置
          always對所有用戶暴露詳細信息

          按照上述配置,配置成 always之后,我們啟動項目,訪問 http://localhost:8080/actuator/health端口,可以看到這樣的信息:

          8154ed73f1b53867df7e7afcdeb1ca80.webp

          是不是感覺好像健康信息有點少?先別急,那是因為我們創(chuàng)建的是一個最基礎(chǔ)的Demo項目,沒有依賴很多的組件。

          /health端點有很多自動配置的健康指示器:如redis、rabbitmq、db等組件。當你的項目有依賴對應組件的時候,這些健康指示器就會被自動裝配,繼而采集對應的信息。如上面的 diskSpace 節(jié)點信息就是 DiskSpaceHealthIndicator 在起作用。

          65f38c439d3db87570be489a3bf9bbec.webp

          上述截圖取自官方文檔

          這是我另一個項目的 /health端點信息。

          9a6fc14a3bb3940274b195a9e10fc58c.webp

          當如上的組件有一個狀態(tài)異常,應用服務的整體狀態(tài)即為down。我們也可以通過配置禁用某個組件的健康監(jiān)測。

          1. management.health.mongo.enabled:false

          或者禁用所有自動配置的健康指示器:

          1. management.health.defaults.enabled:false

          ?自定義 Health Indicator

          當然你也可以自定義一個Health Indicator,只需要實現(xiàn) HealthIndicator 接口或者繼承 AbstractHealthIndicator類。

          1. /**

          2. * @author Richard_yyf

          3. * @version 1.0 2020/1/16

          4. */

          5. @Component

          6. publicclassCustomHealthIndicatorextendsAbstractHealthIndicator{


          7. @Override

          8. protectedvoid doHealthCheck(Health.Builder builder)throwsException{

          9. // 使用 builder 來創(chuàng)建健康狀態(tài)信息

          10. // 如果你throw 了一個 exception,那么status 就會被置為DOWN,異常信息會被記錄下來

          11. builder.up()

          12. .withDetail("app","這個項目很健康")

          13. .withDetail("error","Nothing, I'm very good");

          14. }

          15. }

          最終效果:

          59f0570f083942e8a164256ed84d8dae.webp

          5.2?/metrics端點

          /metrics端點用來返回當前應用的各類重要度量指標,比如:內(nèi)存信息、線程信息、垃圾回收信息、tomcat、數(shù)據(jù)庫連接池等。

          1. {

          2. "names":[

          3. "tomcat.threads.busy",

          4. "jvm.threads.states",

          5. "jdbc.connections.active",

          6. "jvm.gc.memory.promoted",

          7. "http.server.requests",

          8. "hikaricp.connections.max",

          9. "hikaricp.connections.min",

          10. "jvm.memory.used",

          11. "jvm.gc.max.data.size",

          12. "jdbc.connections.max",

          13. ....

          14. ]

          15. }

          不同于1.x,Actuator在這個界面看不到具體的指標信息,只是展示了一個指標列表。為了獲取到某個指標的詳細信息,我們可以請求具體的指標信息,像這樣:

          1. http://localhost:8080/actuator/metrics/{MetricName}

          比如我訪問 /actuator/metrics/jvm.memory.max,返回信息如下:

          c10fb9a92447c5b124b15c67ee68466a.webp

          你也可以用query param的方式查看單獨的一塊區(qū)域。比如你可以訪問 /actuator/metrics/jvm.memory.max?tag=id:Metaspace。結(jié)果就是:

          59f0570f083942e8a164256ed84d8dae.webp

          5.3?/loggers端點

          /loggers 端點暴露了我們程序內(nèi)部配置的所有l(wèi)ogger的信息。我們訪問 /actuator/loggers可以看到,

          c92e86fe40709ae9234be3203488a91d.webp

          你也可以通過下述方式訪問單獨一個logger,

          1. http://localhost:8080/actuator/loggers/{name}

          比如我現(xiàn)在訪問 root logger, http://localhost:8080/actuator/loggers/root

          1. {

          2. "configuredLevel":"INFO",

          3. "effectiveLevel":"INFO"

          4. }

          ?改變運行時的日志等級

          /loggers端點我最想提的就是這個功能,能夠動態(tài)修改你的日志等級。

          比如,我們可以通過下述方式來修改 root logger的日志等級。我們只需要發(fā)起一個URL 為 http://localhost:8080/actuator/loggers/rootPOST請求,POST報文如下:

          1. {

          2. "configuredLevel":"DEBUG"

          3. }

          b59d56a91c6b9fb571d3172ecbdff7d4.webp

          仔細想想,這個功能是不是非常有用。如果在生產(chǎn)環(huán)境中,你想要你的應用輸出一些Debug信息以便于你診斷一些異常情況,你你只需要按照上述方式就可以修改,而不需要重啟應用。

          如果想重置成默認值,把value 改成 null

          5.4?/info端點

          /info端點可以用來展示你程序的信息。我理解過來就是一些程序的基礎(chǔ)信息。并且你可以按照自己的需求在配置文件 application.properties中個性化配置(默認情況下,該端點只會返回一個空的json內(nèi)容。):

          1. info.app.name=actuator-test-demo

          2. info.app.encoding=UTF-8

          3. info.app.java.source=1.8

          4. info.app.java.target=1.8

          5. # 在 maven 項目中你可以直接用下列方式引用 maven properties的值

          6. # [email protected]@

          7. # [email protected]@

          8. # [email protected]@

          啟動項目,訪問 http://localhost:8080/actuator/info

          1. {

          2. "app":{

          3. "encoding":"UTF-8",

          4. "java":{

          5. "source":"1.8.0_131",

          6. "target":"1.8.0_131"

          7. },

          8. "name":"actuator-test-demo"

          9. }

          10. }

          5.5?/beans端點

          /beans端點會返回Spring 容器中所有bean的別名、類型、是否單例、依賴等信息。

          訪問 http://localhost:8080/actuator/beans,返回如下:

          fd9599f8a9869d16ba02dcc7f8ec702f.webp

          5.6?/heapdump?端點

          訪問:http://localhost:8080/actuator/heapdump會自動生成一個 Jvm 的堆文件 heapdump。我們可以使用 JDK 自帶的 Jvm 監(jiān)控工具 VisualVM 打開此文件查看內(nèi)存快照。

          578ab7f0c4ddc39d7889059abdc467c7.webp

          5.7?/threaddump?端點

          這個端點我個人覺得特別有用,方便我們在日常定位問題的時候查看線程的情況。主要展示了線程名、線程ID、線程的狀態(tài)、是否等待鎖資源、線程堆棧等信息。就是可能查看起來不太直觀。訪問 http://localhost:8080/actuator/threaddump返回如下:

          3ecdba74cbf720cc2a8464994ec5ac5b.webp

          5.8?/shutdown端點

          這個端點屬于操作控制類端點,可以優(yōu)雅關(guān)閉 Spring Boot 應用。要使用這個功能首先需要在配置文件中開啟:

          1. management.endpoint.shutdown.enabled=true

          由于 shutdown 接口默認只支持 POST 請求,我們啟動Demo項目,向 http://localhost:8080/actuator/shutdown發(fā)起 POST請求。返回信息:

          1. {

          2. "message":"Shutting down, bye..."

          3. }

          然后應用程序被關(guān)閉。

          由于開放關(guān)閉應用的操作本身是一件非常危險的事,所以真正在線上使用的時候,我們需要對其加入一定的保護機制,比如:定制Actuator的端點路徑、整合Spring Security進行安全校驗等。(不是特別必要的話,這個端點不用開)

          六、整合Spring Security 對端點進行安全校驗

          由于端點的信息和產(chǎn)生的交互都是非常敏感的,必須防止未經(jīng)授權(quán)的外部訪問。如果您的應用程序中存在Spring Security的依賴,則默認情況下使用基于表單的HTTP身份驗證來保護端點。

          如果沒有,只需要增加對應的依賴即可:

          1. org.springframework.boot

          2. spring-boot-starter-security

          添加之后,我們需要定義安全校驗規(guī)則,來覆蓋Spring Security 的默認配置。

          這里我給出了兩個版本的模板配置:

          1. import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;

          2. import org.springframework.boot.actuate.context.ShutdownEndpoint;

          3. import org.springframework.boot.autoconfigure.security.servlet.PathRequest;

          4. import org.springframework.context.annotation.Configuration;

          5. import org.springframework.security.config.annotation.web.builders.HttpSecurity;

          6. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;


          7. /**

          8. * @author Richard_yyf

          9. */

          10. @Configuration

          11. publicclassActuatorSecurityConfigextendsWebSecurityConfigurerAdapter{


          12. /*

          13. * version1:

          14. * 1. 限制 '/shutdown'端點的訪問,只允許ACTUATOR_ADMIN訪問

          15. * 2. 允許外部訪問其他的端點

          16. * 3. 允許外部訪問靜態(tài)資源

          17. * 4. 允許外部訪問 '/'

          18. * 5. 其他的訪問需要被校驗

          19. * version2:

          20. * 1. 限制所有端點的訪問,只允許ACTUATOR_ADMIN訪問

          21. * 2. 允許外部訪問靜態(tài)資源

          22. * 3. 允許外部訪問 '/'

          23. * 4. 其他的訪問需要被校驗

          24. */


          25. @Override

          26. protectedvoid configure(HttpSecurity http)throwsException{

          27. // version1

          28. // http

          29. // .authorizeRequests()

          30. // .requestMatchers(EndpointRequest.to(ShutdownEndpoint.class))

          31. // .hasRole("ACTUATOR_ADMIN")

          32. // .requestMatchers(EndpointRequest.toAnyEndpoint())

          33. // .permitAll()

          34. // .requestMatchers(PathRequest.toStaticResources().atCommonLocations())

          35. // .permitAll()

          36. // .antMatchers("/")

          37. // .permitAll()

          38. // .antMatchers("/**")

          39. // .authenticated()

          40. // .and()

          41. // .httpBasic();


          42. // version2

          43. http

          44. .authorizeRequests()

          45. .requestMatchers(EndpointRequest.toAnyEndpoint())

          46. .hasRole("ACTUATOR_ADMIN")

          47. .requestMatchers(PathRequest.toStaticResources().atCommonLocations())

          48. .permitAll()

          49. .antMatchers("/")

          50. .permitAll()

          51. .antMatchers("/**")

          52. .authenticated()

          53. .and()

          54. .httpBasic();

          55. }

          56. }

          application.properties的相關(guān)配置如下:

          1. # Spring Security Default user name and password

          2. spring.security.user.name=actuator

          3. spring.security.user.password=actuator

          4. spring.security.user.roles=ACTUATOR_ADMIN


          推薦閱讀:


          0d70c2c864cfff9b9e8d397b00239e6c.webp喜歡我可以給我設(shè)為星標哦0d70c2c864cfff9b9e8d397b00239e6c.webp

          db11f79f73ecfb9ed6b912f111cc9b7f.webp

          好文章,我?在看?

          da1ad5d39330d000af6ae408a16ef59e.webp
          瀏覽 71
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品人妻一区二区三区蜜桃 | 色五月丁香网 | 粉嫩小泬BBBB毛片 | 国产精品酒店 | 亚洲综合小说 |