分布式链路追踪 SkyWalking 源码分析 —— Agent 发送 Trace 数据

Skywalking Agent配置及使用(2) SkyWalking(SW)服务器部署完成后,需要将微服务的请求链路信息发送到SW服务器上,通过使用SW agent插件完成上传。 部署相关:SkyWalking8安装部署配置 配置 文件准备 将apache-skywalking-apm-bin-es7/agent文件夹拷贝到发布容器中,位置可以根据情况调整。 cp -r ./agent/* /opt/skywalkingAgent 文件说明 config/agent.config:为客户端代理配置文件,可以根据系统情况进行响应调整,这里 阅读详情

点击上方“芋道源码”,选择“设为星标”

做积极的人,而不是积极废人!

源码精品专栏

 

摘要: 原创出处 http://www.iocoder.cn/SkyWalking/agent-send-trace/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 SkyWalking 3.2.6 正式版

  • 1. 概述

  • 2. TraceSegmentServiceClient

    • 2.1 实现 BootService 接口

    • 2.2 实现 GRPCChannelListener 接口

    • 2.3 实现 TracingContextListener 接口

    • 2.4 实现 IConsumer 接口

  • 666. 彩蛋


1. 概述

分布式链路追踪系统,链路的追踪大体流程如下:

  1. Agent 收集 Trace 数据。

  2. Agent 发送 Trace 数据给 Collector 。

  3. Collector 接收 Trace 数据。

  4. Collector 存储 Trace 数据到存储器,例如,数据库。

本文主要分享【第二部分】 SkyWalking Agent 发送 Trace 数据。

考虑到减少外部组件的依赖,Agent 收集到 Trace 数据后,不是写入外部消息队列( 例如,Kafka )或者日志文件,而是 Agent 写入内存消息队列,后台线程【异步】发送给 Collector 。

本文涉及的类非常少,如下图所示:

2. TraceSegmentServiceClient

org.skywalking.apm.agent.core.remote.TraceSegmentServiceClient ,TraceSegment 发送服务客户端。它是一个服务,也是一个客户端,负责将 TraceSegment 异步发送到 Collector 。

我们先来看看 TraceSegmentServiceClient 的属性:

  • TIMEOUT 静态属性,发送等待超时时长,单位:毫秒。

  • lastLogTime 属性,最后打印日志时间。该属性主要用于开发调试。

  • segmentUplinkedCounter 属性,TraceSegment 发送数量。

  • segmentAbandonedCounter 属性,TraceSegment 被丢弃数量。在 Agent 未连接上 Collector 时,产生的 TraceSegment 将被丢弃。

  • carrier 属性,内存队列。在 《SkyWalking 源码分析 —— DataCarrier 异步处理库》 有对 DataCarrier 的详细解析。

  • serviceStub 属性,非阻塞 Stub 。

  • status 属性,连接状态。

下面,我们来介绍 TraceSegmentServiceClient 实现的接口以及对应的方法。

2.1 实现 BootService 接口

#beforeBoot() 方法,代码如下:

  • 第 86 行:调用 GRPCChannelManager#addChannelListener(this) 方法,将自己添加到 GRPCChannelManager 中,作为一个监听器,从而调用 #statusChanged(GRPCChannelStatus) 方法,实现对连接状态( status )的监听处理。

#boot() 方法,代码如下:

  • 第 95 至 97 行:创建 DataCarrier 对象,作为内存队列,并设置自己作为消费者,从而调用 #consume(List<TraceSegment> ) 方法,实现异步发送 TraceSegment 到 Collector 。

#afterBoot() 方法,代码如下:

  • 第 102 行:调用 TracingContext.ListenerManager#add(this) 方法,将自己添加到 ListenerManager 中,作为一个监听器,从而调用 #afterFinished(TraceSegment) 方法,实现收集到新的 TraceSegment ,添加到内存队列。

#shutdown() 方法,代码如下:

  • 第 107 行:调用 DataCarrier#shutdownConsumers() 方法,停止消费。

2.2 实现 GRPCChannelListener 接口

#statusChanged(GRPCChannelStatus) 方法,代码如下:

  • 第 211 至 214 行:连接成功,创建 Stub 对象。

  • 第 215 行:记录连接状态。

2.3 实现 TracingContextListener 接口

#afterFinished(TraceSegment) 方法,代码如下:

  • 第 197 至 199 行:当 TraceSegment.ignore = true 时,忽略该 TraceSegment 。

  • 第 201 行:提交 TraceSegment 到内存队列。

2.4 实现 IConsumer 接口

#consume(List<TraceSegment>) 方法,代码如下:

  • ------ 连接中 ------

  • 第 119 行:创建 org.skywalking.apm.agent.core.remote。GRPCStreamServiceStatus 对象。

  • 第 122 至 141 行:创建 StreamObserver 对象。在下面,我们可以看到 Agent 发送 TraceSegment 给 Collector 是非阻塞的方式,通过该对象,观察执行结果。

    • 第 130 行 || 第 139 行:当发生错误或者完成时,调用 GRPCStreamServiceStatus#finished() 方法,标记完成。为什么呢?下面会看到。

    • 第 134 行:调用 GRPCChannelManager#reportError(Throwable) 方法,汇报错误。如果是连接错误,GRPCChannelManager 会负责断开重连。

  • 第 144 至 151 行:逐条非阻塞发送 TraceSegment 请求。

    • 注意,此处若等待完成超时,TraceSegment 依然在发送,或者被 Collector 处理中,直到最终的成功或失败。

    • DistributedTraceId#toUniqueId()

    • ID#transform()

    • AbstractTracingSpan#transform()

    • ExitSpan#transform()

    • LogDataEntity#transform()

    • TraceSegmentRef#transform()

    • KeyValuePair#transform()

    • 第 146 行:调用 TraceSegment#transform() 方法,将 TraceSegment 转换成 org.skywalking.apm.network.proto.UpstreamSegment 对象,用于 gRPC 传输,参见 TraceSegmentService.proto 的数据结构定义。

    • 第 154 行:调用 StreamObserver#onCompleted() 方法,标记全部请求发送完成。

    • 第 157 至 159 行:调用 GRPCStreamServiceStatus#wait4Finish(maxTimeout) 方法,等待 Collector 处理完成。这就是为什么上面需要调用 GRPCStreamServiceStatus#finished() 方法。完成后,记录数量到 segmentUplinkedCounter 。

  • ------ 未连接 ------

  • 第 161 行:记录数量到 segmentAbandonedCounter 。

  • ------ ALL ------

  • 调用 #printUplinkStatus() 方法,每三十秒,打印一次 segmentUplinkedCounter 和 segmentAbandonedCounter 数据。主要用于开发调试。另外,该方法会重置 segmentUplinkedCounter 和 segmentAbandonedCounter 计数。

ps:目前 DataCarrier 最长每 20 秒消费一次。

#onError(List<TraceSegment>, Throwable) 方法,当消费发生异常时,打印日志。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:


最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、Elasticsearch、分库分表、读写分离、SpringMVC、SpringWebflux、WebSocket、性能测试等等内容。

提供近 2W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

如果你喜欢这篇文章,喜欢,转发。

生活很美好,明天见(。・ω・。)ノ♡

分布式链路追踪 SkyWalking 源码分析 —— Agent 收集 Trace 数据 点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析... 阅读详情

相关推荐

分布式追踪 SkyWalking 源码分析四 Agent 收集 && 发送 trace数据

分布式链路追踪系统,链路的追踪大体流程如下: Agent 收集 Trace 数据。 Agent 发送 Trace 数据给 Collector 。 Collector 接收 Trace 数据。 Collector 存储 Trace 数据到存储器,例如,数据库。 org.skywalking.apm.agent.core.context.trace.TraceSegment,是一次分布式链路...

郭传志的博客 1237

Skywalking Illegal character in hostname at index

ERROR 2020-07-02 14:04:09:379 SkywalkingAgent-5-GRPCChannelManager-0 GRPCChannelManager : Create channel to apm-skywalking_oap:11800 fail. java.lang.IllegalArgumentException: Invalid host or port: apm-skywalking_oap 11800 at org.apache.skywalking.

t0m的专栏 980

分布式追踪 SkyWalking 源码分析六 Collector 接收和发送 trace 数据

分布式链路追踪系统,链路的追踪大体流程如下: Agent 收集 Trace 数据。 Agent 发送 Trace 数据给 Collector 。 Collector 接收 Trace 数据。 Collector 存储 Trace 数据到存储器,例如,数据库。 Collector 接收到 TraceSegment 数据后,进行构建。 【蓝色流程】构建成功,进行流式处理,最终存储到存储器...

郭传志的博客 701

springboot项目启动使用java-agent注册到skywalking失败.GRPCChannelManager:Create channel to fail.

部署完skywalking之后,准备启动一个springboot项目,将其注册到skywalking进行调用链监控。表示skywalking收集数据的地址,该值配置。项目能正常启动,但是在skywalking页面。在springboot项目启动的参数配置里面,查看java-agent的日志(

qq_44209563的博客 1870

别再折腾SNAP了!ENVI 5.6.0 直接拖拽打开Sentinel-2 L2A数据的正确姿势

本文详细介绍了ENVI 5.6.0直接处理Sentinel-2 L2A数据的高效方法,无需通过SNAP进行繁琐的重采样预处理。通过直接拖拽XML文件,用户可以快速加载不同分辨率的波段数据,显著提升工作效率。文章还对比了直接打开与SNAP重采样流程的优劣,并提供了常见问题解决方案和高级应用技巧。

weixin_30296405的博客 635

【人工智能】你知道什么是DeepSeek吗?你有去了解过DeepSeek吗?新手要入门DeepSeek的必经之路——初识DeepSeek

【人工智能】初识DeepSeek 详细介绍DeepSeek以及DeepSeek-R1

蒙奇D索大的博客 3377

SkyWalking8.7源码解析(四):服务GRPCChannelManager、ServiceManagementClient、CommandService、SamplingService

14、服务-GRPCChannelManager org.apache.skywalking.apm.agent.core.boot.BootService是SkyWalking Agent中所有服务的顶层接口,这个接口定义了一个服务的生命周期,分为prepare、boot、onComplete、shutdown四个阶段 public interface BootService { /** * 准备阶段 * * @throws Throwable */

hxt的博客 3182

YOLOv8改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 1082

Agent-Trace: 揭开 AI Agent 对话的神秘面纱

Agent-Trace 是一个基于 Flask 开发的 AI 对话日志记录和追踪系统。透明代理:拦截并转发所有 AI API 请求完整记录:保存每次对话的请求和响应详情实时查看:提供友好的 Web 界面浏览对话历史双格式支持:同时支持 OpenAI 和 Anthropic API 格式流式处理:完美支持流式和非流式请求简单来说,它就像是一个"监控摄像头",能够记录下 Agent 与 AI 模型之间的所有交互细节。

fw6669998的博客 864

Unity 热更 之 【YooAsset 热更】几分钟快速了解 YooAsset [功能面板]、以及 [基础代码] 说明

Unity 的资源管理系统不断发展,以适应不同项目的需求和解决特定的问题。AssetBundle 和 Addressable Asset System 是 Unity 官方提供的资源管理解决方案,而 YooAsset 是第三方提供的资源管理系统。简化的API和易用性YooAsset 可能提供了更简单直观的 API,使得资源加载和管理更加容易。对于不熟悉 Addressable 或 AssetBundle 复杂配置的开发者来说,YooAsset 可能是一个更易于上手的选择。性能优化。

仙魁XAN 2956

Open3D (C++) 点云边界提取【2025最新版】

Compute the boundary points of a point cloud.The implementation is inspired by the PCL implementation. Reference:https://pointclouds.org/documentation/classpcl_1_1_boundary_estimation.html

点云侠的博客 871

skywalking原理_分布式链路追踪 SkyWalking 源码分析 —— Agent 发送 Trace 数据

摘要: 原创出处 http://www.iocoder.cn/SkyWalking/agent-send-trace/ 「芋道源码」欢迎转载,保留摘要,谢谢!本文主要基于 SkyWalking 3.2.6 正式版1. 概述2. TraceSegmentServiceClient2.1 实现 BootService 接口2.2 实现 GRPCChannelListener 接口2.3 实现 Trac...

weixin_39845220的博客 433

【RT-DETR实战】RT-DETR实战手记(200):端侧实时目标检测,下一步往哪儿走?

昨天深夜调一个模型部署,在树莓派4B上跑RT-DETR-nano,帧率死活卡在8FPS上不去。量化也做了,算子也优化了,内存对齐也检查了,可就是离实时检测的底线还差一截。盯着终端里跳动的数字,突然意识到——我们可能正在接近当前技术路径的瓶颈。端侧实时目标检测的下一个突破口,恐怕不在现有框架的修修补补里。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 186

skywalking使用方法_分布式链路追踪 SkyWalking 源码分析——Agent 收集Trace数据

本文主要基于 SkyWalking 3.2.6 正式版1. 概述2. Trace2.1 ID2.2 AbstractSpan2.3 TraceSegmentRef2.4 TraceSegment3. Context3.1 ContextManager3.2 AbstractTracerContext3.3 SamplingService1. 概述分布式链路追踪系统,链路的追踪大体流程如下:Agen...

weixin_39637256的博客 1186

Qt Android MySql 数据库驱动编译(详细图解步骤)

第一步.先介绍下环境搭建: Qt 版本 5.12.11 下载链接 https://download.qt.io/archive/qt/5.12/5.12.11/qt-opensource-linux-x64-5.12.11.run Ubuntu 18.04.6 LTS 下载链接 JDK版本 1.8.0_191 下载链接https://www.oracle.com/java/technologies/downloads/ Android Studio版本 ...

h a 6 6 6 c k 为 你解决复杂难题! 3381

ETAS工具导入Com Arxml修改步骤

通讯协议栈开发一般通过导入DBC实现,ETAS工具本身导入DBC也是生成arxml后执行cfggen,本文介绍直接导入客户提供的arxml文件,实现通讯协议栈的生成。通过Arxml导入相比于DBC来说,少了从DBC转为arxml的过程。而且arxml中能提供的信息也会更多。如果是DBC的话,很多信息(如PNC的映射,CANTP的配置等)都需要额外配置。不过还有连DBC都无法提供的,那就更麻烦了~

赞的博客 1541

SkyWalking 源码分析 —— Agent 发送 Trace 数据

1. 概述 分布式链路追踪系统,链路的追踪大体流程如下: Agent 收集 Trace 数据。 Agent 发送 Trace 数据给 Collector。 Collector 接收 Trace 数据。 Collector 存储 Trace 数据到存储器,例如,数据库。 本文主要分享【第二部分】SkyWalking Agent 发送 Trace 数据。 考虑到减少外部组件的依赖,Agent 收集到 Trace 数据后,不是写入外部消息队列( 例如,Kafka )或者日志文件,而是 Agent ..

weixin_42073629的博客 968

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

skywalking使用方法_分布式链路追踪 SkyWalking 源码分析 —— Agent 收集Trace数据

摘要: 原创出处 http://www.iocoder.cn/SkyWalking/agent-collect-trace/ 「芋道源码」欢迎转载,保留摘要,谢谢!本文主要基于 SkyWalking 3.2.6 正式版1. 概述2. Trace2.1 ID2.2 AbstractSpan2.3 TraceSegmentRef2.4 TraceSegment3. Context3.1 Context...

weixin_39583623的博客 1415

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SkyWalking 源码分析 —— Agent 收集 Trace 数据

1. 概述 分布式链路追踪系统,链路的追踪大体流程如下: Agent 收集 Trace 数据。 Agent 发送 Trace 数据给 Collector 。 Collector 接收 Trace 数据。 Collector 存储 Trace 数据到存储器,例如,数据库。 本文主要分享【第一部分】SkyWalking Agent 收集 Trace 数据。文章的内容顺序如下: Trace 的数据结构 Context 收集 Trace 的方法 不包括插件对 Context 收集的方法的调用,后续单.

weixin_42073629的博客 780

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

skywalking源码分析第十一篇一server-receiver-plugin之trace链路追踪插件模块启动

文章目录Trace模块原理图二级目录三级目录 Trace模块原理图 二级目录 三级目录

小麒麟的博客 1188

Logback集成SkyWalking Trace ID:实现分布式链路日志追踪

在微服务架构中,分布式链路追踪是解决跨服务调用问题排查的关键技术。其核心原理是为每个请求生成全局唯一的Trace ID,并通过线程上下文在服务间传递,从而将分散的日志串联成完整的执行链路。这项技术的核心价值在于极大提升了复杂分布式系统的可观测性与故障定位效率,广泛应用于微服务监控、性能分析和日志聚合等场景。本文聚焦于如何将Apache SkyWalking生成的Trace ID无缝集成到Logback日志框架中,通过自定义Converter实现日志自动标记,并结合SkyWalking Agent的无侵入字节

weixin_33951761的博客 412

从 agent.config 到 ES:拆解 SkyWalking 数据流动的每一步(附源码 + 实验)

文章摘要: 本文深入解析了SkyWalking全链路监控系统的数据流动过程,通过实验验证了从Agent采集到Elasticsearch存储的完整链路。主要内容包括: 搭建了一个由三个Spring Boot服务组成的Demo环境,演示了请求从网关到后端服务的完整调用链路追踪过程。 详细拆解了SkyWalking三大组件(Agent、OAP、UI)的协同工作原理,包括通信协议和端口分工。 通过七项实验验证了数据采集→传输→解析→存储→查询→展示的全流程透明性,确认了系统可靠性和可扩展性。

qq_59357573的博客 603

Node.js躬行记(30)——SkyWalking使用和排查分析

SkyWalking支持自动埋点和手动埋点,自动埋点只要初始化后,就可以开始工作,很便捷。下载 SkyWalking Node.js Agent在项目的 app.js 中配置和启用 SkyWalking。});

jhasjfhgasjkh的博客 613

ai-agent框架spring ai/alibaba原理源码分析(八)观测I 观测组件,观测技术架构

本文深入剖析了SpringAIAlibaba(SAA)框架的观测系统实现原理。作为Java AI Agent框架,SAA基于micrometer-observation构建了一套完整的可观测性架构,通过Observation核心组件实现业务代码与监控后端的解耦。技术架构包含三层:观测抽象层(Observation/Handler)、桥接层(OpenTelemetry适配)和平台层(Langfuse集成)。重点分析了tracing和metering的实现机制,包括自动配置流程、观测生命周期管理以及低/高基数标

leehom的博客 320

AI Agent 调试实战:链路追踪、Prompt 可视化与异常定位的系统方法

Agent 调试的核心是全链路可观测。通过 Span 记录每步操作的输入、输出、耗时和状态,构建完整的 Trace 轨迹。异常检测自动识别循环调用、工具失败、Token 消耗异常等常见问题。诊断报告提供问题定位和修复建议。Trace 的存储成本需要通过保留策略控制,敏感数据必须脱敏。LLM 的随机性通过固定温度参数和 seed 来缓解。调试不是事后补救,而是 Agent 系统的基础设施——没有可观测性的 Agent 在生产环境中就是黑盒。

好代码自己会说话,烂代码才需要注释来圆谎 2700
上一篇: Flink Forward Asia 2019 - 总结和展望(附PPT下载链接)
下一篇: 微服务架构,如何做分布式,通用缓存机制?
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值