最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 使用Prometheus采集自定義指標(biāo)數(shù)據(jù)的方案

 更新時間:2022年10月09日 11:11:56   作者:張志翔 ?  
這篇文章主要介紹了SpringBoot 使用Prometheus采集自定義指標(biāo)數(shù)據(jù),我們在k8s集群成功搭建了Prometheus服務(wù),今天,我們將在springboot2.x中使用prometheus記錄指標(biāo),需要的朋友可以參考下

我們在k8s集群成功搭建了Prometheus服務(wù)。今天,我們將在springboot2.x中使用prometheus記錄指標(biāo)。

一、我們需要什么指標(biāo)

對于DDD、TDD等,大家比較熟悉了,但是對于MDD可能就比較陌生了。MDD是Metrics-Driven Development的縮寫,主張開發(fā)過程由指標(biāo)驅(qū)動,通過實用指標(biāo)來驅(qū)動快速、精確和細(xì)粒度的軟件迭代。MDD可使所有可以測量的東西都得到量化和優(yōu)化,進而為整個開發(fā)過程帶來可見性,幫助相關(guān)人員快速、準(zhǔn)確地作出決策,并在發(fā)生錯誤時立即發(fā)現(xiàn)問題并修復(fù)。依照MDD的理念,在需求階段就應(yīng)該考慮關(guān)鍵指標(biāo),在應(yīng)用上線后通過指標(biāo)了解現(xiàn)狀并持續(xù)優(yōu)化。有一些基于指標(biāo)的方法論,建議大家了解一下:

  • Google的四大黃金指標(biāo):延遲Latency、流量Traffic、錯誤Errors、飽和度Saturation
  • Netflix的USE方法:使用率Utilization、飽和度Saturation、錯誤Error
  • WeaveCloud的RED方法:速率Rate、錯誤Errors、耗時Duration

二、在SrpingBoot中引入prometheus

SpringBoot2.x集成Prometheus非常簡單,首先引入maven依賴:

io.micrometer
micrometer-registry-prometheus
1.7.3
io.github.mweirauch
micrometer-jvm-extras
0.2.2

然后,在application.properties中將prometheus的endpoint放出來。

management:
  endpoints:
    web:
      exposure:
        include: info,health,prometheus

接下來就可以進行指標(biāo)埋點了,Prometheus的四種指標(biāo)類型此處不再贅述,請自行學(xué)習(xí)。一般指標(biāo)埋點代碼實現(xiàn)上有兩種形式:AOP、侵入式,建議盡量使用AOP記錄指標(biāo),對于無法使用aop的場景就只能侵入代碼了。常用的AOP方式有:

  • @Aspect(通用)
  • HandlerInterceptor (SpringMVC的攔截器)
  • ClientHttpRequestInterceptor (RestTemplate的攔截器)
  • DubboFilter (dubbo接口)

我們選擇通用的@Aspect,結(jié)合自定義指標(biāo)注解來實現(xiàn)。首先自定義指標(biāo)注解:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodMetrics {
    String name() default "";
    String desc() default "";
    String[] tags() default {};
    //是否記錄時間間隔
    boolean withoutDuration() default false;
}

然后是切面實現(xiàn):

@Aspect
public class PrometheusAnnotationAspect {
 
    @Autowired
    private MeterRegistry meterRegistry;
 
    @Pointcut("@annotation(com.smac.prometheus.annotation.MethodMetrics)")
    public void pointcut() {}
 
    @Around(value = "pointcut()")
    public Object process(ProceedingJoinPoint joinPoint) throws Throwable {
        Method targetMethod = ((MethodSignature) joinPoint.getSignature()).getMethod();
        Method currentMethod = ClassUtils.getUserClass(joinPoint.getTarget().getClass()).getDeclaredMethod(targetMethod.getName(), targetMethod.getParameterTypes());
        if (currentMethod.isAnnotationPresent(MethodMetrics.class)) {
            MethodMetrics methodMetrics = currentMethod.getAnnotation(MethodMetrics.class);
            return processMetric(joinPoint, currentMethod, methodMetrics);
        } else {
            return joinPoint.proceed();
        }
    }
 
    private Object processMetric(ProceedingJoinPoint joinPoint, Method currentMethod, MethodMetrics methodMetrics) {
        String name = methodMetrics.name();
        if (!StringUtils.hasText(name)) {
            name = currentMethod.getName();
        }
        String desc = methodMetrics.desc();
        if (!StringUtils.hasText(desc)) {
            desc = currentMethod.getName();
        }
        //不需要記錄時間
        if (methodMetrics.withoutDuration()) {
            Counter counter = Counter.builder(name).tags(methodMetrics.tags()).description(desc).register(meterRegistry);
            try {
                return joinPoint.proceed();
            } catch (Throwable e) {
                throw new IllegalStateException(e);
            } finally {
                counter.increment();
            }
        }
        //需要記錄時間(默認(rèn))
        Timer timer = Timer.builder(name).tags(methodMetrics.tags()).description(desc).register(meterRegistry);
        return timer.record(() -> {
            try {
                return joinPoint.proceed();
            } catch (Throwable e) {
                throw new IllegalStateException(e);
            }
        });
    }
}

代碼很容易,沒什么可說明的,接下來就是在需要記監(jiān)控的地方加上這個注解就行,比如:

@MethodMetrics(name="sms_send",tags = {"vendor","aliyun"})
public void send(String mobile, SendMessage message) throws Exception {
    ...
}

至此,aop形式的指標(biāo)實現(xiàn)方式就完成了。如果是侵入式的話,直接使用meterRegistry就行:

meterRegistry.counter("sms.send","vendor","aliyun").increment();

啟動服務(wù),打開http://localhost:8080/actuator/prometheus查看指標(biāo)。

三、高級指標(biāo)之分位數(shù)

分位數(shù)(P50/P90/P95/P99)是我們常用的一個性能指標(biāo),Prometheus提供了兩種解決方案:

client側(cè)計算方案

summery類型,設(shè)置percentiles,在本地計算出Pxx,作為指標(biāo)的一個tag被直接收集。

Timer timer = Timer.builder("sms.send").publishPercentiles(0.5, 0.9, 0.95,0.99).register(meterRegistry);
timer.record(costTime, TimeUnit.MILLISECONDS);

會出現(xiàn)四個帶quantile的指標(biāo),如圖:

server側(cè)計算方案

開啟histogram,將所有樣本放入buckets中,在server側(cè)通過histogram_quantile函數(shù)對buckets進行實時計算得出。注意:histogram采用了線性插值法,buckets的劃分對誤差的影響比較大,需合理設(shè)置。

Timer timer = Timer.builder("sms.send")
                .publishPercentileHistogram(true)
                .serviceLevelObjectives(Duration.ofMillis(10),Duration.ofMillis(20),Duration.ofMillis(50))
                .minimumExpectedValue(Duration.ofMillis(1))
                .maximumExpectedValue(Duration.ofMillis(100))
                .register(meterRegistry);
timer.record(costTime, TimeUnit.MILLISECONDS);

會出現(xiàn)一堆xxxx_bucket的指標(biāo),如圖:

然后,使用

histogram_quantile(0.95, rate(sms_send_seconds_bucket[5m]))

就可以看到P95的指標(biāo)了,如圖:

結(jié)論:

方案1適用于單機或只關(guān)心本地運行情況的指標(biāo),比如gc時間、定時任務(wù)執(zhí)行時間、本地緩存更新時間等;

方案2則適用于分布式環(huán)境下的整體運行情況的指標(biāo),比如搜索接口的響應(yīng)時間、第三方接口的響應(yīng)時間等。

到此這篇關(guān)于SpringBoot 使用Prometheus采集自定義指標(biāo)數(shù)據(jù)的文章就介紹到這了,更多相關(guān)SpringBoot采集自定義指標(biāo)數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot應(yīng)用部署于外置Tomcat容器的方法

    SpringBoot應(yīng)用部署于外置Tomcat容器的方法

    這篇文章主要介紹了SpringBoot應(yīng)用部署于外置Tomcat容器的方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-06-06
  • 教你用JAVA寫文本編輯器(四)

    教你用JAVA寫文本編輯器(四)

    這篇文章主要給大家介紹了關(guān)于用JAVA寫文本編輯器的相關(guān)資料,通過這篇文章你可以完整的知道利用JAVA寫文本編輯器的完整過程,需要的朋友可以參考下
    2021-11-11
  • Java基礎(chǔ)Map集合詳析

    Java基礎(chǔ)Map集合詳析

    這篇文章主要介紹了Java基礎(chǔ)Map集合詳析,主要通過介紹Map集合的常用方法、Map的獲取方法的一些相關(guān)資料展開內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04
  • Java ArrayList類的基礎(chǔ)使用講解

    Java ArrayList類的基礎(chǔ)使用講解

    數(shù)組的長度是固定的,無法適應(yīng)數(shù)據(jù)變化的需求。為了解決這個問題,Java提供了另一個容器 java.util.ArrayList集合類,讓我們可以更便捷的存儲和操作對象數(shù)據(jù)。本文就將通過示例聊聊ArrayList類的基礎(chǔ)使用,感興趣的可以了解一下
    2022-10-10
  • Java數(shù)組轉(zhuǎn)換為List的四種方式

    Java數(shù)組轉(zhuǎn)換為List的四種方式

    這篇文章主要介紹了Java開發(fā)技巧數(shù)組轉(zhuǎn)List的四種方式總結(jié),每種方式結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • 改變JAVA窗體屬性的操作方法

    改變JAVA窗體屬性的操作方法

    在本篇內(nèi)容里小編給大家詳細(xì)分析了關(guān)于改變JAVA窗體屬性的操作方法和步驟,需要的朋友們學(xué)習(xí)下。
    2018-12-12
  • Java?Date(日期)對象進行格式化的思路詳解

    Java?Date(日期)對象進行格式化的思路詳解

    Date類是經(jīng)常會使用到的一個用來處理日期、時間的一個類。Date類是在java.util包下的Date類,這篇文章主要介紹了Java?Date(日期)對象如何進行格式化呢,需要的朋友可以參考下
    2022-09-09
  • java 中newInstance()方法和new關(guān)鍵字的區(qū)別

    java 中newInstance()方法和new關(guān)鍵字的區(qū)別

    這篇文章主要介紹了java 中newInstance()方法和new關(guān)鍵字的區(qū)別的相關(guān)資料,希望通過本文大家能掌握他們之家的區(qū)別與用法,需要的朋友可以參考下
    2017-09-09
  • 詳談Spring是否支持對靜態(tài)方法進行Aop增強

    詳談Spring是否支持對靜態(tài)方法進行Aop增強

    這篇文章主要介紹了Spring是否支持對靜態(tài)方法進行Aop增強,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring Security保護用戶密碼常用方法詳解

    Spring Security保護用戶密碼常用方法詳解

    這篇文章主要介紹了Spring Security保護用戶密碼常用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論

沧州市| 措美县| 西峡县| 南通市| 梨树县| 个旧市| 闵行区| 略阳县| 柳州市| 巧家县| 蒙自县| 乐至县| 临朐县| 云梦县| 邵阳县| 神木县| 竹溪县| 社旗县| 伊宁市| 建瓯市| 徐水县| 新兴县| 酉阳| 乌拉特后旗| 张家川| 修武县| 盱眙县| 剑阁县| 芦溪县| 和静县| 瑞金市| 四川省| 四会市| 曲松县| 常熟市| 宁城县| 湖州市| 广宁县| 东安县| 临颍县| 梅河口市|