简介
淘宝现在是一个由很多个应用集群组成的非常复杂的分布式系统。这些应用里面主要有处理用户请求的前端系统和有提供服务的后端系统等。这些应用之间一般有RPC调用和异步消息通讯两种手段,RPC 调用会产生一层调一层的嵌套,一个消息发布出来更会被多个应用消费,另外,应用还会访问分库分表的数据库、缓存、存储等后端,以及调用其他外部系统如支付、物流、机彩票等。
请试想一下,现在淘宝一个买家点击下单按钮所产生的网络请求到达淘宝服务器之后,就会触发淘宝内网数百次的网络调用。这些调用中有哪些出问题会影响这次交易,有哪些步骤会拖慢整个处理流程,双十一的交易高峰需要给应用集群分配多少台机器,这些都是需要考虑的。但是调用环境的复杂度,已经很难用人力去做准确的分析和评估了,这时候 EagleEye 就派上了用场。
EagleEye (鹰眼)通过收集和分析在不同的网络调用中间件上的日志埋点,可以得到同一次请求上的各个系统的调用链关系,有助于梳理应用的请求入口与服务的调用来源、依赖关系,同时,也对分析系统调用瓶颈、估算链路容量、快速定位异常有很大帮助。另外,业务方也可以在调用链上添加自己的业务埋点,使网络调用和实际业务内容得到关联。
目前互联网公司类似的产品有:Google Dapper、Twitter Zipkin。
EagleEye 特色功能
调用链的异常跟踪
下面这幅图,展示了在 mtop 上抛的异常顺便打印的 TraceId,可以在 EagleEye 直接定位到是第 4 层 TAIR 网络请求失败导致的问题。PS:日常环境也同样支持调用链跟踪。
应用关键路径(强弱依赖分析 / 瓶颈分析 / 易故障点)
EagleEye 为应用自动产生的关键路径分析报表,除了可以看到 QPS、秒级峰值 QPS之外,还可以看到强弱依赖关系、分布式调用的瓶颈点、经常出错的依赖等。
突发流量来源跟踪
HSF 服务、DB 有突发的调用高峰,来自什么地方??妈妈再也不用担心我束手无策了,EagleEye 直接给你答案。
入口实时大盘
利用 EagleEye 独有的入口大盘,可以清晰看到某个前端 URL,它直接依赖、间接依赖的所有后端服务的调用情况。某个前端网页变白板时,从 EagleEye 入口大盘也许能看出点端倪。
应用实时依赖情况
应用依赖情况尽收眼底。
服务实时调用大盘
服务再多,心里也有数。
EagleEye 的核心
TraceId
在复杂的分布式系统环境下,EagleEye是一个有广泛用途的调用分析和问题排查工具。与一般的调用信息埋点日志相比,EagleEye埋点的一个显著的不同点在于它的每条日志都有与每次请求关联的上下文ID,我们称为TraceId。通过TraceId,后期的日志处理时可以把一次前端请求在不同服务器记录的调用日志关联起来,重新组合成当时这个请求的调用链。因此,EagleEye不仅可以分析到应用之间的直接调用关系,还可以得到他们的间接调用关系、以及上下游的业务处理信息;对于调用链的底层系统,可以追溯到它的最上层请求来源以及中间经过的所有节点;对于调用链的上层入口,可以收集到它的整棵调用树,从而定位下游系统的处理瓶颈,当下游某个应用有异常发生时,能迅速定位到问题发生的位置。
如上图所示,应用A是接受到来自用户浏览器的Web请求的前端服务器,它是一条调用链的开始端,在TBSession和EagleEyeFilter中都做了EagleEye上下文埋点。请求收到后它会先调用EagleEye StartTrace生成TraceId并放置在当前线程的ThreadLocal,日志埋点请求信息(如URL、SessionId、UserId等)。在请求处理完毕提交相应时,再调用EndTrace清理线程中的EagleEye信息。
在应用A调用应用B、C的HSF服务,或者发送Notify消息时,TraceId被包含在EagleEye上下文中,随网络请求到达应用B、C、D、E之中,并放置在线程ThreadLocal内,因此后续调用到的这些系统都会有EagleEye这次请求的上下文。这些系统再发起网络请求时,也类似的携带了上下文信息的。
RpcId
为了区别同一个调用链下多个网络调用的顺序和嵌套层次,EagleEye还需要传输和记录RpcId。
RpcId用0.X1.X2.X3.....Xi来表示,Xi都是非负整数,根节点的RpcId固定从0开始,第一层网络调用的RpcId是0.X1,第二层的则为0.X1.X2,依次类推。例如,从根节点发出的调用的RpcId是0.1、0.2、0.3,RpcId是0.1的节点发出的RpcId则为0.1.1、0.1.2、0.1.3。如下图所示。
通过RpcId,可以准确的还原出调用链上每次调用的层次关系和兄弟调用之间的先后顺序。
例如上图应用 G 的两次调用0.2.1.1和0.1.2.1,可以看出对 DB 的访问0.2.1.1源于 C 到 G 的调用0.2.1,对 Tair 的访问0.1.2.1源于B 到 G 的调用0.1.2。
很多调用场景会比上面说的完全同步的调用更为复杂,比如会遇到异步、单向、广播、并发、批处理等等,这时候需要妥善处理好ThreadLocal上的调用上下文,避免调用上下文混乱和无法正确释放。另外,采用多级序号的RpcId设计方案会比单级序号递增更容易准确还原当时的调用情况。
中间件埋点
EagleEye 需要在网络调用中间件中埋点,实现TraceId/RpcId等上下文信息的生成、传输,以及调用日志的记录。这些信息记录在ThreadLocal,对应用是透明的,应用也不需要修改方法API来回传递EagleEye的上下文对象。
目前EagleEye在淘宝最常见的中间件HSF、Notify、TDDL、Tair、TFS、tbsession、tengine、metaQ、search都已经加上了EagleEye的埋点,基本涵盖了服务调用、消息通信、数据库存取、缓存数据存取、前端接入等各种场景。越来越多的网络调用中间件会逐步接入到 EagleEye 体系当中。
透明数据传输
EagleEye 本身具备透明传输 TraceId、RpcId 的能力,这个能力通用可以用来传输业务的一些数据。例如,如果希望追加自己的业务信息到调用链上,应用可以通过 EagleEye 提供的 API 进行链路分组、链路打标等,EagleEye 会把这些信息一层层的透明往后端系统传递,而且信息也同样记录在每条调用日志里面。
EagleEye 数据透传的功能,在全链路压测、子帐号信息传递、二套环境项目隔离、强弱依赖检测、敏感操作的前端来源跟踪等场景都起到了不可缺少的重要作用。
整体处理架构
下面是EagleEye从日志生成到抓取、存储、分析、展现的多个系统间交互过程。
首先,EagleEye的埋点日志会输出到统一的日志目录下,与业务无关的RPC日志会写文件eagleeye.log,业务埋点日志会写文件biz-eagleeye.log。
随后,tlog服务器会通过每台应用机器上的哈勃agent实时的不断抓取EagleEye日志,按照日志类型不同,将会有不同的处理方式:
- 全量原始日志都会直接存到云梯HDFS中;
- 带有实时标记的EagleEye原始日志,放入HBase中存储;
- 业务日志有一部分会被直接处理,存储到HBase,有一部分会作为消息发送出去,由感兴趣的业务系统订阅处理。
- 全量日志存储到 HDFS 之后,EagleEye服务器会每小时创建 MapReduce 任务,在云梯上完成对全量日志的调用链合并、分析以及统计,合并好的调用链依旧保存在HDFS*,分析和统计的结果也输出到HDFS,EagleEye服务器在任务执行完毕之后,会将结果拉取到本地建立索引,并保存到HBase。在保存完毕后,就可以在EagleEye的数据展现页面看到分析结果了。
- 另外,EagleEye 还做了调用的实时统计,有分钟级别的实时链路大盘、应用大盘、服务大盘和入口大盘,帮助快速定位故障问题所在。
相关推荐
/ someone’s watching your dependencies鹰眼Eagle Eye 会分析您的npm和bower依赖项,并报告其中哪些已过时。 请注意, Eagle Eye处于早期开发阶段,请自行使用。 总是欢迎贡献。基本用法通过np
在这个版本中,用户可以下载 `eagle-0.5.0-bin.tar.gz` 压缩包,它包含了预编译的二进制文件,可以直接在支持的环境中解压并运行。 ### Apache Eagle 简介 Apache Eagle 是由 Apache Software Foundation 维护的一...
这个"arcengine-Eagle-Eye.zip"文件可能包含了实现一个高级GIS交互功能的示例代码,即在mapcontrol1中显示地图的缩略图,并在mapcontrol2中允许用户通过拖拽来改变mapcontrol1的视角。以下是对这一技术的详细解释: ...
MNE鹰眼是黑山所有新监控摄像头的简单地图。 目前,波德戈里察周围以及其他城市仍在安装越来越多的相机,因此此页面将得到更新。 如果您看到新的电线杆正在安装或地图上没有任何电线杆,请让我知道(在Twitter上),...
除了内建的独家专利数字 电压调节器(D-VRM),让效能持续并稳定地高度发挥外,玩家更可 藉由Eagle-eye多段式LED显示面板轻松观察使用电力值的状态, 用电更加透明化。其H型纹样散热孔更有别于市面一般设计,除了 提供...
为了更深入地了解这个项目,我们需要查看"eagle_eye-master"压缩包内的具体文件和文档,包括`README.md`(项目介绍)、`requirements.txt`(依赖项列表)、源代码文件(`.py`)以及可能的测试文件和示例。...
语言:Bahasa Indonesia,Bahasa Melayu,Deutsch,English,English (UK),English (United States),Filipino,Français,Kiswahili,Nederlands,Norsk,Tiếng Việt,Türkçe,català,dansk,eesti,español,español ...
- 眼睛:eye - 耳朵:ear - 手臂:arm - 手:hand - 手指:finger - 腿:leg - 尾巴:tail 3. **颜色(colours)** - 颜色:colour - 红:red - 蓝:blue - 黄:yellow - 绿:green - 白:white - 黑...
- eye:眼睛 - ear:耳朵 - arm:手臂 - hand:手 - finger:手指 - leg:腿 - tail:尾巴 3. 颜色(Colours): - red:红 - blue:蓝 - yellow:黄 - green:绿 - white:白 - pink:粉红 - purple...
- eye:眼睛 - ear:耳朵 - arm:手臂 - hand:手 - finger:手指 - leg:腿 - tail:尾巴 2. 颜色: - red:红 - blue:蓝 - yellow:黄 - green:绿 - white:白 - black:黑 - pink:粉红 - ...
- 眼睛(Eye) - 耳朵(Ear) - 手臂(Arm) - 手(Hand) - 手指(Finger) - 腿(Leg) - 尾巴(Tail) 3. **颜色**: - 红(Red) - 蓝(Blue) - 黄(Yellow) - 绿(Green) - 白(White) - 黑...
荷鲁斯之眼Eye of Horus是一个开放源代码平台,可以控制仅看着它们的任何设备。 该项目(硬件和软件)是在萨拉戈萨太空应用程序期间从头开始构建的,旨在解决太空可穿戴设备的挑战。 该设备可以帮助NASA和宇航员的...
- 眼睛(eye) - 耳朵(ear) - 手臂(arm) - 手(hand) - 手指(finger) - 腿(leg) - 尾巴(tail) 2. 颜色: - 红(red) - 蓝(blue) - 黄(yellow) - 绿(green) - 白(white) - 黑...
"BaiduMapTrace"项目是专门针对运动轨迹处理的一个工具,它利用百度鹰眼(Eagle Eye)SDK服务,提供了轨迹纠偏、去噪和绑路等功能,以提升轨迹数据的准确性和可用性。本文将详细讲解这些核心知识点。 一、轨迹纠偏 ...
- Eye: 眼睛 [ai] - Ear: 耳朵 [iə] - Arm: 手臂 [ɑ:m] - Hand: 手 [hænd] - Finger: 手指 ['fiŋɡə] - Leg: 腿 [leɡ] - Tail: 尾巴 [teil] 3. 颜色(Colours) - Red: 红 [red] - Blue: 蓝 [blu:] ...
7. Eye - 眼睛:视觉器官,让我们看到周围的事物。 8. Ear - 耳朵:听觉器官,接收声音。 9. Arm - 手臂:上肢,连接肩膀和手的部分。 10. Hand - 手:五指和手腕组成的手部结构。 11. Finger - 手指:手的一部分,...
在压缩包文件名称"eagle-eye-master"中,"master"通常表示这是一个主分支或主要版本,可能是开源项目的核心代码库。这暗示"鹰眼"可能是一个开源项目,其源代码可以在GitHub或其他代码托管平台上找到。开发者和测试...
百度鹰眼(Baidu Map Eagle Eye)是百度地图提供的一项专业级轨迹服务,它能够帮助开发者轻松地实现轨迹数据的存储、管理以及展示。通过对车辆、人员等移动对象轨迹的记录,可以实现动态监控、数据分析等功能,为...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
:eagle: git-machete提供的鸟瞰图使合并/重新设置/推/拉操作变得轻松自如,即使存储库中存在多个分支(主/开发,主题分支,队友的分支已检阅等)。 :direct_hit: 使用此工具,您可以毫不费力地维护小的,集中的,...