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

前言

分布式链路追踪的客户端实现中,我们会通过各种手段和规则得到一个又一个的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.rhkb.cn/news/321684.html

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

相关文章

vue脚手架和vite创建的项目的环境配置

开发环境文件 .env.development NODE_ENV"development" # // 开发接口域名 本地测试就用这个 # vue脚手架创建的 VUE_APP_MODE"开发环境" VUE_APP_API_URL http://19527 # vite创建的 # VITE_MODE"开发环境" # VITE_BASE_URL http://1920:9527…

【自动驾驶|毫米波雷达】初识毫米波雷达射频前端硬件

第一次更新:2024/5/4 目录 整体概述 混频器(MIXER) 低通滤波器(LPF:Low-Pass filter) 数模转换器(ADC:Analog to Digital Converter) 毫米波雷达功能框图 整体概述 完…

开源go实现的iot物联网新基建平台

软件介绍 Magistrala IoT平台是由Abstract Machines公司开发的创新基础设施解决方案,旨在帮助组织和开发者构建安全、可扩展和创新的物联网应用程序。曾经被称为Mainflux的平台,现在已经开源,并在国际物联网领域受到广泛关注。 功能描述 多协…

如何利用AI提高内容生产效率

一:简介 通过AI技术可以在内容生产过程中提升效率和质量,以下是一些方法和应用场景: 1. 自动化内容生成: 自然语言生成(NLG):通过AI技术,可以自动生成文章、报告、产品描述等文…

原型模式类图与代码

现要求实现一个能够自动生成求职简历的程序,简历的基本内容包括求职者的姓名、性别、年龄及工作经历。希望每份简历中的工作经历有所不同,并尽量减少程序中的重复代码。 采用原型模式(Prototype)来实现上述要求,得到如图 7.25 所示的类图。 原…

如何完美解决Outlook大文件传送问题,提升办公协作效率?

在日常工作中,邮件是一种常用的通信方式,经常用来发送各类文件,比如报告和文档、合同和协议、财务报表、营销资料、设计文件等。但有时文件会比较大,因此Outlook大文件传送时,会遇到附件大小受限的情况。常用的解决发送…

Sqlmap的使用

Sqlmap URL 检测 sqlmap直接对单一的url探测,参数使用-u或--url payload:sqlmap -u "http://192.168.10.1/sqlilabs/sqli-labs-php7-master/Less-1/?id1" --banner 注意:如果进入这个页面要先登录那么就需要把cookie带上 sqlm…

【MsSQL】数据库基础 库的基本操作

目录 一,数据库基础 1,什么是数据库 2,主流的数据库 3,连接服务器 4,服务器,数据库,表关系 5,使用案例 二,库的操作 1,创建数据库 2,创建…

【代码分享】使用HTML5的Canvas绘制编码说明图片

最急在工作中遇到一个需求,根据给定的编码生成编码说明,像下面这样的效果。 不同含义的编码用横杠分割,然后每个编码下面用箭头指明具体的含义。下面是我使用canvas实现的代码。具体的编码宽度大家可以根据实际情况进行调整,目前…

未授权访问:Redis未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 4、利用redis未授权写入weshell 5、利用redis未授权反弹shell 6、利用redis未授权实现免密登录 防御手段 从这篇文章开始我就要开始学习各种未授权访问的知识和相关的实操实验了,一共有好多篇,内容主…

Python实现txt转Excel(坐标)

import pandas as pddef txt_to_excel(txt_file, excel_file):# 读取 txt 文件with open(txt_file, r) as f:lines f.readlines()# 将每行数据分割成多个单元格data []for line in lines:row line.strip().split( )data.append(row)# 将数据保存到 Excel 文件df pd.DataFra…

Portforge:一款功能强大的轻量级端口混淆工具

关于Portforge Portforge是一款功能强大的轻量级端口混淆工具,该工具使用Crystal语言开发,可以帮助广大研究人员防止网络映射,这样一来,他人就无法查看到你设备正在运行(或没有运行)的服务和程序了。简而言…

SpringBoot项目配置HTTPS接口的安全访问

参考:https://blog.csdn.net/weixin_45355769/article/details/131727935 安装好openssl后, 创建 D:\certificate CA文件夹下包含: index.txt OpenSSL在创建自签证书时会向该文件里写下索引database.txt OpenSSL会模拟数据库将一些敏感信息…

MacOS快速安装FFmpeg,并使用FFmpeg转换视频

前言:目前正在接入flv视频流,但是没有一个合适的flv视频流地址。网上提供的flv也都不是H264AAC(一种视频和音频编解码器组合),所以想通过fmpeg来将flv文件转换为H264AAC。 一、MacOS环境 博主的MacOS环境(…

机器学习——4.案例: 简单线性回归求解

案例目的 寻找一个良好的函数表达式,该函数表达式能够很好的描述上面数据点的分布,即对上面数据点进行拟合。 求解逻辑步骤 使用Sklearn生成数据集定义线性模型定义损失函数定义优化器定义模型训练方法(正向传播、计算损失、反向传播、梯度清空&#…

vue3+elementPlus:el-input输入框设置数字小数点

<el-input-numberplaceholder"请输入"v-model.number"scope.row.threeValue"class"mx-4":step"0.001" //精度controls-position"right" //幅度/></template> 上一篇文章&#xff0c; vue3echarts&#xff1a;e…

三分钟了解计算机网络核心概念-数据链路层和物理层

计算机网络数据链路层和物理层 节点&#xff1a;一般指链路层协议中的设备。 链路&#xff1a;一般把沿着通信路径连接相邻节点的通信信道称为链路。 MAC 协议&#xff1a;媒体访问控制协议&#xff0c;它规定了帧在链路上传输的规则。 奇偶校验位&#xff1a;一种差错检测方…

淘宝扭蛋机小程序开发:转动幸运,开启无限惊喜

一、探索未知&#xff0c;开启全新扭蛋体验 淘宝扭蛋机小程序&#xff0c;为您带来一场前所未有的扭蛋盛宴。在这个充满神秘与乐趣的平台上&#xff0c;每一次点击都将引领您走进未知的宝藏世界&#xff0c;每一次旋转都可能揭示出意想不到的惊喜。 二、海量商品&#xff0c;…

一个好用的轮子——美丽“表哥”(prettytable)

原文链接&#xff1a;http://www.juzicode.com/python-note-prretytable 在编写命令行程序时如果要输出表格&#xff0c;使用print()函数时通常需要花费大量的精力用在空格符和tab制表符的排版上。 我们先来看个例子&#xff0c;有一个包含3个字段的表格&#xff0c;需要用pri…

面试分享——订单超30分钟未支付自动取消用什么实现?如何使用Redis实现延迟队列?

目录 1.订单超时未支付自动取消&#xff0c;这个你用什么方案实现&#xff1f; 2.如何使用Redis实现延迟队列 2.1实验步骤 2.2实现生产可用的延迟队列还需关注什么 3.总结 电商场景中的问题向来很受面试官的青睐&#xff0c;因为业务场景大家都相对更熟悉&#xff0c;相关…