OpenTelemetry 收集器都有哪些用例?

Posted

技术标签:

【中文标题】OpenTelemetry 收集器都有哪些用例?【英文标题】:What are the some use cases for OpenTelemetry Collectors?OpenTelemetry 收集器有哪些用例? 【发布时间】:2021-10-30 01:25:00 【问题描述】:

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

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

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

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

TLDR;我们正在尝试了解 Otel Collector 的用例和优势,优于我们直接将数据导出到支持(在我们的案例中为 Jaeger)的方法。

其他信息:

以下是用于将跟踪数据发送到 Jaeger 的代码 sn-p(用 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

谢谢!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢朋友的回复!但是,OTel 的目的不就是提供与供应商无关的 SDK/API 吗?即使没有收集器?我的意思是,除了初始化之外,我编写的代码已经与供应商无关。收藏家到底添加了什么?另外,这两种方法是否存在性能差异?

以上是关于OpenTelemetry 收集器都有哪些用例?的主要内容,如果未能解决你的问题,请参考以下文章

测试管理工具都有哪些?

JavaScript 中的闭包/回调函数都有哪些用例?

punpcklbw(MMX/SSE/AVX 中的交错)的用例都有哪些?

在 TypeORM 中使用 QueryBuilder 与 Repository 都有哪些不同的用例? [关闭]

使用OpenTelemetry搭配Zipkin构建NetCore分布式链路跟踪 | WebAPI + gRPC

接口测试用例编写要点都有哪些?