首页 > 解决方案 > OpenTelemetry 收集器有哪些用例?

问题描述

我们正在尝试多种可观察性工具(如 Jaeger、Prometheus 等)。

在构建将分布式跟踪数据发送到 Jaeger 的演示应用程序时。我们使用 ' go.opentelemetry.io/otel/exporters/jaeger' 将数据导出到跟踪数据到 Jaeger。

效果很好,似乎可以实现我们的目的。但是在浏览 Otel 文档时,我们发现了“OpenTelemetry Collector”。

虽然我们有非常高水平的理解,但我们似乎并没有完全理解 Otel Collector 的正确用例而不是我们正在使用的导出器。

TLDR;我们试图了解 Otel Collector 的用例和优势,而不是我们直接将数据导出到支持的方法(在我们的例子中是 Jaeger)。

附加信息:

以下是用于将跟踪数据发送到 Jaeger 的代码片段(用 Go 编写)。

func tracerProvider(url string) (*tracesdk.TracerProvider, error) {
    exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
    if err != nil {
        return nil, err
    }
    tp := tracesdk.NewTracerProvider(
        tracesdk.WithBatcher(exp),
        tracesdk.WithResource(resource.NewWithAttributes(
            semconv.SchemaURL,
            semconv.ServiceNameKey.String(service),
            attribute.String("environment", environment),
        )),
    )
    return tp, nil
} 



func main() {
    tp, err := tracerProvider("http://localhost:14268/api/traces")
    if err != nil {
        log.Fatal(err)
    }

    otel.SetTracerProvider(tp)
    propagator := propagation.NewCompositeTextMapPropagator(propagation.Baggage{}, propagation.TraceContext{})
    otel.SetTextMapPropagator(propagator)

// Business code

}


func serviceTwoCall(ctx context.Context, throwerror bool) *http.Response {
    url := fmt.Sprintf("http://localhost:8080", throwerror)
    req, _ := http.NewRequest(http.MethodGet, url, nil)
    otelhttptrace.Inject(ctx, req)

    client := &http.Client{}
    res, err := client.Do(req)
    if err != nil {
        fmt.Printf("Service Two Error %v", err.Error())
    }
    return res
}

谢谢!

标签: goprometheusjaegeropen-telemetryjaeger-client-go

解决方案


从本质上讲,Open Telemetry Collector 的优势在于,您的代码可以完全不依赖于您用于存储/查询指标和跟踪的供应商。这意味着无论该供应商是什么,都不再是与您的应用程序相关的细节,并且如果在一个环境中您想改变它(例如本地开发),您可以简单地将收集器配置为不同的行为。

收集器还意味着可以跨多种语言支持更多的导出器。虽然 Go 实现目前支持直接导出到 Jaeger,但在其他语言中这可能不是一个选项,但所有语言都应该支持收集器,然后它可以导出到您喜欢的任何内容。

以我个人的经验,对于较小的安装,直接导出到 Jaeger 是有意义的。在您的集群中引入另一个组件来托管可能会使您的应用程序相对简单的事情变得复杂。使用收集器有意义的阈值取决于许多因素,例如团队的规模、负责遥测的人员、是否使用其他语言/运行时等。


推荐阅读