Observability:使用OpenTelemetry手动检测Go应用程序

65 阅读1分钟

首先,OpenTelemetry是一个开源项目,它提供了一套API、库和工具来捕获分布式系统的遥测数据。这些数据包括度量、日志和追踪。在这个上下文中,我们将专注于如何使用它来手动检测Go应用程序。

首先需要在你的项目中导入OpenTelemetry Go库。你可以通过运行以下命令将其添加到你的Go模块:

go get go.opentelemetry.io/otel

然后,在代码中设置一个全局TracerProvider实例:

package main

import (
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
    sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

func main() {
    exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
    if err != nil {
        log.Fatalf("failed to initialize stdout export pipeline: %v", err)
    }

    tp := sdktrace.NewTracerProvider(sdktrace.WithSyncer(exporter))
    defer tp.Shutdown(context.Background())

    otel.SetGlobalTracerProvider(tp)
}

以上代码创建了一个新的TraceExporter实例,并将其设置为全局TraceExporter。这样就可以在整个应用程序中创建新的跟踪器。

接下来,在需要跟踪特定操作或函数调用时,可以使用 Tracer对象创建新Span:

tracer := otel.Tracer("my-application")

func doSomething() {
    ctx, span := tracer.Start(context.Background(), "doSomething")
    defer span.End()

    // your code here
}

在这个例子中,我们创建了一个新的Span,用于跟踪 doSomething函数的执行。Span开始时,函数开始执行,并在函数结束时结束。

如果你想要跟踪一个包含多个步骤或操作的复杂过程,可以创建子Span:

func doComplexThing() {
    ctx, span := tracer.Start(context.Background(), "doComplexThing")
    defer span.End()

    doStep1(ctx)
    doStep2(ctx)
}

func doStep1(ctx context.Context) {
    _, stepSpan := tracer.Start(ctx, "step1")
    defer stepSpan.End()

    // your code here
}

func doStep2(ctx context.Context) {
    _, stepSpan := tracer.Start(ctx, "step2")
    defer stepSpan.End()

    // your code here
}

这样就可以清晰地看到每个步骤如何贡献到整体过程中。

最后一点要注意的是,在生产环境中你可能不希望将所有数据都发送到stdout。OpenTelemetry支持多种导出器类型(如Jaeger、Zipkin、Prometheus等),你可以根据需要选择合适的导出器。