概念
OpenTelemetry 是一套通用监控工具包,不生产监控数据,只负责采集监控数据;Metrics 是它专门用来抓「数字指标」的模块
理解:OTel Metrics
1.区分三大可观测核心
OTel 只干三件事,你可以把服务运行状态想象成人:
- Trace(链路追踪):看一次动作,比如你走一步路,从抬脚到落地的全过程(单次请求路径、哪里慢)
- Logs(日志):看文字记录,比如你走路摔了一跤,日志写「摔倒了,膝盖疼」(报错详情、文本信息)
- Metrics(指标):看持续数字,比如你每分钟走多少步、心跳多少、体温多少(系统 / 服务的长期数值趋势)
简单说:Metrics 就是记录各种监控数字,看整体稳不稳常见 Metrics 数字:
- 接口每秒请求数(QPS)
- 内存 / CPU 占用大小
- 接口报错次数、错误率
- 在线用户数、并发连接数
- 接口响应耗时分布
2. Metrics 4 种核心类型
所有监控数字,只分 4 类,对应不同场景:
- Counter 计数器 :只增不减
比如:请求总次数、报错总数、系统启动次数,只能往上加 - UpDownCounter 增减计数器 :可加可减
比如:当前在线人数、数据库连接数,上线 + 1、下线 - 1 - Gauge 仪表盘 :只存当前这一刻的值
比如:此刻 CPU 使用率、当前内存占用、当前温度 - 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 个就行:
- OTLP 协议:OTel 官方标准,直接导出到云监控 / 自建平台
- Prometheus Exporter:行业最通用,导出到 Prometheus,后续画图最方便
Metrics 数据怎么展示
重点:OTel 只负责抓数据,不负责画图、不负责看数据必须搭配工具才能看
行业标配三件套:
OpenTelemetry(采集) + Prometheus(存指标) + Grafana(画图展示 + 告警)
三件套分工
OpenTelemetry :抓 CPU、QPS、错误率这些数字
Prometheus :时序数据库,专门存按时间排序的数字(比如每分钟的 QPS)
Grafana:可视化工具,把存好的数字画成图表、做仪表盘、发告警