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

APM-全链路追踪的更多相关文章

  1. 全链路追踪traceId,ThreadLocal与ExecutorService

    关于全链路追踪traceId遇到线程池的问题,做过架构的估计都遇到过,现在以写个demo,总体思想就是获取父线程traceId,给子线程,子线程用完移除掉. mac上的chrome时不时崩溃,写了一大 ...

  2. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

  3. skywalking与pinpoint全链路追踪方案对比

    由于公司目前有200多微服务,微服务之间的调用关系错综复杂,调用关系人工维护基本不可能实现,需要调研一套全链路追踪方案,初步调研之后选取了skywalking和pinpoint进行对比; 选取skyw ...

  4. 基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪

    原文链接:基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪 一.日志系统 1.日志框架 在每个系统应用中,我们都会使用日志系统,主要是为了记录必要的信息和方便排 ...

  5. Node.js 应用全链路追踪技术——[全链路信息获取]

    全链路追踪技术的两个核心要素分别是 全链路信息获取 和 全链路信息存储展示. Node.js 应用也不例外,这里将分成两篇文章进行介绍:第一篇介绍 Node.js 应用全链路信息获取, 第二篇介绍 N ...

  6. 【AWS】使用X-Ray做AWS云上全链路追踪监控系统

    功能 AWS X-Ray 是一项服务,收集应用程序所请求的相关数据,并提供用于查看.筛选和获取数据洞察力的工具,以确定问题和发现优化的机会. 对于任何被跟踪的对您应用程序的请求,不仅可以查看请求和响应 ...

  7. 全链路追踪技术选型:pinpoint vs skywalking

    目前分布式链路追踪系统基本都是根据谷歌的<Dapper大规模分布式系统的跟踪系统>这篇论文发展而来,主流的有zipkin,pinpoint,skywalking,cat,jaeger等. ...

  8. Spring Cloud全链路追踪实现(Sleuth+Zipkin+RabbitMQ+ES+Kibana)

    简介 在微服务架构下存在多个服务之间的相互调用,当某个请求变慢或不可用时,我们如何快速定位服务故障点呢?链路追踪的实现就是为了解决这一问题,本文采用Sleuth+Zipkin+RabbitMQ+ES+ ...

  9. Spring Cloud 全链路追踪实现

    简介 在微服务架构下存在多个服务之间的相互调用,当某个请求变慢或不可用时,我们如何快速定位服务故障点呢?链路追踪的实现就是为了解决这一问题,本文采用Sleuth+Zipkin+RabbitMQ+ES+ ...

  10. 全链路追踪体验—最简陋TraceId的生成

    对于后端开发来说,排查问题是常有的事情.而排查问题时最常用的就是看日志,看一次调用中经过了哪些系统,是那个系统出问题了.这就需要业务日志中关联调用链的TraceId信息,从而在应用出现问题时,能够通过 ...

随机推荐

  1. PREPARE - 创建一个准备好的查询

    SYNOPSIS PREPARE plan_name [ (datatype [, ...] ) ] AS statement DESCRIPTION 描述 PREPARE 创建一个已准备好的查询. ...

  2. Less 混合(mixin)

    Less的混合:混合可以将一个定义好的class A轻松的引入到另一个class B中,从而简单实现class B继承class A中的所有属性.我们还可以带参数地调用,就像使用函数一样. .bord ...

  3. 2018-09-20-weekly

    Algorithm 最长有效括号 What 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. How 这里可以用栈来求解,需要定义个start变量来记录合法括号串的起 ...

  4. k8s源码编译

    1.可在github上面直接下载源码 2.下载所需要的docker镜像,并打上tag,不知道tag,可以先编译一下,会提示所需image. docker pull index.alauda.cn/xu ...

  5. python 按多维列表中的某一个元素位进行排序

    import os,re top = os.popen("tasklist") process_list = [] split_r = r"\s+" memor ...

  6. Nginx-常用命令和配置文件

    Nginx常用命令 1.启动命令 在/usr/local/nginx/sbin 目录下执行 ./nginx 2.关闭命令 在/usr/local/nginx/sbin 目录下执行 ./nginx s ...

  7. Task2.设立计算图并自动计算

    1.numpy和pytorch实现梯度下降法 import numpy as np # N is batch size; N, D_in, H, D_out = 64, 1000, 100, 10 # ...

  8. php key()函数 语法

    php key()函数 语法 作用:返回数组内部指针当前指向元素的键名.大理石构件支架 语法:key(array) 参数: 参数 描述 array 必需.规定要使用的数组. 说明:返回数组内部指针当前 ...

  9. JVM虚拟机运行机制

    JVM虚拟机运行机制 什么是JVM?虚拟机是物理机器的软件实现.Java是用在VM上运行的WORA(Write Once Run Anywhere)概念而开发的.编译器将Java文件编译为Java . ...

  10. POJ 2253 Frogger ( 最短路变形 || 最小生成树 )

    题意 : 给出二维平面上 N 个点,前两个点为起点和终点,问你从起点到终点的所有路径中拥有最短两点间距是多少. 分析 : ① 考虑最小生成树中 Kruskal 算法,在建树的过程中贪心的从最小的边一个 ...