久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Boot Actuator監(jiān)控的簡單使用方法示例代碼詳解

瀏覽:73日期:2023-09-01 13:53:00

Spring Boot Actuator幫助我們實現(xiàn)了許多中間件比如mysql、es、redis、mq等中間件的健康指示器。通過 Spring Boot 的自動配置,這些指示器會自動生效。當(dāng)這些組件有問題的時候,HealthIndicator 會返回 DOWN 或 OUT_OF_SERVICE 狀態(tài),health 端點 HTTP 響應(yīng)狀態(tài)碼也會變?yōu)?503,我們可以以此來配置程序健康狀態(tài)監(jiān)控報警。使用步驟也非常簡單,這里演示的是線程池的監(jiān)控。模擬線程池滿了狀態(tài)下將HealthInicator指示器變?yōu)镈own的狀態(tài)。

pom中引入jar

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency>

引入properties配置

spring.application.name=boot# server.servlet.context-path=/boot# management.server.servlet.context-path=/boot# JVM (Micrometer)要求給應(yīng)用設(shè)置commonTagmanagement.metrics.tags.application=${spring.application.name}#去掉重復(fù)的metricsspring.metrics.servo.enabled=falsemanagement.endpoint.metrics.enabled=truemanagement.endpoint.metrics.sensitive=false#顯式配置不需要權(quán)限驗證對外開放的端點management.endpoints.web.exposure.include=*management.endpoints.jmx.exposure.include=*management.endpoint.health.show-details=always#Actuator 的 Web 訪問方式的根地址為 /actuator,可以通過 management.endpoints.web.base-path 參數(shù)進行修改management.endpoints.web.base-path=/actuatormanagement.metrics.export.prometheus.enabled=true

代碼

/** * @Author jeffSmile * @Date 下午 6:10 2020/5/24 0024 * @Description 定義一個接口,來把耗時很長的任務(wù)提交到這個 demoThreadPool 線程池,以模擬線程池隊列滿的情況 **/ @GetMapping('slowTask') public void slowTask() { ThreadPoolProvider.getDemoThreadPool().execute(() -> { try { TimeUnit.HOURS.sleep(1); } catch (InterruptedException e) { } }); }

package com.mongo.boot.service;import jodd.util.concurrent.ThreadFactoryBuilder;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class ThreadPoolProvider { //一個工作線程的線程池,隊列長度10 private static ThreadPoolExecutor demoThreadPool = new ThreadPoolExecutor( 1, 1, 2, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10), new ThreadFactoryBuilder().setNameFormat('demo-threadpool-%d').get()); //核心線程數(shù)10,最大線程數(shù)50的線程池,隊列長度50 private static ThreadPoolExecutor ioThreadPool = new ThreadPoolExecutor( 10, 50, 2, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), new ThreadFactoryBuilder().setNameFormat('io-threadpool-%d').get()); public static ThreadPoolExecutor getDemoThreadPool() { return demoThreadPool; } public static ThreadPoolExecutor getIOThreadPool() { return ioThreadPool; }}

package com.mongo.boot.service;import org.springframework.boot.actuate.health.Health;import org.springframework.boot.actuate.health.HealthIndicator;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ThreadPoolExecutor;/** * @Author jeffSmile * @Date 下午 6:12 2020/5/24 0024 * @Description 自定義的 HealthIndicator 類,用于單一線程池的健康狀態(tài) **/public class ThreadPoolHealthIndicator implements HealthIndicator { private ThreadPoolExecutor threadPool; public ThreadPoolHealthIndicator(ThreadPoolExecutor threadPool) { this.threadPool = threadPool; } @Override public Health health() { //補充信息 Map<String, Integer> detail = new HashMap<>(); //隊列當(dāng)前元素個數(shù) detail.put('queue_size', threadPool.getQueue().size()); //隊列剩余容量 detail.put('queue_remaining', threadPool.getQueue().remainingCapacity()); //如果還有剩余量則返回UP,否則返回DOWN if (threadPool.getQueue().remainingCapacity() > 0) { return Health.up().withDetails(detail).build(); } else { return Health.down().withDetails(detail).build(); } }}

package com.mongo.boot.service;import org.springframework.boot.actuate.health.CompositeHealthContributor;import org.springframework.boot.actuate.health.HealthContributor;import org.springframework.boot.actuate.health.NamedContributor;import org.springframework.stereotype.Component;import java.util.HashMap;import java.util.Iterator;import java.util.Map;/*** * @Author jeffSmile * @Date 下午 6:13 2020/5/24 0024 * @Description 定義一個 CompositeHealthContributor,來聚合兩個 ThreadPoolHealthIndicator 的實例, * 分別對應(yīng) ThreadPoolProvider 中定義的兩個線程池 **/@Componentpublic class ThreadPoolsHealthContributor implements CompositeHealthContributor { //保存所有的子HealthContributor private Map<String, HealthContributor> contributors = new HashMap<>(); ThreadPoolsHealthContributor() { //對應(yīng)ThreadPoolProvider中定義的兩個線程池 this.contributors.put('demoThreadPool', new ThreadPoolHealthIndicator(ThreadPoolProvider.getDemoThreadPool())); this.contributors.put('ioThreadPool', new ThreadPoolHealthIndicator(ThreadPoolProvider.getIOThreadPool())); } @Override public HealthContributor getContributor(String name) { //根據(jù)name找到某一個HealthContributor return contributors.get(name); } @Override public Iterator<NamedContributor<HealthContributor>> iterator() { //返回NamedContributor的迭代器,NamedContributor也就是Contributor實例+一個命名 return contributors.entrySet().stream() .map((entry) -> NamedContributor.of(entry.getKey(), entry.getValue())).iterator(); }}

啟動springboot驗證

這里我訪問:http://localhost:8080/slowTask

Spring Boot Actuator監(jiān)控的簡單使用方法示例代碼詳解

每次訪問都向demo線程池中提交一個耗時1小時的任務(wù),而demo線程池的核心和最大線程數(shù)都是1,隊列長度為10,那么當(dāng)訪問11次之后,任務(wù)將被直接拒絕掉!

Spring Boot Actuator監(jiān)控的簡單使用方法示例代碼詳解Spring Boot Actuator監(jiān)控的簡單使用方法示例代碼詳解

此時訪問:http://localhost:8080/actuator/health

Spring Boot Actuator監(jiān)控的簡單使用方法示例代碼詳解

demo線程池隊列已經(jīng)滿了,狀態(tài)變?yōu)镈OWN。

Spring Boot Actuator監(jiān)控的簡單使用方法示例代碼詳解

監(jiān)控內(nèi)部重要組件的狀態(tài)數(shù)據(jù)

通過 Actuator 的 InfoContributor 功能,對外暴露程序內(nèi)部重要組件的狀態(tài)數(shù)據(jù)!實現(xiàn)一個 ThreadPoolInfoContributor 來展現(xiàn)線程池的信息:

package com.mongo.boot.config;import com.mongo.boot.service.ThreadPoolProvider;import org.springframework.boot.actuate.info.Info;import org.springframework.boot.actuate.info.InfoContributor;import org.springframework.stereotype.Component;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ThreadPoolExecutor;/** * @Author jeffSmile * @Date 下午 6:37 2020/5/24 0024 * @Description 通過 Actuator 的 InfoContributor 功能,對外暴露程序內(nèi)部重要組件的狀態(tài)數(shù)據(jù) **/@Componentpublic class ThreadPoolInfoContributor implements InfoContributor { private static Map threadPoolInfo(ThreadPoolExecutor threadPool) { Map<String, Object> info = new HashMap<>(); info.put('poolSize', threadPool.getPoolSize());//當(dāng)前池大小 info.put('corePoolSize', threadPool.getCorePoolSize());//設(shè)置的核心池大小 info.put('largestPoolSize', threadPool.getLargestPoolSize());//最大達到過的池大小 info.put('maximumPoolSize', threadPool.getMaximumPoolSize());//設(shè)置的最大池大小 info.put('completedTaskCount', threadPool.getCompletedTaskCount());//總完成任務(wù)數(shù) return info; } @Override public void contribute(Info.Builder builder) { builder.withDetail('demoThreadPool', threadPoolInfo(ThreadPoolProvider.getDemoThreadPool())); builder.withDetail('ioThreadPool', threadPoolInfo(ThreadPoolProvider.getIOThreadPool())); }}

直接訪問http://localhost:8080/actuator/info

Spring Boot Actuator監(jiān)控的簡單使用方法示例代碼詳解

如果開啟jmx,還可以使用jconsole來查看線程池的狀態(tài)信息:

#開啟 JMXspring.jmx.enabled=true

打開jconcole界面之后,進入MBean這個tab,可以在EndPoint下的Info操作這里看到我們的Bean信息。

Spring Boot Actuator監(jiān)控的簡單使用方法示例代碼詳解

不過,除了jconsole之外,我們可以把JMX協(xié)議轉(zhuǎn)為http協(xié)議,這里引入jolokia:

<dependency> <groupId>org.jolokia</groupId> <artifactId>jolokia-core</artifactId></dependency>

重啟后訪問:http://localhost:8080/actuator/jolokia/exec/org.springframework.boot:type=Endpoint,name=Info/info

Spring Boot Actuator監(jiān)控的簡單使用方法示例代碼詳解

監(jiān)控延伸

通過Micrometer+promethues+grafana的組合也可以進行一些生產(chǎn)級別的實踐。

到此這篇關(guān)于Spring Boot Actuator監(jiān)控的簡單使用的文章就介紹到這了,更多相關(guān)Spring Boot Actuator監(jiān)控內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 阿克| 金沙县| 新余市| 杂多县| 郎溪县| 远安县| 扶余县| 城市| 冷水江市| 商水县| 永吉县| 开封县| 新源县| 新昌县| 施甸县| 九台市| 襄城县| 大新县| 长乐市| 广东省| 乐昌市| 正定县| 阿克| 文水县| 青冈县| 巴林右旗| 海宁市| 沁源县| 绥化市| 长治县| 黄山市| 大港区| 礼泉县| 监利县| 卢湾区| 环江| 开封市| 顺平县| 大悟县| 商都县| 威海市|