OpenTracing 详解

OpenTracing 详解OpenTracing 于 2016 年 10 月加入 CNCF 基金会 是继 Kubernetes 和 Prometheus 之后 第三个加入 CNCF 的开源项目 它是一个中立的 厂商无关 平台无关 分布式追踪的 API 规范 提供统一接口 可方便开发者在自己的服务中集成一种或多种分布式追踪的实现 本文讲一讲 OpenTracing 的来龙去脉 以及在容器化和微服务盛行的今天 为什么分布式追踪显得格外有用 DistributedT 什么是 Tracing 图片来源 Metrics t

OpenTracing 于 2016 年 10 月加入 CNCF 基金会,是继 Kubernetes 和 Prometheus 之后,第三个加入 CNCF 的开源项目。它是一个中立的(厂商无关、平台无关)分布式追踪的 API 规范,提供统一接口,可方便开发者在自己的服务中集成一种或多种分布式追踪的实现。本文讲一讲 OpenTracing 的来龙去脉,以及在容器化和微服务盛行的今天,为什么分布式追踪显得格外有用。

Distributed Tracing

什么是 Tracing

Metrics, tracing, and logging

图片来源 Metrics, tracing, and logging

Wikipedia 中,对 Tracing 的定义 是,在软件工程中,Tracing 指使用特定的日志记录程序的执行信息,与之相近的还有两个概念,它们分别是 Logging 和 Metrics。

  • Logging:用于记录离散的事件,包含程序执行到某一点或某一阶段的详细信息。
  • Metrics:可聚合的数据,且通常是固定类型的时序数据,包括 Counter、Gauge、Histogram 等。
  • Tracing:记录单个请求的处理流程,其中包括服务调用和处理时长等信息。

同时这三种定义相交的情况也比较常见。

  • Logging & Metrics:可聚合的事件。例如分析某对象存储的 Nginx 日志,统计某段时间内
  • GET、PUT、DELETE、OPTIONS 操作的总数。 Metrics & Tracing:单个请求中的可计量数据。例如 SQL
  • 执行总时长、gRPC 调用总次数。 Tracing & Logging:请求阶段的标签数据。例如在 Tracing
    的信息中标记详细的错误原因。

针对每种分析需求,我们都有非常强大的集中式分析工具。

  • Logging:ELK,近几年势头最猛的日志分析服务,无须多言。
  • Metrics:Prometheus,第二个加入 CNCF 的开源项目,非常好用。
  • Tracing:OpenTracing 和 Jaeger,Jaeger 是 Uber 开源的一个兼容 OpenTracing 标准的分布式追踪服务。目前 Jaeger 也加入了 CNCF。

为什么需要 Distributed Tracing

Blind Elephant
图片来源 OpenTracing Joins the Cloud Native Computing Foundation

微服务极大地改变了软件的开发和交付模式,单体应用被拆分为多个微服务,单个服务的复杂度大幅降低,库之间的依赖也转变为服务之间的依赖。由此带来的问题是部署的粒度变得越来越细,众多服务给运维带来巨大压力,不过好在我们有 Kubernetes,可以解决大部分运维方面的难题。

随着服务数量的增多和内部调用链的复杂化,仅凭借日志和性能监控很难做到 “See the Whole Picture”,在进行问题排查或是性能分析的时候,无异于盲人摸象。分布式追踪能够帮助开发者直观分析请求链路,快速定位性能瓶颈,逐渐优化服务间依赖,也有助于开发者从更宏观的角度更好地理解整个分布式系统。

上图为 Jaeger 呈现的一个 HTTP 请求过程,无关名称已做模糊处理

乍看上去是不是有点火焰图的感觉,从 Jaeger 的前端界面上可以清晰的看到某个请求的所有阶段和内部调用,以及每个阶段所耗费的时间。展开某个阶段,还能看到这个阶段是在哪台机器(或容器)上执行的,也可以针对请求阶段增加的自定义标记,例如标记错误原因。之后还会单独写一篇关于 Jaeger 的具体实践文章,详细介绍一下如何将 Jaeger 集成到自己的服务当中。

原理

请求过程被采集之后,会以上图的形式呈现,横坐标是时间,圆角矩形是请求的执行的各个阶段。

OpenTracing

发展历史

图片来源 OpenTracing: Turning the Lights On for Microservices

目前,主流的分布式追踪实现基本都已经支持 OpenTracing,包括 Jaeger、Zipkin、Appdash 等,具体可参考官方文档 《Supported Tracer Implementations》。

Causal relationships between Spans in a single Trace [Span A] ←←←(the root span) | +------+------+ | | [Span B] [Span C] ←←←(Span C is a `ChildOf` Span A) | | [Span D] +---+-------+ | | [Span E] [Span F] >>> [Span G] >>> [Span H] ↑ ↑ ↑ (Span G `FollowsFrom` Span F) 

Trace 是调用链,每个调用链由多个 Span 组成。Span 的单词含义是范围,可以理解为某个处理阶段。Span 和 Span 的关系称为 Reference。上图中,总共有标号为 A-H 的 8 个阶段。

Temporal relationships between Spans in a single Trace ––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> time [Span A···················································] [Span B··············································] [Span D··········································] [Span C········································] [Span E·······] [Span F··] [Span G··] [Span H··] 

上图是按照时间顺序呈现的调用链。

每个阶段(Span)包含如下状态:

  • 操作名称
  • 起始时间
  • 结束时间
  • 一组 KV 值,作为阶段的标签(Span Tags)
  • 阶段日志(Span Logs)
  • 阶段上下文(SpanContext),其中包含 Trace ID 和 Span ID
  • 引用关系(References)

阶段(Span)可以有 ChildOf 和 FollowsFrom 两种引用关系。ChildOf 用于表示父子关系,即在某个阶段中发生了另一个阶段,是最常见的阶段关系,典型的场景如调用 RPC 接口、执行 SQL、写数据。FollowsFrom 表示跟随关系,意为在某个阶段之后发生了另一个阶段,用来描述顺序执行关系。

如果对原理比较感兴趣,建议读一下 OpenTracing 的规范文档和 Go 语言的实现。

建议使用方式

首先假设某微服务已经有了中心化的日志收集和处理系统,如果还没有的话,强烈建议部署一套 ELK。再假设对于每一个请求,都会有一个贯穿整个请求流程的 Request ID,如果还没有的话,强烈建议加一个。以上准备完毕后,可以选取一个分布式追踪系统,集成到服务当中,建议采用 Jaeger。重点在最后,在 Trace 的起始处,将 Trace ID 设置为 Request ID,这么一来就打通了日志系统和分布式追踪系统,可以使用同一个 ID 查询请求的事件流和日志流,从此开启了上帝视角。

具体使用

脱离分布式追踪系统单独讲 OpenTracing 的使用方法的话,意义不大,所以本文就不介绍具体的使用方法,之后会以 Jaeger 为例,解释如何给微服务增加分布式追踪,以及如何与现有的日志系统集合。

如果想简单了解一下使用方式,可参考 OpenTracing 的《Quick Start》。

非入侵式

除了通过修改应用程序代码增加分布式追踪之外,还有一种不需要修改代码的非入侵的方式,那就是 Service Mesh。Service Mesh 一般会被翻译成服务啮合层,它是在网络层面做文章,通过 Sidecar 的方式为 Pod 增加一层代理,通过这层网络代理来实现一些服务治理的功能,因为是工作在网络层面,可以做到跨语言、非入侵。Istio 则是目前最成熟的 Service Mash 工具,支持启用分布式追踪服务。Istio 会修改微服务之间发送的网络请求,在请求中注入 Trace 和 Span 标记,再将采集到的数据发送到支持 OpenTracing 的分布式追踪服务中,从而拿到请求在微服务中的调用链。当然这种方式也有缺点,它无法追踪某个微服务内部的调用过程,并且目前阶段 Istio 只能追踪 HTTP 请求,能够覆盖的范围比较有限。如果想追踪更详细的数据,还是需要在中间件和代码中埋点,不过好在埋点的过程并不复杂,不会成为一个额外的负担。

参考资料

  • Datadog + OpenTracing: Embracing the open standard for APM https://www.datadoghq.com/blog/opentracing-datadog-cncf/
  • Metrics, tracing, and logging https://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html
  • Wikipedia – Tracing (software) https://www.wikiwand.com/en/Tracing_(software)
  • Elastic https://www.elastic.co
  • Prometheus https://prometheus.io
  • OpenTracing http://opentracing.io
  • Jaeger https://www.jaegertracing.io
  • OpenTracing Joins the Cloud Native Computing Foundation https://www.cncf.io/blog/2016/10/11/opentracing-joins-the-cloud-native-computing-foundation/
  • Introduction OpenTracing http://opentracing.io/documentation/
  • Dapper, a Large-Scale Distributed Systems Tracing Infrastructure https://ai.google/research/pubs/pub36356
  • OpenTracing: Turning the Lights On for Microservices https://www.cncf.io/blog/2016/10/20/opentracing-turning-the-lights-on-for-microservices/
  • Supported Tracer Implementations http://opentracing.io/documentation/pages/supported-tracers.html#supported-tracer-implementations
  • The OpenTracing Semantic Specification https://github.com/opentracing/specification/blob/master/specification.md
  • Istio https://istio.io
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227245.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:37
下一篇 2026年3月16日 下午9:37


相关推荐

  • kindeditor编辑器微软雅黑样式font-family值变成"

    kindeditor编辑器微软雅黑样式font-family值变成"

    2021年10月22日
    48
  • 关于PCBLayout的一些具体细节的认识(能力有限,请大家多多指点)

    关于PCBLayout的一些具体细节的认识(能力有限,请大家多多指点)进行 PCB 的绘制不能随心所欲 想到哪儿画到哪 应该有顺序的一步一步进行下去 这样才能尽可能的减少错误 满足线路要求 我也曾到网上搜索过 PCB 的绘制流程 但大部分都讲的很粗略 对细节上的步骤没有进行描述 尽管本人的技术水平非常有限 但是我还是想把自己平时绘制 PCB 的一些细节步骤写下来 可能每个人的习惯都不一样 但主体上是不会相差太多的 大致步骤 原理图电路是经过确认没有错误的 封装及参数都已

    2026年3月18日
    3
  • c语言尖括号什么意思,请教尖括号里面含有尖括号是什么意思

    c语言尖括号什么意思,请教尖括号里面含有尖括号是什么意思当前位置 我的异常网 C 请教尖括号里面含有尖括号是什么意思请教尖括号里面含有尖括号是什么意思 www myexceptions net 网友分享于 2013 11 19 浏览 55 次请问尖括号里面含有尖括号是什么意思 voidcv resize InputArray src OutputArray dst Sizedsize doubleinv scale x d

    2026年3月17日
    1
  • PS可以卸载了?Lovart:全球首个 Design Agent,重新定义 AI 设计!

    PS可以卸载了?Lovart:全球首个 Design Agent,重新定义 AI 设计!

    2026年3月13日
    2
  • 计算机适配器有什么作用,例举适配器是什么

    计算机适配器有什么作用,例举适配器是什么随着科技进步,网络的进步,电脑已逐渐渗透到我们生活的方方面面,但是我们对于电脑的一些配置却不怎么了解,比如我们经常用到的适配器。下面,我就将适配器的一些小知识分享给大家我们在生活中或者使用电脑的时候经常会看到适配器一词,很多朋友就纳闷了,适配器是什么呢?有什么作用呢?针对这些问题,小编给大家整理了一些适配器的介绍,赶紧来瞧瞧吧适配器介绍电脑图解1适配器是一个接口转换器,也就是一种起中间连接作用的配…

    2022年6月7日
    51
  • 高分1(GF1)、高分2(GF2)卫星数据大气校正[通俗易懂]

    高分1(GF1)、高分2(GF2)卫星数据大气校正[通俗易懂]KEYWORDS:GF1,GF2,RSD,大气校正,遥感软件0.RSD大气校正RSD是李国春教授团队开发的一款遥感数处理软件。其大气校正模块是参照USGSLaSRC大气校正流程,使用VC++重新改写并在Windows平台实现的内置大气校正功能。1.原理与方法RSD大气校正是应用6SV大气辐射模型原理实现的RSD遥感平台内置软件功能。其对Landsat8OLI大气校正部分延续了LaSRC的校…

    2022年10月9日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号