开源最前线(ID:OpenSourceTop) 猿妹整编
综合自:infoq、GitHub等
Uber 在 GitHub 正式开源了分布式跟踪系统 Jaeger,其灵感来源于 Dapper 和 OpenZipkin,从 2016 年开始,该系统已经在 Uber 内部得到了广泛的应用。
分布式追踪系统 Jaeger
授权协议:MIT
开发语言:Google Go
操作系统:跨平台
开发厂商:Uber
Github:https://github.com/jaegertracing/jaeger
Jaeger 简介
它可以用于微服务架构应用的监控,特性包括分布式上下文传播(Distributed context propagation)、分布式事务监控、根原因分析、服务依赖分析以及性能/延迟优化。该项目已经被云原生计算基金会(Cloud Native Computing Foundation,CNCF)接纳为第 12 个项目。
大多数现有的 Zipkin 兼容仪表库支持概率采样,但他们希望在初始化时配置采样率。这种方法在大规模使用时导致几个严重问题:
● 给定的服务几乎没有洞察采样率对跟踪后端的总体流量的影响。
● 在 Uber,商业交通展示强烈的每日季节性;更多的人在高峰时段乘坐。固定采样概率对于非高峰业务来说太低,而对于高峰业务又太高。
● Jaeger 客户端库中的轮询功能旨在解决这些问题。通过将关于适当采样策略的决定移动到跟踪后端,我们免除服务开发人员猜测适当的采样率。这还允许后端在流量模式改变时动态地调整采样率。下图显示了从收集器到客户端库的反馈循环。
Jaeger 架构
当前的 Jaeger 架构:在 Go 中实现的后端组件,支持 OpenTracing 标准的四种语言的客户端库,基于 React 的 Web 前端以及基于 Apache Spark 的后处理和聚合数据管道。Jaeger 的各组件关系如下图所示:
Agent:Agent 是一个网络守护进程,监听通过 UDP 发送过来的 Span,它会将其批量发送给 collector。按照设计,Agent 要被部署到所有主机上,作为基础设施。Agent 将 collector 和客户端之间的路由与发现机制抽象了出来。
Collector:Collector 从 Jaeger Agent 接收 Trace,并通过一个处理管道对其进行处理。目前的管道会校验 Trace、建立索引、执行转换并最终进行存储。存储是一个可插入的组件,现在支持 Cassandra。
Query:Query 服务会从存储中检索 Trace 并通过 UI 界面进行展现,该UI界面通过React技术实现
Span:代表了系统中的一个逻辑工作单元,它具有操作名、操作开始时间以及持续时长。Span可能会有嵌套或排序,从而对因果关系建模。一个RPC调用的Span如下图所示。
Trace:代表了系统中的一个数据/执行路径,可以理解成Span的有向无环图。
Jaeger 客户端库
Jaeger 客户端库是 OpenTracing API 的特定语言实现。它们可以对要进行分布式跟踪的应用进行 instrument 操作,这些应用可以手动实现,也可以使用各种已有的开源的框架,比如 Flask、Dropwizard、gRPC 等。
需要注意的是,所有的 Trace 都会生成,但是只有其中的一小部分会被采样。默认情况下,Jaeger 会采样 0.1% 的 Trace。
附:新开源报道汇总

●本文编号79,以后想阅读这篇文章直接输入79即可
●输入m获取文章目录
↓↓↓ 点击"阅读原文" 进入GitHub详情页 
继续阅读
阅读原文