使用 OpenTelemetry 构建可观测性 03 - 导出

这篇具有很好参考价值的文章主要介绍了使用 OpenTelemetry 构建可观测性 03 - 导出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一个博文中,我提到如何使用 OpenTelemery 的特定语言 API 来收集遥测数据,包含手动和自动的埋点技术,这很重要!但是,收集遥测数据只是解决方案的第一步。

你需要把遥测数据路由转发到其他地方,同时添加额外的元数据信息。这时就轮到 SDK 发挥作用了。

链路追踪生产者( Tracer Provider )

链路追踪生产者是 SDK 中一个关键概念。用于将通过 API 收集的遥测数据与其他组件联系起来。在 Go 语言中,TracerProvider 对象只有一个 Tracer 方法的接口,方法签名如下:

Tracer(instrumentationName string, opts ...TracerOption) Tracer

Tracer 方法返回一个实现 Tracer 接口的对象,这个接口也只有一个方法 Start,其方法签名如下:

Start(ctx context.Context, spanName string, opts ...spanStartOption) (context.Context, Span)

样例项目中通过链路追踪生产者创建了跨度( span ):

import "go.opentelemetry.io/otel"

// ...

ctx, span := otel.Tracer(telemetry.TelemetryLibrary).Start(ctx, "get_product_price")

可以发现通过otel.Tracer 查找并创建全局的链路追踪生产者最终返回 Tracer 对象,需要注意要使用链路追踪生产者,其初始化设置是不可缺少的。

Note: 在文中提及是获取‘全局’链路追踪生产者的方法。使用全局链路追踪最简单的一种方式就是调用 otel.Tracer 的 API 。不过实际使用中如果上面方案不满足,还可以通过链路追踪生产者传递给消费者以替代全局查找的方法。

Note: trace 代表整个请求的路径信息、span 代表链路中的具体节点信息

资源( Resource )

链路追踪生产者还需要配置‘资源’对象,它是元数据信息的一部分。资源是遥测数据产生描述过程或者服务的信息,描述了服务本身的元数据,有助于解析遥测数据。

这是样例项目中购物车服务的‘资源’对象定义:

import (
    "go.opentelemetry.io/otel/sdk/resource"
    semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
)

// ...

res, err := resource.New(
    ctx,
    resource.WithAttributes(
        semconv.ServiceNameKey.String("cart"),
        semconv.ServiceVersionKey.String("v1.0.0"),
    ),
)

资源对象定义的关键是设置属性参数,OpenTelemetry 已经定义了一些资源属性的键值对,可以参考这篇文档 OTel’s 资源语义约定。 例如,你可以通过上面例子看到,如何定义服务名称和版本号信息。但是可能还有更多信息你需要配置,比如服务自身依赖的资源有哪些;服务运行在云上吗?需要约定不同的属性给不同的云服务供应商;服务运行在 Kubernetes 吗?是的话,这里有份指导手册 Kubernetes 的资源语义约定。

最终样例项目中, 链路追踪数据中 span 都包含这样的‘资源’数据:

Resource labels:
     -> service.name: STRING(cart)
     -> service.version: STRING(v1.0.0)

导出器( Exporter )

既然我们已经创建了资源对象,我们接下来定义一下遥测数据的目的地。

导出器的选择范围很广,可以根据自己的需求选择不同的导出器,不过在当前项目例子中我使用 OpenTelemetry 控制器(会在下一篇细聊),它支持 HTTP 和 gRPC 协议。我选择使用 gRPC 协议和 OTLP 导出器:

import (
    "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
    "google.golang.org/grpc"
)

// ...

hostIP := os.Getenv("HOST_IP")
if hostIP == "" {
    return nil, fmt.Errorf("unexpected no host IP address for receiver")
}
receiverAddress := fmt.Sprintf("%s:%d", hostIP, 4317)

conn, err := grpc.DialContext(
    ctx,
    receiverAddress,
    grpc.WithTransportCredentials(insecure.NewCredentials()),
    grpc.WithBlock(),
)
if err != nil {
    return nil, fmt.Errorf("error creating client connection to collector: %w", err)
}

otlpTraceExporter, err := otlptracegrpc.New(
    ctx,
    otlptracegrpc.WithGRPCConn(conn),
)

Note: 文中例子是演示的程序,使用的非安全的连接方式来获取数据,不过生产环境中你最起码应该要使用带鉴权的连接方式。

就导出器而言,有多种方式输出结果渠道供你选择,例如:控制台输出(输出到 stdout ), Jaeger (直接发送数据给它), Prometheus 等。使用 OTLP 导出器并将数据发送到 OTel Collector 的好处是,您可以创建数据副本、并行处理数据,并拥有更多控制权(将在下一篇文章中介绍)。

由于使用 OTLP 导出器非常灵活,我们可以根据需要在 Collector 中使用遥测数据(输出到 stdout、发送到 Jaeger 等)。下一篇文章将详细介绍这一点!

整合( Tying it all together )

现在我们有了资源(生成遥测数据)和导出器(遥测数据的目的地),我们将它们放在一起形成链路追踪生产者:

tp := trace.NewTracerProvider(
    trace.WithSampler(trace.AlwaysSample()),
    trace.WithResource(res),
    trace.WithSpanProcessor(trace.NewBatchSpanProcessor(otlpTraceExporter)),
)

当链路追踪生产者创建后,我们需要将其设置为全局链路追踪生产者:

import (
    "go.opentelemetry.io/otel"
)

// ...

otel.SetTracerProvider(tp)

接下来我们需要设置‘传播’。在后续博文中,将深入讨论传播和附加数据( baggage ,整个链路中传递业务自定义 KV 属性),但现在只需要知道‘传播’可以将 OTel 链路追踪的上下文信息跨多个服务进行传递。让‘分布式’概念在‘分布式链路追踪’中实现。

import (
    "go.opentelemetry.io/otel/propagation"
)

// ...

otel.SetTextMapPropagator(
    propagation.NewCompositeTextMapPropagator(
        propagation.TraceContext{},
        propagation.Baggage{}),
)

最后,我们需要调用 TracerProvider.Shutdown 来清理并关闭跨度处理器(在例子中,我们使用批量 span 处理器,按批次将 span 数据进行聚合和批量处理,然后将完整的批处理结果发送给导出器):

defer func() {
    if err := tp.Shutdown(context.Background()); err != nil {
        fmt.Printf("Error shutting down tracer provider: %v", err)
        os.Exit(1)
    }
}()

Note: 为了可靠性和可读性,仅通过调用 defer tp.Shutdown(context.Background()) 是不够的,需要处理函数返回的一些错误。

链路追踪生产者 Python 版( Python tracer provider )

样例项目中大部分服务都用 Go 语言来编写,用 Python 写了一个服务(定价服务)。为了完整起见,以下是如何在 Python 中创建和设置类似的链路追踪生产者的例子:

from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource, SERVICE_NAME, SERVICE_VERSION
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

resource = Resource(attributes={
    SERVICE_NAME: "price",
    SERVICE_VERSION: "v1.0.0"
})
tracer_provider = TracerProvider(resource=resource)

host_ip = os.environ.get("HOST_IP")
if host_ip is None:
    print("Must pass in environment var HOST_IP")
    sys.exit(1)

tracer_provider.add_span_processor(span_processor=BatchSpanProcessor(
    OTLPSpanExporter(endpoint=f"{host_ip}:4317", insecure=True)
))
trace.set_tracer_provider(tracer_provider)

其中资源、span 处理器和设置全局链路追踪生产者的实现与 Go 描述相同。

总结

很棒前进了一步!按照上面步骤实现了,通过 API 获取了遥测数据,并将其从当前组件中被发送到一个导出器,并向其中添加了一些元数据(资源)!接下来我们将了解如何使用 OpenTelemetry 收集器来处理这来数据。

本文翻译自:Observability with OpenTelemetry Part 3 - SDK and Exporting | Thomas Stringer

扩展阅读:文章来源地址https://www.toymoban.com/news/detail-655996.html

  • 方法论:面向故障处理的可观测性体系建设
  • 白皮书:事件 OnCall 中心建设方法
  • 好工具:FlashDuty - 一站式告警处理平台:告警降噪、排班OnCall

到了这里,关于使用 OpenTelemetry 构建可观测性 03 - 导出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生可观测框架 OpenTelemetry 基础知识(架构/分布式追踪/指标/日志/采样/收集器)...

    OpenTelemetry 是一个开源的可观测性框架,由云原生基金会(CNCF)托管。它是 OpenCensus 和 OpenTracing 项目的合并。旨在为所有类型的可观测信号(如跟踪、指标和日志)提供单一标准。 https://opentelemetry.io https://www.cncf.io https://opencensus.io OpenTelemetry 指定了如何收集遥测数据并将其发送到

    2024年01月16日
    浏览(41)
  • 开源解决方案OpenTelemetry的介绍以及如何将其与Prometheus结合使用

    作者:禅与计算机程序设计艺术 OpenTelemetry 是 CNCF(Cloud Native Computing Foundation)旗下的一个开源项目。它的目标是在云原生时代成为应用性能监控领域的事实标准,目前已经成为 Prometheus、Jaeger等工具的事实标准。 OpenTelemetry 提供了一套统一的 API 和 SDK ,使得开发者可以基于

    2024年02月05日
    浏览(24)
  • 【技术运维】SRE求职必会 —— 可观测性平台&可观测性工程(Observability Engineering)

    可观测性已成为一个热门话题,并广受关注。随着它的普及,“可观测性”不幸被误作“监控”或“系统遥测”的同义词。可观测性是软件系统的一个特征。而且,只有当团队采用新的实践进行持续开发时,才能在生产软件系统中有效利用这一特征。因此,将可观测性引入系

    2024年02月08日
    浏览(57)
  • 【咕咕送书第一期】 | SER运维:实现可观测性平台的技术要点是什么?

    🎬 鸽芷咕 :个人主页  🔥 个人专栏 :《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位铁汁们大家好啊,今天给大家推荐的的是机械工业出版社的 《可观测性工程》这本书!    ⛳️ 随着可观测性理念的深入人心,可观测性平台

    2024年02月07日
    浏览(58)
  • 华为云应用运维管理平台获评中国信通院可观测性评估先进级

    摘要: 经过中国信通院的检验,华为云应用运维管理平台满足云上软件系统稳定-可观测性平台技术要求,达到了可观测性平台技术检验的先进级水平。 本文分享自华为云社区《华为云应用运维管理平台获评中国信通院可观测性评估先进级!》,作者:华为云PaaS服务小智。

    2024年02月06日
    浏览(34)
  • 【变形金刚03】使用 Pytorch 开始构建transformer

            在本教程中,我们将使用 PyTorch 从头开始构建一个基本的转换器模型。Vaswani等人在论文“注意力是你所需要的一切”中引入的Transformer模型是一种深度学习架构,专为序列到序列任务而设计,例如机器翻译和文本摘要。它基于自我注意机制,已成为许多最先进的自

    2024年02月13日
    浏览(36)
  • 构建可观测架构,从这5个方面着手

    随着系统复杂度的提升,“可观测性”(Observability)成为架构建设的重要原则之一。那么构建一个可观测的系统架构需要做哪些工作呢?本文将从以下5个方面介绍构建可观测架构的主要考虑: 首先要确定核心业务指标,比如请求响应时间、错误率、吞吐量等。这些指标直接关联到用

    2024年02月14日
    浏览(27)
  • 直播预告 | 博睿学院 Bonree ONE接入zabbix数据源提高可观测运维能力

    课程中会分享数据接入的过程,重点讲解zabbix工作机制,深入分析zabbix数据库表结构,带你理清数据流向、功能与数据表之间的关系。揭秘Bonree ONE将zabbix数据收纳为己用的二三事。 本期讲师:久岐 业务专长:监控体系构筑,K8s集群维护 工作经历:曾就职于CTSIG 本期主题:

    2024年02月09日
    浏览(33)
  • 构建 NodeJS 影院预订微服务并使用 docker 部署(03/4)

            构建一个微服务的电影网站,需要Docker、NodeJS、MongoDB,这样的案例您见过吗?如果对此有兴趣,您就继续往下看吧。 你好社区,这是🏰“构建 NodeJS 影院微服务”系列的第三篇文章。本系列文章演示了如何使用 ES6、¿ES7 ...8?,连接到 MongoDB 副本集,本文还演示

    2024年02月12日
    浏览(26)
  • 华为云CCE集群健康中心:一个有大量的专家运维经验的云原生可观测平台

    本文分享自华为云社区《新一代云原生可观测平台之华为云CCE集群健康中心》,作者:云容器大未来。 \\\"Kubernetes运维确实复杂,这不仅需要深入理解各种概念、原理和最佳实践,还需要对集群的健康状态、资源利用率、容器的稳定性等多个方面进行风险评估。当集群出现故障

    2024年01月21日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包