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


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. 精通 Pandas · 翻译完成

    协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 面试求职交流群 724187166 ApacheCN 学习资源 ...

  2. 统信UOS系统部署.Net Core 5.0

    平时很少用Linux,需要的时候才查资料,记录下遇到的问题和解决办法.这次部署的系统是统信UOS,arm64位CPU 第一步:安装.Net Core 5.0运行环境 统信UOS是基于Debian 10 ...

  3. Java Calendar类的使用总结【转】

    感谢!原文地址:https://www.cnblogs.com/huangminwen/p/6041168.html Java Calendar类的使用总结 在实际项目当中,我们经常会涉及到对时间的处 ...

  4. CentOS更新VMware Tools及设置共享文件夹

    CentOS设置共享文件夹 设置共享文件夹 点击虚拟机->设置 2. 打开虚拟机设置->选项->共享文件夹->总是启用->添加 3. 点击下一步创建主机路径并命名 4. ...

  5. 微服务从代码到k8s部署应有尽有系列(一)

    从本篇文章开始,我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 实战项目地址:https://github.com/Mikaelemmmm/go-zer ...

  6. sql与数据库

    sql的优化: 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在进行条件判断的字段上创建索引 2.尽量避免在WHERE字句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描 3. ...

  7. centos安装MySQL问题

    使用sudo yum install mysql-server出现没有可用软件包 mysql-server. 先 执行 wget http://repo.mysql.com/mysql-communi ...

  8. Azure AD(六)添加自定义域名

    一,引言 每当我们在 Azure Portal 上创建新的租户时,都会在设置租户的 "初始域名" 后加上 ".onmicrosoft.com",默认情况下 &q ...

  9. 如何强制关闭Win10自动更新

    今天我向往常一样打开了电脑,在工作时突然感觉CPU风扇嗡嗡的响电脑开始变得极慢内存也开始上涨,我意识到不妙了,Windows10 又开始在后台给我搞事情了,由于我的电脑安装有开机还原功能,所以每次开机 ...

  10. JUC之Java中的阻塞队列及其实现原理

    在文章线程池实现原理 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了线程池的组成部分,其中一个组成部分就是阻塞队列.那么JAVA中的阻塞队列如何实现的呢? 阻塞队列,关键字是阻塞 ...