第一章:Go可观测性实战概述
可观测性不是监控的简单升级,而是通过日志、指标、追踪三大支柱协同工作,让系统内部状态可推断、可验证、可调试的能力。在 Go 生态中,其原生支持高并发与轻量级协程(goroutine)的特性,使得传统单体式监控手段容易遗漏上下文流转和瞬时异常,因此需构建面向分布式、生命周期短、调用链深的现代可观测体系。
核心支柱与 Go 原生适配优势
- 指标(Metrics):使用
prometheus/client_golang暴露结构化数值,如 HTTP 请求延迟、活跃 goroutine 数、GC 次数; - 日志(Logs):采用结构化日志库(如
zerolog或zap),避免字符串拼接,确保字段可索引、可过滤; - 追踪(Tracing):借助
OpenTelemetry Go SDK注入 span 上下文,在 HTTP 中间件、数据库调用、RPC 客户端等关键路径自动传播 trace ID。
快速启用基础可观测能力
以下代码片段为一个最小可行服务注入 Prometheus 指标与 OpenTelemetry 追踪:
package main
import (
"net/http"
"time"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/prometheus"
"go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/propagation"
)
func main() {
// 初始化 Prometheus 指标 exporter
exporter, _ := prometheus.New()
meterProvider := metric.NewMeterProvider(metric.WithReader(exporter))
otel.SetMeterProvider(meterProvider)
// 初始化追踪 provider(内存中导出,生产环境应替换为 Jaeger/OTLP)
tp := trace.NewTracerProvider()
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.TraceContext{})
// 暴露 /metrics 端点
http.Handle("/metrics", exporter.Handler())
// 启动服务
http.ListenAndServe(":8080", nil)
}
执行后访问 http://localhost:8080/metrics 即可查看自动生成的 Go 运行时指标(如 go_goroutines、go_memstats_alloc_bytes)。该初始化不侵入业务逻辑,后续可通过 otel.Tracer("example").Start() 手动埋点或使用 otelhttp 等插件实现自动 instrumentation。
| 组件 | 推荐库 | 关键特性 |
|---|---|---|
| 指标采集 | prometheus/client_golang |
与 Prometheus 生态无缝集成 |
| 结构化日志 | uber-go/zap 或 rs/zerolog |
零分配 JSON 日志,支持字段结构化 |
| 分布式追踪 | open-telemetry/opentelemetry-go |
符合 OTel 规范,支持多后端导出 |
| 链路采样 | otel/sdk/trace + 自定义 Sampler |
可按 URL、错误率、采样率动态控制 |
第二章:Prometheus指标埋点实践
2.1 Prometheus数据模型与Go客户端原理剖析
Prometheus 的核心是多维时间序列数据模型:<metric_name>{label1="value1", label2="value2"} => value@timestamp。每个指标由名称和键值对标签唯一标识,支持高效下钻与聚合。
数据模型关键特性
- 标签(Labels)在服务端静态绑定,不可修改
- 指标类型包括
Counter、Gauge、Histogram、Summary - 所有样本以浮点数 + Unix 纳秒时间戳存储
Go客户端注册与采集流程
// 初始化注册器与指标
var (
httpRequests = promauto.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total HTTP requests.",
},
[]string{"method", "status"},
)
)
func init() {
prometheus.MustRegister(httpRequests) // 显式注册至默认注册器
}
该代码声明带 method 和 status 标签的计数器,并自动注册到 prometheus.DefaultRegisterer。promauto 包确保指标在首次使用时完成注册,避免重复注册 panic。
指标生命周期与内存管理
| 阶段 | 行为 |
|---|---|
| 创建 | 分配指标结构体与标签哈希桶 |
| 增量更新 | 原子操作更新对应 labelset 的值 |
| Scraping | /metrics 接口按文本格式序列化 |
graph TD
A[Go应用写入指标] --> B[内存中LabelSet映射]
B --> C[HTTP handler序列化为OpenMetrics文本]
C --> D[Prometheus Server拉取并存入TSDB]
2.2 基于prometheus/client_golang的自定义指标埋点
在 Go 应用中暴露可观测性指标,首选 prometheus/client_golang 官方 SDK。核心是注册自定义指标并周期性更新其值。
指标类型与选择
Counter:只增计数器(如请求总量)Gauge:可增可减瞬时值(如当前并发数)Histogram:观测分布(如 HTTP 延迟分桶)Summary:客户端计算分位数(适用低基数场景)
注册与初始化示例
import "github.com/prometheus/client_golang/prometheus"
// 定义一个带标签的 Counter
httpRequestsTotal := prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests.",
},
[]string{"method", "status_code"},
)
// 必须注册到默认注册器,否则 /metrics 不暴露
prometheus.MustRegister(httpRequestsTotal)
逻辑说明:
NewCounterVec构造带维度的指标;[]string{"method","status_code"}定义标签键,运行时通过.WithLabelValues("GET", "200")动态打点;MustRegister在注册失败时 panic,适合启动期初始化。
埋点调用时机
- HTTP 中间件中
httpRequestsTotal.WithLabelValues(r.Method, strconv.Itoa(status)).Inc() - 关键业务路径入口/出口处记录耗时(配合
Histogram)
| 指标类型 | 是否支持标签 | 是否支持分位统计 | 典型用途 |
|---|---|---|---|
| Counter | ✅ | ❌ | 累计事件次数 |
| Histogram | ✅ | ✅(服务端计算) | 延迟、大小分布 |
2.3 业务指标设计规范:Counter、Gauge、Histogram与Summary选型指南
核心选型原则
- Counter:仅单调递增,适用于请求总数、错误累计等;不可用于耗时或瞬时值。
- Gauge:可增可减,适合内存使用率、活跃连接数等瞬时快照。
- Histogram:按预设桶(bucket)统计分布,推荐用于响应延迟、API耗时。
- Summary:客户端计算分位数(如 p90/p99),但缺乏多维聚合能力,已逐步被 Histogram 替代。
典型误用示例
# ❌ 错误:用 Gauge 记录请求耗时(丢失分布信息)
gauge_latency.set(142.7) # 单一数值,无法分析长尾
# ✅ 正确:用 Histogram 刻画延迟分布
histogram_latency.observe(142.7) # 自动落入 {0.1, 0.2, 0.5, 1.0, 2.0, 5.0}+s 桶
histogram_latency 默认配置 10 个 latency bucket,覆盖 0.1s–5s 区间,支持 *_sum/*_count/*_bucket 三元组下钻分析。
| 场景 | 推荐类型 | 理由 |
|---|---|---|
| 支付成功次数 | Counter | 单调累积,语义清晰 |
| 当前库存余量 | Gauge | 可上可下,需实时快照 |
| 订单创建耗时 P95 | Histogram | 多维度聚合 + 分位数推导 |
graph TD
A[业务指标需求] --> B{是否单调?}
B -->|是| C[Counter]
B -->|否| D{是否需分布分析?}
D -->|是| E[Histogram]
D -->|否| F[Gauge]
2.4 实时指标采集与HTTP Handler集成(/metrics端点实现)
/metrics 端点是 Prometheus 生态中服务自监控的核心入口,需以文本格式暴露结构化指标。
数据同步机制
指标采集应避免阻塞主请求处理,推荐采用非阻塞快照模式:
- 每秒由后台 goroutine 更新内存中的指标快照
- HTTP Handler 仅读取最新快照,零分配序列化
核心实现代码
func metricsHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain; version=0.0.4")
metrics := prometheus.DefaultGatherer
if err := metrics.Gatherers().Gather(w); err != nil {
http.Error(w, "failed to gather metrics", http.StatusInternalServerError)
return
}
}
http.HandleFunc("/metrics", metricsHandler)
此 handler 复用
prometheus.DefaultGatherer,自动聚合所有已注册的Counter、Gauge等指标;Gather()方法线程安全,内部执行快照拷贝,不阻塞写入。
指标类型与语义对照表
| 类型 | 适用场景 | 示例 |
|---|---|---|
| Gauge | 可增可减的瞬时值 | http_requests_in_flight |
| Counter | 单调递增计数器 | http_requests_total |
graph TD
A[HTTP /metrics 请求] --> B[调用 Gather()]
B --> C[并发读取各 Collector 快照]
C --> D[序列化为 OpenMetrics 文本]
D --> E[写入 ResponseWriter]
2.5 指标生命周期管理与高并发场景下的线程安全实践
指标从注册、采集、聚合到过期销毁,构成完整生命周期。高并发下若共享状态未加保护,易引发计数错乱或内存泄漏。
线程安全的指标注册器
public class ThreadSafeMetricRegistry {
private final ConcurrentHashMap<String, Gauge> metrics = new ConcurrentHashMap<>();
public void register(String name, Gauge gauge) {
metrics.putIfAbsent(name, gauge); // 原子性避免重复注册
}
public Gauge get(String name) {
return metrics.get(name); // 无锁读,O(1) 并发安全
}
}
ConcurrentHashMap 替代 synchronized HashMap:putIfAbsent 保证注册幂等性;get() 无锁快读,适用于高频查询场景。
生命周期关键阶段对比
| 阶段 | 触发条件 | 线程安全要求 |
|---|---|---|
| 注册 | 应用启动/动态加载 | 写操作需原子性 |
| 采集 | 定时任务/事件驱动 | 多线程写入需 CAS 或分段锁 |
| 销毁 | TTL 过期/显式注销 | 需防止 ABA 问题 |
数据同步机制
graph TD
A[指标采集线程] -->|CAS 更新| B[AtomicLong 值]
C[聚合线程] -->|Lock-free 读| B
D[过期清理线程] -->|removeIf| E[ConcurrentHashMap]
第三章:OpenTelemetry链路追踪落地
3.1 OpenTelemetry Go SDK架构解析与Span语义约定
OpenTelemetry Go SDK采用分层设计:API(稳定契约)、SDK(可插拔实现)、Exporter(传输适配)三者解耦。
核心组件职责
trace.Tracer:创建Span的入口,不依赖具体实现sdk/trace.SpanProcessor:异步处理Span生命周期(如BatchSpanProcessor批量导出)exporters/otlp/otlptrace.Exporter:序列化Span为OTLP协议并发送
Span语义约定示例(HTTP客户端)
// 创建带语义属性的Span
span := tracer.Start(ctx, "http.request",
trace.WithAttributes(
semconv.HTTPMethodKey.String("GET"),
semconv.HTTPURLKey.String("https://api.example.com/users"),
semconv.HTTPStatusCodeKey.Int(200),
),
)
semconv来自go.opentelemetry.io/otel/semconv/v1.21.0,确保跨语言指标一致性;HTTPMethodKey等常量强制标准化字段名与类型,避免自定义标签导致可观测性割裂。
| 属性名 | 类型 | 说明 |
|---|---|---|
http.method |
string | 必填,大写HTTP方法 |
http.status_code |
int | 响应状态码,非字符串形式 |
http.url |
string | 完整请求URL(不含凭证) |
graph TD
A[tracer.Start] --> B[SpanBuilder]
B --> C[SDK Span 实例]
C --> D[SpanProcessor.Queue]
D --> E[BatchSpanProcessor.Worker]
E --> F[OTLP Exporter]
3.2 HTTP/gRPC中间件自动注入TraceID与Context传播
在分布式追踪中,TraceID需贯穿请求全链路。HTTP与gRPC中间件是注入与透传的关键切面。
自动注入机制
中间件在请求入口生成唯一TraceID(如uuid4),并写入X-Trace-ID(HTTP)或trace_id二进制元数据(gRPC)。
Context传播示例(Go gRPC中间件)
func TraceIDInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
// 从metadata提取或生成TraceID
md, ok := metadata.FromIncomingContext(ctx)
traceID := getOrGenTraceID(md)
// 注入到context供下游使用
ctx = context.WithValue(ctx, "trace_id", traceID)
return handler(ctx, req)
}
逻辑分析:metadata.FromIncomingContext解析gRPC元数据;getOrGenTraceID优先复用上游传入的TraceID,缺失时生成新ID;context.WithValue将TraceID绑定至请求生命周期上下文,确保业务Handler可安全访问。
支持的传播方式对比
| 协议 | 传输头/元数据键 | 是否支持Baggage | 跨语言兼容性 |
|---|---|---|---|
| HTTP | X-Trace-ID |
✅ X-Baggage |
高 |
| gRPC | trace_id (binary) |
✅ baggage |
中(需proto适配) |
graph TD
A[Client Request] -->|Inject TraceID| B[HTTP Middleware]
B --> C[Upstream Service]
C -->|gRPC Call| D[gRPC Client Interceptor]
D -->|Propagate via Metadata| E[Downstream gRPC Server]
3.3 自定义Span打点、属性标注与事件记录实战
在分布式追踪中,精准的 Span 打点是可观测性的基石。以下为 Spring Cloud Sleuth + OpenTelemetry 的典型实践:
添加业务属性与事件
Span span = tracer.spanBuilder("order-process")
.setAttribute("user.id", "U12345") // 自定义属性:字符串键值对
.setAttribute("order.amount", 299.99) // 数值型属性自动类型推导
.addEvent("payment-initiated",
Attributes.of(AttributeKey.stringKey("method"), "alipay")); // 结构化事件
span.end();
逻辑分析:
setAttribute()支持布尔/数值/字符串/数组类型,会被序列化为 OTLP 属性;addEvent()记录带时间戳与上下文的瞬时事件,便于定位状态跃迁点。
常用属性分类表
| 类别 | 示例键名 | 推荐类型 | 说明 |
|---|---|---|---|
| 业务标识 | order.id |
string | 关联核心业务实体 |
| 性能指标 | db.query.time.ms |
double | 毫秒级耗时,支持聚合分析 |
| 环境上下文 | env.region |
string | 标识部署区域(如 cn-shanghai) |
全链路事件流示意
graph TD
A[HTTP入口] --> B[订单校验]
B --> C[库存扣减]
C --> D[支付发起]
D --> E[异步通知]
classDef span fill:#e6f7ff,stroke:#1890ff;
class A,B,C,D,E span;
第四章:Grafana看板一键部署与协同观测
4.1 Grafana Provisioning机制详解与Dashboard JSON模板工程化
Grafana Provisioning 是实现仪表盘声明式管理的核心能力,支持通过 YAML 配置自动加载数据源、仪表盘及告警规则。
Provisioning 目录结构
Grafana 启动时扫描 /etc/grafana/provisioning/ 下的子目录:
datasources/:定义数据源连接参数dashboards/:声明仪表盘位置与刷新策略plugins/:插件自动安装配置
Dashboard JSON 模板工程化关键实践
- 使用
__inputs实现变量注入(如${DS_PROMETHEUS}) - 通过
__requires声明插件依赖 - 利用
templating.list动态生成下拉变量
示例:dashboard.yaml 配置
# /etc/grafana/provisioning/dashboards/sample.yaml
apiVersion: 1
providers:
- name: 'default'
orgId: 1
folder: 'Production'
type: file
options:
path: /var/lib/grafana/dashboards # JSON 文件所在路径
foldersFromFilesStructure: true # 按文件夹结构创建 Grafana 文件夹
该配置使 Grafana 自动监听 /var/lib/grafana/dashboards/ 下所有 .json 文件,并按目录层级同步到 UI。foldersFromFilesStructure: true 启用嵌套文件夹映射,提升多团队协作时的组织效率。
| 字段 | 类型 | 说明 |
|---|---|---|
name |
string | Provider 唯一标识符 |
folder |
string | 对应 Grafana 中的文件夹名称 |
path |
string | JSON 文件系统路径(支持 glob,如 *.json) |
// dashboard-template.json 片段(含模板变量)
"templating": {
"list": [{
"name": "DS_PROMETHEUS",
"type": "datasource",
"pluginId": "prometheus",
"current": { "value": "Prometheus", "label": "Prometheus" }
}]
}
此片段声明一个数据源变量,供面板查询中引用 $DS_PROMETHEUS,实现环境无关的 JSON 复用。变量值在 Provisioning 加载时由实际注册的数据源名自动填充。
graph TD A[Grafana 启动] –> B[读取 provisioning/dashboards/*.yaml] B –> C[解析 path 路径下的 JSON 文件] C –> D[注入 inputs / requires] D –> E[校验 templating 变量绑定] E –> F[持久化至数据库并渲染]
4.2 使用Terraform+Grafana API实现看板自动化部署
借助 Terraform 的 grafana_dashboard 资源,可将 JSON 格式看板定义声明式地纳入 IaC 流水线。
声明式看板资源示例
resource "grafana_dashboard" "api_latency" {
config_json = file("${path.module}/dashboards/api-latency.json")
folder = "Production"
}
config_json 直接注入 Grafana 兼容的 JSON 结构;folder 参数需预先存在(可通过 grafana_folder 资源创建)。Terraform 自动处理 UID 冲突与版本覆盖。
关键依赖关系
- Grafana API Token 需配置为环境变量
GRAFANA_AUTH_TOKEN - 后端必须启用
allow_embedding = true(若嵌入使用) - 推荐搭配
grafana_datasource资源确保数据源就绪后再部署看板
| 组件 | 作用 | 是否必需 |
|---|---|---|
grafana_provider |
认证并连接 Grafana 实例 | ✅ |
grafana_folder |
组织看板归属目录 | ❌(可选,但强烈推荐) |
grafana_dashboard |
创建/更新看板实体 | ✅ |
graph TD
A[Terraform Apply] --> B[读取 dashboard.json]
B --> C[调用 Grafana POST /api/dashboards/db]
C --> D[返回新 UID 与版本号]
D --> E[状态同步至 tfstate]
4.3 多维度关联视图构建:指标+Trace+日志(Loki)联动查询
在可观测性体系中,单一数据源难以定位根因。Prometheus 提供高维指标,Jaeger/Tempo 记录分布式调用链,Loki 存储结构化日志——三者通过统一标签(如 cluster, service, traceID)实现语义对齐。
数据同步机制
Loki 日志需注入 traceID 和 spanID(通过 OpenTelemetry SDK 自动注入或 Nginx/Envoy 日志模板注入):
# Loki pipeline 配置:提取并保留 trace 上下文
pipeline:
- labels:
traceID: ""
service: ""
- json:
expressions:
traceID: trace_id
service: service_name
此配置从 JSON 日志中提取
trace_id字段作为 Loki 标签,使日志可被 Tempo 按traceID关联;service标签则与 Prometheus 的job、Jaeger 的service.name对齐。
关联查询路径
| 查询入口 | 关联动作 | 工具支持 |
|---|---|---|
| Prometheus 报警 | 点击 traceID 跳转 Tempo |
Grafana Explore + Tempo data source |
| Tempo Trace | 下钻 log 标签跳转 Loki |
Tempo UI 内置 Logs Link |
| Loki 日志行 | 点击 traceID 跳转 Trace 视图 |
Grafana Loki → Tempo 超链接 |
graph TD
A[Prometheus Alert] -->|traceID| B(Tempo Trace View)
B -->|traceID + service| C[Loki Log Stream]
C -->|spanID| B
4.4 Go服务专属看板设计:P99延迟热力图、错误率下钻分析、服务依赖拓扑图
核心指标可视化分层架构
- P99延迟热力图:按服务/接口/地域三维聚合,分钟级采样,自动识别毛刺时段
- 错误率下钻分析:从全局错误率 → HTTP状态码分布 → 异常traceID聚类 → 关联Go panic堆栈
- 服务依赖拓扑图:基于OpenTelemetry链路数据自动生成有向图,节点大小映射QPS,边粗细反映调用延迟
Go原生指标采集示例
// 使用prometheus/client_golang暴露P99延迟直方图
histogram := prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Latency distribution of HTTP requests",
Buckets: prometheus.ExponentialBuckets(0.01, 2, 10), // 10ms~5s共10档
},
[]string{"service", "endpoint", "status_code"},
)
prometheus.MustRegister(histogram)
该直方图支持histogram.WithLabelValues("authsvc", "/login", "500").Observe(latency.Seconds())动态打点;ExponentialBuckets适配Go服务典型延迟分布(多数请求
依赖拓扑生成逻辑
graph TD
A[Go服务A] -->|HTTP 200 avg=42ms| B[Redis集群]
A -->|gRPC 200 avg=18ms| C[用户中心Svc]
C -->|DB query p99=310ms| D[PostgreSQL]
第五章:可观测性体系演进与最佳实践总结
从日志中心化到OpenTelemetry统一采集
某大型电商在2021年仍依赖ELK Stack进行日志聚合,监控指标由Prometheus独立抓取,链路追踪使用Jaeger。三套系统间无语义对齐,告警时需跨平台手动关联上下文。2023年完成OpenTelemetry SDK全量接入,Java/Go/Python服务统一通过OTLP协议上报trace、metrics、logs(Logs via OTLP),采样率动态配置,CPU开销下降37%。关键业务接口的端到端延迟归因准确率从58%提升至92%。
告警降噪与根因推荐实战
运维团队曾日均接收2100+低价值告警(如单实例CPU>90%但服务SLI未受损)。引入基于服务拓扑的动态基线算法后,结合SLO偏差检测(如http_server_duration_seconds_bucket{le="0.2", job="checkout-api"} / http_server_duration_seconds_count < 0.995),告警量压缩至日均142条。同时集成因果图推理引擎,在P1级故障中自动输出Top3根因节点(如“etcd集群leader切换导致API网关重试激增”)。
黄金信号驱动的SLO看板体系
下表为订单履约核心链路的SLO定义与实时达标状态(数据采样自2024年Q2生产环境):
| 服务名 | SLO目标 | 当前达标率 | 关键错误类型 | 数据来源 |
|---|---|---|---|---|
| payment-gateway | 99.95% | 99.962% | payment_timeout |
Prometheus + OTel |
| inventory-service | 99.90% | 99.831% | stock_lock_failed |
Jaeger trace tags |
| notification-svc | 99.99% | 99.994% | sms_provider_rejected |
LogQL异常模式识别 |
基于eBPF的无侵入式深度观测
在Kubernetes集群中部署Pixie(基于eBPF),无需修改应用代码即获取HTTP/gRPC请求的TLS握手耗时、TCP重传次数、DNS解析延迟等网络层指标。某次支付失败率突增问题中,eBPF探针发现83%失败请求在TLS ClientHello后3.2s内无响应,最终定位为WAF设备SSL卸载模块内存泄漏——该问题传统APM工具无法捕获。
graph LR
A[用户下单请求] --> B[API Gateway]
B --> C[Payment Service]
C --> D[Bank Core System]
D --> E[Async Notification]
E --> F[User App]
subgraph 可观测性注入点
B -.->|OpenTelemetry SDK| G[(Metrics/Traces)]
C -.->|eBPF Socket Probe| H[(Network Latency)]
D -.->|Sidecar Log Exporter| I[(Structured Logs)]
end
混沌工程验证可观测性有效性
每月执行混沌实验:随机kill订单服务Pod、注入150ms网络延迟、模拟MySQL主库只读。观测平台必须在2分钟内自动识别故障域,并推送包含调用链快照、最近3个异常日志片段、对应指标趋势图的诊断卡片。2024年累计17次实验中,15次达成自动诊断SLA,2次因gRPC客户端重试逻辑掩盖了真实错误码而需人工介入。
观测数据治理规范
所有OTel导出数据强制添加env=prod、team=checkout、service_version=2.4.1标签;日志字段遵循OpenTelemetry语义约定(如http.status_code而非status);指标命名采用namespace_subsystem_operation_unit格式(例:checkout_payment_request_duration_seconds)。CI流水线嵌入OpenTelemetry Linter,拒绝不符合规范的Instrumentation提交。
成本优化策略
将低频日志(如DEBUG级别)采样率设为0.1%,高频指标(如HTTP请求计数)保留全量,中间态trace数据按服务等级差异化保留:核心链路保留100% span,辅助服务仅保留error trace。年度可观测性基础设施成本降低41%,存储用量从12TB/月降至7.1TB/月。
多云环境统一观测架构
混合部署场景下,AWS EKS集群通过OTLP over gRPC直连观测平台,阿里云ACK集群经轻量级Collector(资源限制:512Mi内存/1vCPU)做协议转换与标签标准化,边缘IoT网关则使用MQTT桥接器转发JSON格式遥测数据。所有数据在观测平台侧统一映射为OpenTelemetry数据模型,实现跨云服务依赖关系自动发现。
