Knative Tracing 介绍
摘要: 一个完整的业务实现想要基于 Serverless 模型来开发的话可能会分解成多个 Serverless 模块,每一个模块单独通过 Knative 的 Serving 部署,那么这些不同的 Serving 之间就需要调用链进行事务的串联。
前言
为了实现系统组件的水平扩展、敏捷开发、CD(持续集成)、解耦等各种诉求,现代的大型软件架构往往都是微服务架构。 微服务架构本身会面临一系列诸如:后台错误原因分析、各个微服务组件的调用情况诊断等。所以需要有一个 Tracing 系统解决这些问题。
除了微服务以外 Serverless 应用也面临同样的问题。一个完整的业务实现想要基于 Serverless 模型来开发的话可能会分解成多个 Serverless 模块,每一个模块单独通过 Knative 的 Serving 部署,那么这些不同的 Serving 之间就需要调用链进行事务的串联。
而 Knative 本身没有 Tracing 的设计,需要借助 ServiceMesh 层来实现 tracing。对于开源的 Knative 来说 ServiceMesh 层其实就是 Istio。说到 Istio 的 Tracing 就要提到 OpenTracing 了。OpenTracing 现在已经成了云原生的 Tracing 标准。所以本文我们从 OpenTracing 到 Istio 再到 Knative 来层层分析看看 Knative 应用应该如何使用 Tracing。
为什么需要 Opentracing
目前流行的分布式跟踪系统 Zipkin、Jeager 等。如果这些 Tracing 系统使用不兼容的 API 或者他们对开发语言支持不友好那么就会给微服务开发带来困难。
OpenTracing 通过提供平台无关、厂商无关的 API,使得开发人员能够方便的添加(或更换)追踪系统的实现。 OpenTracing 还提供了流行开发语言的 SDK,这样就非常方便非服务的 tracing 实现。常用的开发语言 SDK 如下:
- opentracing-go
- opentracing-java
- opentracing-python
- opentracing-cpp
- opentracing-php
- opentracing-javascript
- opentracing-csharp
- opentracing-c
- opentracing-ruby
- opentracing-swift
- opentracing-lua
- opentracing-objc
什么是 tracing
首先我们要搞清楚什么是 Trace,在前面的介绍中我们提到 Trace 是为了解决微服务调用的一些链路追踪等问题,所以 Trace 应该是能够表达一个事务在各个微服务中的执行过程。
所以一个 Trace 代表了一个事务或者流程在系统中的执行过程。在 OpenTracing 标准中,Trace 是由多个 Span 组成的一个有向无环图,每一个 Span 代表事务的一个执行节点或者片段,每一个 Span 都是有名字并且有起止时间的。
分布式追踪中的每个组件都一个或者多个 Span。例如,在一个常规的 RPC 调用过程中,OpenTracing 推荐在 RPC 的客户端和服务端,至少各有一个 Span,用于记录 RPC 调用的客户端和服务端信息。
如上所示是一个由 8 个 Span 组成的完整的 Trace 调用流程。
关于 Span 有两个主要的关系需要解释一下:ChildOf 和 FollowsFrom,从上面的示意图中看起来都是前面的 Span 触发后面的 Span,从图上出不出区别。但实际区别还是很大的。
- ChildOf
表示父子关系。意思是父 Span 需要等待子 Span 结束才能结束。所以子 Span 会 block 父 Span 的执行。如上所示的 [Span A] 必须等待 B 和 C 都结束自己才算结束,同理 C 也要等待 E 和 F 都结束才行。
- FollowsFrom
表示兄弟关系。兄弟关系和父子关系的根本区别就是不需要等待兄弟的结束。比如上面的 F 和 G 的关系就是 F 结束之后触发的 G,所以 F 要先于 G 结束,不需要等待 G。
ChildOf 有点儿像是函数调用,父函数需要等待子函数结束。FollowsFrom 有点儿像是 Goroutine 父 goroutine 并不需要等待子 goroutine 的结束,两者各自的生命周期是独立的。
上图可以很好的表示各组件的组合关系,但无法表示组件的调用时间、是串行调用还是并行调用。所以一般的 Trace 实现都会用如下所示的方式展示 Trace 的调用过程
Istio Tracing
Istio 本身是基于 OpenTracing 调用链追踪,并且 ZipKin 和 Jeager 两种实现都可以用于 Istio。
上图是 Istio 官方例子中的 Bookinfo 应用的例子。Bookinfo 应用由如下四个模块组成
- Product page
Python 语言开发,用来展示书本信息
- Reviews
Java 语言开发,接收 Product page 的请求,返回评论信息,同时也调用 Ratings 微服务。Reviews 有三个版本:v1、v2、v3,这个三个版本在响应 Product page 的请求时各有不同:v1 的响应没有评分等级、v2 的响应包含黑色的评分等级、v3 的响应包含红色的评分等级
- Ratings
Nodejs 语言开发,接受 Reviews 的请求,返回评分信息
- Details
Ruby 语言开发,接受 Product page 的请求,返回书本详细属性
从前端入口 Gateway 那个 Envoy 上进行一次调用,到四个不同语言开发的服务间完成调用,一次调用输出的 Tracing 可能是这样:
如上图所示有四个 Span:
- product page Span
- detail Span
- reviews Span
- rationgs Span
而且这四个 Span 构成了一个调用链,也就是说 Ratings Span 知道自己的父 Span 是 reviews,reviews Span 也知道自己的父 Span 是 product page。那么问题来了 reviews Span 和 ratings Span 是怎么知道自己的父 Span 的呢?
我们知道 Istio 是通过 Sidecar 的方式接管流量的,对于 Sidecar 里面的 Envoy 来说是没有办法判断进来的哪个请求和出去的哪个是一个事务。
我们看一下 Istio bookInfo 的代码https://github.com/istio/istio/blob/master/samples/bookinfo/src/reviews/reviews-application/src/main/java/application/rest/LibertyRestEndpoint.java#L146 就能发现其实这个 tracing 的完整流程是需要应用程序参与的。
对于上图所示对于 HTTP 请求需求在 Header 中把 Tracing 的信息获取出来并且在调用下游服务的时候还需要继续传递下去。也就是说 Istio 只是负责接管流量并且创建 Span,但是微服务 Span 之间的衔接是需要应用程序来配合的。
Knative Tracing
了解了 Istio Tracing 的原理我们就比较清楚 Knative 应该的玩法了。Knative Service 部署的应用如果有多个微服务模块,那么微服务模块之间的完整调用链的衔接就需要应用程序来完成。
对于 HTTP 协议而言就需要应用程序提取接受到的请求的 Tracing Header 中的信息并且传递到款下一个微服务的调用中。
另外虽然 OpenTracing 是一个通用的标准,但是 OpenTracing 并没有规定 HTTP Header 应该如何设置。也就是说虽然 Istio 支持 Zipkin 和 Jeager 两种 Tracing 实现,但是这两种是不能混用的,因为这两种实现的 Header 设置是不一样的。不过 Jeager 设置一下也是可以支持 ZipKin 标准的(参考这里),所以我们的应用程序开发的时候也要想好是基于 Zipkin 的规范实现还是基于 Jeager 的规范实现。
小结
- OpenTracing 是一个通用的 Tracing 标准,但是标准规定的边界还有点儿窄,还有一些地方没有标准
- Istio Tracing 是需要应用程序一起配合实现的,否则就是一堆杂乱的 Span 堆在一起,无法串联整个事务链
- Istio Envoy 默认是基于 apache/ncubator-zipkin-b3-propagation 标准实现的 HTTP Header 注入,建议应用程序开发也使用这个标准,这也是 ZipKin 遵循的标准
- Knative Service 部署的服务需要主动参与 Tracing 的实现,否则无法完成这个调用链的串联。所以如果说 Tracing 是 Serverless 必不可少的一部分,那么 Knative Service 部署的应用有其他依赖的微服务模块的话就必须要主动参与 Tracing 的实现
参考文献
- Repository that describes and sometimes implements B3 propagation
- Istio 文档中提到的跟踪头 英文
- Istio 文档中提到的跟踪头 中文
- Trace Span
- The OpenTracing Specification repository
- OpenTracing API Contributions
- Istio 分布式追踪
- apache/ncubator-zipkin-b3-propagation
- HTTP header manipulation
- Using OpenTracing with Istio/Envoy
本文作者:冬岛
本文为云栖社区原创内容,未经允许不得转载。
Knative Tracing 介绍的更多相关文章
- 开箱即用,Knative 给您极致的容器 Serverless 体验
作者 | 冬岛 阿里巴巴技术专家 导读:托管 Knative 开箱即用,您不需要为这些常驻实例付出任何成本.结合 SLB 云产品提供 Gateway 的能力以及基于突发性能型实例的保留规格功能,极大 ...
- WebGPU学习(五): 现代图形API技术要点和WebGPU支持情况调研
大家好,本文整理了现代图形API的技术要点,重点研究了并行和GPU Driven Render Pipeline相关的知识点,调查了WebGPU的相关支持情况. 另外,本文对实时光线追踪也进行了简要的 ...
- Istio 将被捐赠给开源基金会 | 云原生生态周报 Vol. 47
作者 | 陈俊.徐迪.陈有坤.李鹏.敖小剑 业界要闻 1.Google Cloud CEO 表示将把 Istio 项目捐赠给基金会 Istio 项目找到了理想的发展方向: 捐赠给开源基金会. 2.Ko ...
- #研发解决方案介绍#Tracing(鹰眼)
郑昀 最后更新于2014/11/12 关键词:GoogleDapper.分布式跟踪.鹰眼.Tracing.HBase.HDFS. 本文档适用人员:研发 分布式系统为什么需要 Tracing? ...
- Knative 基本功能深入剖析:Knative Eventing 之 Sequence 介绍
作者 | 元毅,阿里云容器平台高级开发工程师,负责阿里云容器平台 Knative 相关工作. 导读:在实际的开发中我们经常会遇到将一条数据需要经过多次处理的场景,称为 Pipeline.那么在 Kna ...
- Knative 核心概念介绍:Build、Serving 和 Eventing 三大核心组件
Knative 主要由 Build.Serving 和 Eventing 三大核心组件构成.Knative 正是依靠这三个核心组件,驱动着 Knative 这艘 Serverless 巨轮前行.下面让 ...
- Knative Serving 健康检查机制分析
作者| 阿里云智能事业群技术专家牛秋霖(冬岛) 导读:从头开发一个Serverless引擎并不是一件容易的事情,今天咱们就从Knative的健康检查说起.通过健康检查这一个点来看看Serverles ...
- Knative 实战:一个微服务应用的部署
作者 | 元毅 阿里云智能事业群高级开发工程师 在 Istio 中提供了一个 Bookinfo 的示例,用于演示微服务之间的调用,那么如何在 Knative 中部署这个示例呢?本文将会给大家介绍一下在 ...
- 如何利用ETW(Event Tracing for Windows)记录日志
ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统.由于采用内核(Kernel)层面的缓冲和日志记录机制,所以ETW提供了一种非常高效的事 ...
随机推荐
- java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.copyInputStreamToFile(Ljava/io/InputStream;Ljava/io/File;)V
昨天用的好好的,今天就不行了 也懒得搞 具体原因就是引用的问题 找了个能用的pom 直接贴过去完事儿
- ArrayList,LinkedList,Vestor
Collection是最基本的集合接口,声明了适用于JAVA集合的通用方法,list和set都继承自collection接口. Collection接口的方法 boolean add(Object o ...
- 凸优化 & 1概念
---恢复内容开始--- 放射集合 系数之和为1 相加仍然能在集合内,就是 纺射集合 子空间加一个常熟 就是纺射集合 , 例题2.1 一类特殊的线性方程组的解可以看作纺射 集合 纺射包 aff C 是 ...
- 阿里云DMS发布数据库网关服务: 打通网络限制 开启数据库统一管理的万能钥匙
概述 阿里云数据管理DMS在云端可提供专业的数据库服务,除对标本地数据库软件的基础功能外,还包含性能诊断.数据追踪.跨实例SQL查询(含异构数据库类型之间)等专业性功能,同时提供审计安全和企业级数据库 ...
- Kibana将语言设置为中文
6.7以后系统开始支持中文了,修改语言只需要添加一行配置即可. 设置方法 在kibana.yml配置文件中添加一行配置 i18n.locale: "zh-CN" 修改后重启,可以看 ...
- WPF快速入门系列(6)—— WPF资源和样式
一.引言 WPF资源系统可以用来保存一些公有对象和样式,从而实现重用这些对象和样式的作用.而WPF样式是重用元素的格式的重要手段,可以理解样式就如CSS一样,尽管我们可以在每个控件中定义格式,但是如果 ...
- js正则表达式常见规则整理
验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9 ...
- python设计模式整理
设计模式的定义:为了解决面向对象系统中重要和重复的设计封装在一起的一种代码实现框架,可以使得代码更加易于扩展和调用 四个基本要素:模式名称,问题,解决方案,效果 六大原则: 1.开闭原则:一个软件实体 ...
- 【Leetcode 堆、快速选择、Top-K问题 BFPRT】有序矩阵中第K小的元素(378)
题目 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素. 请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1, 5, 9], [ ...
- vue 保存数组和对象, 避免双向绑定影响
很多时候需要保存数据然后复用该数据,因vue的双向绑定总是不能保存原始数据 随笔记录解决方式 1. 不要把变量放置在data中 2. 保存至新的变量 object : let obj= Objec ...