OpenTelemetry可观测系统之Metrics学习

概念

OpenTelemetry 是一套通用监控工具包,不生产监控数据,只负责采集监控数据;Metrics 是它专门用来抓「数字指标」的模块

理解:OTel Metrics

1.区分三大可观测核心

OTel 只干三件事,你可以把服务运行状态想象成人:

  • Trace(链路追踪):看一次动作,比如你走一步路,从抬脚到落地的全过程(单次请求路径、哪里慢)
  • Logs(日志):看文字记录,比如你走路摔了一跤,日志写「摔倒了,膝盖疼」(报错详情、文本信息)
  • Metrics(指标):看持续数字,比如你每分钟走多少步、心跳多少、体温多少(系统 / 服务的长期数值趋势)

简单说:Metrics 就是记录各种监控数字,看整体稳不稳常见 Metrics 数字:

  • 接口每秒请求数(QPS)
  • 内存 / CPU 占用大小
  • 接口报错次数、错误率
  • 在线用户数、并发连接数
  • 接口响应耗时分布

2. Metrics 4 种核心类型

所有监控数字,只分 4 类,对应不同场景:

  1. Counter 计数器 :只增不减
    比如:请求总次数、报错总数、系统启动次数,只能往上加
  2. UpDownCounter 增减计数器 :可加可减
    比如:当前在线人数、数据库连接数,上线 + 1、下线 - 1
  3. Gauge 仪表盘 :只存当前这一刻的值
    比如:此刻 CPU 使用率、当前内存占用、当前温度
  4. Histogram 直方图 :统计数值分布
    比如:接口响应时间,多少请求 0-100ms,多少 100-500ms,看快慢占比

3. OTel Metrics 3 个基础组件

  • Meter(仪表管理员):所有指标的总管家,一个服务只需要一个 Meter
  • Instrument(采集埋点):你要统计什么数字,就创建一个埋点(上面 4 种类型就是埋点)
  • Exporter(导出器):把采集到的数字,发给存储 / 画图工具(OTel 本身不存数据)

怎么用 OTel Metrics

整体流程就 4 步:配置采集 → 埋点统计 → 导出数据 → 存储

引入依赖

kotlin 复制代码
dependencies {
    // OTel SDK 核心指标
    implementation("io.opentelemetry:opentelemetry-sdk-metrics:1.40.0")
    // 导出器(选 Prometheus 最通用)
    implementation("io.opentelemetry:opentelemetry-exporter-prometheus:1.40.0")
}

配置初始化

接入代码示例

kotlin 复制代码
import io.opentelemetry.api.OpenTelemetry
import io.opentelemetry.api.metrics.Meter
import io.opentelemetry.sdk.OpenTelemetrySdk
import io.opentelemetry.sdk.metrics.SdkMeterProvider
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader
import io.opentelemetry.exporter.prometheus.PrometheusMetricReader

/**
 * 全局唯一 OTel 指标管理器
 * 整个项目只 new 这一个 Meter
 */
object OtelMetricsManager {
    // 1. 初始化 SDK
    private val meterProvider = SdkMeterProvider.builder()
        .registerMetricReader(
            PeriodicMetricReader.create(PrometheusMetricReader.create())
        )
        .build()

    private val openTelemetry: OpenTelemetry = OpenTelemetrySdk.builder()
        .setMeterProvider(meterProvider)
        .build()

    // 全局唯一 Meter,一个服务只需要这一个,所有的指标用这个一个
    val meter: Meter = openTelemetry.getMeter("my-business-service")

    // ========== 在这里定义【所有指标】,统一管理 ==========
    // 指标1:总请求次数(Counter 只增不减)
    val totalRequestCounter = meter
        .counterBuilder("api.request.total")
        .setDescription("接口总请求数")
        .build()

    // 指标2:错误请求次数
    val errorRequestCounter = meter
        .counterBuilder("api.request.error")
        .setDescription("接口错误次数")
        .build()

    // 指标3:接口响应耗时(Histogram 直方图)
    val apiDurationHistogram = meter
        .histogramBuilder("api.duration.ms")
        .setDescription("接口响应耗时")
        .setUnit("ms")
        .build()

    // 指标4:当前并发连接数(UpDownCounter 可加可减)
    val concurrentConnCounter = meter
        .upDownCounterBuilder("server.concurrent.conn")
        .setDescription("当前并发连接数")
        .build()
}

业务侧添加埋点

kotlin 复制代码
fun handleApi() {
    val start = System.currentTimeMillis()

    try {
        // 正常业务
        // ...
        OtelMetricsManager.totalRequestCounter.add(1)
    } catch (e: Exception) {
        OtelMetricsManager.errorRequestCounter.add(1)
    } finally {
        val cost = System.currentTimeMillis() - start
        OtelMetricsManager.apiDurationHistogram.record(cost)
    }
}

// 连接进来 +1
fun connect() {
    OtelMetricsManager.concurrentConnCounter.add(1)
}
// 连接断开 -1
fun disconnect() {
    OtelMetricsManager.concurrentConnCounter.add(-1)
}

导出器 Exporter

新手只记 2 个就行:

  1. OTLP 协议:OTel 官方标准,直接导出到云监控 / 自建平台
  2. Prometheus Exporter:行业最通用,导出到 Prometheus,后续画图最方便

Metrics 数据怎么展示

重点:OTel 只负责抓数据,不负责画图、不负责看数据必须搭配工具才能看

行业标配三件套:

OpenTelemetry(采集) + Prometheus(存指标) + Grafana(画图展示 + 告警)

三件套分工
OpenTelemetry :抓 CPU、QPS、错误率这些数字
Prometheus :时序数据库,专门存按时间排序的数字(比如每分钟的 QPS)
Grafana:可视化工具,把存好的数字画成图表、做仪表盘、发告警

相关推荐
Bacon7 小时前
装上就回不去了:CodeGraph 让 AI 编程效率飙升 92%,它到底做了什么?
前端·人工智能·后端
hadeas7 小时前
Spring 技术栈学习文档(面向前端开发者)
前端
Xiacqi17 小时前
Spring全局异常处理
java·后端
狗头大军之江苏分军7 小时前
Python 协程进化史:从 yield 到 async/await 的底层实现
前端·后端
Ting-yu7 小时前
Spring AI Alibaba零基础速成(3) ---- ChatClient使用
java·spring·spring cloud·spring ai
憧憬成为java架构高手的小白7 小时前
git(基于b站狂神说学习)【未完结】
git·学习
升鲜宝供应链及收银系统源代码服务8 小时前
升鲜宝供应链管理系统box_周转物功能设计模块详细开发文档(一)---升鲜宝生鲜配送供应链管理系统源代码服务
java·intellij-idea·生鲜配送源代码·升鲜宝生鲜配送源代码·后端app与手机端·b2b订货商城·客户订货系统源代码
jay神8 小时前
基于YOLOv8的交通标志识别Web系统
前端·人工智能·深度学习·yolo·机器学习·毕业设计
CAD老兵8 小时前
一张 HTML 走天下:CAD-Viewer 首创的「离线 CAD 看图」
前端·javascript·github