Opentracing概念介绍——Span

文章首发公众号:海天二路搬砖工

引言

作为分布式跟踪系统的标准化API,OpenTracing提供了一种通用的方式来追踪和分析分布式系统中的请求和操作。

在Opentracing中,Span是基本的跟踪单元,用于描述在分布式系统中的一个操作或事件。通过收集和分析Span数据,我们可以更好地理解和优化分布式系统的性能和可靠性。

文中将深入探讨Opentracing中的Span,包括Span的定义、结构体、属性、操作、上下文等方面的内容。帮助读者更好地理解和应用Opentracing。

Span的简介

在OpenTracing中,跟踪数据通常由许多小的跨度(Span)组成 。 Span代表应用程序处理过程中的某个操作,例如 SQL 查询、HTTP 接口调用或函数调用等。每个Span都有一个开始时间和结束时间,并记录了其他元数据,例如跨度所属的节点、跨度的父子关系、错误信息和跨度的标签等。

Span的作用

Span作为分布式跟踪系统中的基本跟踪单元,具有以下作用:

  1. 追踪请求路径:在分布式系统中,一个请求通常会经过多个服务和组件,Span可以用于追踪请求在分布式系统中的路径。
  2. 监控系统状态:Span可以用于记录分布式系统中的事件和状态变化,例如服务调用、数据库查询、HTTP请求等。
  3. 分析性能指标:Span可以记录请求在分布式系统中的耗时和性能指标,例如响应时间、吞吐量、错误率等。
  4. 建立关联关系:Span可以用于建立Span之间的关联关系,例如父子关系、兄弟关系等,从而更好地理解和分析分布式系统中的请求和操作。

Tracer中的Span

Span是OpenTracing中具有开始时间和执行时长的逻辑运行单元。一条完整的追踪链可能包含多个span。 span之间通过嵌套或者顺序排列建立逻辑因果关系。

从继承维度看,一个Tracer的span一般如下图所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从时间维度看,上面的Tracer的span的生命周期如下图所示

在这里插入图片描述

Span的基本属性

在OpenTracing中,Span对象具有以下几个基本属性:

  1. Operation Name(操作名称):指Span正在干什么的简短、描述性的名称。例如,"get_users"或"place_order"等。
  2. Start Time(开始时间)和Finish Time(完成时间):表示Span的开始和结束时间,用于确定Span的执行时间。Start Time和Finish Time以Unix时间戳形式存储。
  3. Duration(执行时间):Span执行所需的时间长度。Duraction可以通过Start Time和Finish Time计算得到。
  4. Parent Span ID(父Span ID)和Span ID(Span ID):分别表示Span在调用链路中的相对位置和唯一标识符。一个Span的Span ID是唯一的,而Parent Span ID则表示Span在调用链路中的父Span的Span ID。
  5. Tags(标签):可用于添加关于Span的元数据,例如Span所执行操作的请求方法、响应状态码、HTTP请求路径等。
  6. Logs(日志):可用于记录Span对象执行期间出现的某些动作和状态,例如某个操作的输入、输出等信息。

Span的上下文信息

在OpenTracing中,Span的上下文可以包括以下信息:

  • Trace ID:表示跟踪的唯一标识符,重新启动或创建的一系列Span将共享该值。
  • Parent Span ID:表示父Span的唯一标识符。
  • Span ID:表示Span的唯一标识符。

通过Span的上下文,我们可以了解Span在调用链中的位置、关系以及它们之间传递的上下文数据,以便更好地了解操作执行过程和状态,并能够快速排除分布式系统中的性能和问题。

Span的结构体

在Opentracing中,Span通常被表示为一个结构体,包含了Span的各种元数据和属性。

Span的结构体在不同的语言和实现中可能会有所不同,但是大致的结构和属性应该是类似的。

type Span struct {
	SpanContext   SpanContext				// Span的上下文信息,包括Trace ID、Span ID、Trace Flags等。
	OperationName string					// Span的名称,用于标识Span所代表的操作或事件。
	StartTime     time.Time					// Span的开始时间。
	Duration      time.Duration 			// Span的持续时间。
	Tags          map[string]interface{}	// Span的标签和附加信息等。
	Logs          []LogRecord				// Span的日志和事件,用于记录Span上发生的事件和状态变化等。
	References    []SpanReference			// Span的引用,用于建立Span之间的关联关系。
	Tracer        Tracer 					// 创建该Span的Tracer对象。
}

Span的常见操作

Span的开始和结束

Span可以分为两个阶段:开始()和结束()。我们可以调用start_span()函数创建一个新的Span,并使用finish()函数来标记Span的完成。Span的开始和结束对于我们跟踪分布式系统中的操作的执行时间和路径非常重要。

Span的日志和标记

在Span对象上添加日志和标记的功能是OpenTracing的一项重要特性。Span的标记通常是键值对,用于记录元数据。我们可以使用Span对象上的set_tag()方法来为Span添加标记。Span的日志通常是与Span所代表的事物的相关事件,例如记录SQL查询中的参数等。我们可以使用Span对象上的log()方法来记录关于Span的这些事件。

Span的嵌套和链接

有时,我们需要对操作进行更详细的跟踪。通过嵌套和链接Span对象,我们可以更好的跟踪分布式系统的操作执行路径。嵌套的Span表示一个操作的详细过程,其开始和结束都在外部Span开始和结束与之相关联。而Linked Span是一种用于表示两个Span对象之间的关系,例如父Span和子Span之间的关系。Linked Span可以通过在创建Span对象时引用旧的Span ID或创建一个新的Span ID来实现。

其他操作

  • 设置Span的名称

    Span的名称表示它正在记录的事件的名称和类型。我们在创建Span对象时可以指定Span的名称。

  • 设置Span的时间戳

    OpenTracing允许我们手动设置Span的开始和结束时间戳,以便记录分布式系统中的常见情况。

  • 设置Span的上下文

    我们可以使用Span对象上的set_()方法来设置Span对象的上下文,例如Span对象在哪个线程中执行。

总结

OpenTracing是一个用于在分布式系统中跟踪代码路径的工具。在OpenTracing中,Span是一个核心概念,代表分布式操作和服务调用的执行路径。Span的开始和结束、日志和标记、嵌套和链接是常见的Span操作,用于帮助我们更完整地记录Span对象的上下文,以便于进行应用程序的调试、排错和优化。Span的上下文信息、基本属性、结构体和常用操作等是掌握OpenTracing跟踪分布式系统的重要概念。

公众号

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLO目标检测——红花数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:红花检测数据集可以用于监测和分析红花的生长情况,包括生长速度、叶面积、花朵数量等,为农民提供精确的决策支持,以提高红花产量和品质。数据集说明:红花检测数据集,真实场景的高质量图片数据…

长江存储诉讼镁光侵权的8个专利是什么?

1.事件背景回顾 据《环球时报》周日从美国加州北区地方法院官方网站获悉,中国领先的存储芯片生产商长江存储科技股份有限公司(YMTC)周四对美国美光科技及其全资子公司美光消费品集团提起诉讼,指控其侵犯了长江存储的八项专利。 …

ObRegisterCallbacks()返回0xC0000022(拒绝访问)解决办法

在开发测试环境下,没有打签名的驱动调用ObRegisterCallbacks会返回0xC0000022(拒绝访问)的错误码。这是由于该函数内部会进行驱动的签名校验。 具体位置在 因此可以用以下代码绕过该检查 // 以下代码放在DriverEntry中 ULONG_PTR pDrvSectio…

基于servlet+jsp+mysql网上书店系统

基于servletjspmysql网上书店系统 一、系统介绍二、功能展示四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型:Java web项目 项目名称:基于servletjspmysql网上书店系统 项目架构:B/S架构 开发语言:Java语言 前端技…

csdn2023必看系列:最牛最全面的JMeter实现接口自动化测试教程

【文章末尾给大家留下了大量的福利哦】 一、JMETER的环境搭建 参考:https://www.cnblogs.com/qmfsun/p/4902534.html 二、JMETER的汉化 临时汉化方法:打开jmeter,options-->choose language-->选择语言 可以根据自己的需要选择简体…

基于SSM的“镜头人生”约拍网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:JSP 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

【OS】操作系统课程笔记 第七章 内存管理

目录 7.1 内存管理的功能 7.1.1 内存分配 7.1.2 地址转换 1. 空间的概念 2. 地址转换 7.1.3 存储保护 7.1.4 存储共享 7.1.5 存储扩充 7.2 程序的链接和加载 7.2.1 程序的链接 链接的分类 7.2.2 程序的加载 1. 加载器的功能 2. 装入方式分类 7.3 连续分配方式 7.…

Unity性能优化分析篇

性能优化是游戏项目开发中一个重要环节。游戏帧率过低,手机发烫, 包体太大,低端机上跑不起来等, 这些都需要来做优化,不管过去,现在,未来,性能优化都是永恒的话题。 而性能优化首先要掌握的是性…

Linux C 进程编程

进程编程 进程介绍进程的定义进程和线程以及程序的区别进程块PCB进程的状态相关指令 进程调度算法先来先服务调度算法 FCFS短作业(进程)优先调度算法 SJF优先权调度算法 FPF优先权调度算法的类型非抢占式优先权算法抢占式优先权算法 优先权类型静态优先权动态优先权 高响应比优…

接口测试--知识问答

1 做接口测试当请求参数多时tps下降明显,此接口根据参数从redis中获取数据,每个参数与redis交互一次,当一组参数是tps5133,五组参数是tps1169,多次交互影响了处理性能,请详细阐述如何改进增进效果的方案。 …

酷柚易汛ERP - 序列号状态表操作指南

1、应用场景 序列表状态表统计商品的每个序列号目前的状态(在库、已出库),每个序列号仅会显示一条记录。 2、主要操作 打开【仓库】-【序列号状态表】,可勾选序列号在库/已出库两种状态查询,其它筛选操作与上文其它…

垃圾/垃圾桶识别相关开源数据集汇总

垃圾箱图片数据集 数据集下载链接:http://suo.nz/3cvbiC 垃圾箱多类检测数据集 数据集下载链接:http://suo.nz/2eluH3 蒙得维亚的垃圾箱图片 数据集下载链接:http://suo.nz/2lRHLK 垃圾桶满溢检测数据集 数据集下载链接:http:…

【HttpRunner】接口自动化测试框架

简介 2018年python开发者大会上,了解到HttpRuuner开源自动化测试框架,采用YAML/JSON格式管理用例,能录制和转换生成用例功能,充分做到用例与测试代码分离,相比excel维护测试场景数据更加简洁。在此,利用业余…

filte(过滤数组)

根据条件,保留满足条件的对应项,得到一个新数组

关于我在配置zookeeper出现,启动成功,进程存在,但是查看状态却没有出现Mode:xxxxx的问题和我的解决方案

在我输入:zkServer.sh status 之后出现报错码. 报错码: ZooKeeper JMX enabled by default Using config: /opt/software/zookeeper/bin/../conf/zoo.cfgClient port found: 2181. Client address: localhost. Error contacting service. It is probably not runni…

11.读取文件长度-fseek和ftell函数的使用

文章目录 简介1. 写入测试文件2. 读取文件长度 简介 主要讲使用fopen读取文件,配合使用fseek和ftell来读取文件长度。1. 写入测试文件 执行下方程序,使用fwrite函数写入40字节的数据,使其形成文件存入本地目录。#define _CRT_SECURE_NO_WARNI…

【SpringBoot】SpringBoot自动配置底层源码解析

概述 EnableAutoConfiguration源码解析SpringBoot常用条件注解源码解析SpringBoot之Mybatis自动配置源码解析SpringBoot之AOP自动配置源码解析SpringBoot Jar包启动过程源码解析 DeferredImportSelector接口 DeferredImportSelector和ImportSelector的区别在于: …

Leetcode—202.快乐数【简单】

2023每日刷题(二十八) Leetcode—202.快乐数 快慢指针思想 通过手玩2,可以发现 会走入一个循环,并且fast和slow会在一个数字相遇,以下也大概花了一下推倒出来了。如果slow不是因为1和fast相等的,就说明它…

Nginx的安装

Nginx的安装 Windows下Nginx的安装 1、下载nginx 下载稳定版本: http://nginx.org/en/download.html 直接下载 nginx-1.20.0.zip : http://nginx.org/download/nginx-1.20.0.zip 下载后解压,解压后如下: 2、启动Nginx 有很多种方法启动nginx (…

如何准确分析需求

业务驱动的需求思想 要做好软件需求工作,业务驱动需求思想是核心。传统的需求分析是站在技术视角展开的,关注的是“方案级需求”;而业务驱动的需求思想则是站在用户视角展开的,关注的是“问题级需求”。 变更/优化型需求分析任务…