在大型网站系统设计中,随着分布式架构,特别是微服务架构的流行,我们将系统解耦成更小的单元,通过不断的添加新的、小的模块或者重用已经有的模块来构建复杂的系统。随着模块的不断增多,一次请求可能会涉及到十几个甚至几十个服务的协同处理,那么如何准确快速的定位到线上故障和性能瓶颈,便成为我们不得不面对的棘手问题。


Jaeger 是什么

为解决分布式架构中复杂的服务错误定位和性能问题,Google在论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》中提出了分布式跟踪系统的设计和构建思路。

Jaeger 是受到 Dapper 的启发,由 Uber 创建的分布式追踪平台,可用于监控和追踪基于微服务模式构建的分布式系统。Jaeger 于 17 年 4 月份开源,9 月进入 CNCF 孵化,2019 年 10 月正式从 CNCF 毕业,一跃成为 CNCF 顶级项目。

Jaeger 的流行得益于背后有大厂和强大的组织支持,同时原生支持 OpenTracing 标准(可以认为是 OpenTracing 协议的参考实现),当前支持多种主流语言(如 Java、.NET、Golang、Python、NodeJS 等),并且社区有大量的 OpenTracing 生态组件可以直接使用。

在架构设计上,Jaeger 使用 gRPC 插件化的设计,可以同时支持多种后端存储,目前支持的数据存储包括:内存、Badger、Cassandra、Elasticsearch、GRPC插件等。在 Jaeger 的新版本中,也实现了流式架构来处理数据分析,不过需要额外引入 Kafka 和 Flink 组件。

但在要实现微服务系统完整的可观测性,我们发现 Jaeger 本身也具有一定的局限性:

  • 相比其他的可观测性系统,Jaeger 更专注于链路追踪(Tracing),日志和指标功能支持比较有限。同时因为本身缺少监控和报警机制,Jaeger 往往需要结合其他系统来一起实现,比如 Prometheus、ELK 等。

  • Jaeger 作为一个可观察性/监控系统的组成部分,是开发和运维同学定位和发现业务系统问题的重要手段,我们一定要保证监控系统比业务系统活的更久。而 Jaeger 作为一个开源项目,它本身只提供解决方案,并不会提供部署规模的评估方案和服务如何保证高可用的方案,这需要运维同学基于对服务高可用的经验和对业务系统规模的调研的给出具体部署方案。

那么这种情况下我们怎么去降低可观测性平台的复杂性?怎么去提供高可用和高性能的后端服务?

最好的方式是寻找一个能够兼容 Jaeger 的后端系统,提供高可靠、高性能的能力。

当 Jaeger 相遇 Erda

Erda 作为一款云上应用协同开发平台,提供了 SaaS 化可开箱即用的可观测性云服务,免去了自己运维多个监控、日志系统后端的复杂性,同时也提供了完整的微服务观测能力,包括但不限于:

  • 服务性能监控,包括接口调用监控、SQL 调用监控、慢事务分析、JVM 监控等
  • 分布式链路追踪,调用链路的瀑布图/火焰图等多种分析模式
  • 分布式日志查询和分析
  • 可视化并且灵活的告警配置,支持告警收敛、降噪
  • 自定义仪表盘分析

一般情况下,可以有两种不同的方式来替换 Jaeger 的后端:

  • 原生的数据用 Jaeger SDK 产生,查询模式继续使用 Jaeger 的 UI,这样对于应用开发同学来说继续沿用之前的使用模式,但也仅限于 Jaeger 能提供的 Trace 能力

  • 原生的数据用 Jaeger SDK 产生,查询使用 Erda 的微服务观测平台

在 Erda 上,目前我们只支持第 2 种方式,原因在于除了 Trace 能力之外,Erda 还可以基于 Jaeger 的数据,自动发现服务调用拓扑,自动分析服务接口的调用性能等。

接下来,我们看一下如何使用 Jaeger SDK 把数据接入 Erda 微服务观测平台。

首先,在管理中心创建一个监控项目(监控项目和研发项目的区别是后者除观测能力之外还包含完整的 DevOps 研发功能):

接下来在微服务治理平台中找到创建的监控项目,进入后点击【环境设置】 > 【接入配置页面】:

目前 Erda 支持 Jaeger SDK 直连后端的方式,为了区分不同用户上报的追踪数据和鉴权,我们需要根据页面的提示获取【接入点】、【环境ID】和【环境Token】三个变量。

下面以 Java SDK 为例,我们可以使用 Jaeger SpringCloud Starter 或者其他任何兼容 OpenTracing 的 SDK,然后在 Jaeger 的 tags 中添加上面的三个变量标签,并且把 SDK 的上报接入点修改为

https://collector.erda.cloud/api/jaeger/traces】

例如:

opentracing:
jaeger:
service-name: <your_service_name>
http-sender:
url: https://collector.erda.cloud/api/jaeger/traces
log-spans: true
tags:
erda.env.id: <your_env_id>
erda.env.token: <your_token>

Jaeger 和 Erda 功能对比

拓扑分析可以自动计算并生成 Trace 的依赖拓扑,相比 Jaeger 增加了非常多的指标计算,包括 QPS、错误率、平均延迟、状态码分布等:

Erda 可以自动从 Jaeger 的 Trace 数据中计算出服务节点,并生成服务的全局 Top 对比:

Erda 提供服务端视角的 APM 功能,Jaeger 并不具备这样的能力:

Erda 可以对 Trace 数据进行计算分析并且生成大量可自定义配置的告警策略,Jaeger 还暂不支持此功能:

此外,Erda 链路追踪分析能力增强,并支持火焰图模式:

小结

Jaeger 作为 OpenTracing 协议的代表实现,也是 CNCF 的顶级项目和大量云原生框架实现Trace能力的首选。如果你正在使用 Jaeger ,可以很容易的在不修改代码的情况下进行尝试把数据接入到 Erda 进行统计和分析。

另外,Erda 2.0 版本也将于今天正式发布,本次版本中产品整体视觉交互进行全新的改版上线,深度优化产品用户体验;项目级的研发流程全新上线,在单应用的 CI/CD 基础之上,提供了项目级的流水线、制品、环境部署的核心功能,让软件项目产品研发、交付变得更简单优雅~我们在后续的文章中将会对新版本进行详细解读,感兴趣的小伙伴可以持续关注!

参考链接 & 延伸阅读

《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》

《使用SLS Trace实现Jaeger的高可靠部署方案》

极速体验|使用 Erda 微服务观测接入 Jaeger Trace的更多相关文章

  1. 通过k8s部署dubbo微服务并接入ELK架构

    需要这样一套日志收集.分析的系统: 收集 -- 能够采集多种来源的日志数据 (流式日志收集器) 传输 -- 能够稳定的把日志数据传输到中央系统 (消息队列) 存储 -- 可以将日志以结构化数据的形式存 ...

  2. [Abp vNext微服务实践] - 前后端分类

    一.前景 abp vNext是ABP 开源 Web应用程序框架,是abp的新一代开源web框架.框架完美的集成.net core.identity server4等开源框架,适用于构建web应用程序和 ...

  3. 基于.NET CORE微服务框架 -谈谈surging API网关

    1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...

  4. 【架构】SpringCloud JHipster -微服务相关资料

    SpringCloud-微服务相关资料 基于Spring Boot和Spring Cloud实现微服务架构学习(四)-Spring Cloud总结 - zeb_perfect的专栏 - 博客频道 - ...

  5. Spring Cloud微服务Sentinel+Apollo限流、熔断实战总结

    在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实 ...

  6. Spring Cloud微服务限流之Sentinel+Apollo生产实践

    Sentinel概述 在基于Spring Cloud构建的微服务体系中,服务之间的调用链路会随着系统的演进变得越来越长,这无疑会增加了整个系统的不可靠因素.在并发流量比较高的情况下,由于网络调用之间存 ...

  7. Erda MSP 系列 - 以服务观测为中心的 APM 系统设计:开篇词

    本文首发于 Erda 技术团队知乎账号,更多技术文章可点击 Erda 技术团队 作者:刘浩杨,端点科技 PaaS 技术专家,微服务治理和监控平台负责人,Apache SkyWalking PMC成员 ...

  8. SpringCloud初体验:六、利用 Sleuth 和 Zipkin 给微服务加上链路监控追踪查看功能

    首先:装上 Zipkin 服务,收集调用链跟踪数据,体验时装在了本机docker上, 方便快捷 docker run -d -p : openzipkin/zipkin 安装后访问地址也是 9411端 ...

  9. Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转

    原文地址:https://mp.weixin.qq.com/s/QO1QDQWnjHZp8EvGDrxZvw 这是专题的第二篇文章,看看如何搭建一个简单模式的微服务架构. 记得好久之前看到一个大牛说过 ...

随机推荐

  1. ApacheCN Pandas 教程集

    Pandas 秘籍 零.前言 一.Pandas 基础 二.数据帧基本操作 三.开始数据分析 四.选择数据子集 五.布尔索引 六.索引对齐 七.分组以进行汇总,过滤和转换 八.将数据重组为整齐的表格 九 ...

  2. 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足

    前言 PC网页吊起支付宝支付界面报了如下这么个错误: 我明明申请的支付宝支付功能列表的签约已经生效了呀!怎么回事呢? 解决 支付宝商户中心:https://b.alipay.com/signing/p ...

  3. #pragma mark指令

    1.#pragma mark指令的使用 功能:简单来说就是对代码的分组,方便代码查找和导航用的 它们告诉Xcode编译器,要在编辑器窗格顶部的方法和函数弹出菜单中将代码分隔开.一些类(尤其是一些控制器 ...

  4. java中静态代码块初始化顺序

    (一)java 静态代码块 静态方法区别    一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下, ...

  5. Jenkins敏捷开发 自动化构建工具

    一.序言 Jenkins 是一款自动化构建工具,能够基于 Maven 构建后端 Java 项目,也能够基于 nodejs 构建前端 vue 项目,并且有可视化 web 界面. 所谓自动化构建是按照一定 ...

  6. Hadoop文件操作常用命令

    1.创建目录 #hdfs dfs -mkidr /test 2.查询目录结构 #hdfs dfs -ls / 子命令 -R递归查看//查看具体的某个目录:例如#hdfs dfs -ls /test 3 ...

  7. 05.python语法入门--垃圾回收机制

    # (1)垃圾回收机制GC# 引用计数# x = 10 # 值10引用计数为1# y = x   # 值10引用计数为2## y = 1000 # 值10引用计数减少为1# del x     # 值 ...

  8. Solution -「HAOI 2018」「洛谷 P4491」染色

    \(\mathcal{Description}\)   Link.   用 \(m\) 种颜色为长为 \(n\) 的序列染色,每个位置一种颜色.对于一种染色方案,其价值为 \(w(\text{出现恰 ...

  9. 羽夏闲谈—— C 语言入门之问

    前言   最近加入了一个QQ频道,有很多想学C的纯小白.为什么这么说呢?因为他们会问一些环境用啥?为啥我配置不行?看了教程配置环境我也不会,咋配置?为啥这里代码这里有错误?啥语言好不好?诸如此类的问题 ...

  10. UVM中重要函数

    1.get_full_name() 获取这个节点的完整层次,这函数在object中就有定义,但是在component类中进行了重载,实现输出从uvm_test_top到当前节点的路径(是通过执行m_s ...