欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot使用Prometheus采集自定義指標數(shù)據(jù)的方法詳解

 更新時間:2024年10月11日 11:20:09   作者:BasicLab基礎架構實驗室  
隨著微服務在生產(chǎn)環(huán)境大規(guī)模部署和應用,隨之而來也帶來了新的問題,其中比較關鍵的就是關于微服務的運維和監(jiān)控,本文將結合微服務運維監(jiān)控中的指標監(jiān)控進行詳細的說明,需要的朋友可以參考下

一、我們需要什么指標

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

Google的四大黃金指標:延遲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

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

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

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

@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();
            }
        }
        //需要記錄時間(默認)
        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形式的指標實現(xiàn)方式就完成了。如果是侵入式的話,直接使用meterRegistry就行:

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

啟動服務,打開http://localhost:8080/actuator/prometheus查看指標。

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

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

client側計算方案

summery類型,設置percentiles,在本地計算出Pxx,作為指標的一個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的指標,如圖:

server側計算方案

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

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的指標,如圖:

然后,使用

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

就可以看到P95的指標了,如圖:

結論:

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

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

相關文章

  • Spring Boot中自動執(zhí)行sql腳本的實現(xiàn)

    Spring Boot中自動執(zhí)行sql腳本的實現(xiàn)

    這篇文章主要介紹了Spring Boot中自動執(zhí)行sql腳本的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • SpringBoot項目URL訪問異常的問題處理

    SpringBoot項目URL訪問異常的問題處理

    這篇文章主要介紹了SpringBoot項目URL訪問異常的問題處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 詳解如何在spring中創(chuàng)建全局異常處理器

    詳解如何在spring中創(chuàng)建全局異常處理器

    全局異常處理器在實際項目開發(fā)中是一個很重要的工具,對保證代碼的正常運行有很重要的作用,所以下面來講一下如何在spring中創(chuàng)建一個全局異常處理器,感興趣的的朋友可以參考下
    2023-12-12
  • Java基礎入門語法--String類

    Java基礎入門語法--String類

    字符串廣泛應用在Java編程中,在Java中字符串屬于對象,Java 提供了String類來創(chuàng)建和操作字符串,今天給大家介紹Java基礎入門語法--String類的相關知識,感興趣的朋友一起看看吧
    2021-06-06
  • SpringBoot結合ProGuard實現(xiàn)代碼混淆(最新版)

    SpringBoot結合ProGuard實現(xiàn)代碼混淆(最新版)

    這篇文章主要介紹了SpringBoot結合ProGuard實現(xiàn)代碼混淆(最新版),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 淺談Java生命周期管理機制

    淺談Java生命周期管理機制

    最近有位細心的朋友在閱讀筆者的文章時,對java類的生命周期問題有一些疑惑,筆者打開百度搜了一下相關的問題,看到網(wǎng)上的資料很少有把這個問題講明白的,主要是因為目前國內(nèi)java方面的教材大多只是告訴你“怎樣做”,但至于“為什么這樣做”卻不多說
    2016-01-01
  • Java如何獲取視頻文件的視頻時長

    Java如何獲取視頻文件的視頻時長

    文章介紹了如何使用Java獲取視頻文件的視頻時長,包括導入maven依賴和代碼案例,同時,也討論了在運行過程中遇到的SLF4J加載問題,并給出了解決方案
    2025-02-02
  • spring boot springMVC擴展配置實現(xiàn)解析

    spring boot springMVC擴展配置實現(xiàn)解析

    這篇文章主要介紹了spring boot springMVC擴展配置實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Java?spring注解@PostConstruct實戰(zhàn)案例講解

    Java?spring注解@PostConstruct實戰(zhàn)案例講解

    我們在Spring項目中經(jīng)常會遇到@PostConstruct注解,可能有的伙伴對這個注解很陌生,下面這篇文章主要給大家介紹了關于Java?spring注解@PostConstruct實戰(zhàn)案例講解的相關資料,需要的朋友可以參考下
    2023-12-12
  • 在java中http請求帶cookie的例子

    在java中http請求帶cookie的例子

    今天小編就為大家分享一篇在java中http請求帶cookie的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論