Trail:分布式追踪

标签: tech | 发表时间:2017-03-15 14:33 | 作者:
出处:https://cattail.me/

在又拍云,即使是 应用层服务也依赖到其他服务,而那些服务又依赖到了更多服务。当一个接口超时时,定位接口的性能瓶颈是困难的。

解决定位服务性能瓶颈和错误原因的问题,是实现 Trail:分布式追踪服务 的初衷。

Trail 做了什么

系统接收到外部的请求后,会在分布式系统内形成复杂的调用关系,

request in distributed system

Credit: Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

Trail 采集服务(进程)间的调用,记录处理调用数据,并提供分析平台。

工作原理

分布式系统的调用形成树状结构,我们称一次调用形成的调用链为 trace,每个 trace 有唯一 ID traceId,构成 trace 的最小元素是 spantrace 下的所有 span 有相同的 traceId

每个 span 有自己唯一的 ID spanId,通过在 span 中存储父 span ID parentId 来建立 span 之间的关系。

span relationship

Credit: Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

采集

Trail 记录 span 来记录服务之间的调用,并生成完整的 trace。它通过在基础通信和调用库中增加采集代码来实现采集功能。

以 HTTP 协议举例,在前端 HTTP 服务器进程接收到用户请求后,会 创建一个新的 span,这是 trace 中的第一个 span,该 span 初始化过程中除了生成 spanId 外还会 生成 traceId

当前端服务进程 向后端服务进程发送 HTTP 请求时, 请求头中被加入了额外信息,包括 traceId spanId。后端进程接收到请求,也会创建 span,但在创建过程中会直接使用接收到的 traceId,并设置 parentId

span 采集的关键是

  1. 客户端注入参数
  2. 传输协议支持并传递参数
  3. 服务端解析参数

存储

Trail 目前没有实现完善的存储机制,当 span 采集后,将通过 TCP 请求发送至 Logstash,并被转存至 Elasticsearch。

处理分析

分析程序通过接口读取 Elasticsearch 数据,根据需求组装数据。

如,为了展示一次调用完整的调用链,将查询特定 traceId 下的所有 span,并通过 parentId 构建调用链。

应用场景

调用链

call chain

服务状态和关系

在组织服务关系过程中,需要节点 node 和关系 link 两个原子数据。节点通过对多条 span 聚合标签获得,关系通过聚合父子 span 的标签(有方向性)获得。在展示服务状态过程时,数据量较小,节点和关系数据可以在浏览器端实时计算。在展示服务关系时,数据量较大,可以通过定时任务在特定时间计算。

service relationship

性能监控

服务性能数据可以通过 Kibana 和 Elasticsearch 直接生成图表,

可用性 availability

响应时间 response time

QPS QPS

慢路由 Slow Route

接口请求量 Accesslog

遗留问题

目前 Trail 的采集功能已经完善,然而在存储,处理和分析功能上还有很多遗留问题。

分布式时钟同步

在绘制调用链的过程中,发现子 span 的开始时间可能小于父 span 时间,这个问题是由不同机器之间存在时间差引起的。因为整个 span 的时间非常短(通常只有十几毫秒),机器间细微的时间不同步也会导致这种现象。该问题仍未解决,仅在绘制调用链的过程中补偿时间差。

异步调用

Trail 目前仅支持同步调用,对异步调用(如任务队列)其实也可以从相似的方式处理,

  1. 生产者创建任务并附加额外参数
  2. 任务队列支持任务附加额外参数
  3. 消费者获取任务并解析参数

Continuation-Local Storage

对 Node.js 应用代码来说,所有请求都在一个线程中,因而难以区分 当前执行代码在哪个 trace 上(Request-Local)。

continuation-local-storage 部分解决了这个问题,它通过 绑定回调函数的上下文来区分请求。然而这增加了埋点代码的复杂度,在为基础库实现采集代码时,需要 非常小心的实现和完备的测试用例,才能保证不出问题。

附录

span 的完整数据结构

   type Span {
    operationName: String
    startTime: Number
    duration: Number
    tags: [Object]
    logs: [Array]

    traceId: Long
    spanId: Long
    parentId: String
    sampled: Boolean
    baggage: Object
}

span 示例

   {
  "type": "trail",
  "operationName": "upyun.account.get",
  "startTime": 1475035067586,
  "duration": 3,
  "tags": {
    "type": "ServerReceive",
    "service": "surume",
    "address": "10.0.5.58",
    "host": "10.0.5.58",
    "port": "8888",
    "protocol": "upyun.dendenmushi",
    "status": 0
  },
  "traceId": "5638971931279564310",
  "spanId": "1171987629847622065",
  "parentId": "17243618903848623758",
  "sampled": true,
  "baggage": {}
}

span 生命周期

span life time

Credit: Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

相关 [trail 分布] 推荐:

Trail:分布式追踪

- - 猫尾博客
在又拍云,即使是 应用层服务也依赖到其他服务,而那些服务又依赖到了更多服务. 当一个接口超时时,定位接口的性能瓶颈是困难的. 解决定位服务性能瓶颈和错误原因的问题,是实现 Trail:分布式追踪服务 的初衷. 系统接收到外部的请求后,会在分布式系统内形成复杂的调用关系,. Trail 采集服务(进程)间的调用,记录处理调用数据,并提供分析平台.

River Trail:为浏览器带来并行编程

- 三十不归 - Solidot
英特尔宣布了扩展JavaScript并行编程功能的开源项目River Trail. 浏览器不再只执行轻量级的任务,然而高计算量的应用程序却仍须原生执行,因为原生应用有性能优势,如它可以充分利用多核处理器的并行处理能力. Web开发的通用语言JavaScript不允许应用程序访问多核心,现在是时候让JavaScript跟上时代步伐了.

华硕发布Eee PC 1025彩色Cedar Trail上网本

- 洞箫 - cnBeta.COM
在之前的Computex 2011大展上,华硕展出了其搭载Intel最新Cedar Trail平台处理器的EeePC 1025C/CE,预计的10月份的期限已到,华硕准时地发布了这一款产品. 华硕EeePC 1025C/CE配以10.1英寸LED显示屏(1024×600)以及巧克力键盘,外观上共有粉、红、黑、白、蓝、棕等多种色式的同 时,机身两侧均有金属围边设计.

分布式日志

- - Java - 编程语言 - ITeye博客
最近完成一个简单的日志管理系统,拿出来跟大家分享一下. 3、支持文件输出、habse输出、mongodb输出. 基于以上三点功能,我们下面详细说明. 说道支持这个功能,有个同事认为没有这个必要,他的观点是log4j的配置不需要经常变动,不需要支持这样的功能;本人的观点是“配置可以进行统一管理、而且正式机跟测试机的log4j的配置肯定会有一些差异的”,因此这个功能是必须的.

分布式事务简述

- If you are thinking one year ahead, you plant rice. If you are thinking twenty years ahead, you plant trees. If you are thinking a hundred years ahead, you educate people. - BlogJava-首页技术区
  随着系统越来越大,不断的模块化和SOA化,你的系统可能被分散于不同的机器上,这时候,你原先的单机本地事务可能已经无法满足你的需求,你可能要跨系统跨资源的去使用事务.   具体就不多介绍了,相信大家都能明白ACID特性的基本含义. 而一个具体的事务需要涉及到的模型(无论哪种模型)一般由下面几部分组成:.

Hadoop与分布式计算

- 透明 - 丕子
写本文由leftnoteasy发布于http://leftnoteasy.cnblogs.com 本文可以被全部或者部分的使用,但请注明出处,如果有问题,可以联系wheeleast (at) gmail.com, 也可以加作者的新浪微博:http://weibo.com/leftnoteasy. 很久没有写写博客了,之前主要是换工作,耽误了很多的时间,让人也变得懒散,不想花大时间来写东西.

分布式缓存-Memcached

- - 人月神话的BLOG
分布式缓存出于如下考虑,首先是缓存本身的水平线性扩展问题,其次是缓存大并发下的本身的性能问题,再次避免缓存的单点故障问题(多副本和副本一致性). 分布式缓存的核心技术包括首先是内存本身的管理问题,包括了内存的分配,管理和回收机制. 其次是分布式管理和分布式算法,其次是缓存键值管理和路由. 原文: http://wenku.baidu.com/view/8686d46c7e21af45b307a8c3.html.

再谈集中和分布

- - 人月神话的BLOG
上篇文章转载了关于mysql数据库的垂直和水平拆分的相关内容,本篇文章再谈下关于应用集中化后的集中和分布相关策略问题,以及最近关于完全去IOE思路的一些思考和回顾. 现在有一个问题我暂时还没得到比较明确的一些验证,如对于当前x86的pc server服务器好的配置完全可以达到200万TPMC,对于磁盘阵列可以挂接到20T甚至更高的存储容量.

hadoop分布式配置

- - CSDN博客云计算推荐文章
一、前面的部分见伪分布式配置. 二、实现SSH无密码登录远程主机(只在源主机上配置). 注意:以上scp命令表示把authoriezd_keys远程复制到对应主机的相应目录下. slave2是目的主机的名字,需要在源主机的/etc/hosts下配置slave2以及对应的IP地址 192.168.0.5.

浅谈分布式缓存

- - CSDN博客推荐文章
在前面的一些文章中,从实战的角度,讲解了有关 memcached的应用、容灾、监控等等. 但是缺乏对理论的讲解和原理性的剖析. 本文将从理论的角度去介绍,让大家从宏观上对“分布式缓存、nosql”等技术有所了解,以便进一步学习和使用. 在构建大规模的web应用时,缓存技术可以说是必备的,学习的必要性不言而喻.