五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Spring Boot如何自定義監(jiān)控指標(biāo)

2023-03-04 08:13 作者:Cpp程序員  | 我要投稿

1.創(chuàng)建項目

pom.xml引入相關(guān)依賴

<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.自定義指標(biāo)

  • 方式一

直接使用micrometer核心包的類進行指標(biāo)定義和注冊

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;@Componentpublic class NativeMetricsMontior { /** * 支付次數(shù) */ private Counter payCount; /** * 支付金額統(tǒng)計 */ 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包,該包結(jié)合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;@Componentpublic class PrometheusMetricsMonitor { /** * 訂單發(fā)起次數(shù) */ private Counter orderCount; /** * 金額統(tǒng)計 */ 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

連續(xù)增加不會減少的計數(shù)器,可以用于記錄只增不減的類型,例如:網(wǎng)站訪問人數(shù),系統(tǒng)運行時間等。

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

一般而言,Counter類型的metric指標(biāo)在冥冥中我們使用_total結(jié)束,如http_requests_total.

Gauge

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

對于這類可增可減的指標(biāo),用于反應(yīng)應(yīng)用的當(dāng)前狀態(tài)。

例如在監(jiān)控主機時,主機當(dāng)前空閑的內(nèi)存大小,可用內(nèi)存大小等等。

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

Histogram

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

Summary

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

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;@RestControllerpublic class PayController { @Resource private NativeMetricsMontior monitor; @RequestMapping("/pay") public String pay(@RequestParam("amount") Double amount) throws Exception { // 統(tǒng)計支付次數(shù) monitor.getPayCount().increment(); Random random = new Random(); //int amount = random.nextInt(100); if(amount==null) { amount = 0.0; } // 統(tǒng)計支付總金額 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;@RestControllerpublic class OrderController { @Resource private PrometheusMetricsMonitor monitor; @RequestMapping("/order") public String order(@RequestParam("amount") Double amount) throws Exception { // 訂單總數(shù) monitor.getOrderCount() .labels("orderCount") .inc(); Random random = new Random(); //int amount = random.nextInt(100); if(amount==null) { amount = 0.0; } // 統(tǒng)計訂單總金額 monitor.getOrderAmountSum() .labels("orderAmountSum") .inc(amount); return "下單成功, 訂單金額: " + amount; }}

啟動服務(wù)

訪問http://127.0.0.1:9595/actuator/prometheus;正??吹奖O(jiān)測數(shù)據(jù)

改變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。查看監(jiān)控數(shù)據(jù)

4.項目中的應(yīng)用

項目中按照上面說的方式進行數(shù)據(jù)埋點監(jiān)控不太現(xiàn)實;在spring項目中基本通過AOP進行埋點監(jiān)測。比如寫一個切面Aspect;這樣的方式就非常友好。能在入口就做了數(shù)據(jù)埋點監(jiān)測,無須在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@Componentpublic 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 urlString 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;// 請求次數(shù)加1//自定義的指標(biāo)名稱:custom_http_request_all,指標(biāo)包含數(shù)據(jù)Metrics.counter("custom_http_request_all", tags).increment();Object object = null;try {object = joinPoint.proceed();} catch (Exception e) {//請求失敗次數(shù)加1Metrics.counter("custom_http_request_error", tags).increment();throw e;} finally {long endTs = System.currentTimeMillis() - startTs;//記錄請求響應(yīng)時間Metrics.timer("custom_http_request_time", tags).record(endTs, TimeUnit.MILLISECONDS);}return object;}}

編寫好切面后,重啟服務(wù);訪問controller的接口,同樣可以進行自定義監(jiān)控指標(biāo)埋


Spring Boot如何自定義監(jiān)控指標(biāo)的評論 (共 條)

分享到微博請遵守國家法律
马山县| 宁国市| 阿克苏市| 临海市| 阳泉市| 安乡县| 定襄县| 武冈市| 金寨县| 泸州市| 万州区| 醴陵市| 鄂伦春自治旗| 宁陵县| 灯塔市| 龙南县| 兴文县| 襄樊市| 海城市| 陈巴尔虎旗| 定结县| 罗源县| 安吉县| 五大连池市| 册亨县| 江都市| 锡林浩特市| 攀枝花市| 永春县| 涡阳县| 黄山市| 东平县| 辛集市| 呼图壁县| 永嘉县| 抚顺市| 凉山| 黄浦区| 兴安盟| 高陵县| 闻喜县|