背景

之前陆续写过一些和 OpenTelemetry 相关的文章:

这些内容的前提是最好有一些 OpenTelemetry 的背景知识,看起来就不会那么枯燥,为此这篇文章就来做一个入门科普,方便一些对 OpenTelemetry 不是那么熟的朋友快速掌握一些 OpenTelemetry 的基本概念。


历史发展

早在 OpenTelemetry 诞生之前可观测性这个概念就一直存在了,我记得我最早接触到这个概念是在 16 年当时的公司所使用的一个产品:pinpoint

现如今这个项目依然比较活跃。



依然还记得当时通过它可以直接看到项目调用的拓扑图,在时间坐标上框出高延迟的点就能列出这些请求,同时还能查看此时的运行日志。

这样强大的功能对于一个刚工作一年的小白来说冲击力实属太大了一点。

后来才了解到 pinpoint 属于 APM 这类产品,类似的产品还有:

  • Apache SkyWalking
  • 美团的 CAT 等

他们都是可以用于性能分析和链路追踪的产品,到后来公司的运维层面也接入过 Zabbix、open-falcon 之类的产品:

17之后全面切换到 spring boot 时,也用过社区提供的 spring-boot-admin 项目:



这就是一个简单的可以监控 spring boot 应用的产品,用于展示 JVM 指标,或者自己也可以定义一些健康指标。


再之后进入云原生体系后可观测性的技术栈稍有变化。

日志使用 Sidecar 代理的方式通过 Agent 将数据写入 ElasticSearch 中。

具体日志采集方式可以参考之前的文章:

而链路追踪则是使用的 skywalking,在 trace 这个领域 skywalking 还是非常受大家喜爱的。

不过最近也从 skywalking 切换到了我们本文所讲到的 OpenTelemetry,具体可以看之前的文章:

指标采集使用的是自然也是 Prometheus 的那一套技术栈,只是 Prometheus 换为了与它完全兼容的 VictoriaMetric 目前是为了更省资源。

客户端使用则是直接使用 Prometheus 的库进行指标暴露:

  1. <dependency>
  2. <groupId>io.prometheus</groupId>
  3. <artifactId>prometheus-metrics-core</artifactId>
  4. <version>1.0.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>io.prometheus</groupId>
  8. <artifactId>prometheus-metrics-instrumentation-jvm</artifactId>
  9. <version>1.0.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>io.prometheus</groupId>
  13. <artifactId>prometheus-metrics-exporter-httpserver</artifactId>
  14. <version>1.0.0</version>
  15. </dependency>

最终通过配置抓取策略,由 VictoriaMetrics 的 scrape 程序来抓取指标最终写入到它自己的存储中:

  1. apiVersion: operator.victoriametrics.com/v1beta1
  2. kind: VMPodScrape
  3. metadata:
  4. name: kubernetes-pod-scrape
  5. namespace: monitoring
  6. spec:
  7. podMetricsEndpoints:
  8. - scheme: http
  9. scrape_interval: "30s"
  10. path: /metrics
  11. relabelConfigs:
  12. - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
  13. separator: ;
  14. regex: "true"
  15. replacement: $1
  16. action: keep
  17. # 端口相同
  18. - action: keep_if_equal
  19. source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number ]
  20. # 过滤INIT容器
  21. - action: drop
  22. source_labels: [ __meta_kubernetes_pod_container_init ]
  23. regex: "true"
  24. - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
  25. separator: ;
  26. regex: (.+)
  27. target_label: __metrics_path__
  28. replacement: $1
  29. action: replace
  30. - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
  31. separator: ;
  32. regex: ([^:]+)(?::\d+)?;(\d+)
  33. target_label: __address__
  34. replacement: $1:$2
  35. action: replace
  36. - separator: ;
  37. regex: __meta_kubernetes_pod_label_(.+)
  38. replacement: $1
  39. action: labelmap
  40. - source_labels: [__meta_kubernetes_namespace]
  41. separator: ;
  42. regex: (.*)
  43. target_label: kubernetes_namespace
  44. replacement: $1
  45. action: replace
  46. - source_labels: [__meta_kubernetes_pod_name]
  47. separator: ;
  48. regex: (.*)
  49. target_label: kubernetes_pod_name
  50. replacement: $1
  51. action: replace
  52. vm_scrape_params:
  53. stream_parse: true
  54. namespaceSelector:
  55. any: true

以上是 VM 提供的 CRD

OpenTelemetry 诞生

到此铺垫完成,不知道有没有发现在可观测性中关键的三个部分:日志、指标、trace 都是使用不同的开源产品,从而会导致技术栈较多,维护起来自然也是比较麻烦的。

这么一个软件领域的核心能力自然需要提供一个完整方案的,将以上的不同技术栈都整合在一起,更加的方便开发者使用。

在这之前也有两个社区想要做类似的事情:

  • OpenTracing
  • OpenCensus

不过他们并没有统一整个可观测领域,直到 2019 年 CNCF 社区宣布成立 OpenTelemetry,并且将上述两个社区进行合并共同开发 OpenTelemetry。

背靠 CNCF 云原生社区加上许多知名厂商的支持(Google、Amazon、Redhat 等),现在已经正式成为 CNCF 的顶级项目了。

OpenTelemetry 架构介绍

但我们打开 OpenTelemetry 社区的 GitHub 首页时,会看到有许多项目;第一反应应该是比较蒙的,下面我会着重介绍一些比较重要的项目。

在开始之前还是先简单介绍下 OpenTelemetry 的一些基础组件和概念:

整个 OpenTelemetry 系统其实可以简单分为三个部分:

  • 客户端
  • OTel collector
  • 数据存储

第一个客户端很好理解,也就是我们的业务应用;如果是 Java 应用只需要挂载一个 agent 就可以自动采集系统的指标、链路信息、日志等上传到 Collector 中。

也就是上图的左边部分。

之后就是非常关键的组件 collector,它可以通过 OTLP 协议接收刚才提到的客户端上传的数据,然后再内部进行处理,最终输出到后续的存储系统中。

Collector

上图是 collector 的架构图

由于 OpenTelemetry 设计之初就是要做到厂商无关,所以它就得做出更高层级的设计。

关键点就是这里的 Receiver 和 Exporter 都是模块化的设计,第三方开发者可以基于它的标准开发不同组件从而兼容不同的产品。

Receiver:用于接收客户端上报的数据,不止是自己 agent 上报的数据,也可能会来自不同的厂商,比如 kubernetes、Kafka 等。

Exporter:同理,可以将 receiver 收到的数据进行处理之后输出到不同的组件中;比如 Kafka/Pulsar/Promethus/Jaeger 等。

比如我们可以使用 Nginx Receiver接收来着 Nginx 上报的数据。

使用 MySQL Receiver接收来自 MySQL 的数据。

当然通常我们使用最多的还是 OTLP Receiver,这是官方的 OTLP 协议的接收器,可以接受官方的一些指标,比如我们只使用了 Java Agent 进行数据上报时。



https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver

在这里是可以看到目前支持的所有第三方的 Receiver。


OpenTelemetry 所支持的 Exporter 也很多,比如一些常见的存储:

Exporter 的使用场景很多:如果是指标相关的数据可以直接写入 Prometheus,如果是日志数据也可以直接写入 ElasticSearch。

如果还有其他的特殊需求(删减属性等)则可以写入消息队列,自行处理完之后再发往 collector 进行后续的处理。

可能你已经发现了,由于 collector 非常的灵活,所以我们可以像搭积木一样组装我们的 receiver 和 exporter,它会以我们配置的流水线的方式进行调用,这样我们就可以实现任意可定制的处理逻辑。

而这些流水线的组装对于客户端来说都是透明的,也就是说 collector 的更改完全不会影响到业务;业务只需要按照 OTLP 的格式上报数据即可。

在之前的从 Skywalking 切换到 OpenTelemetry 的文章中有人问为什么要切换到 OpenTelemetry?

从这里也能看得出来,OpenTelemetry 的灵活度非常高,借助于 Exporter 可以任意的更换后端存储,或者增加/删减一些不需要的指标数据等。


当然我们也可以统一的在这里进行搜索,可以列出所有的第三方集成的组件:

https://opentelemetry.io/ecosystem/registry/

OpenTelemetry 项目介绍

opentelemetry-java

介绍完基本的概念后,我们可以看看 OTel 社区的一些主要开源项目。

这里我们还是以刚才的那个架构图从作往右讲起,也就是主要分为客户端和 collector 端。



目前官方支持的客户端语言已经非常齐全了,大部分的版本都已经是 Stable 稳定版,意味着可以进入生产环境。

这里我们以 Java 客户端为例:



其中我们重点关注下 opentelemetry-java 和 opentelemetry-java-instrumentation 这两个项目。

我们用的最多的会是 opentelemetry-java-instrumentation,它会给我们提供一个 java agent 的 JAR 包:

  1. java -javaagent:path/to/opentelemetry-javaagent.jar \
  2. -jar myapp.jar

我们只需要在 Java 应用中加上该 agent 就可以实现日志、指标、trace 的自动上报。

而且它还实现了不同框架、库的指标采集与 trace。

在这里可以查到支持的库与框架列表:

https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md#libraries--frameworks

总之几乎就是你能想到和不能想到的都支持了。

而 opentelemetry-java 我们直接使用的几率会小一些,opentelemetry-java-instrumentation 本身也是基于它创建的,可以理解为是 Java 版本的核心基础库,一些社区支持的组件就可以移动到 instrumentation 这个库中。

比如我在上篇文章:从一个 JDK21+OpenTelemetry 不兼容的问题讲起中涉及到的 HostResourceProvider 资源加载就是从 opentelemetry-java 中移动到了 opentelemetry-java-instrumentation

具体可以参考:https://github.com/open-telemetry/opentelemetry-java/issues/4701

collector

之后就是 collector 的组件了,它同样的也有两个库:

OpenTelemetry CollectorOpenTelemetry Collector Contrib

其实通过他们的名字也可以看得出来,他们的作用与刚才的 Java 库类似:

  • opentelemetry-collector:由官方社区维护,提供了一些核心能力;比如只包含了最基本的 otlp 的 receiver 和 exporter。
  • opentelemetry-collector-contrib:包含了官方的 collector,同时更多的维护了社区提供的各种 receiver 和 exporter;就如上文提到的,一些社区组件(pulsar、MySQL、Kafka)等都维护在这个仓库。

而我们生产使用时通常也是直接使用 opentelemetry-collector-contrib,毕竟它所支持的社区组件更多。

总结

因为 OpenTelemetry 想要解决的是整个可观测领域的所有需求,所以仓库非常多,社区也很开放,感兴趣的朋友可以直接参与贡献,这么多 repo 总有一个适合你的。

后续会继续讲解如何安装以及配置我们的 OpenTelemetry。

参考链接:

OpenTelemetry 实践指南:历史、架构与基本概念的更多相关文章

  1. App架构师实践指南四之性能优化一

    App架构师实践指南四之性能优化一     1.性能维度常见用来衡量App性能的维度如图9-1所示.其中,性能指标包括电池(电量/温度).流量(上行流量/下行流量等).CPU(平均/最大/最小).内存 ...

  2. App架构师实践指南五之性能优化二

    App架构师实践指南五之性能优化二 2018年07月30日 13:08:44 nicolelili1 阅读数:214   从UI和CPU方面来说App流畅体验优化,核心为流畅度/卡顿性能优化. 1.基 ...

  3. App架构师实践指南三之基础组件

    App架构师实践指南三之基础组件 1.基础组件库随着时间的增长,代码量的逐渐积累,新旧项目之间有太多可以服用的代码.下面是整理的公共代码库. 2.关于加密密钥的保护以及网络传输安全是移动应用安全最关键 ...

  4. 《App架构实践指南》

    推荐书籍 <App 架构实践指南>

  5. App架构师实践指南六之性能优化三

    App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190   内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...

  6. App架构师实践指南二之App开发工具

    App架构师实践指南二之App开发工具     1.Android Studio 2.编译调试---条件断点.右键单击断点,在弹出的窗口中输入Condition条件.---日志断点.右键单击断点,在弹 ...

  7. 转载:Google 官方应用架构的最佳实践指南 赞👍

    官方给的实践指南,很有实际的指导意义,  特别是对一些小公司,小团队,给了很好的参考意义. 原文地址: https://developer.android.com/topic/libraries/ar ...

  8. 基于 Spring Cloud 的微服务架构实践指南(下)

    show me the code and talk to me,做的出来更要说的明白 本文源码,请点击learnSpringCloud 我是布尔bl,你的支持是我分享的动力! 一.引入 上回 基于 S ...

  9. [CoreOS 转载] CoreOS实践指南(七):Docker容器管理服务

    转载:http://www.csdn.net/article/2015-02-11/2823925 摘要:当Docker还名不见经传的时候,CoreOS创始人Alex就预见了这个项目的价值,并将其做为 ...

  10. OpenGL ES应用开发实践指南:iOS卷

    <OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...

随机推荐

  1. 基于 Serverless 架构的头像漫画风处理小程序

    ​简介: 当一个程序员想要个漫画风的头像时... 前言 我一直都想要有一个漫画版的头像,奈何手太笨,用了很多软件 "捏不出来",所以就在想着,是否可以基于 AI 实现这样一个功能, ...

  2. 实时数仓入门训练营:Hologres性能调优实践

    简介: <实时数仓入门训练营>由阿里云研究员王峰.阿里云资深技术专家金晓军.阿里云高级产品专家刘一鸣等实时计算 Flink 版和 Hologres 的多名技术/产品一线专家齐上阵,合力搭建 ...

  3. Windows 官方提供的触屏硬件延迟测量方法

    本文记录微软 Windows 官方在 Windows Hardware Lab Kit 提供的触屏硬件延迟测量方法 Overview of measuring Touch Down Hardware ...

  4. k8s控制节点etcd删除并重新加入

    官方参考:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/ 1.删除etcd节点 cd ...

  5. Java中的读写锁ReentrantReadWriteLock详解,存在一个小缺陷

    写在开头 最近是和java.util.concurrent.locks包下的同步类干上了,素有 并发根基 之称的concurrent包中全是精品,今天我们继续哈,今天学习的主题要由一个大厂常问的Jav ...

  6. 记录一次fs通话无声的问题

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. fs的实际应用中,由于网络.配置等问题,经常会产生通话无声的问题. 环境 CentOS 7.9 freeswitch 1.10.7 ...

  7. 累计预扣法个税,怎么算?(附excel)

    累计预扣法个税计算 依法纳税是每个公民的义务,但看着每个月递增的个税,你可能会发出疑问,这到底是怎么算的?这就要引出2019年1月1日实施新实施的个税法,累计预扣法.即自2019年1月1日起,居民个人 ...

  8. DB2查找最耗时SQL

    两种方法:db2top和snapshot for dynamic sql 1. db2top -d <dbname>

  9. Python竖版大屏2 | 用pyecharts开发可视化的奇妙探索!

    目录 1.SHINE主题 2.LIGHT主题 3.MACARONS主题 4.INFOGRAPHIC主题 5.WALDEN主题 6.WESTEROS主题 7.WHITE主题 8.WONDERLAND主题 ...

  10. 官宣:Splashtop与JumpCloud合作 提供单次登录远程访问解决方案

    号外! 官宣:Splashtop与JumpCloud合作 提供单次登录远程访问解决方案! 打开百度APP,查看更多高清图片 以下是一本正经的官宣新闻,我是没感情的翻译机器人,嘻嘻. Bad Robot ...