• APM-全链路追踪


      

    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 拦截器)在手工方法和自动方法两者之间属于自动方法。

       

    应有尽有: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模块:

    1.加载配置信息

    2.加载插件

    3.加载所需服务

    4.使用ByteBuddy增强class

    5.接入应用

    6.部署启动agent ,程序中简单配置agentconfig即可。

    7.同metrics.namespace

  • 相关阅读:
    移动端调试Vconsole
    Vue-返回顶部
    Vue-封装loading
    Vue-水印封装
    Vue-封装scroll触底
    微信小程序-图片上传
    前端面试题(2)
    前端常见面试题
    服务端渲染(SSR)和客户端(CSR)渲染的区别
    什么是模块化?模块化开发的好处
  • 原文地址:https://www.cnblogs.com/liboware/p/11996393.html
Copyright © 2020-2023  润新知