Sleuth

Sleuth源码解析 一、概念介绍 先说几个概念。 span:span是sleuth中最基本的工作单元,一个微服务收到请求后会创建一个span同时产生一个span id,span id是一个64位的随机数,sleuth将其转化为16进制的字符串,打印在日志里面。其对应的实现类是RealSpan。 trace id:在一个调用链条中,trace id是始终不变的,每经过一个微服务span id生成一个新的,所以通过trace id可以找出调用链上所有经过的微服务。trace id默认是64位,可以通过spring.sleuth.t 阅读详情

原理介绍

Sleuth通过Trace定义一次业务调用链,根据它的信息,我们就知道多少个系统参与了该业务处理。
Span用来记录系统间的调用顺序和时间戳信息。
Trace和Span的信息经过整合,就能知道该业务的完整调用链。

Brave和Zipkin

Brave是一个用于捕捉分布式系统之间调用信息的工具库,然后将这些信息以Span的形式发送给Zipkin。
参考:https://github.com/openzipkin/brave

从2.0.0版本开始,Sleuth不再自己存储上下文信息,而是使用Brave作为调用链工具库,并且遵循Brave的命名和标记惯例。

如果你想延用老版本的使用方式,可以配置spring.sleuth.http.legacy.enabled=true。

Zipkin是一个基于Google Dapper论文设计的分布式跟踪系统,它收集系统的延时数据并提供展示界面,以便用户排查问题。
参考:https://github.com/openzipkin/zipkin

Zipkin启动方式

  • java -jar zipkin.jar
  • 还支持源码部署和Docker镜像启动。
  • Zipkin支持各种持久化方式,默认存储在内存中
  • 部署后,默认的启动端口位9411,http://localhost:9411/

使用

引入spring-cloud-starter-sleuth依赖之后,我们的日志组件可以自动打印Span信息。可以随着feign、restTemplate往服务端传递,也可以在父子线程间传递。

依赖

<!--sleuth-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

<!--openfeign-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>


<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

Sleuth对feign的支持

  • Feign提供了feign.Client接口以便开发者自定义远程调用功能。
  • Sleuth使用了TracingFeignClient实现Feign接口,在Http调用前,在Header中添加Span信息。
public Response execute(Request request, Options options) throws IOException {
    Map<String, Collection<String>> headers = new HashMap(request.headers());
    Span span = this.handleSend(headers, request, (Span)null);
    if (log.isDebugEnabled()) {
        log.debug("Handled send of " + span);
    }

    Response response = null;
    IOException error = null;

    Object var9;
    try {
        SpanInScope ws = this.tracer.withSpanInScope(span);
        Throwable var8 = null;

        try {
            var9 = response = this.delegate.execute(this.modifiedRequest(request, headers), options);
        } catch (Throwable var27) {
            var9 = var27;
            var8 = var27;
            throw var27;
        } finally {
            if (ws != null) {
                if (var8 != null) {
                    try {
                        ws.close();
                    } catch (Throwable var26) {
                        var8.addSuppressed(var26);
                    }
                } else {
                    ws.close();
                }
            }

        }
    } catch (RuntimeException | Error | IOException var29) {
        error = var29;
        throw var29;
    } finally {
        this.handleReceive(span, response, error);
        if (log.isDebugEnabled()) {
            log.debug("Handled receive of " + span);
        }

    }

    return (Response)var9;
}

Sleuth对RestTemplate的支持

对RestTemplate的支持并不是临时初始化的,需要将RestTemplate注册成一个Bean。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package brave.spring.web;

import brave.Span;
import brave.Tracer;
import brave.Tracing;
import brave.Tracer.SpanInScope;
import brave.http.HttpClientAdapter;
import brave.http.HttpClientHandler;
import brave.http.HttpTracing;
import brave.propagation.Propagation.Setter;
import brave.propagation.TraceContext.Injector;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;

public final class TracingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
    static final Setter<HttpHeaders, String> SETTER = new Setter<HttpHeaders, String>() {
        public void put(HttpHeaders carrier, String key, String value) {
            carrier.set(key, value);
        }

        public String toString() {
            return "HttpHeaders::set";
        }
    };
    final Tracer tracer;
    final HttpClientHandler<HttpRequest, ClientHttpResponse> handler;
    final Injector<HttpHeaders> injector;

    public static ClientHttpRequestInterceptor create(Tracing tracing) {
        return create(HttpTracing.create(tracing));
    }

    public static ClientHttpRequestInterceptor create(HttpTracing httpTracing) {
        return new TracingClientHttpRequestInterceptor(httpTracing);
    }

    @Autowired
    TracingClientHttpRequestInterceptor(HttpTracing httpTracing) {
        this.tracer = httpTracing.tracing().tracer();
        this.handler = HttpClientHandler.create(httpTracing, new TracingClientHttpRequestInterceptor.HttpAdapter());
        this.injector = httpTracing.tracing().propagation().injector(SETTER);
    }

    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        Span span = this.handler.handleSend(this.injector, request.getHeaders(), request);
        ClientHttpResponse response = null;
        IOException error = null;

        Object var9;
        try {
            SpanInScope ws = this.tracer.withSpanInScope(span);
            Throwable var8 = null;

            try {
                var9 = response = execution.execute(request, body);
            } catch (Throwable var27) {
                var9 = var27;
                var8 = var27;
                throw var27;
            } finally {
                if (ws != null) {
                    if (var8 != null) {
                        try {
                            ws.close();
                        } catch (Throwable var26) {
                        }
                    } else {
                        ws.close();
                    }
                }

            }
        } catch (RuntimeException | Error | IOException var29) {
            error = var29;
            throw var29;
        } finally {
            this.handler.handleReceive(response, error, span);
        }

        return (ClientHttpResponse)var9;
    }

    static final class HttpAdapter extends HttpClientAdapter<HttpRequest, ClientHttpResponse> {
        HttpAdapter() {
        }

        public String method(HttpRequest request) {
            return request.getMethod().name();
        }

        public String url(HttpRequest request) {
            return request.getURI().toString();
        }

        public String requestHeader(HttpRequest request, String name) {
            Object result = request.getHeaders().getFirst(name);
            return result != null ? result.toString() : "";
        }

        public Integer statusCode(ClientHttpResponse response) {
            try {
                return response.getRawStatusCode();
            } catch (IOException var3) {
                return null;
            }
        }
    }
}

Sleuth对多线程的支持

Sleuth提供了三种多线程实现

  • LazyTraceExecutor
  • TraceableExecutorService
  • TraceableScheduleExecutorService
    它们可以在创建新的任务时新建一个Span。
    必须使用这三种多线程实现才有效。
SpringCloud Sleuth 概述提供了Sleuth框架作为解决方案,Sleuth可以在整个分布式系统中跟踪一个用户请求的过程包括数据采集,数据传输,数据存储,数据分析,数据可视化等捕获这些跟踪的数据,并构建微服务的整个调用链的视图,为服务跟踪、解决问题提供便利。特点:1.提供链路追踪 2.性能分析 3.数据分析 4.可视化在实际开发中,Zipkin默认展示的链路数据有时无法满足我们想要获取的数据,比如,无法在Zipkin的UI界面中看到请求发送人的名称这时,可以使用Zipkin添加自定义链路数据。 阅读详情

相关推荐

Sleuth集成Zipkin

SpringCloud Sleuth主要功能就是在分布式系统中提供链路追踪解决方案。但是Sleuth并没有UI界面。需要集成Zipkin完成数据的收集、存储、查找和展示。 目录 1 集成Sleuth 2 集成Zipkin 2.1 下载Zipkin的jar包(服务端) 2.2 命令行启动Zipkin Server 2.3 通过浏览器访问http://localhost:9411 2.4 Zipkin客户端集成 1 集成Sleuth Sleuth的集成很简单。只需要引入Sleuth依赖即可。由

qq_31155349的博客 898

Spring Cloud Sleuth 2.0概要使用说明

Sleuth,Zipkin和Brave 先说一下Spring Cloud Sleuth, Zipkin和Brave三者之间的关系。 首先,对于Spring Cloud Sleuth来说,大家或许接触的比较多,它是Spring框架家族(在这里为什么不说是Spring Cloud框架家族,实际上这是因为Sleuth和Spring框架中的其他组成部分一样,非常灵活,即可以配合其他Spring Cloud组建,也可以不与其他的Spring Cloud组建一起使用,而仅仅作为一个Trace追踪的系统框架来试用)中

lgxzzz的博客 1335

SLEUTH模型:城市扩张预测的终极工具

在城市规划与管理领域,预测和模拟城市发展一直是挑战性极高的任务。SLEUTH模型,作为一种自适应的城市增长模拟工具,凭借其强大的自组织能力与灵活性,逐渐成为专业研究者和城市规划者青睐的工具。它不仅融合了地理信息系统(GIS)的强大数据处理能力,还通过定义特定的规则和参数来模拟城市扩张的趋势和模式。在本章中,我们将对SLEUTH模型的基本概念进行介绍,并深入探讨其在城市扩张模拟中扮演的关键角色。SLEUTH模型中的参数定义必须根据实际情况进行精确设定。

weixin_42620563的博客 1471

梳理一下与链路追踪tracing相关的sleuth-brave内容

链路追踪tracing的文章,多数基于google的dapper论文,介绍了trace,span等概念。关于微服务Spring Cloud Sleuth,主要功能就是在分布式系统中提供追踪解决方案。Spring Cloud Sleuth是对Zipkin的一个封装,对于Span、Trace等信息的生成、接入HTTP Request,以及向Zipkin Server发送采集信息等全部自动完成。那么sleuth,zipkin,brave它们本身是什么样子,有什么联系呢?

herriman的博客 940

使用autodl服务器运行CasMVSNet以及使用colmap产生的数据

MVSNet学习

qq_44708206的博客 3274

工业质检新利器:手把手教你用AD-DINOv3实现零样本缺陷检测(附MVTec AD实战)

本文详细介绍了AD-DINOv3框架在工业质检中的应用,通过零样本异常检测技术解决传统方法的标注成本高和泛化能力弱问题。文章包含技术原理解析、MVTec AD数据集实战部署、模型训练流程及工业部署优化技巧,帮助读者快速掌握这一创新技术。

seed的博客 764

Sleuth/Brave+Zipkin 实现链路日志

码字不易,转载请注明出处!! 链路日志 sleuth 术语 span(跨度):sleuth 的基本工作单元。每个 sleuth 有一个唯一的64位ID作为标识。此外还有一些其它的数据,如时间戳、标签、描述等。 trace(跟踪):由一组 span 组成的树桩结构称为一个 trance。 annotation(标注):表示一个行为。 CS (client sent);客户端发起一个请求,这是一个 span 的开始。 SR (server received):服务器接收并准备处理它。 SS (serv

小欧的哈士奇 596

手把手教你用Verilog实现MDIO控制器(附完整VHDL代码对比)

本文详细介绍了如何使用Verilog实现MDIO控制器,并提供了与VHDL实现的深度对比。通过解析MDIO协议核心要点,展示Verilog状态机架构设计和关键时序控制逻辑,同时对比VHDL在信号声明、状态机实现和双向端口处理上的差异。适用于以太网硬件设计开发者,帮助掌握MDIO控制器自主实现能力。

weixin_30682415的博客 422

dubbo3+sleuth+brave实现链路追踪及traceId未传递或不对应的原因分析

基于SpringCloud Sleuth+Brave实现dubbo3的链路追踪方案,并剖析链路追踪信息无法正确传递的原因。

Hey_JC的博客 1264

宇树机器人丝滑的二人转动作背后,MPC到底是什么?

了解MPC,让我们闻“机”起舞。

Barok的博客 2144

基于深度学习的灰度图像气泡群识别与优化

灰度图像气泡群深度学习识别优化研究 本研究针对MATLAB实现的深度学习气泡群识别系统在从1445个点到4992个点扩展时出现的精度不稳定问题,提出了一套完整的解决方案。文章首先分析了问题根源,包括数据复杂度增加、类别不平衡、网络容量不足等因素,然后系统性地提出了数据预处理增强、网络架构优化、训练策略调整和后处理算法改进等优化措施。通过改进的U-Net架构、自适应直方图均衡化等技术创新,有效提升了模型在大规模气泡群图像上的识别精度和稳定性,为化工、生物医学等领域的灰度图像分析提供了可靠的技术支持。

max500600的博客 412

sleuth原理详解

sleuth原理 1、关键术语 Span:Span基本工作单元,发送一个远程调度任务就会产生一个Span, Span 是用 64ID唯一标识的,Trace是用另一个64ID唯一标识的。Span还包含了其他的信息,例如摘要、时间戳事件、Span的ID以及进程 ID。 Trace:一系列spans组成的一个树状结构。 Annotation:用来及时记录一个事件的存在,一些核心annotations用来定义一个请求的开始和结束   cs- Client Sent -客户端发起一个请求,这个annoti.

weixin_40400410的博客 5424

基于YOLOv8的应急通道占用监测系统设计与实现

通过详细的数据集选择、模型训练、代码实现等内容,本博客为您提供完整的系统搭建过程,帮助您构建高效的监测系统。然而,在一些建筑物和公共场所中,应急通道经常被不当占用,导致紧急情况下无法及时使用,严重影响人员的疏散效率。YOLOv8是YOLO系列中的最新版本,它通过引入深度学习的优化和改进,在保证检测速度的同时,显著提升了检测精度。同时,随着深度学习技术的不断发展,检测精度与速度的提升将使得该系统在更广泛的场景中应用。:如果已有监控设备,可以采集应急通道的实时视频,并进行标注,生成占用监测数据集。

YOLO 797

Sleuth如何生成traceId

- SpringBoot启动时在zipkin的包中配置MDCScopeDecorator属性,添加traceId和spanId; - Sleuth版本:3.1.0:生成traceId和spanId直接使用traceId和spanId获取,日志格式为:[traceId=%X{traceId:-}, spanId=%X{spanId:-}] - Logback天然配置MDC,通过LogbackMDCAdapter最终填充traceId和spanId值。

天然玩家的博客 5457

从零开始学习CANoe(六)—— CAPL 测试节点

创建CAPL Test Module的两种方式

蚂蚁小兵 1万+

芒果YOLO11改进59:分类损失函数Loss篇FocalLoss:即插即用|最新改进FocalLoss损失函数,提高处理不平衡数据分类场景下的任务性能,提升YOLO11检测精度

即插即用|最新改进FocalLoss损失函数,提高处理不平衡数据分类场景下的任务性能,提升YOLO11检测精度

包括YOLOv5、YOLOv7、YOLOv8等模型改进 548

Sleuth、Zipkin学习

Spring Cloud Sleuth是一个分布式链路追踪框架,主要用于在微服务架构中跟踪请求的调用链路。在微服务架构中,服务之间的通信非常频繁,日志分散在各个服务中,难以定位问题。

攸攸太上的博客 1347

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

集成Sleuth实现链路追踪

【代码】集成Sleuth实现链路追踪。

Sun的个人博客 1417

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

sleuth原理分析

背景 微服务模式下,一次请求可能会经过多个服务。如果没有日志链将单次请求的日志串起来,定位问题时很容易陷入海量的日志中,无法快速定位问题。 sleuth是spring cloud中日志链(调用链解决方案),引入该依赖后,日志中会自动添加(traceid,spanid)。当获取到traceid后,可以在kibana或者其他日志收集系统中,精确定位到本次的所有日志。 sleuth基本原理很简单,就是在入口生成(traceid,spanid),并在调用中将traceid传递下去。 但是在基本原理之上,还是有些东西

shuxiaohua的博客 6559

Spring Cloud Sleuth

Sleuth是SpringCloud的子项目,全称SpringCloud-Sleuth,提供分布式系统中链路追踪解决方案,同类产品还有Cat由大众点评开源,基于java开发的实时应用监控平台,包括实时应用监控、业务监控。集成方案是通过代理码埋点的方式来实现监控

zhuge_long的专栏 1115

sleuth 简介

sleuth 可以解决分布式系统的追踪问题。 Sleuth:日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作; spring cloud 微服务框架可以看这里: 微服务 Spring Boot 2.0 + Spring cloud + consul + Hystrix + zuul + config + feign (上) 场景: 在分布式系统中...

程序领域 1万+

SpringCloud之链路跟踪Sleuth

前言 SpringCloud 是微服务中的翘楚,最佳的落地方案。 在一个完整的微服务架构项目中,服务之间的调用是很复杂的,当其中某一个服务出现了问题或者访问超时,很 难直接确定是由哪个服务引起的,所以就有了 Spring Cloud Sleuth 链路跟踪。通过它,我们就可以很清楚直观 的了解每一个服务请求经过了哪些服务,用时多久,谁依赖谁或者被谁依赖。 源码 Gi...

我的博客 2万+

Spring Cloud Sleuth系列(1) — Sleuth环境搭建以及Feign整合调用分析

Sleuth环境搭建以及Feign整合调用分析

weixin_46053046的博客 1567

spring cloud-sleuth原理浅析

本文基于sleuth 2.2.5版本 sleuth是一个链路追踪工具,通过它在日志中打印的信息可以分析出一个服务的调用链条,也可以得出链条中每个服务的耗时,这为我们在实际生产中,分析超时服务,分析服务调用关系,做服务治理提供帮助。 第一次使用sleuth,虽说跟着网上的教程也可以运行出正确的结果,但是对于原理、更进一步的使用还是一头蒙。我就尝试着分析一下源代码,其代码量并不大,但是代码还真是难懂,看了一段时间源码,并从网上找了资料,只是对原理、部分类的作用有了一些了解,我通过本文做一下介绍。 文章目.

3060

Spring Cloud Sleuth和Zipkin

在分布式服务架构中,需要对分布式服务进行治理——在分布式服务协同向用户提供服务时,每个请求都被哪些服务处理?在遇到问题时,在调用哪个服务上发生了问题?在分析性能时,调用各个服务都花了多长时间?哪些调用可以并行执行?…… 为此,分布式服务平台就需要提供这样一种基础服务——可以记录每个请求的调用链;调用链上调用每个服务的时间;各个服务之间的拓扑关系…… 我们把这种行为称为“分布式服务跟踪”。 了解源码可+求求: 1791743380 1. 背景 现今业界分布式服务跟踪的理论基础主要来自于 Google 的一篇论

m0_46413054的博客 3524
上一篇: maven打包命令
下一篇: Sleuth深入用法
菜鸟=大神
博客等级 码龄11年 5粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值