开放分布式追踪(OpenTracing)入门与 Jaeger 实现

摘要: 分布式系统的运维挑战 容器、Serverless 编程方式的诞生极大提升了软件交付与部署的效率。在架构的演化过程中,可以看到两个变化: 应用架构开始从单体系统逐步转变为微服务,其中的业务逻辑随之而来就会变成微服务之间的调用与请求。

点此查看原文:http://click.aliyun.com/m/43363/

分布式系统的运维挑战

容器、Serverless 编程方式的诞生极大提升了软件交付与部署的效率。在架构的演化过程中,可以看到两个变化:

change.png

  • 应用架构开始从单体系统逐步转变为微服务,其中的业务逻辑随之而来就会变成微服务之间的调用与请求。
  • 资源角度来看,传统服务器这个物理单位也逐渐淡化,变成了看不见摸不到的虚拟资源模式。

从以上两个变化可以看到这种弹性、标准化的架构背后,原先运维与诊断的需求也变得越来越复杂。为了应对这种变化趋势,诞生一系列面向 DevOps 的诊断与分析系统,包括集中式日志系统(Logging),集中式度量系统(Metrics)和分布式追踪系统(Tracing)。

Logging,Metrics 和 Tracing

Logging,Metrics 和 Tracing 有各自专注的部分。

  • Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。
  • Metrics - 用于记录可聚合的数据。例如,队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP 请求个数可被定义为一个计数器,新请求到来时进行累加。
  • Tracing - 用于记录请求范围内的信息。例如,一次远程方法调用的执行过程和耗时。它是我们排查系统性能问题的利器。

这三者也有相互重叠的部分,如下图所示。

logging_metrics_tracing.png

通过上述信息,我们可以对已有系统进行分类。例如,Zipkin 专注于 tracing 领域;Prometheus 开始专注于 metrics,随着时间推移可能会集成更多的 tracing 功能,但不太可能深入 logging 领域; ELK,阿里云日志服务这样的系统开始专注于 logging 领域,但同时也不断地集成其他领域的特性到系统中来,正向上图中的圆心靠近。

关于三者关系的更详细信息可参考 Metrics, tracing, and logging。下面我们重点介绍下 tracing。

Tracing 的诞生

Tracing 是在90年代就已出现的技术。但真正让该领域流行起来的还是源于 Google 的一篇论文"Dapper, a Large-Scale Distributed Systems Tracing Infrastructure",而另一篇论文"Uncertainty in Aggregate Estimates from Sampled Distributed Traces"中则包含关于采样的更详细分析。论文发表后一批优秀的 Tracing 软件孕育而生,比较流行的有:

  • Dapper(Google) : 各 tracer 的基础
  • StackDriver Trace (Google)
  • Zipkin(twitter)
  • Appdash(golang)
  • 鹰眼(taobao)
  • 谛听(盘古,阿里云云产品使用的Trace系统)
  • 云图(蚂蚁Trace系统)
  • sTrace(神马)
  • X-ray(aws)

分布式追踪系统发展很快,种类繁多,但核心步骤一般有三个:代码埋点,数据存储、查询展示。

下图是一个分布式调用的例子,客户端发起请求,请求首先到达负载均衡器,接着经过认证服务,计费服务,然后请求资源,最后返回结果。

opentracing1.png

数据被采集存储后,分布式追踪系统一般会选择使用包含时间轴的时序图来呈现这个 Trace。

opentracing2.png

但在数据采集过程中,由于需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果您希望切换追踪系统,往往会带来较大改动。

OpenTracing

为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。
OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库追踪或日志分析程序之间。

+-------------+  +---------+  +----------+  +------------+
| Application |  | Library |  |   OSS    |  |  RPC/IPC   |
|    Code     |  |  Code   |  | Services |  | Frameworks |
+-------------+  +---------+  +----------+  +------------+|              |             |             ||              |             |             |v              v             v             v+------------------------------------------------------+|                     OpenTracing                      |+------------------------------------------------------+|                |                |               ||                |                |               |v                v                v               v
+-----------+  +-------------+  +-------------+  +-----------+
|  Tracing  |  |   Logging   |  |   Metrics   |  |  Tracing  |
| System A  |  | Framework B |  | Framework C |  | System D  |
+-----------+  +-------------+  +-------------+  +-----------+

OpenTracing 的优势

  • OpenTracing 已进入 CNCF,正在为全球的分布式追踪,提供统一的概念和数据标准。
  • OpenTracing 通过提供平台无关、厂商无关的 API,使得开发人员能够方便的添加(或更换)追踪系统的实现。

OpenTracing 数据模型

OpenTracing 中的 Trace(调用链)通过归属于此调用链的 Span 来隐性的定义。
特别说明,一条 Trace(调用链)可以被认为是一个由多个 Span 组成的有向无环图(DAG图),Span 与 Span 的关系被命名为 References

例如:下面的示例 Trace 就是由8个 Span 组成:

单个 Trace 中,span 间的因果关系[Span A]  ←←←(the root span)|+------+------+|             |[Span B]      [Span C] ←←←(Span C 是 Span A 的孩子节点, ChildOf)|             |[Span D]      +---+-------+|           |[Span E]    [Span F] >>> [Span G] >>> [Span H]↑↑↑(Span G 在 Span F 后被调用, FollowsFrom)

有些时候,使用下面这种,基于时间轴的时序图可以更好的展现 Trace(调用链):

单个 Trace 中,span 间的时间关系––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> time[Span A···················································][Span B··············································][Span D··········································][Span C········································][Span E·······]        [Span F··] [Span G··] [Span H··]

每个 Span 包含以下的状态:(译者注:由于这些状态会反映在 OpenTracing API 中,所以会保留部分英文说明)

  • An operation name,操作名称
  • A start timestamp,起始时间
  • A finish timestamp,结束时间
  • Span Tag,一组键值对构成的 Span 标签集合。键值对中,键必须为 string,值可以是字符串,布尔,或者数字类型。
  • Span Log,一组 span 的日志集合。
    每次 log 操作包含一个键值对,以及一个时间戳。

键值对中,键必须为 string,值可以是任意类型。
但是需要注意,不是所有的支持 OpenTracing 的 Tracer,都需要支持所有的值类型。

  • SpanContext,Span 上下文对象 (下面会详细说明)
  • References(Span间关系),相关的零个或者多个 Span(Span 间通过 SpanContext 建立这种关系)

每一个 SpanContext 包含以下状态:

  • 任何一个 OpenTracing 的实现,都需要将当前调用链的状态(例如:trace 和 span 的 id),依赖一个独特的 Span 去跨进程边界传输
  • Baggage Items,Trace 的随行数据,是一个键值对集合,它存在于 trace 中,也需要跨进程边界传输

更多关于 OpenTracing 数据模型的知识,请参考 OpenTracing语义标准。

OpenTracing 实现

这篇文档列出了所有 OpenTracing 实现。在这些实现中,比较流行的为 Jaeger 和 Zipkin。

Jaeger

Jaeger 是 Uber 推出的一款开源分布式追踪系统,兼容 OpenTracing API。

Jaeger 架构

architecture-jaeger.png

如上图所示,Jaeger 主要由以下几部分组成。

  • Jaeger Client - 为不同语言实现了符合 OpenTracing 标准的 SDK。应用程序通过 API 写入数据,client library 把 trace 信息按照应用程序指定的采样策略传递给 jaeger-agent。
  • Agent - 它是一个监听在 UDP 端口上接收 span 数据的网络守护进程,它会将数据批量发送给 collector。它被设计成一个基础组件,部署到所有的宿主机上。Agent 将 client library 和 collector 解耦,为 client library 屏蔽了路由和发现 collector 的细节。
  • Collector - 接收 jaeger-agent 发送来的数据,然后将数据写入后端存储。Collector 被设计成无状态的组件,因此您可以同时运行任意数量的 jaeger-collector。
  • Data Store - 后端存储被设计成一个可插拔的组件,支持将数据写入 cassandra、elastic search。
  • Query - 接收查询请求,然后从后端存储系统中检索 trace 并通过 UI 进行展示。Query 是无状态的,您可以启动多个实例,把它们部署在 nginx 这样的负载均衡器后面。

Jaeger 存在的问题

  • 需要架设并维护存储。
  • UI比较薄弱,有一些个性化的分析需求无法快速满足(例如对比,统计延迟分布等)。

Jaeger on Aliyun Log Service

Jaeger on Aliyun Log Service 是基于 Jeager 开发的分布式追踪系统,支持将采集到的追踪数据持久化到日志服务中,并通过 Jaeger 的原生接口进行查询和展示。

architecture.png

优势

  • 原生 Jaeger 仅支持将数据持久化到 cassandra 和 elasticsearch 中,用户需要自行维护后端存储系统的稳定性,调节存储容量。Jaeger on Aliyun Log Service 借助阿里云日志服务的海量数据处理能力,让您享受 Jaeger 在分布式追踪领域给您带来便捷的同时无需过多关注后端存储系统的问题。
  • Jaeger UI 部分仅提供查询、展示 trace 的功能,对分析问题、排查问题支持不足。使用 Jaeger on Aliyun Log Service,您可以借助日志服务强大的查询分析能力,助您更快分析出系统中存在的问题。
  • 相对于 Jaeger 使用 elasticsearch 作为后端存储,使用日志服务的好处是支持按量付费,成本仅为 elasticsearch 的13%。参阅自建ELK vs 日志服务(SLS)全方位对比

配置步骤

参阅:https://github.com/aliyun/jaeger/blob/master/README_CN.md

使用实例

HotROD 是由多个微服务组成的应用程序,它使用了 OpenTracing API 记录 trace 信息。

下面通过一段视频向您展示如何使用 Jaeger on Aliyun Log Service 诊断 HotROD 出现的问题。视频包含以下内容:

  1. 如何配置日志服务
  2. 如何通过 docker-compose 运行 Jaeger
  3. 如何运行 HotROD
  4. 通过 Jaeger UI 如何检索特定的 trace
  5. 通过 Jaeger UI 如何查看 trace 的详细信息
  6. 通过 Jaeger UI 如何定位应用的性能瓶颈
  7. 通过日志服务管理控制台,如何定位应用的性能瓶颈
  8. 应用程序如何使用 OpenTracing API

视频中用到的查询分析样例

1. 以分钟为单位统计 frontend 服务的 HTTP GET /dispatch 操作的平均延迟以及请求个数。

process.serviceName: "frontend" and operationName: "HTTP GET /dispatch" |
select from_unixtime( __time__ - __time__ % 60) as time,
truncate(avg(duration)/1000/1000) as avg_duration_ms,
count(1) as count
group by __time__ - __time__ % 60 order by time desc limit 60

2. 比较两条 trace 各个操作的耗时

traceID: "trace1" or traceID: "trace2" |
select operationName,
(max(duration)-min(duration))/1000/1000 as duration_diff_ms
group by operationName
order by duration_diff_ms desc

3. 统计延迟大于 1.5s 的 trace 的 IP 情况

process.serviceName: "frontend" and operationName: "HTTP GET /dispatch" and duration > 1500000000 |
select "process.tags.ip" as IP,
truncate(avg(duration)/1000/1000) as avg_duration_ms,
count(1) as count
group by "process.tags.ip"

参考资料

  • Jaeger on Aliyun Log Service - https://github.com/aliyun/jaeger
  • OpenTracing 中文文档 - https://wu-sheng.gitbooks.io/opentracing-io/content/
  • Jaeger - http://jaeger.readthedocs.io/en/latest/getting_started/
  • OpenTracing tutorial - https://github.com/yurishkuro/opentracing-tutorial
  • http://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html

特别感谢

Jaeger on Aliyun Log Service 是基于阿里云MVP @WPH95 在业余时间工作整理而成,感谢 MVP
的杰出贡献!

识别以下二维码,干货



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言网页版在线编译器_C语言编译器IDEapp下载-C语言编译器IDE官方版下载v1.5.1 安卓版...

c语言编译器IDE是专门为学习c语言的人专门打造的,解决了很多人身边没电脑的问题,这款软件是手机端的编译神器,用手机也可以学习c语言,软件中有很多详细的讲解原理,可以非常好的学习c语言,是初学者的好帮手&…

MWC18见闻录|阿里云的第一届“巴交会”

摘要: 上周,世界移动通信大会MWC18在巴塞罗那举行。非常荣幸能成为阿里云“巴交会”首秀小分队的一员。 短短四日,我们借此平台,给欧洲带去中国数字化转型的经验和技术。来自全世界的参会者也借此机会真实感受到了年轻且在高速发展…

这!不是一点儿super,青云混合云!

戳蓝字“CSDN云计算”关注我们哦!作者|刘晶晶“什么是混合云?”刚一开场,青云QingCloud解决方案及架构副总裁沈鸥就抛出了一个常听却做起来并不简单的问题。青云QingCloud解决方案及架构副总裁 沈鸥其实关于混合云,我们可以简单分…

查看系统版本

cat /etc/redhat-release

《阿里巴巴Android开发手册》v1.0.1更新,优化部分内容和示例代码

摘要: 春节余味尚未消,我们为移动开发者准备了一份迟到的新年礼物——《阿里巴巴Android开发手册》,继《阿里巴巴Java开发手册》之后,阿里巴巴开发规范家族又添一丁,「阿里巴巴Android开发规范」认证考试也同步上线。 …

java 如何循环执行一个对象_Java基础:如何定义好一个方法和进行方法重载

方法就是定义在类中的具有特定功能的一段独立小程序,可以完成特定功能的代码块在很多语言里都有函数的定义函数在java中也称为方法格式:修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,...){执行语句;return 返回值;}详细解释&…

再见!微服务

戳蓝字“CSDN云计算”关注我们哦!作者|马岛本文翻译自Alexandra Noonan 的 《Goodbye Microservices: From 100s of problem children to 1 superstar》内容是描述 Segment 的架构如何从 「单体应用」 -> 「微服务」 -> 「140 微服务」 -> 「单体应用」 的…

揭秘 | 直播美颜不靠脸 靠的是阿里云程序员?

摘要: 在这个看脸的时代,美颜已经成为必不可少的社交工具。不仅美颜相机成为了装机必备,各大直播APP也都相继推出美颜功能,利用摄像头对人脸进行追踪并叠加特效的新玩法也层出不穷。在市场热的背后,离不开技术支持。 点…

数据保护伞—为MaxCompute平台数据安全保驾护航

摘要: 数据安全是大数据发展道路上的重要挑战之一,数据,作为企业的核心资产,80%以上的核心信息是以结构化数据存储,包含个人身份证号、银行账号、电话、客户数据、医疗、交易、薪资等极其重要又敏感的信息。一旦发生数…

jdk 安装 linux环境

文章目录一、查看jdk是否安装?二、安装jdk步骤2.1. 上传jdk到系统相应目录2.2. 解压2.1. 复制jdk目录2.3. 配置环境变量2.4. 保存退出2.5. 重新加载环境变量2.6. 验证是否安装成功一、查看jdk是否安装? java -version如果是空的,说明没有安装…

nginx 一个请求发给多台机器_一个机器人可以同时为多台数控机床上下料吗?东智力衡...

机床的装卸机器人是自动装卸功能,代替了CNC机床的装卸中的手动完成的工件。它主要适用于大量,高重复性或较重的工件使用,并且工作环境具有高温,粉尘等恶劣条件。具有定位准确,生产质量稳定,机床和刀具磨损减…

Kafka精华问答 | kafka节点之间如何备份?

戳蓝字“CSDN云计算”关注我们哦!Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。作为一种高吞吐量的分布式发布订阅消息系统,有着诸多特性。今天,就让我们一起来看看关于它的精华问答吧!1Q&a…

阿里巴巴测试环境稳定性提升实践

摘要: 测试环境是研发/测试同学最常用的功能,稳定性直接影响到研发效率,那如何提升测试环境的稳定性?阿里巴巴应用与基础运维平台高级开发工程师张劲,通过阿里内部实践,总结了一套测试环境稳定性提升方法&a…

android中设置lmargin简书,超详细React Native实现微信好友/朋友圈分享功能-Android/iOS双平台通用...

(一)前言本文主要会涉及到以下内容:微信开发者应用申请审核安装配置微信分享库微信好友/朋友圈功能实现(二)应用申请审核首先大家需要去微信开发平台去注册账号并且创建一个移动应用。(地址:https://open.weixin.qq.com)开始创建移动应用,填写应用名称,应用名称以及中英文的信息…

【干货合集】看完这些干货,再说你因为“怕蛇”,所以学不好Python!

摘要: 作为编程语言界的“当红小生”,Python不仅能够承担起Web项目的重任,还能够用于写自动化脚本帮助你做很多事情,不仅能够用于机器学习和神经网络的研究,还能够用于最具有业务价值的数据分析方面,无论什…

蜕变!网易轻舟微服务这波操作,始于异构融合、源于中台!

戳蓝字“CSDN云计算”关注我们哦!作者|刘晶晶提及中台,无人不知。从概念诞生于阿里到如今高居神坛之上,整个行业无一不在频繁建设中,不可否认,TA带来的ICT变革远远超过了字面含义。深入实践我们感受到,有了…

首次公开!菜鸟弹性调度系统的架构设计

摘要: 为什么菜鸟需要弹性调度? 在弹性调度出现之前,菜鸟整体资源使用率都处于一个比较低的水平,这是因为: 1.在线应用一般是通过单机性能压测,并且结合经验预估业务流量的方式来确定所需容器数量。这种方式…

springboot listener_看完这份springboot 全套面试提升宝典,面试不带怕的

简介:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发…

“Java跌落向下,Python奋斗向前”,程序员:看哭了...

还记得被Java统治的时代吗?最近,这个格局已经被悄然打破,正是被来自曾经的小弟,新晋网红Python给硬生生拽下神坛。对此,Java曾表示强烈质疑,最近一份数据榜单悄悄来了!PLPY 8月榜单官宣&#xf…

注册docker hub账号

官网地址:https://hub.docker.com