ITPub博客

首页 > 数据库 > 数据库开发技术 > 监控系统-OpenTracing

监控系统-OpenTracing

原创 数据库开发技术 作者:五分钟学SRE 时间:2023-03-17 09:31:00 0 删除 编辑
OpenTracing是一个开放标准,用于分布式应用程序跟踪。它旨在提供一种通用的方式来描述应用程序中的操作,并提供一种可插拔的跟踪框架,以便于不同跟踪系统之间的集成。

为什么需要OpenTracing

在all in拥抱云原生的大环境中,分布式系统已经成为标配,传统的服务器逐渐弹性化,上层接触到的跟多的是虚拟资源模式。然而,随着系统规模和复杂度的增加,分布式系统中的问题变得越来越难以排查和修复。在这种情况下,分布式追踪技术成为了必不可少的工具,以帮助开发者理解系统行为和性能,并快速识别和解决问题。

为了解决架构上带来的troubleshooting的复杂度,演练出常见监控系统主要有三种类型:集中式日志系统(Logging),集中式度量系统(Metrics)和分布式追踪系统(Tracing),这三种分析系统都有各自专注的地方。

  • Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。开源 Logging 有 ELK、Loki

  • Metrics - 用于记录可聚合的数据。例如,队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP 请求个数可被定义为一个计数器,新请求到来时进行累加。常见的开源 Metrics 有前面介绍的Prometheus,还有Zabbix、Nagios

  • Tracing - 用于记录请求范围内的信息。例如,一次远程方法调用的执行过程和耗时。它是我们排查系统性能问题的利器。常见的开源链路跟踪有 Jaeger、Zipkin、Pinpoint、Skywalking

三者的关系图



也是因为三种监控类型系统相对割裂与功能部分重合,对实际的troubleshoot工作其实有一定干扰,所以最近也开始流行起了新的监控标准:OpenTelemetry。

    OpenTelemetry集成了 OpenCensus、OpenTracing 标准,将 Metrics+Tracing+Logging 集成一体,目前Prometheus、Jaeger等开源工具都在遵循这个标准进行优化改造。不过这后面我们在进行介绍,这次主要介绍下三类监控类型中的Tracing。


OpenTracing从哪里来

    OpenTracing最初是由Ben Sigelman在2016年发布的一篇论文“Distributed Tracing with OpenTracing”。该论文提出了分布式追踪的概念,并阐述了OpenTracing的设计目标、基本原则和实现方式。论文指出,分布式追踪的核心挑战在于需要在多个服务之间建立上下文,并跨越多个异步和同步调用。OpenTracing通过使用上下文传递和操作ID来解决这个问题,并提供了一种可扩展的方式来生成和收集跟踪数据。


设计方案

OpenTracing的设计方案包括以下几个核心组件:

  • Tracer:跟踪器是OpenTracing的核心组件,用于创建和管理跟踪span。它还提供了一组标准API,用于在应用程序中嵌入跟踪代码。

  • API: API是一组标准化的接口,用于跨语言和跨平台地记录和传递跟踪数据。

  • Span:Span是跟踪中的基本单位,用于描述操作的开始和结束。它可以包含事件、标签和日志,并可以与上下文关联。

  • Context:Context是OpenTracing中用于传递上下文信息的关键组件。它可以包含操作ID、Span和其他跟踪数据,用于跨越不同服务和调用之间的信息传递。Context通常需要与RPC系统和HTTP框架进行集成,以便在不同的服务之间传递跟踪信息。

  • Carrier:Carrier是OpenTracing中用于传递跟踪数据的载体。它可以是HTTP请求头、RPC参数、日志文件等等。通过使用标准化的Carrier格式,不同的跟踪系统可以互相兼容并集成。

在设计OpenTracing时,还考虑了可扩展性和可插拔性。跟踪器和跟踪系统可以根据需要进行定制和更改,而不会影响应用程序中的跟踪代码。

底层原理

在实现OpenTracing时,通常会使用两个核心组件:Tracer和Span。

Tracer

    Tracer是OpenTracing中的核心组件之一,它充当了跟踪系统和应用程序之间的桥梁。Tracer主要负责管理和创建Span和Trace。Span是代表代码执行时间和相关上下文信息的对象,而Trace是包含所有Span的集合。Tracer可以通过将跟踪数据发送到跟踪系统进行存储和分析,以便开发人员能够更好地了解应用程序的行为和性能。

    在OpenTracing中,Tracer对象是线程安全的,因此可以在多个线程中使用。通常,Tracer应该在应用程序中只有一个实例。创建Tracer实例时,通常需要提供一些配置选项,例如跟踪系统的地址、采样率等。

Span

    Span是OpenTracing中的另一个核心组件,它代表了一段代码的执行时间和相关的上下文信息。Span通常被嵌套在Trace中,并且可以包含其他Span。

Span通常由以下几个部分组成:

  1. SpanContext:包含Span的元数据,例如Span的唯一标识符、父Span的标识符等。

  2. Operation Name:Span的名称,用于描述Span代表的操作。

  3. Start Time:Span的开始时间,用于记录Span开始执行的时间。

  4. End Time:Span的结束时间,用于记录Span执行结束的时间。

  5. Tags:用于添加Span的标签,例如Span的名称、开始时间、结束时间等。

  6. Logs:用于向Span中添加日志和事件信息,例如请求开始和结束的时间、传输的数据等。

在OpenTracing中,Span通常由以下几个操作组成:

  1. StartSpan:用于开始一个新的Span,并返回一个Span对象。

  2. SetTag:用于添加Span的标签。

  3. Log:用于向Span中添加日志和事件信息。

    使用Tracer和Span可以帮助开发人员更好地了解应用程序的行为和性能。Tracer可以帮助开发人员将应用程序的跟踪数据发送到跟踪系统进行存储和分析,而Span则可以用来描述整个请求的跟踪信息

    在使用OpenTracing时,开发人员需要在代码中创建Span,并通过Tracer将Span与跟踪操作相关联。下面是一些使用OpenTracing的示例代码:


import opentracing
# 创建一个新的Tracer对象tracer = opentracing.Tracer()
# 开始一个新的Spanwith tracer.start_active_span('my_operation') as scope: span = scope.span # 在Span中添加一些标签 span.set_tag('key', 'value') # 记录一些日志 span.log_kv({'event': 'my_event', 'data': 'my_data'}) # 执行一些操作 do_something() # 结束Span scope.close()

    上面的代码使用Python的OpenTracing库创建了一个新的Tracer对象,并使用start_active_span方法开始一个新的Span。在Span中,开发人员可以添加标签、记录日志、执行操作等。当跟踪操作完成后,Span会被自动关闭并提交给Trace。

目前基于OpenTracing理论的开源项目:

Jaeger

    Jaeger是一个开源的分布式追踪系统,它支持OpenTracing规范,并提供了一个用于收集、存储和查询跟踪数据的平台。并支持多种语言和平台。Jaeger可以帮助用户了解服务之间的依赖关系,找到性能瓶颈,进行故障排除等。在Jaeger中,开发人员可以使用OpenTracing API创建Span,并将它们与Jaeger进行交互。

    Jaeger的设计与OpenTracing的原则非常一致。Jaeger的架构包括以下组件:

  • Agent:运行在每个主机上的进程,用于接收Span数据并将其发送到Collector。

  • Collector:收集Agent发送的Span数据,并将其存储在数据库中。

  • Query:提供一个Web界面,用于查询和分析存储在数据库中的Span数据。

  • Storage:用于存储Span数据的后端存储,支持Cassandra、Elasticsearch和Memory三种存储方式。


Zipkin

    Zipkin是Twitter开源的分布式跟踪系统,它也实现了OpenTracing规范,并支持多种语言和平台。Zipkin可以帮助用户追踪请求的路径,分析服务之间的依赖关系,以及找到性能瓶颈。

SkyWalking

    SkyWalking是Apache基金会孵化的分布式APM系统,它也支持OpenTracing规范。SkyWalking可以帮助用户追踪分布式系统中的请求,分析服务之间的依赖关系,以及监控服务的性能指标。


原文作者:五分钟学SRE;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-11-23

  • 博文量
    81
  • 访问量
    38724