09.8Metrics收集 自定义业务指标

分类: 后端集成 Java Spring Boot OpenTelemetry

Metrics 收集:自定义业务指标

欢迎回到第 9 章的学习。在上一节,我们学习了手动插桩。现在我们要学习 Metrics 收集:自定义业务指标。

本节将学习:Meter API 使用、Counter、Gauge、Histogram、业务指标设计、以及指标导出。

Meter API 使用

Meter API 是什么? Meter API 用于创建和记录 Metrics,提供业务指标收集能力。

如何使用 Meter API 呢?

第一步:注入 Meter。 在 Service 类中注入 Meter。

第二步:创建 Metrics。 使用 meter.counterBuilder() 创建 Counter,使用 meter.gaugeBuilder() 创建 Gauge,使用 meter.histogramBuilder() 创建 Histogram。

第三步:记录指标值。 在业务方法中记录指标值。

第四步:查看 Metrics。 在 Grafana 中查看 Metrics 数据。

代码示例:

package com.shoehub.orderservice.service;

import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.metrics.Counter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderService {
    
    @Autowired
    private Meter meter;
    
    private final Counter orderCreatedCounter;
    
    public OrderService(Meter meter) {
        this.meter = meter;
        this.orderCreatedCounter = meter.counterBuilder("orders.created.total")
            .setDescription("Total number of orders created")
            .build();
    }
    
    public Order createOrder(OrderRequest request) {
        // Business logic
        orderCreatedCounter.add(1);
        return order;
    }
}

Counter、Gauge、Histogram

Counter 是什么? Counter 用于记录累计值,只能增加,不能减少。

使用场景: 订单创建数量、请求总数、错误总数。

Gauge 是什么? Gauge 用于记录当前值,可以增加或减少。

使用场景: 当前订单总数、当前活跃用户数、当前内存使用量。

Histogram 是什么? Histogram 用于记录分布值,统计数据分布。

使用场景: 订单金额分布、请求延迟分布、响应大小分布。

代码示例:

@Service
public class OrderService {
    
    @Autowired
    private Meter meter;
    
    private final Counter orderCreatedCounter;
    private final Gauge orderTotalGauge;
    private final Histogram orderAmountHistogram;
    
    public OrderService(Meter meter) {
        this.meter = meter;
        this.orderCreatedCounter = meter.counterBuilder("orders.created.total")
            .setDescription("Total number of orders created")
            .build();
        
        this.orderTotalGauge = meter.gaugeBuilder("orders.total")
            .setDescription("Current total number of orders")
            .buildWithCallback(measurement -> {
                measurement.record(orderRepository.count());
            });
        
        this.orderAmountHistogram = meter.histogramBuilder("orders.amount")
            .setDescription("Order amount distribution")
            .build();
    }
    
    public Order createOrder(OrderRequest request) {
        Order order = // Create an order
        orderCreatedCounter.add(1);
        orderAmountHistogram.record(request.getAmount());
        return order;
    }
}

不同类型 Metrics 的适用场景:Counter(累计值)、Gauge(当前值)、Histogram(分布值)。

业务指标设计

业务指标设计是什么? 业务指标设计用于设计有意义的业务指标,遵循指标命名规范。

指标命名规范是什么?

  • 点号分隔: 使用点号分隔单词。
  • 小写字母: 使用小写字母。
  • 描述性名称: 名称应该清楚描述指标的含义。

业务指标示例:

  • 订单相关指标: orders.created.total、orders.completed.total、orders.cancelled.total。
  • 用户相关指标: users.active、users.registered.total、users.online。

标签(Labels)是什么? 标签用于对指标进行分类,添加维度信息。

指标导出

指标导出是什么? 指标导出用于将 Metrics 发送到 Prometheus,通过 OpenTelemetry Collector 导出。

导出流程: 应用 → OpenTelemetry SDK → OTLP Exporter → Alloy → Prometheus。

本节小结

在本节中,我们学习了 Metrics 收集:自定义业务指标:

第一个是 Meter API。 用于创建和记录 Metrics,提供业务指标收集能力。

第二个是 Counter、Gauge、Histogram。 不同类型的 Metrics,适用于不同场景。

第三个是业务指标设计。 设计有意义的业务指标,遵循指标命名规范。

第四个是指标导出。 将 Metrics 发送到 Prometheus,通过 OpenTelemetry Collector 导出。

Metrics 收集总结: Metrics 收集包括 Meter API(创建 Metrics)、Counter/Gauge/Histogram(不同类型)、业务指标设计(命名规范)、指标导出(Prometheus)。这些功能组合在一起,构成了完整的业务指标收集能力。

这就是 Metrics 收集:自定义业务指标。掌握这些功能,可以收集和分析业务指标。

在下一节,我们将学习 Logs 关联:Trace ID 注入。学习如何将 Trace ID 注入到日志中。