go:学习使用opentelemetry.io gin/otelgin

696 阅读1分钟

在使用 go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin 时,我们需要知道 OpenTelemetry 的基本概念,其中包括 Tracer、Span 和 Exporter 等。这些是用于收集和传输遥测数据的关键组件。otelgin 中间件用于自动化地在 Gin 框架中收集请求相关的遥测数据。

下载 (5).png

要配置数据存储的后端,您需要设置一个或多个 Exporter。Exporter 负责将收集到的遥测数据发送到您选择的后端服务,例如 Prometheus、Jaeger、Zipkin 等。以下是配置 Exporter 并将其与 otelgin 中间件集成的基本步骤:

1. 导入必要的包

首先,确保我们已经安装了所需的包:

import (
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
    "go.opentelemetry.io/otel/sdk/resource"
    "go.opentelemetry.io/otel/sdk/trace"
    "go.opentelemetry.io/otel/semconv"
    otelgin "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
)

2. 配置 Exporter

这里以 stdout Exporter 为例,您可以选择其他支持的 Exporter:

func main() {
    // 创建并配置 stdout 导出器
    exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
    if err != nil {
        log.Fatalf("创建导出器失败: %v", err)
    }

    // 配置资源信息
    resource, err := resource.New(context.Background(),
        resource.WithAttributes(
            semconv.ServiceNameKey.String("您的服务名称"),
        ),
    )
    if err != nil {
        log.Fatalf("配置资源信息失败: %v", err)
    }

    // 创建 tracer 提供者
    tp := trace.NewTracerProvider(
        trace.WithBatcher(exporter),
        trace.WithResource(resource),
    )
    otel.SetTracerProvider(tp)
    
    // 其他代码
}

3. 在 Gin 中间件中使用 otelgin

在我们的 Gin 应用程序中添加 otelgin 中间件:

func main() {
    // ...

    // 创建 Gin 路由器
    r := gin.Default()

    // 添加 OpenTelemetry 中间件
    r.Use(otelgin.Middleware("您的服务名称"))

    // 定义路由和处理函数
    // ...

    // 启动 Gin 服务器
    r.Run()
}

4. 启动并测试

运行我们的 Gin 应用程序,所有通过 Gin 处理的请求现在将自动产生遥测数据,并通过配置的 Exporter 发送到指定的后端。

额外说明

  • 可以选择不同的 Exporter(如 Jaeger, Zipkin 等),配置方式大同小异。
  • 确保后端服务(如 Jaeger, Zipkin 等)已经运行并可以接收数据。
  • OpenTelemetry 是一个相对复杂的系统,可能需要一定时间来熟悉其工作原理和配置方式。