3. 分布式链路追踪的链路日志设计

news2024/11/25 3:57:37

前言

分布式链路追踪的客户端实现中,我们会通过各种手段和规则得到一个又一个的Span,得到这些Span后,需要在分布式链路追踪的服务端这边汇总这些Span并拼接出一条请求链路,那么这里就存在一个问题,客户端得到的Span如何给到服务端,通常是会在每个Span调用finish() 方法时将Span发送给服务端,这里的发送有多种形式,例如把Span主动的pushKafkaTopic,还例如把Span当作一条日志打印出来再由Filebeat采集,我们的本系列文章中,就选择将Span链路日志的形式打印出来,至于如何采集以及服务端如何拼接,这不在本系列文章的讨论范围内。

正文

这里直接给出定义好的链路日志格式,如下所示。

{
    "traceId": "testTraceId", 
    "spanId": "testSpanId", 
    "parentSpanId": "testparentSpanId", 
    "timestamp": "1704038400000", 
    "duration": "10", 
    "httpCode": "200", 
    "host": "127.0.0.1", 
    "requestStacks": [ 
        {
            "subSpanId": "testSubSpanId", 
            "subHttpCode": "200", 
            "subTimestamp": "1704038401000", 
            "subDuration": "5", 
            "subHost": "192.168.10.5", 
        }
    ]
}

特别说明一下requestStacks这个字段,该字段主要就是用于记录当前节点调用下游子节点的Span的信息,包括子节点的SpanId,调用子节点得到的HTTP状态码和调用耗时等。

既然确定了链路日志的格式,现在我们用一个示例demo,来结合链路日志做一个演示说明。示例demo的调用链路如下所示。

假定请求在网络中跑不耗时,clientserver1的应用自身逻辑处理不耗时,那么对于client,打印的链路日志如下。

{
    "traceId": "0001",
    "spanId": "01",
    "parentSpanId": "0",
    "timestamp": "1704038400000",
    "duration": "100",
    "httpCode": "200",
    "host": "192.168.10.1",
    "requestStacks": [
        {
            "subSpanId": "02",
            "subHttpCode": "200",
            "subTimestamp": "1704038400000",
            "subDuration": "40",
            "subHost": "192.168.10.2"
        },
        {
            "subSpanId": "04",
            "subHttpCode": "200",
            "subTimestamp": "1704038400040",
            "subDuration": "60",
            "subHost": "192.168.10.3"
        }
    ]
}

对于server1,打印链路日志如下。

{
    "traceId": "0001",
    "spanId": "02",
    "parentSpanId": "01",
    "timestamp": "1704038400000",
    "duration": "40",
    "httpCode": "200",
    "host": "192.168.10.2",
    "requestStacks": [
        {
            "subSpanId": "03",
            "subHttpCode": "200",
            "subTimestamp": "1704038400000",
            "subDuration": "40",
            "subHost": "192.168.10.4"
        }
    ]
}

对于server2,打印链路日志如下。

{
    "traceId": "0001",
    "spanId": "04",
    "parentSpanId": "01",
    "timestamp": "1704038400040",
    "duration": "60",
    "httpCode": "200",
    "host": "192.168.10.3",
    "requestStacks": []
}

对于server3,打印链路日志如下。

{
    "traceId": "0001",
    "spanId": "03",
    "parentSpanId": "02",
    "timestamp": "1704038400000",
    "duration": "40",
    "httpCode": "200",
    "host": "192.168.10.4",
    "requestStacks": []
}

总结

其实打印链路日志,其核心目的就是记录每个SpantraceIdspanIdparentSpanId,通过这三个字段信息,就可以拼接出一条链路。此外,还可以根据实际的需求添加一些额外字段,例如和时间相关的durationtimestamp,这两个字段能够帮助排查链路中的耗时情况。
原文:https://juejin.cn/post/7331959792787079177

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

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

相关文章

揭秘全网热门话题:抖音快速涨粉方法,巨量千川投流助你日增10000粉

在当今社交媒体的时代( 千川投流:hzzxar)抖音成为了年轻人分享自己才华和生活的平台。然而,要在抖音上快速获得关注和粉丝,却不是一件容易的事情。今天,我们将揭秘全网都在搜索的抖音快速涨1000粉的秘籍,带…

彩色 Bitmap转换HObject图像

彩色 Bitmap转换HObject图像 之前已有的代码是这样的 public static HImage Bitmap2HImage_24(Bitmap bImage){lock (m_lock){Bitmap bImage24;BitmapData bmData null;Rectangle rect;IntPtr pBitmap;IntPtr pPixels;HImage hImage new HImage();rect new Rectangle(0, 0,…

搭建Springboot的基础开发框架-01

本系列专题虽然是按教学的深度来定稿的,但在项目结构和代码组织方面是按公司系统的要求来书定的。在本章中主要介绍下基础开发框架的功能。后续所有章节的项目全是在本基础框架的基础上演进的。 工程结构介绍 SpringbootSeries:父工程,定义一…

嵌入式RTOS面试题目

用过哪些嵌入式操作系统?使⽤RTOS和裸机代码开发有什么区别(优缺点)? 之前的⼀个项⽬是采⽤裸机代码开发的,写起来还⾏,通过状态机来管理业务逻辑和各种外设。 但是随着外设的增加,任务之间的…

泛域名SSL证书购买攻略!

购买泛域名证书(也称为通配符证书)通常涉及以下几个步骤: 1. 选择证书提供商: 首先,你需要选择一个信誉良好的SSL证书提供商,如 Sectigo、GlobalSign、DigiCert 或者JoySSL。部分云服务提供商如华为云也提供…

windows11获取笔记本电脑电池健康报告

笔记本电脑的电池关系到我们外出时使用的安全,如果电池健康有问题需要及时更换,windows系统提供了检查电池健康度的方法。 1、打开命令行 1)键入 winR 2)键入 cmd 打开命令行。 2、在命令行运行如下指令,生成电池健…

直播产品实习生实习体验报告,笔灵AI生成模版分享

实习体验报告:直播产品实习生 如果有不同的岗位需要写的话可以去笔灵生成一下 网址:https://ibiling.cn/scene/inex?fromcsdnsx 一、实习背景我是XXX,作为一名直播产品实习生,我在XX公司进行了为期X个月的实习。在这段时间里&…

【Java基础】Java异常处理机制超简单的!!

程序在运行时出现的不正常情况 java把程序运行时出现的各种不正常情况提取属性和行为进行描述,从而出现了各种异常类,也就是异常被面向对象了。 异常名称、异常信息、异常发生的位置 Exception in thread "main" java.lang.ArrayIndexOutOf…

Saving Environment to FAT... Card did not respond to voltage select!

在移植uboot到全志H3时,出现了错误: Saving Environment to FAT… Card did not respond to voltage select! 判定与MMC有关。 同时还有报错: Error: ethernet1c30000 address not set. No ethernet found. 查看源码发现这与环境变量有关&am…

01-xss基本原理

核心:攻击的是前端&#xff0c; 一、课程引入 1、开发一个简单的PHP页面&#xff0c;代码如下&#xff1a; <?php // xss 基础演示代码&#xff1a;从浏览器中接受一个URL地址参数名为content if(isset($_GET[content])){$content$_GET[content];echo "你输入的内容…

LeetCode 每日一题 Day 144-157

2385. 感染二叉树需要的总时间 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟&#xff0c;感染 将会从值为 start 的节点开始爆发。 每分钟&#xff0c;如果节点满足以下全部条件&#xff0c;就会被感染&#xf…

浏览器的使用心得和探索

文章目录 前言一、浏览器二、个人推荐2.1 3602.2 猎豹2.3 火狐2.4 chorme2.5 Opera2.6 QQ浏览器2.7 猫眼&#xff08;Catsxp&#xff09;2.8 edge 三、Browser plugin3.1 AdGuard 广告拦截器3.2 Axure RP 查看器3.3 Edge深度清理者3.4 FeHelper(前端助手)3.5 MarkDownload - Ma…

Echarts之桑基图的配置,带你感受数据流动之美。

一、桑基图的作用 ECharts中的桑基图&#xff08;Sankey diagram&#xff09;是一种用于显示数据流量、能量转移、材料流动等复杂关系的图表类型。它可以反映不同节点之间的流动关系、数量、比例等信息。 桑基图可以用于展示各种复杂的关系&#xff0c;比如流程图、资源分配、…

算法基础01一快速排序,归并排序,二分

一.排序 1.快速 排序 基于分治 确定分界点 左 右 中间 随机划分区间 左半边<x >x在右半边递归处理左右两端 #include<iostream>using namespace std;const int N 1e6 10;int n; int q[N]; void quick_sort(int q[],int l,int r) {if(l>r)return;//边界&…

【微机原理及接口技术】8086/8088系统时序和微机总线

【微机原理及接口技术】8086/8088系统时序和微机总线 文章目录 【微机原理及接口技术】8086/8088系统时序和微机总线前言一、8086/8088引脚信号和工作模式1.8088 的两种组态模式2.最小组态的引脚信号3.最小组态的总线形成4.最大组态的总线形成 二、8086/8088典型时序1.三种周期…

九州金榜|孩子出现焦虑情绪应该怎么家庭教育?

当下社会&#xff0c;生活节奏快&#xff0c;生活压力大&#xff0c;同时孩子学习压力也在加大&#xff0c;这就造成孩子会出现焦虑情绪。那么作为家长&#xff0c;我们不仅仅只关注孩子的身体健康&#xff0c;还要重视孩子心理健康问题。当孩子出现焦虑情绪时&#xff0c;那么…

鞋店小程序商城的作用是什么

鞋与服装一样其购买/复购属性都非常足&#xff0c;每个人生活所需无疑促进了品牌多样化、工厂/店铺商家/个人都有很多&#xff0c;其目的都是为了品牌宣传和将更多货卖给下游/客户。 对消费者来说&#xff0c;买鞋渠道线上线下选择比较多&#xff0c;普遍会以品牌为主&#xf…

Centos7 安装 MySQL5.7 使用 RPM 方式

1 访问网站 https://downloads.mysql.com/archives/community/ 选择合适的版本&#xff0c;点击 Download。 2 上传下载好的 mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar 文件到 Centos7 机器&#xff0c;这里放到了 下载 目录。 3 解压 mysql-5.7.44-1.el7.x86_64.rpm-bundle.…

FileLink跨网文件交换的交换方式:满足不同场景下的文件交换需求

FileLink&#xff0c;作为一款创新的文件交换工具&#xff0c;不仅满足了用户在日常生活中对文件传输的需求&#xff0c;更在技术上实现了跨网文件交换的突破。其独特之处在于支持邮件方式投递、文件中转站、网盘模式共享三种交换方式&#xff0c;这使得FileLink能够适应不同场…

《intel开发手册卷1》学习笔记2

1、栈 堆栈&#xff08;见图 6-1&#xff09;是一个连续的内存位置数组。它包含在一个段中&#xff0c;并由 SS 寄存器中的段选择器标识。使用平面内存模型时&#xff0c;堆栈可以位于程序线性地址空间中的任何位置。堆栈最长可达 4 GB&#xff0c;这是段的最大大小。 使用 P…