zipkin学习--01--理论

2023-11-09

一、 介绍

  1. 是分布式跟踪系统(Distributed Tracking System)
    1. 监控微服务各个服务的调用情况
      1. 举例
        1. 一个请求A,需要先后调用f1,f2,f3等微服务单元的接口,我们可以通过链路追踪查看f1,f2,f3对应接口的耗时。
  2. 主要功能
    1. 聚集来自各个异构系统的实时监控数据。
    2. 追踪微服务架构下的系统延时问题
  3. 分布式跟踪系统其他比较成熟的实现
    1. Naver的Pinpoint
    2. Apache的HTrace
    3. 阿里的鹰眼Tracing
    4. 京东的Hydra
    5. 新浪的Watchman
    6. 美团点评的CAT,skywalking等。
  4. 应用系统需要进行装备(instrument)以向 Zipkin 报告数据
  5. Zipkin 的用户界面
    1. 可以呈现一幅关联图表,以显示有多少被追踪的请求通过了每一层应用。
    2. 可以查看 Span 的依赖关系
    3. 可以以瀑布图的形式显示了每个 Span 的耗时情况,可以一目了然的看到各个服务的性能状况。
      1. 打开每个 Span,还有更详细的数据以键值对的形式呈现,而且这些数据可以在装备应用的时候自行添加。
  6. Zipkin 以 Trace 结构表示对一次请求的追踪,又把每个 Trace 拆分为若干个有依赖关系的 Span。
    1. 在微服务架构中,一次用户请求可能会由后台若干个服务负责处理,那么每个处理请求的服务就可以理解为一个 Span(可以包括 API 服务,缓存服务,数据库服务以及报表服务等)。当然这个服务也可能继续请求其他的服务,因此 Span 是一个树形结构,以体现服务之间的调用关系。

1.1、 背景

微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,这个接口功能可能需要很多个服务协同,如果链路上任何一个服务出现问题,都会导致接口调用失败。

在这里插入图片描述

随着业务的不断扩张,服务之间互相调用越复杂。调用链的分析也会越复杂。它们之间的调用关系也许如下

在这里插入图片描述

二、 ZipKin架构

  1. 跟踪器(Tracer)位于你的应用程序中,并记录发生的操作的时间和元数据,提供了相应的类库,对用户的使用来说是透明的,收集的跟踪数据称为Span;将数据发送到Zipkin的仪器化应用程序中的组件称为Reporter,Reporter通过几种传输方式之一将追踪数据发送到Zipkin收集器(collector),然后将跟踪数据进行存储(storage),由API查询存储以向UI提供数据。

  2. ZipKin可以分为两部分:zipkin server和zipkin client
    在这里插入图片描述

2.1、客户端和服务器

zipkin server:用来作为数据的采集存储、数据分析与展示
  1. Collector
    1. 收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin内部处理的Span格式,以支持后续的存储,分析,展示等功能。
  2. Storage
    1. 存储接受或收集过来的数据
    2. 当前支持Memory,MySQL,Cassandra,ElasticSearch等
    3. 默认存储在内存中。
  3. API(Query)
    1. 负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用
  4. Web UI
    1. UI组件,基于API组件实现的上层应用。
    2. 通过UI组件用户可以方便而有直观地查询和分析跟踪信息。
zipkin client

完成了追踪数据的生成与上报功能

2.2、概念和字段说明

1、Trace

  1. Zipkin使用Trace结构表示对一次请求的跟踪
    1. 一次请求可能由后台的若干服务负责处理
      1. 每个服务的处理是一个Span,Span之间有依赖关系
  2. Trace就是树结构的Span集合

2、Span

每个服务的处理跟踪是一个Span,可以理解为一个基本的工作单元,如下:

//一个Span
{
 
  //标记一次请求的跟踪,相关的Spans都有相同的traceId 
  "traceId": "bd7a977555f6b982",
  //span的名称,一般是接口方法的名称
  "name": "get-traces",
  //span id
  "id": "ebf33e1a81dc6f71",
  //当前Span的父Span id,通过parentId来保证Span之间的依赖关系,如果没有parentId,表示当前Span为根Span;
  "parentId": "bd7a977555f6b982",
  //Span创建时的时间戳。单位是微秒,可能服务器有时钟偏差导致时间错误
  "timestamp": 1458702548478000,
  //持续时间,单位是微秒 
  "duration": 354374,
  //注解用于及时记录事件;有一组核心注解用于定义RPC请求的开始和结束 
  "annotations": [
    {
      "endpoint": {
        "serviceName": "zipkin-query",
        "ipv4": "192.168.1.2",
        "port": 9411
      },
      "timestamp": 1458702548786000,
      "value": "cs"
    }
  ],
  //二进制注释,旨在提供有关RPC的额外信息。
  "binaryAnnotations": [
    {
      "key": "lc",
      "value": "JDBCSpanStore",
      "endpoint": {
        "serviceName": "zipkin-query",
        "ipv4": "192.168.1.2",
        "port": 9411
      }
    }
  ]
}

3、transport

  1. 负责从运输从service收集来的spans,并把这些spans转化为zipkin的通用span,并将其传递到存储层,这种方法是模块化的,允许任何生产者接收任何类型的数据
  2. zipkin配有HTTP、kafka、scribe三种类型的transport
  3. instrumentations负责和transport进行交互。

三、 服务追踪流程如下:


┌─────────────┐ ┌───────────────────────┐  ┌─────────────┐  ┌──────────────────┐
│ User Code   │ │ Trace Instrumentation │  │ Http Client │  │ Zipkin Collector │
└─────────────┘ └───────────────────────┘  └─────────────┘  └──────────────────┘
       │                 │                         │                 │
           ┌─────────┐
       │ ──┤GET /foo ├─▶ │ ────┐                   │                 │
           └─────────┘         │ record tags
       │                 │ ◀───┘                   │                 │
                           ────┐
       │                 │     │ add trace headers │                 │
                           ◀───┘
       │                 │ ────┐                   │                 │
                               │ record timestamp
       │                 │ ◀───┘                   │                 │
                             ┌─────────────────┐
       │                 │ ──┤GET /foo         ├─▶ │                 │
                             │X-B3-TraceId: aa │     ────┐
       │                 │   │X-B3-SpanId: 6b  │   │     │           │
                             └─────────────────┘         │ invoke
       │                 │                         │     │ request   │
                                                         │
       │                 │                         │     │           │
                                 ┌────────┐          ◀───┘
       │                 │ ◀─────┤200 OK  ├─────── │                 │
                           ────┐ └────────┘
       │                 │     │ record duration   │                 │
            ┌────────┐     ◀───┘
       │ ◀──┤200 OK  ├── │                         │                 │
            └────────┘       ┌────────────────────────────────┐
       │                 │ ──┤ asynchronously report span     ├────▶ │
                             │                                │
                             │{                               │
                             │  "traceId": "aa",              │
                             │  "id": "6b",                   │
                             │  "name": "get",                │
                             │  "timestamp": 1483945573944000,│
                             │  "duration": 386000,           │
                             │  "annotations": [              │
                             │--snip--                        │
                             └────────────────────────────────┘
简单说明

一个应用的代码发起HTTP get请求,经过Trace框架拦截,然后

  1. 把当前调用链的Trace信息添加到HTTP Header里面
  2. 记录当前调用的时间戳
  3. 发送HTTP请求,把trace相关的header信息携带上
  4. 调用结束之后,记录当前调用花费的时间
  5. 然后把上面流程产生的 信息汇集成一个span,把这个span信息上传到zipkin的Collector模块

四、 核心数据结构

3.1、traceId

  1. 标记一次请求的跟踪,相关的Spans都有相同的traceId
  2. Zipkin将具有相同traceId的span组装成跟踪树来直观的将调用链路图展现在我们面前。

3.2、id

  1. span的id

3.3、parentId

当前Span的父Span id,通过parentId来保证Span之间的依赖关系,如果没有parentId,表示当前Span为根Span;

3.4、name

  1. span的名称,一般是接口方法的名称
  2. name的作用是让人知道它是哪里采集的span

3.5、timestamp

Span创建时的时间戳。单位是微秒,可能服务器有时钟偏差导致时间错误

3.6、duration

  1. 持续时间,即span的创建到span完成最终的采集所经历的时间,除去span自己逻辑处理的时间
  2. 该时间段可以理解成对于该跟踪埋点来说服务调用的总耗时

3.7、annotations

  1. 用于定位一个request的开始和结束,cs/sr/ss/cr含有额外的信息,比如说时间点,当这个annotation被记录了,这个RPC也被认为完成了。

3.7.1、cs: Client Start

表示客户端发起请求,一个span的开始

3.7.2、cr:Client Received

表示客户端获取到服务端返回信息,一个span的结束

3.7.3、sr:Server Receive

表示服务端收到请求

3.7.4、ss:Server Send

表示服务端完成处理,并将结果发送给客户端

3.7.5、sr-cs:sr的时间-cs的时间

网络延迟 

3.7.6、ss-sr:ss的时间-sr的时间

逻辑处理时间 

3.7.7、cr-cs:cr的时间-cs的时间

整个流程时间 

3.8、binaryAnnotations

业务标注列表,如果某些跟踪埋点需要带上部分业务数据(比如url地址、返回码和异常信息等),可以将需要的数据以键值对的形式放入到这个字段中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

zipkin学习--01--理论 的相关文章

随机推荐

  • c/c++ 力扣LeetCode 645.错误的集合

    题目链接 力扣 645 错误的集合 不想戳的看下图 解题思路 循环嵌套 对于这道题 有很多种方法 首先想到的 应是循环嵌套 直接for循环两边寻找相同 并求得丢失的整数 代码就不展示了 想必大家都会写 但时间复杂度O n2 是相当高的 对于
  • ios html mail,在Ios上的html电子邮件中显示base64图像

    我生成一个包含base64图像的html字符串 当MFMailComposeViewController打开时 我会看到生成的电子邮件中的图像 当我发送并打开它时 图像不会显示 只有空方块 我的代码 IBAction actionShare
  • VSCode无法登录leetcode,报[ERROR] invalid password?错误

    原因 leetcode cn的用户名是手机或者邮箱 不能用昵称登录 在官网退出登陆后发现用昵称登录不了 换成邮箱或者手机号后 登录成功 login node 960 Warning Accessing non existent proper
  • SQL Server主流版本生命周期管理

    SQL Server 生命周期 每个版本的 SQL Server 都有至少 10 年的支持期限 其中包括五年的主要支持和五年的扩展支持 主要支持 包括功能 性能 可伸缩性和安全更新 扩展支持 仅包含安全更新 终止支持 有时也称为生命周期结束
  • 2020年高教社杯全国大学生数学建模竞赛赛题 C题分析与思路!(持续更新)

    C题 中小微企业的信贷决策 1 C题题目背景 分析 在实际中 由于中小微企业规模相对较小 也缺少抵押资产 因此银行通常是依据信贷政策 企业的交易票据信息和上下游企业的影响力 向实力强 供求关系稳定的企业提供贷款 并可以对信誉高 信贷风险小的
  • 【nginx编译-zierror: ‘struct crypt_data‘ has no member named ‘current_salt‘】

    nginx编译 src os unix ngx user c In function ngx libc crypt src os unix ngx user c 26 7 error struct crypt data has no mem
  • C#中Class与Struct区别

    C 中Class与Struct区别 1 class 是引用类型 继承自System Object stuce是值类型 继承自System ValueType类 因此不具多态性 但是注意 System ValueType是个引用类型 2 从职
  • 如何用SPSS对数据进行标准化处理?

    SPSS统计分析软件是我最早接触的数据分析工具 我的博客将陆续介绍SPSS统计分析软件的相关内容 这类文章将统一按照在标题或者正文第一段出现 SPSS案例分析 编号 的形式组织 便于读者朋友们快速查询 收集 今天是第一篇 即 SPSS案例分
  • python循环与文件操作

    if 语句语法结构 if 条件 elif 条件 else 1 如果表达式的值 非0 或者为布尔值 True 则代码组 if suite 被执行 否则就去执行 else suite 2 只要表达式数字为 非零值 即为 True 3 空字符串
  • 移植使用tslib 库

    目录 tslib 简介 tslib 移植 下载tslib 源码 编译tslib 源码 tslib 安装目录下的文件夹介绍 在开发板上测试tslib tslib 库函数介绍 打开触摸屏设备 配置触摸屏设备 读取触摸屏数据 基于tslib 编写
  • STL库的使用之容器模板类QVector使用

    Qt中提供了一组通用的基于模板的容器类 对比C 中的STL库的容器类 Qt的这些容器类更轻量 更安全并且容易使用同时在速度 内存消耗 内联代码等方面进行了优化 存储在Qt的容器中数据必须是可赋值的数据类型 数据类型必须提供一个默认的构造函数
  • BES2300X,BES2500X——UI(按键,提示音,指示灯)

    本文是BES2300X BES2500X系列博文UI部分 一个耳机 音箱 UI是联系使用者与开发者最直接的一个窗口 当然 对于吾等码农而言 UI设计并不是我们最关心的 我们主要做的是UI实现 本文 写BES最基础UI 按键 指示灯 提示音
  • 基于Qt的收银点餐系统之UI的改进——QStackedLayout和QScrollArea的使用

    待解决问题 在收银点餐系统之UI的基本实现中 我们实现了本系统中最基本的UI 这一个UI是静态的 不能够动态添加按钮 关于如何添加见参考资料 也不能实现点击不同的分类 出现不同的界面等 前者的逻辑通过代码很好实现 故不赘述 后者则需要用到一
  • 力扣第45天----第392题、第115题

    力扣第45天 第392题 第115题 文章目录 一 第392题 判断子序列 二 第115题 不同的子序列 一 第392题 判断子序列 挺简单的 思路跟以前的都差不多 class Solution public bool isSubseque
  • Go解析yaml和yml文件

    Go解析yaml和yml文件 文章目录 Go解析yaml和yml文件 1 yaml概述 2 功能 3 示例 4 语言的构成元素 1 清单 数组 2 关系数组 3 区块的字符 4 保留换行 Newlines preserved 5 折叠换行
  • 英文期刊催稿信模板_SCI投稿委婉催稿信模板

    SCI投稿委婉催稿信模板1 Dear editor I m not sure if it is the right time to contact you to inquire about the status of my submitte
  • 34种ArcGIS常用操作技巧大汇总

    概述 ArcGIS产品线为用户提供一个可伸缩的 全面的GIS平台 ArcObjects包含了许多的可编程组件 从细粒度的对象 例如单个的几何对象 到粗粒度的对象 例如与现有ArcMap文档交互的地图对象 涉及面极广 这些对象为开发者集成了全
  • Burpsuite2022.1详细安装步骤包含证书安装

    burpsuite安装 burpsuite2022 1 https pan baidu com s 1k46tVXOKfdSwxOha UNeyQ 提取码 6954 将 burp suite 压缩包解压到英文目录下 这里我解压到了 E Bu
  • matlab图像滤波

    转自 http hi baidu com wang 5Fpw blog item 36354a637ac87b48eaf8f879 html clc clear all I imread eight tif 用中值滤波 多维滤波 使用中心为
  • zipkin学习--01--理论

    一 介绍 是分布式跟踪系统 Distributed Tracking System 监控微服务各个服务的调用情况 举例 一个请求A 需要先后调用f1 f2 f3等微服务单元的接口 我们可以通过链路追踪查看f1 f2 f3对应接口的耗时 主要