OpenTelemetry-可观察性的新时代

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Ops领域两个网红项目OpenTracing和OpenCensus终于走到了一起,可观察性统一的标准化已经扬帆起航。这篇文章旨在抛砖引玉,希望能够和更多的同学一起交流可观察性相关的内容。

有幸在2019KubeCon上海站听到Steve Flanders关于OpenTelemetry的演讲,之前Ops领域两个网红项目OpenTracing和OpenCensus终于走到了一起,可观察性统一的标准化已经扬帆起航。
这篇文章旨在抛砖引玉,希望能够和更多的同学一起交流可观察性相关的内容。

前世

OpenTracing

OpenTracing制定了一套平台无关、厂商无关的Trace协议,使得开发人员能够方便的添加或更换分布式追踪系统的实现。在2016年11月的时候CNCF技术委员会投票接受OpenTracing作为Hosted项目,这是CNCF的第三个项目,第一个是Kubernetes,第二个是Prometheus,可见CNCF对OpenTracing背后可观察性的重视。比如大名鼎鼎的Zipkin、Jaeger都遵循OpenTracing协议。

OpenCensus

大家可能会想,既然有了OpenTracing,OpenCensus又来凑什么热闹?对不起,你要知道OpenCensus的发起者可是谷歌,也就是最早提出Tracing概念的公司,而OpenCensus也就是Google Dapper的社区版。OpenCensus和OpenTracing最大的不同在于除了Tracing外,它还把Metrics也包括进来,这样也可以在OpenCensus上做基础的指标监控;还一点不同是OpenCensus并不是单纯的规范制定,他还把包括数据采集的Agent、Collector一股脑都搞了。OpenCensus也有众多的追随者,最近最大的新闻就是微软也宣布加入,OpenCensus可谓是如虎添翼。

OpenTracing vs OpenCensus

两套Tracing框架,都有很多追随者,都想统一对方,咋办?首先来PK啊,这里偷个懒,直接上Steve的图:
image.png
可以看到,OpenTracing和OpenCensus从功能和特性上来看,各有优缺点,半斤八两。OpenTracing支持的语言更多、相对对其他系统的耦合性要更低;OpenCensus支持Metrics、从API到基础框架都实现了个便。既然从功能和特性上分不出高下,那就从知名度和用户数上来PK吧:
image.png
好吧,又是半斤八两,OpenTracing有很多厂商追随(比如ElasticSearch、Uber、DataDog、还有国产的SkyWalking),OpenCensus背后Google和微软两个大佬就够撑起半边天了。
最终一场PK下来,没有胜负,怎么办?

OpenTelemetry

横空出世

所谓天下合久必分、分久必合,既然没办法分个高低,谁都有优劣势,咱们就别干了,统一吧。于是OpenTelemetry横空出世。

那么问题来了:统一可以,起一个新的项目从头搞吗?那之前追随我的弟兄们怎么办?不能丢了我的兄弟们啊。
放心,这种事情肯定不会发生的。要知道OpenTelemetry的发起者都是OpenTracing和OpenCensus的人,所以项目的第一宗旨就是:兼容OpenTracing和OpenCensus。对于使用OpenTracing或OpenCensus的应用不需要重新改动就可以接入OpenTelemetry。

核心工作

OpenTelemetry可谓是一出生就带着无比炫目的光环:OpenTracing支持、OpenCensus支持、直接进入CNCF sanbox项目。但OpenTelemetry也不是为了解决可观察性上的所有问题,他的核心工作主要集中在3个部分:

  1. 规范的制定,包括概念、协议、API,除了自身的协议外,还需要把这些规范和W3C、GRPC这些协议达成一致;
  2. 相关SDK、Tool的实现和集成,包括各类语言的SDK、代码自动注入、其他三方库(Log4j、LogBack等)的集成;
  3. 采集系统的实现,目前还是采用OpenCensus的采集架构,包括Agent和Collector。

可以看到OpenTelemetry只是做了数据规范、SDK、采集的事情,对于Backend、Visual、Alert等并不涉及,官方目前推荐的是用Prometheus去做Metrics的Backend、用Jaeger去做Tracing的Backend。
image.png

看了上面的图大家可能会有疑问:Metrics、Tracing都有了,那Logging为什么也不加到里面呢?
其实Logging之所以没有进去,主要有两个原因:

  1. 工作组目前主要的工作是在把OpenTracing和OpenCensus的概念尽早统一并开发相应的SDK,Logging是P2的优先级。
  2. 他们还没有想好Logging该怎么集成到规范中,因为这里还需要和CNCF里面的Fluentd一起去做,大家都还没有想好。

终极目标

OpenTelemetry的终态就是实现Metrics、Tracing、Logging的融合,作为CNCF可观察性的终极解决方案。

Tracing:提供了一个请求从接收到处理完毕整个生命周期的跟踪路径,通常请求都是在分布式的系统中处理,所以也叫做分布式链路追踪。
Metrics:提供量化的系统内/外部各个维度的指标,一般包括Counter、Gauge、Histogram等。
Logging:提供系统/进程最精细化的信息,例如某个关键变量、事件、访问记录等。

这三者在可观察性上缺一不可:基于Metrics的告警发现异常,通过Tracing定位问题(可疑)模块,根据模块具体的日志详情定位到错误根源,最后再基于这次问题调查经验调整Metrics(增加或者调整报警阈值等)以便下次可以更早发现/预防此类问题。

Metrics、Tracing、Logging融合的关键

实现Metrics、Tracing、Logging融合的关键是能够拿到这三者之间的关联关系.其中我们可以根据最基础的信息来聚焦,例如:时间、Hostname(IP)、APPName。这些最基础的信息只能定位到一个具体的时间和模块,但很难继续Digin,于是我们就把TraceID把打印到Log中,这样可以做到Tracing和Logging的关联。但这还是解决不了很多问题:

  1. 如何把Metrics和其他两者关联起来
  2. 如何提供更多维度的关联,例如请求的方法名、URL、用户类型、设备类型、地理位置等
  3. 关联关系如何一致,且能够在分布式系统下传播

在OpenTelemetry中试图使用Context为Metrics、Logging、Tracing提供统一的上下文,三者均可以访问到这些信息,由OpenTelemetry本身负责提供Context的存储和传播:

  • Context数据在Task/Request的执行周期中都可以被访问到
  • 提供统一的存储层,用于保存Context信息,并保证在各种语言和处理模型下都可以工作(例如单线程模型、线程池模型、CallBack模型、Go Routine模型等)
  • 多种维度的关联基于Tag(或者叫meta)信息实现,Tag内容由业务确定,例如:通过TrafficType来区别是生产流量还是压测流量、通过DeviceType来分析各个设备类型的数据...
  • 提供分布式的Context传播方式,例如通过W3C的traceparent/tracestate头、GRPC协议等

下面是Yuri Shkuro画的原型设计:

  +----------------------------------------------------+
               |                                                    |
  +------------+ custom application logic or specialized frameworks |
  |            |                                                    |
  |            +-------------------------------------+--------------+
  |                                                  |
  |    +---------+ +------+ +--------+               |
  |    |         | |      | |        |               |
  |    | metrics | | logs | | traces +---+           |
  |    |         | |      | |        |   |           |
  |    +----+----+ +---+--+ +---+----+   |           |
  |         ^          ^        ^        |           |
  |   +-----+----------+--------+-----+  |           |
  |   |                               |  |           |
  +--->            baggage            |  |           |
      |                               |  |           |
      +---------------+---------------+  |           |
                      |                  |           |
+---------------------+------------------+-----------+-------------------+
             Universal context propagation layer <-----> marshaling
                                                          plugins

当前状态以及后续路线

目前OpenTelemetry还处于策划和原型阶段,很多细节的点还在讨论当中,目前官方给的时间节奏是:

  • 2019年9月,发布主要语言版本的SDK(Pre Release版)
  • 2019年11月,OpenTracing和OpenCensus正式sunsetted(ReadOnly)
  • 未来两年内,保证可以兼容OpenTracing和OpenCensus的SDK

总结

从Prometheus、OpenTracing、Fluentd到OpenTelemetry、Thanos这些项目的陆续进入就可以看出CNCF对于Cloud Native下可观察性的重视,而OpenTelemetry的出现标志着Metrics、Tracing、Logging有望全部统一。

但OpenTelemetry并不是为了解决客观性上的所有问题,后续还有很多工作需要进行,例如:

  • 提供统一的后端存储,目前三类数据都是存储在不同系统中
  • 提供计算、分析的方法和最佳实践,例如动态拓扑分析
  • 统一的可视化方案
  • AIOps相关能力,例如Anomaly Detection、Root Cause Analysis等

参考

有兴趣的同学可以看看下面的一些文章,欢迎各位指教和探讨:
https://opentracing.io/
https://opencensus.io/
https://opentelemetry.io/
https://thenewstack.io/opentracing-opencensus-merge-into-a-single-new-project-opentelemetry/
https://www.cncf.io/blog/2019/05/21/a-brief-history-of-opentelemetry-so-far/
https://www.cncf.io/blog/2016/10/11/opentracing-joins-the-cloud-native-computing-foundation/
https://medium.com/jaegertracing/embracing-context-propagation-7100b9b6029a
https://github.com/open-telemetry/opentelemetry-specification/issues/9
https://docs.google.com/document/d/1UxrEYOaQlF_E4gtiPoFmcZ4YKKe1GxohvCvQDuwvD1I/edit?source=post_page---------------------------#heading=h.pcdszlrz3y2w
https://medium.com/jaegertracing/jaeger-and-opentelemetry-1846f701d9f2

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
存储 JSON 运维
直击痛点,详解 K8s 日志采集最佳实践
在 Kubernetes 中,日志采集和普通虚拟机的方式有很大不同,相对实现难度和部署代价也略大,但若使用恰当则比传统方式自动化程度更高、运维代价更低。
直击痛点,详解 K8s 日志采集最佳实践
|
4月前
|
存储 人工智能 监控
日志服务 SLS 深度解析:拥抱云原生和 AI,基于 SLS 的可观测分析创新
阿里云日志服务 SLS 全面拥抱云原生和 AI,近一年持续进行技术创新,此次云栖大会上发布了在稳定可靠、高性能、开放易用、AI 加持、低成本等五个方面的全面升级。
102008 4
|
6月前
|
前端开发 Cloud Native JavaScript
《深入分布式追踪:OpenTracing 实践手册》
《深入分布式追踪:OpenTracing 实践手册》
125 0
|
11月前
|
Arthas 缓存 Prometheus
《2021 阿里云可观测技术峰会演讲实录合辑(下)》——一、基于OPLG从0到1构建统一可观测平台实践——场景实践1:如何基于OpenTemeletry和ARMS实现全链路的追踪和应用诊断【下】
《2021 阿里云可观测技术峰会演讲实录合辑(下)》——一、基于OPLG从0到1构建统一可观测平台实践——场景实践1:如何基于OpenTemeletry和ARMS实现全链路的追踪和应用诊断【下】
456 0
|
11月前
|
监控 Java
《2021 阿里云可观测技术峰会演讲实录合辑(下)》——一、基于OPLG从0到1构建统一可观测平台实践——场景实践1:如何基于OpenTemeletry和ARMS实现全链路的追踪和应用诊断【上】
《2021 阿里云可观测技术峰会演讲实录合辑(下)》——一、基于OPLG从0到1构建统一可观测平台实践——场景实践1:如何基于OpenTemeletry和ARMS实现全链路的追踪和应用诊断【上】
387 0
|
11月前
|
弹性计算 Prometheus 监控
《2021 阿里云可观测技术峰会演讲实录合辑(下)》——一、基于OPLG从0到1构建统一可观测平台实践——场景实践2:如何基于Prometheus和Grafana做统一的监控和告警
《2021 阿里云可观测技术峰会演讲实录合辑(下)》——一、基于OPLG从0到1构建统一可观测平台实践——场景实践2:如何基于Prometheus和Grafana做统一的监控和告警
231 0
|
存储 Prometheus 运维
云原生可观测套件:构建无处不在的可观测基础设施
近日,全球权威 IT 研究与顾问咨询公司 Gartner 发布《2023 年十大战略技术趋势》报告,「应用可观测性」再次成为其中热门趋势之一。阿里云原生可观测套件 ACOS Prometheus监控、ARMS、Grafana服务皆迎来重大更新,进一步覆盖不同监控长江。
云原生可观测套件:构建无处不在的可观测基础设施
|
存储 数据采集 运维
阿里云日志服务SLS携手观测云发布可观测性解决方案,共建可观测应用创新
2022年云栖大会期间,阿里云同观测云共同发布可观测性联合解决方案。
298 0
|
存储 监控 前端开发
【SkyWalking】从零接入全链路追踪解决方案
Skywalking是一个国产的开源框架,2015年有吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,本次分享下从零接入SkyWalking。
576 0
【SkyWalking】从零接入全链路追踪解决方案
ARMS 助力羽如贸易打造全链路可观测最佳实践
随着奢侈品行业在我国快速发展,跨境电商市场不断扩张。作为电商行业初创企业的上海羽如贸易有限公司(简称羽如贸易)积极进行数字化创新,打破固有零售思维,借助可观测能力有效提升用户体验,为业务飞速增长提供稳定支持。
226 0
ARMS 助力羽如贸易打造全链路可观测最佳实践