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


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. 守护石谈学习Java之路

    ​这次在CSDN Blink发表了几篇关于Java编程学习的小作文,讲述了Java工程师的成长路线.Java学习的技能树和入门工作要关注的核心问题,我继续做一次文章的整合与延展,以文章的形式发表出来, ...

  2. Serverless Workflow项目

    维基百科对工作流的定义是:对工作流程及其各操作步骤之间业务规则的抽象.概括描述.我们认为工作流的主要职责是: 保证结果一致性,提高容错性要求:对错误重试,捕获,执行回滚或补偿逻辑 为长时间运行的流程维 ...

  3. AT2274 [ARC066D] Contest with Drinks Hard

    先考虑不修改怎么做,可以令 \(dp_i\) 表示前 \(i\) 个题能获得的最大得分.那么我们有转移: \[dp_i = \min\{dp_{i - 1}, dp_{j} + \frac{(i - ...

  4. Swift数组

    数组的介绍 数组(Array)是一串有序的由相同类型元素构成的集合 数组中的集合元素是有序的,可以重复出现 Swift中的数组 swift数组类型是Array,是一个泛型集合 数组的初始化 数组分成: ...

  5. js正则表达式 未提交进行验证

    转载请注明来源:https://www.cnblogs.com/hookjc/ function SetInputMust(){  /*var varr=idstr.split(','); idstr ...

  6. 使用C++开发PHP扩展

    目前,PHP编程语言也是相当成熟,各种文档,各种问题,只要Google一下,总有你想要的答案.当然"如何开发PHP扩展"的文章也不少,但是很少有专门来介绍使用C++开发PHP扩展的 ...

  7. java多线程编程(二)

    1. wait 和 sleep 区别? 1.wait可以指定时间也可以不指定,sleep必须指定时间. 2.在同步中时,对cpu的执行权和锁的处理不同.  wait:释放执行权,释放锁.  sleep ...

  8. SpringCloud--feign的配置加载

    spring cloud feign我们使用 @FeignClient注解,其中有几个核心属性: @AliasFor("name") String value() default ...

  9. 大话PHP设计模式笔记

    针对PHP的设计模式进行总结记录. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百度云下载,这样以后你们开发就可以直接翻笔记不用百度搜那么麻 ...

  10. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...