中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?Boot怎么自定義監控指標

發布時間:2023-03-07 17:09:34 來源:億速云 閱讀:115 作者:iii 欄目:開發技術

今天小編給大家分享一下Spring Boot怎么自定義監控指標的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    1.創建項目

    pom.xml引入相關依賴

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>com.olive</groupId>
    	<artifactId>prometheus-meter-demo</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.3.7.RELEASE</version>
    		<relativePath />
    	</parent>
    	<properties>
    		<java.version>1.8</java.version>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    		<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    	</properties>
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-aop</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-actuator</artifactId>
    		</dependency>
    		<!-- Micrometer Prometheus registry  -->
    		<dependency>
    			<groupId>io.micrometer</groupId>
    			<artifactId>micrometer-registry-prometheus</artifactId>
    		</dependency>
    	</dependencies>
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-dependencies</artifactId>
    				<version>${spring-boot.version}</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    		</dependencies>
    	</dependencyManagement>
    </project>

    2.自定義指標

    方式一

    直接使用micrometer核心包的類進行指標定義和注冊

    package com.olive.monitor;
     
    import javax.annotation.PostConstruct;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
     
    import io.micrometer.core.instrument.Counter;
    import io.micrometer.core.instrument.DistributionSummary;
    import io.micrometer.core.instrument.MeterRegistry;
     
    @Component
    public class NativeMetricsMontior {
     
    	/**
    	 * 支付次數
    	 */
    	private Counter payCount;
     
    	/**
    	 * 支付金額統計
    	 */
    	private DistributionSummary payAmountSum;
     
    	@Autowired
    	private MeterRegistry registry;
     
    	@PostConstruct
    	private void init() {
    		payCount = registry.counter("pay_request_count", "payCount", "pay-count");
    		payAmountSum = registry.summary("pay_amount_sum", "payAmountSum", "pay-amount-sum");
    	}
     
    	public Counter getPayCount() {
    		return payCount;
    	}
     
    	public DistributionSummary getPayAmountSum() {
    		return payAmountSum;
    	}
     
    }

    方式二

    通過引入micrometer-registry-prometheus包,該包結合prometheus,對micrometer進行了封裝

    <dependency>
    			<groupId>io.micrometer</groupId>
    			<artifactId>micrometer-registry-prometheus</artifactId>
    		</dependency>

    同樣定義兩個metrics

    package com.olive.monitor;
     
    import javax.annotation.PostConstruct;
     
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
     
    import io.prometheus.client.CollectorRegistry;
    import io.prometheus.client.Counter;
     
    @Component
    public class PrometheusMetricsMonitor {
     
    	/**
    	 * 訂單發起次數
    	 */
    	private Counter orderCount;
     
    	/**
    	 * 金額統計
    	 */
    	private Counter orderAmountSum;
    	
    	@Autowired
    	private CollectorRegistry registry;
    	@PostConstruct
    	private void init() {
    		orderCount = Counter.build().name("order_request_count")
    				.help("order request count.")
    				.labelNames("orderCount")
    				.register();
    		orderAmountSum = Counter.build().name("order_amount_sum")
    				.help("order amount sum.")
    				.labelNames("orderAmountSum")
    				.register();
    		registry.register(orderCount);
    		registry.register(orderAmountSum);
    	}
     
    	public Counter getOrderCount() {
    		return orderCount;
    	}
     
    	public Counter getOrderAmountSum() {
    		return orderAmountSum;
    	}
     
    }

    prometheus 4種常用Metrics

    Counter

    連續增加不會減少的計數器,可以用于記錄只增不減的類型,例如:網站訪問人數,系統運行時間等。

    對于Counter類型的指標,只包含一個inc()的方法,就是用于計數器+1.

    一般而言,Counter類型的metric指標在冥冥中我們使用_total結束,如http_requests_total.

    Gauge

    可增可減的儀表盤,曲線圖

    對于這類可增可減的指標,用于反應應用的當前狀態。

    例如在監控主機時,主機當前空閑的內存大小,可用內存大小等等。

    對于Gauge指標的對象則包含兩個主要的方法inc()和dec(),用于增加和減少計數。

    Histogram

    主要用來統計數據的分布情況,這是一種特殊的metrics數據類型,代表的是一種近似的百分比估算數值,統計所有離散的指標數據在各個取值區段內的次數。例如:我們想統計一段時間內http請求響應小于0.005秒、小于0.01秒、小于0.025秒的數據分布情況。那么使用Histogram采集每一次http請求的時間,同時設置bucket。

    Summary

    Summary和Histogram非常相似,都可以統計事件發生的次數或者大小,以及其分布情況,他們都提供了對時間的計數_count以及值的匯總_sum,也都提供了可以計算統計樣本分布情況的功能,不同之處在于Histogram可以通過histogram_quantile函數在服務器計算分位數。而Sumamry的分位數則是直接在客戶端進行定義的。因此對于分位數的計算,Summary在通過PromQL進行查詢的時候有更好的性能表現,而Histogram則會消耗更多的資源,但是相對于客戶端而言Histogram消耗的資源就更少。用哪個都行,根據實際場景自由調整即可。

    3. 測試

    定義兩個controller分別使用NativeMetricsMontiorPrometheusMetricsMonitor

    package com.olive.controller;
     
    import java.util.Random;
     
    import javax.annotation.Resource;
     
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
     
    import com.olive.monitor.NativeMetricsMontior;
     
    @RestController
    public class PayController {
     
    	@Resource
    	private NativeMetricsMontior monitor;
     
    	@RequestMapping("/pay")
    	public String pay(@RequestParam("amount") Double amount) throws Exception {
    		// 統計支付次數
    		monitor.getPayCount().increment();
     
    		Random random = new Random();
    		//int amount = random.nextInt(100);
    		if(amount==null) {
    			amount = 0.0;
    		}
    		// 統計支付總金額
    		monitor.getPayAmountSum().record(amount);
    		return "支付成功, 支付金額: " + amount;
    	}
     
    }
    package com.olive.controller;
     
    import java.util.Random;
     
    import javax.annotation.Resource;
     
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
     
    import com.olive.monitor.PrometheusMetricsMonitor;
     
    @RestController
    public class OrderController {
     
    	@Resource
    	private PrometheusMetricsMonitor monitor;
     
    	@RequestMapping("/order")
    	public String order(@RequestParam("amount") Double amount) throws Exception {
    		// 訂單總數
    		monitor.getOrderCount()
    			.labels("orderCount")
    			.inc();
     
    		Random random = new Random();
    		//int amount = random.nextInt(100);
    		if(amount==null) {
    			amount = 0.0;
    		}
    		// 統計訂單總金額
    		monitor.getOrderAmountSum()
    			.labels("orderAmountSum")
    			.inc(amount);
    		return "下單成功, 訂單金額: " + amount;
    	}
     
    }

    啟動服務

    訪問http://127.0.0.1:9595/actuator/prometheus;正常看到監測數據

    Spring?Boot怎么自定義監控指標

    改變amount多次方式http://127.0.0.1:8080/order?amount=100http://127.0.0.1:8080/pay?amount=10后;再訪問http://127.0.0.1:9595/actuator/prometheus。查看監控數據

    Spring?Boot怎么自定義監控指標

    4.項目中的應用

    項目中按照上面說的方式進行數據埋點監控不太現實;在spring項目中基本通過AOP進行埋點監測。比如寫一個切面Aspect;這樣的方式就非常友好。能在入口就做了數據埋點監測,無須在controller里進行代碼編寫。

    package com.olive.aspect;
     
    import java.time.LocalDate;
    import java.util.concurrent.TimeUnit;
     
    import javax.servlet.http.HttpServletRequest;
     
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.springframework.stereotype.Component;
    import org.springframework.util.StringUtils;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
     
    import io.micrometer.core.instrument.Metrics;
     
    @Aspect
    @Component
    public class PrometheusMetricsAspect {
     
        // 切入所有controller包下的請求方法
        @Pointcut("execution(* com.olive.controller..*.*(..))")
        public void controllerPointcut() {
        }
     
        @Around("controllerPointcut()")
        public Object MetricsCollector(ProceedingJoinPoint joinPoint) throws Throwable {
     
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            String userId = StringUtils.hasText(request.getParameter("userId")) ? 
            		request.getParameter("userId") : "no userId";
            
            // 獲取api url
            String api = request.getServletPath();
            // 獲取請求方法
            String method = request.getMethod();
            long startTs = System.currentTimeMillis();
            LocalDate now = LocalDate.now();
            String[] tags = new String[10];
            tags[0] = "api";
            tags[1] = api;
            tags[2] = "method";
            tags[3] = method;
            tags[4] = "day";
            tags[5] = now.toString();
            tags[6] = "userId";
            tags[7] = userId;
            
            String amount = StringUtils.hasText(request.getParameter("amount")) ? 
            		request.getParameter("amount") : "0.0";
            
            tags[8] = "amount";
            tags[9] = amount;
            // 請求次數加1
            //自定義的指標名稱:custom_http_request_all,指標包含數據
            Metrics.counter("custom_http_request_all", tags).increment();
            Object object = null;
            try {
                object = joinPoint.proceed();
            } catch (Exception e) {
                //請求失敗次數加1
                Metrics.counter("custom_http_request_error", tags).increment();
                throw e;
            } finally {
                long endTs = System.currentTimeMillis() - startTs;
                //記錄請求響應時間
               Metrics.timer("custom_http_request_time", tags).record(endTs, TimeUnit.MILLISECONDS);
            }
            return object;
        }
    }

    編寫好切面后,重啟服務;訪問controller的接口,同樣可以進行自定義監控指標埋點

    Spring?Boot怎么自定義監控指標

    以上就是“Spring Boot怎么自定義監控指標”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    吴忠市| 千阳县| 突泉县| 陆河县| 邯郸市| 达尔| 乐业县| 铁岭县| 平塘县| 孙吴县| 宜兰市| 黄山市| 井研县| 巴林左旗| 江口县| 乌兰浩特市| 耒阳市| 临西县| 兴国县| 宁南县| 石柱| 敖汉旗| 葫芦岛市| 乐昌市| 轮台县| 衡水市| 乌拉特前旗| 仙游县| 吉林省| 五家渠市| 泾源县| 深圳市| 栖霞市| 衢州市| 合水县| 万州区| 剑阁县| 南澳县| 蒙山县| 乌拉特中旗| 仪征市|