OpenTelemetry可观测系统之Metrics学习
概念OpenTelemetry 是一套通用监控工具包不生产监控数据只负责采集监控数据Metrics 是它专门用来抓「数字指标」的模块理解OTel Metrics1.区分三大可观测核心OTel 只干三件事你可以把服务运行状态想象成人Trace链路追踪看一次动作比如你走一步路从抬脚到落地的全过程单次请求路径、哪里慢Logs日志看文字记录比如你走路摔了一跤日志写「摔倒了膝盖疼」报错详情、文本信息Metrics指标看持续数字比如你每分钟走多少步、心跳多少、体温多少系统 / 服务的长期数值趋势简单说Metrics 就是记录各种监控数字看整体稳不稳常见 Metrics 数字接口每秒请求数QPS内存 / CPU 占用大小接口报错次数、错误率在线用户数、并发连接数接口响应耗时分布2. Metrics 4 种核心类型所有监控数字只分 4 类对应不同场景Counter 计数器只增不减比如请求总次数、报错总数、系统启动次数只能往上加UpDownCounter 增减计数器可加可减比如当前在线人数、数据库连接数上线 1、下线 - 1Gauge 仪表盘只存当前这一刻的值比如此刻 CPU 使用率、当前内存占用、当前温度Histogram 直方图统计数值分布比如接口响应时间多少请求 0-100ms多少 100-500ms看快慢占比3. OTel Metrics 3 个基础组件Meter仪表管理员所有指标的总管家一个服务只需要一个 MeterInstrument采集埋点你要统计什么数字就创建一个埋点上面 4 种类型就是埋点Exporter导出器把采集到的数字发给存储 / 画图工具OTel 本身不存数据怎么用 OTel Metrics整体流程就 4 步配置采集 → 埋点统计 → 导出数据 → 存储引入依赖dependencies{// OTel SDK 核心指标implementation(io.opentelemetry:opentelemetry-sdk-metrics:1.40.0)// 导出器选 Prometheus 最通用implementation(io.opentelemetry:opentelemetry-exporter-prometheus:1.40.0)}配置初始化接入代码示例importio.opentelemetry.api.OpenTelemetryimportio.opentelemetry.api.metrics.Meterimportio.opentelemetry.sdk.OpenTelemetrySdkimportio.opentelemetry.sdk.metrics.SdkMeterProviderimportio.opentelemetry.sdk.metrics.export.PeriodicMetricReaderimportio.opentelemetry.exporter.prometheus.PrometheusMetricReader/** * 全局唯一 OTel 指标管理器 * 整个项目只 new 这一个 Meter */objectOtelMetricsManager{// 1. 初始化 SDKprivatevalmeterProviderSdkMeterProvider.builder().registerMetricReader(PeriodicMetricReader.create(PrometheusMetricReader.create())).build()privatevalopenTelemetry:OpenTelemetryOpenTelemetrySdk.builder().setMeterProvider(meterProvider).build()// 全局唯一 Meter一个服务只需要这一个所有的指标用这个一个valmeter:MeteropenTelemetry.getMeter(my-business-service)// 在这里定义【所有指标】统一管理 // 指标1总请求次数Counter 只增不减valtotalRequestCountermeter.counterBuilder(api.request.total).setDescription(接口总请求数).build()// 指标2错误请求次数valerrorRequestCountermeter.counterBuilder(api.request.error).setDescription(接口错误次数).build()// 指标3接口响应耗时Histogram 直方图valapiDurationHistogrammeter.histogramBuilder(api.duration.ms).setDescription(接口响应耗时).setUnit(ms).build()// 指标4当前并发连接数UpDownCounter 可加可减valconcurrentConnCountermeter.upDownCounterBuilder(server.concurrent.conn).setDescription(当前并发连接数).build()}业务侧添加埋点funhandleApi(){valstartSystem.currentTimeMillis()try{// 正常业务// ...OtelMetricsManager.totalRequestCounter.add(1)}catch(e:Exception){OtelMetricsManager.errorRequestCounter.add(1)}finally{valcostSystem.currentTimeMillis()-start OtelMetricsManager.apiDurationHistogram.record(cost)}}// 连接进来 1funconnect(){OtelMetricsManager.concurrentConnCounter.add(1)}// 连接断开 -1fundisconnect(){OtelMetricsManager.concurrentConnCounter.add(-1)}导出器 Exporter新手只记 2 个就行OTLP 协议OTel 官方标准直接导出到云监控 / 自建平台Prometheus Exporter行业最通用导出到 Prometheus后续画图最方便Metrics 数据怎么展示重点OTel 只负责抓数据不负责画图、不负责看数据必须搭配工具才能看行业标配三件套OpenTelemetry采集 Prometheus存指标 Grafana画图展示 告警三件套分工OpenTelemetry抓 CPU、QPS、错误率这些数字Prometheus时序数据库专门存按时间排序的数字比如每分钟的 QPSGrafana可视化工具把存好的数字画成图表、做仪表盘、发告警