⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

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

本文主要基于 SkyWalking 3.2.6 正式版


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1. 概述

本文主要分享运维界面的第三部分,链路追踪视角

SkyWalking WEBUI :https://github.com/apache/incubator-skywalking-ui

在我们打开 SkyWalking WEBUI 的 Trace Stack ( trace/trace.html ) 页时,如下图:

基情提示:运维界面相关 HTTP 接口,逻辑简单易懂,笔者写的会比较简略一些。

2. ApplicationsGetHandler

《SkyWalking 源码分析 —— 运维界面(二)之应用实例视角》「3. ApplicationsGetHandler」 相同。

3. SegmentTopGetHandler

org.skywalking.apm.collector.ui.jetty.handler.SegmentTopGetHandler ,实现 JettyHandler 接口,获得 TraceSegment 分页列表的逻辑处理器。

  • #pathSpec() ,路径定义,"/segment/top"
  • 响应示例:
  • #doGet() 方法,代码如下:
    • 第 62 至 73 行:解析 startTimeendTime 参数。
    • 第 75 至 87 行:解析 fromlimit 分页参数。
    • 第 90 至 97 行:解析 minCostmaxCost 参数。
    • 第 100 至 103 行:解析 globalTraceId 参数。
    • 第 106 至 109 行:解析 operationName 参数。
    • 第 112 至 117 行:解析 applicationId 参数。
    • 第 120 至 132 行:解析 error 参数。
    • 第 135 至 141 行:解析 sort 排序参数,倒序。
    • 第 73 行:调用 SegmentTopService#load(...) 方法,,获得 TraceSegment 分页列表。代码如下:
      • 第 59 至 62 行:若存在 globalTraceId 参数,调用 GlobalTraceEsUIDAO#getSegmentIds(globalTraceId) 方法,查询对应的 TraceSegment 编号数组。为什么需要这么查询呢?在下面,我们会看到,实际查询的是 SegmentCost 表,该表不存在 global_trace_id ,所以需要查询到 segment_id 数组,作为查询条件。
      • 第 65 行:调用 SegmentCostEsUIDAO#loadTop(...) 方法,查询 SegmentCost 数组。
      • 第 68 至 77 行:循环 SegmentCost 数组,调用 GlobalTraceEsUIDAO#getGlobalTraceId(segmentId) 方法,获得每个 SegmentCost 对应的 global_trace_id 属性,并设置返回。

4. TraceStackGetHandler

org.skywalking.apm.collector.ui.jetty.handler.TraceStackGetHandler ,实现 JettyHandler 接口,获取一次分布式链路追踪记录详情的逻辑处理器。

  • #pathSpec() ,路径定义,"/traceStack/globalTraceId"
  • 响应示例:
  • #doGet() 方法,代码如下:
    • 第 73 行:调用 TraceStackService#load(globalTraceId) 方法,基 GlobalTraceSegment 表,获取一次分布式链路追踪记录详情的逻辑处理器。逻辑较为繁琐,笔者已经添加注释,胖友调试一下,很容易明白滴。

5. SpanGetHandler

org.skywalking.apm.collector.ui.jetty.handler.SpanGetHandler ,实现 JettyHandler 接口,获得 TraceSegment 单个 Span 详细的逻辑处理器。

  • #pathSpec() ,路径定义,"/span/spanId"
  • 响应示例:
  • #doGet() 方法,代码如下:
    • 第 52 行:解析 segmentId 参数。
    • 第 55 至 62 行:解析 spanId 参数。
    • 第 73 行:调用 SpanService#load(segmentId, spanId) 方法,获得 TraceSegment 单个 Span 详细。代码如下:
      • 第 44 行:调用 SegmentEsUIDAO#load(segmentId) 方法,获得 TraceSegment 。
      • 第 58 至 139 行:循环获得的 TraceSegment 的 Span 数组,找到对应的 Span 记录,设置后返回。

666. 彩蛋

知识星球

水更第三发!

胖友,分享一波朋友圈可好?

文章目录
  1. 1. 1. 概述
  2. 2. 2. ApplicationsGetHandler
  3. 3. 3. SegmentTopGetHandler
  4. 4. 4. TraceStackGetHandler
  5. 5. 5. SpanGetHandler
  6. 6. 666. 彩蛋