全链路追踪目的

微服务背景下

1.故障快速定位

    跨语言实现开发中在业务日志中添加调用链ID,可以通过调用链结合业务日志快速定位错误信息。

2.各个调用环节的性能分析

   分析调用链的各个环节耗时,分析系统的性能瓶颈,找到系统的薄弱环节针对性优化

3.数据分析

   分析用户的行为路径,经过了哪些服务器上的哪个服务加以应用。

4.调用拓扑图

Trace系统设计目标
低侵入、低损耗、大范围部署

基本实现
埋点日志内容,通过记录traceId、RPCId、调用的开始时间,调用类型,协议类型,调用方ip和端口,请求的服务名等信息;调用耗时,调用结果,异常信息,消息报文等;

典型应用
非开源:Google的Dapper,淘宝的鹰眼,新浪的Watchman,京东的Hydra

开源:zipkin, pinpoint , skywalking 

应用及分析
1.鼻祖:Google Dapper
谷歌tracing论文,关键字:低损耗、应用透明的、大范围部署需求;大规模集群的跟踪监控系统;跨应用跨服务器;ops-dev;

应用级透明:把核心跟踪代码做的很轻巧,然后把它植入到那些无所不在的公共组件种,比如线程调用、控制流以及RPC库

实现:为服务器上每一次你发送和接收动作来收集跟踪标识符(message identifiers)和时间戳(timestamped events),通过把代码植入限制在一个很小的通用组件库,实现监测系统的应用对开发人员的透明。

Dapper的跟踪模型:

跟踪树和span
ABCDE 5个span 组成了userRequest的跟踪树。Dapper会记录span名称,以及每个span的ID和父ID,以重建在一次追踪过程中不同span之间的关系。如果一个span没有父ID被称为root span。所有span都挂在一个特定的跟踪上,也共用一个跟踪id。所有这些ID用全局唯一的64位整数标示。

一个单独的span的细节图:

注意时间戳的正确性处理:由于客户端和服务器上的时间戳来自不同的主机,我们必须考虑到时间偏差。在我们的分析工具,我们利用了这个事实:RPC客户端发送一个请求之后,服务器端才能接收到,对于响应也是一样的(服务器先响应,然后客户端才能接收到这个响应)。这样一来,服务器端的RPC就有一个时间戳的一个上限和下限。

 

注:为保护Dapper的用户意外的过分热衷于日志的记录,每一个跟踪span有一个可配置的总标注量的上限。

Dapper日志收集管道


span数据写入(1)本地日志文件中

然后Dapper的守护进程和收集组件把这些数据从生产环境的主机中拉出来(2)

最终写到(3)Dapper的Bigtable仓库中,一次跟踪被设计成Bigtable中的一行,每一列相当于一个span。

Dapper守护进程在负载测试时的CPU资源使用率


Dapper的数据收集在Google的生产环境中的只占用了0.01%的网络资源。

后台查询WEB UI
Dapper的“Depot API”或称作DAPI,对分布式跟踪数据一个直接访问

 

2.阿里EagleEye
EagleEye (鹰眼)是Google 的分布式调用跟踪系统 Dapper 在淘宝的实现(2013)。每次调用分配TraceId、RpcId(dapper中的spanID),放在ThreadLocal的调用上下文上面,调用结束的时候,把TraceId、RpcId打印到访问日志。访问日志里面,一般会记录调用时间、远端IP地址、结果状态码、调用耗时之类,也会记录与这次调用类型相关的一些信息,如URL、服务名、消息topic等。

优化:通过设置全局采样开关,用来在运行期控制调用链的采样率(控制打不打日志)。所谓调用链采样,就是根据TraceId来决定当前的这一次访问日志是否输出

 

鹰眼sdk写log ——>storm集群收集(全量 hdfs;实时hbase)——>鹰眼服务器——>UI

3.Pinpoint
韩国naver, Pinpoint is an APM tool for large-scale distributed systems written in Java / PHP. Inspired by Dapper. Show me demo

Architecture

new release 支持flink处理数据(apache flink:stream vs spark 流式处理来模拟批量处理 )

数据结构:(Span, Trace, 和 TraceId组成)同dapper 

Core:字节码增强
使用字节码增强技术,不修改代码就工作。(代码零侵入,只需要加启动参数或通过配置文件加载即可)

JAVA字节码增强(before after 拦截器)在手工方法和自动方法两者之间属于自动方法。

 

应用3步走
1)docker 服务组建一键安装

2)启动服务,check web UI

3)应用添加配置,一次集成,运行手工.    eg. applicationContext-dao-config.xml

    <context:component-scan base-package="com.navercorp.pinpoint.web.dao.mysql" />
    <!-- SqlsessionFactory setup for MyBatis Database Layer -->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <property name="dataSource" ref="dataSource"/>

        <!-- mybatis basic config -->

        <property name="configLocation" value="classpath:/mybatis-config.xml"/>

        <!-- typeAliases -->

        <property name="typeAliasesPackage" value="com.navercorp.pinpoint.web.alarm.vo" />

        <!-- setting the location of mapper -->

        <property name="mapperLocations" value="classpath*:mapper/*Mapper.xml"/>

        <!-- set "true" in order to catch the errors of declaration of statement more quickly -->

        <property name="failFast" value="true"/>

        <property name="plugins">

            <list>

                <!-- use the patch version because of mybatis 3.2's incompatibility-->

                <bean class="com.navercorp.pinpoint.web.dao.ibatis.BindingLogPlugin32"/>

            </list>

        </property>

    </bean>
多插件集成
应有尽有:spring全家,mq mw、cache、rpc(dubbo、grpc)、db(hbase、mysql及drivers)……很丰富

4.Skywalking
中国华为吴晟基于OpenTracking实现的开源项目-2017年加入Apache孵化器,show demo

OpenTracking:OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。

Component:

 

H2:Database Engine

ShardingSphere:Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar

支持多语言多来源多格式数据输入:java、php、nodejs、go

Architecture


三层:

agent:探针,用来收集和发送数据到收集器

collector:链路数据收集器,数据可以落地ElasticSearch等Storage。

Storage&web:web可视化平台,用来展示落地的数据

Agent埋点实现
字节码增强:agent java 在类使用之前,增强或修改类的行为

Byte Buddy:Apache 2.0许可证的开源库,致力于解决字节码操作和API的复杂性

public class Agent {
 public static void premain(String argument, Instrumentation inst) {
   inst.addTransformer(new ClassFileTransformer() {
     @Override
     public byte[] transform(
       ClassLoader loader,
       String className,
       Class<?> classBeingRedefined, // 如果类之前没有加载的话,值为null
       ProtectionDomain protectionDomain,
       byte[] classFileBuffer) {
       // 返回改变后的类文件。
     }
   });
 }
}
Agent模块:

加载配置信息
加载插件
加载所需服务
使用ByteBuddy增强class
接入应用
部署启动agent ,程序中简单配置agentconfig即可。同metrics.namespace

Pinpoint VS Skywalking
Pinpoint    Skywalking
优势
大企业/长时间验证,稳定性和完成度高
探针收集的数据粒度比较细
HBase的数据密度较大,支持PB级别下的数据查询
代码设计考虑的扩展性较弱,二次开发难度较大
拥有完整的APM和调用链跟踪功能
优势
数据容器为ES,查询支持的维度较多并且扩展潜力大
项目易读性和扩展性都比较强
主要的研发人员为华人并且均比较活跃,能够进行更加直接的沟通
拥有完整的APM和调用链跟踪功能
劣势
代码针对性强,扩展较难
探针的额外消耗较多(探针采集粒度细,大概10%~20%)
项目趋于成熟,而扩展难度较大,目前社区活跃度偏低,基本只进行探针的增加或者升级
缺少自定义指标的设计
劣势
项目发展非常快,稳定性有待验证
ES数据密度较小,在PB级别可能会有性能压力
 

5.zipkin
java by twitter,collector 收集器、storage 存储、api 查询api-ui 界面,jdk8 required

 

接入应用
1.引入zipkin maven dependency

2.java coding ,before after增强自动拦截,把config配置好即可。

public Brave brave(SpanCollector spanCollector){  
        Builder builder = new Builder("service2");//指定serviceName  
        builder.spanCollector(spanCollector);  
        builder.traceSampler(Sampler.create(1));//采集率  
        return builder.build();  
    }
6.TODO ONEAPM 优秀产品实现分析(insight全家桶)、腾讯bk-ci、   Prometheus

总结
由上面对主流全链路追踪技术的分析,组件基本都包括一个埋点sdk agent、日志收集collector、到storage (mysql、es、或bigdata)、最后集成webUI供用户查看。而sdk大多采用基于面向切面增强的方式,减少程序侵入性及接入成本。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud 可以通过使用 Sleuth 库来实现链路追踪。 Sleuth 是一个用于在分布式系统中跟踪请求的库,它会在请求中注入一些信息,如请求 ID、调用链等,这些信息可以在整个请求的生命周期中传递。 首先,需要在 Spring Boot 应用中添加 Sleuth 的依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> ``` 然后,需要配置日志系统,以便 Sleuth 能够记录请求信息。比如,可以使用 Logback 和 SLF4J 进行配置: ``` <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> ``` 最后,可以使用各种工具(如 Zipkin、Elastic Stack 等)来收集和展示请求信息。 这样,就可以在分布式系统中实现链路追踪了。 ### 回答2: Spring Cloud提供了一种称为"Sleuth"的组件,它可以实现链路追踪链路追踪目的是可视化和监控微服务架构中的请求流。下面是Spring Cloud Sleuth如何实现链路追踪的步骤: 1. 引入依赖:在项目的pom.xml文件中,引入Spring Cloud Sleuth的依赖。例如: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> ``` 2. 配置跟踪信息:在微服务的配置文件(例如application.yml)中,配置服务的名称(spring.application.name)和端口(server.port)。例如: ```yaml spring: application: name: your-service-name server: port: 8080 ``` 3. 启用链路追踪:在微服务的主类上,使用`@EnableSleuth`注解来启用Spring Cloud Sleuth的链路追踪功能。例如: ```java @SpringBootApplication @EnableSleuth public class YourServiceApplication { public static void main(String[] args) { SpringApplication.run(YourServiceApplication.class, args); } } ``` 4. 发起请求:通过HTTP或其他方式在微服务之间发起请求。每个请求都会包含一个唯一的跟踪ID。 5. 查看链路追踪信息:在日志中,可以看到每个请求的跟踪ID和相应的父跟踪ID。这些信息可以帮助我们追踪和分析请求的流动。 通过使用Spring Cloud Sleuth,我们可以轻松地实现在微服务架构中进行链路追踪。这对于追踪和分析请求流是非常有价值的,可以提高微服务系统的性能和可维护性。 ### 回答3: Spring Cloud提供了一种称为Sleuth的链路追踪解决方案,可以帮助我们追踪分布式系统中的请求流程。下面是Spring Cloud Sleuth实现链路追踪的步骤: 1. 配置依赖:在项目的pom.xml文件中,添加Spring Cloud Sleuth的依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> ``` 2. 配置日志:在系统的主配置文件中,配置日志相关的属性,例如日志输出格式、日志级别等。 3. 创建并配置Zipkin服务器:Zipkin是一个用于收集、存储和展示追踪数据的服务器。我们可以使用Docker或者下载其JAR包来启动Zipkin服务器。 4. 配置请求追踪:在项目的主类上添加@EnableZipkinServer注解,启用Zipkin追踪。 5. 添加日志跟踪:在程序的关键组件中(例如Controller层、Service层)添加相关注解,Spring Cloud Sleuth会自动为每个请求生成一个唯一的请求ID,并将该ID添加到日志中。 这样,当有请求进入系统时,系统就会自动为该请求生成一个唯一的ID,然后在请求经过不同的模块和服务时,这个ID会在日志中进行传递和记录。通过查看日志信息,我们可以很方便地追踪请求在系统中的流向和调用。 总之,通过使用Spring Cloud Sleuth,我们可以很容易地实现链路追踪功能,帮助我们分析和排查分布式系统中的问题,并提高系统的可用性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值