Spring Boot で監視インジケーターをカスタマイズする方法

PHPz
リリース: 2023-05-11 14:01:13
転載
1050 人が閲覧しました

    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. インジケーターをカスタマイズします

    メソッド 1

    micrometercore パッケージのクラスを直接使用してインジケーターを定義および登録する

    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;
    	}
     
    }
    ログイン後にコピー

    メソッド 2

    micrometer-registry を導入することにより-prometheus パッケージ、このパッケージは prometheus を組み合わせてマイクロメーターをカプセル化します

    <dependency>
    			<groupId>io.micrometer</groupId>
    			<artifactId>micrometer-registry-prometheus</artifactId>
    		</dependency>
    ログイン後にコピー

    2 つのメトリクスも定義します

    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 つの一般的に使用されるメトリクス

    Counter

    継続的に増加するが減少しないカウンタは、Web サイト訪問者数、システム実行時間など、増加するだけで減少しないタイプを記録するために使用できます。

    カウンター タイプのインジケーターには、カウンター 1 に使用される inc() メソッドが 1 つだけあります。

    一般的に、カウンター タイプのメトリック インジケーターには _total を使用します。 .

    ゲージ

    増加または減少できるダッシュボードと曲線グラフ

    増加または減少できるこのタイプのインジケーターの場合、それを反映するために使用されます。アプリケーションの現在のステータス。

    たとえば、ホストを監視する場合、ホストの現在の空きメモリ サイズ、使用可能なメモリ サイズなどを監視します。

    ゲージ インジケーター オブジェクトには、カウントを増減するために使用される 2 つのメイン メソッド inc() および dec() が含まれています。

    ヒストグラム

    は、主にデータの分布をカウントするために使用されます。これは、おおよそのパーセンテージ推定値を表す特殊なメトリクス データ タイプです。すべての離散インジケータ データを回数でカウントします。それぞれの値の範囲で。例: 一定期間内の 0.005 秒未満、0.01 秒未満、および 0.025 秒未満の http リクエスト応答のデータ分布をカウントしたいとします。次に、ヒストグラムを使用して各 http リクエストの時間を収集し、同時にバケットを設定します。

    サマリー

    サマリーとヒストグラムは非常によく似ています。どちらもイベントの数またはサイズとその分布をカウントできます。どちらも時間のカウントと値のサマリーを提供します。また、次の情報も提供します。統計的なサンプル分布を計算できる関数。違いは、Histogram が histogram_quantile 関数を通じてサーバー上で分位数を計算できることです。 Sumamry の分位数はクライアント上で直接定義されます。したがって、分位数の計算では、PromQL を介してクエリを実行すると Summary の方がパフォーマンスが向上しますが、Histogram はより多くのリソースを消費しますが、クライアントと比較すると、Histogram の方が消費するリソースは少なくなります。どちらを使用しても、実際のシーンに応じて自由に調整できます。

    3. テスト

    2 つのコントローラーを定義し、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 で監視インジケーターをカスタマイズする方法

    金額を複数回変更します http://127.0.0.1:8080/order?amount=100http://127.0.0.1:8080/pay?amount=10; の後に、http にアクセスします。 / /127.0.0.1:9595/アクチュエーター/プロメテウス。監視データの確認

    Spring Boot で監視インジケーターをカスタマイズする方法

    4. プロジェクトへの応用

    上記の方法でデータが埋もれた箇所を監視するのは現実的ではありません; 春にはproject 基本的に埋設点モニタリングはAOPを通じて実施します。たとえば、アスペクトAspectと書きます。この方法は非常に使いやすいです。コントローラにコードを記述することなく、入口でデータ埋没点の監視が可能です。

    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;
        }
    }
    ログイン後にコピー

    アスペクトを作成した後、サービスを再起動します。コントローラー インターフェイスにアクセスすると、カスタム監視インジケーターを埋め込むこともできます

    Spring Boot で監視インジケーターをカスタマイズする方法

    以上がSpring Boot で監視インジケーターをカスタマイズする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート