OpenTelemetry Go API 和 SDK 介绍

OpenTelemetry Go API 和 SDK 介绍

技术背景

OpenTelemetry-Go 是 OpenTelemetry 的 Go 语言实现。OpenTelemetry 旨在提供一套统一的 API,用于直接测量软件的性能和行为,并将这些数据发送到可观测性平台。它可以帮助开发者更好地了解软件的运行状况,及时发现和解决问题。

实现步骤

1. 兼容性检查

OpenTelemetry-Go 确保与当前受支持的 Go 语言版本兼容。每个主要的 Go 版本在有两个更新的主要版本发布之前都会得到支持。目前,该项目支持的环境包括 Ubuntu、macOS 和 Windows 等不同操作系统和架构。

2. 开始使用

可以在 opentelemetry.io 上找到入门指南。使用 OpenTelemetry-Go 主要有两个步骤:

  • 应用程序插桩(Instrumentation):要开始从应用程序捕获分布式跟踪和指标事件,首先需要对应用程序进行插桩。最简单的方法是使用官方支持的插桩库。如果需要扩展插桩库提供的遥测功能或直接为应用程序构建自己的插桩,需要使用 Go 的 otel 包。
  • 配置导出器(Export):应用程序进行插桩以收集遥测数据后,需要一个导出管道将这些遥测数据发送到可观测性平台。OpenTelemetry 项目的所有官方支持的导出器都包含在 exporters 目录中。

核心代码

以下是一个简单的使用 OpenTelemetry-Go 进行插桩和导出的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package main

import (
"context"
"log"

"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
"go.opentelemetry.io/otel/sdk/resource"
tracesdk "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
)

func initTracer() (*tracesdk.TracerProvider, error) {
// 创建一个 stdout 导出器
exp, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
if err != nil {
return nil, err
}

// 创建资源
r, err := resource.Merge(
resource.Default(),
resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName("my-service"),
attribute.String("environment", "development"),
),
)
if err != nil {
return nil, err
}

// 创建 TracerProvider
tp := tracesdk.NewTracerProvider(
tracesdk.WithBatcher(exp),
tracesdk.WithResource(r),
)
otel.SetTracerProvider(tp)
return tp, nil
}

func main() {
tp, err := initTracer()
if err != nil {
log.Fatal(err)
}
defer func() {
if err := tp.Shutdown(context.Background()); err != nil {
log.Printf("Error shutting down tracer provider: %v", err)
}
}()

// 创建一个 span
ctx, span := otel.Tracer("example-tracer").Start(context.Background(), "my-span")
defer span.End()

// 记录一些事件
span.AddEvent("Example event", attribute.String("key", "value"))

// 模拟一些工作
// ...
}

最佳实践

  • 选择合适的插桩库:根据应用程序的具体需求,选择官方支持的插桩库,以减少开发工作量。
  • 定期更新:随着 Go 语言版本的更新,及时更新 OpenTelemetry-Go 以确保兼容性和获得新功能。
  • 合理配置导出器:根据可观测性平台的要求,选择合适的导出器,并进行合理的配置。

常见问题

兼容性问题

对于不再受上游支持的 Go 版本,opentelemetry-go 会逐步停止对这些版本的兼容性测试。如果遇到兼容性问题,建议更新到受支持的 Go 版本。

导出器配置问题

如果在配置导出器时遇到问题,需要检查导出器的文档和配置参数,确保正确配置。同时,要确保可观测性平台能够正常接收数据。


OpenTelemetry Go API 和 SDK 介绍
https://119291.xyz/posts/opentelemetry-go-api-and-sdk-introduction/
作者
ww
发布于
2025年7月27日
许可协议