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:可视化工具,把存好的数字画成图表、做仪表盘、发告警

相关推荐
W_LuYi18523 分钟前
Tauri + Rust + Vue 3 打造极速轻量桌面应用
java·开发语言·vue.js·rust
winfredzhang30 分钟前
用 Node.js + SQLite + 原生前端写一个本地情绪急救 Web App:情绪降落伞 Mood Parachute
前端·sqlite·node.js·express·情绪管理
学机械的鱼鱼41 分钟前
一文读懂轮足翼复合机器人:结构特点与仿真学习路线规划
学习·机器人
小张小张爱学习43 分钟前
Java基础面试题
java·开发语言
宋哥转AI1 小时前
Java后端转AI Agent:技术栈全景图与从ReAct到多Agent协作实战
java·人工智能·agent
樱花的浪漫1 小时前
Typescript、Zod基础
前端·javascript·人工智能·语言模型·自然语言处理·typescript
Mr.Entropy1 小时前
ecplise 导出maven依赖jar
java·maven·jar
知识分享小能手1 小时前
Hadoop学习教程,从入门到精通, 部署Hadoop 3.x — 知识点详解(2)
大数据·hadoop·学习
Bigger1 小时前
记一次坑爹的 Cloudflare Pages 部署:Failed to load module script 是怎么把我的 SPA 搞挂的
前端·ci/cd·浏览器
ANnianStriver1 小时前
PetLumina 05 — App 端 UI 效果应用
java·ui·ai编程