简介

  1. OpenTelemetry 简称 OTel,是 CNCF 的一个可观测性项目
  2. OpenTelemetry 旨在提供可观测性领域标准化方案
    • 解决遥测数据数据建模采集处理导出等标准化问题,并能将数据发送到后端 - 避免厂商锁定

历史

  1. 在 OpenTelemetry 之前,已经出现过 OpenTracingOpenCensus 两套标准
  2. APM 领域,有 Jaeger、Pinpoint、Zipkin 等多个开源产品,都有独立的数据采集标准SDK
  3. OpenTracing 制订了一套与平台厂商无关的协议标准,能够方便地添加或者更换底层 APM 实现
    • 2016 年 11 月,CNCF 接受 OpenTracing 成为第三个项目 - Kubernetes + Prometheus
  4. OpenCensus谷歌发起,包括 Metrics,而微软也加入了 OpenCensus
  5. 功能特性上,OpenTracing 和 OpenCensus 差不多,都想统一对方,此时 OpenTelemetry 横空出世
  6. OpenTelemetry
    • 同时兼容 OpenTracing 和 OpenCensus
    • 支持各种语言后端 - OpenTelemetry 本身不提供后端
    • 支持厂商中立 - 在不改变现有工具的情况下捕获遥测数据并将其传输到后端

架构

Specification + API / SDK + Collector

跨语言规范

  1. 跨语言规范描述了所有实现的跨语言要求数据模型
    • 遥测客户端内部实现所需要的标准定义 + 与外部通信时需要实现的协议规范
  2. 主要包含
    • API - 定义用于生成和关联 Tracing、Metrics 和 Logs 的数据类型操作
    • SDK - 定义 API 特定语言实现的要求,同时还定义配置、数据处理和导出等概念
    • 数据 - 定义遥测后端可以支持的 OpenTelemetry 协议和与厂商无关的语义约定
  3. OTLP - OpenTelemetry Protocol
    • OTLP 是 OpenTelemetry 原生遥测信号传递协议
    • OpenTelemetry 项目组件支持 Zipkin V2Jaeger Thrift 协议格式的实现 - 第三方贡献库
    • OTLP 的数据模型定义是基于 ProtoBuf 完成的

API + SDK

  1. API 可以让开发者对应用程序代码进行 Instrument,而 SDK 是 API 的具体实现,与开发语言是相关的
  2. Instrument 是将系统状态数据(遥测数据-Telemetry)发送到后端,遥测数据包括 - Metrics + Logs + Tracing
    • 遥测数据记录了处理特定请求时的代码行为,可以对应用系统的状态进行分析
  3. Instrument 的方式 - 手动增加代码生成遥测数据 + 以探针的方式自动收集数据
  4. OpenTelemetry 为每种语言提供了基础的监控客户端 APISDK

Collector

  1. Collector - 接收转换导出遥测数据 - OpenTelemetry 中最重要的部分
  2. Collector 针对如何接收处理导出遥测数据提供了与厂商无关的实现 - 避免厂商锁定
  3. Collector 支持将开源可观测数据格式(如 JaegerPrometheus 等)发送到一个或多个开源或商业后端
  4. 在 Collector 内部,有一套负责接收、处理和导出数据的 Pipeline
    • Receiver
      • 负责按照对应的协议格式监听和接收遥测数据,并将数据转给一个或多个 Processor
    • Processor
      • 负责加工处理遥测数据,并把数据传递给下一个 Processor 或者一个或多个 Exporter
    • Exporter
      • 负责把数据发送给下一个接收端(一般是后端),例如将指标数据存储到 Prometheus 中

image-20241207215647292

部署模式

  1. Agent 模式
    • 把 Collector 部署在应用程序所在的主机内(Kubernetes DaemonSet or Kubernetes Sidecar
  2. Gateway 模式
    • 把 Collector 当作一个独立的中间件,应用把采集到的遥测数据发往到该中间件

实现方案

开源工具

OpenTelemetry 在 Logs 方面还不稳定

image-20241207220324398

Grafana

image-20241207220845370

  1. Grafana Tempo
    • Grafana Tempo 是一个开源易于使用大规模分布式追踪后端
    • Tempo 具有成本效益,只需要对象存储即可运行,可以和 Grafana、Prometheus 和 Loki 深度集成
    • Tempo 可以与任何开源 Tracing 协议一起使用 - Jaeger、Zipkin、OpenTelemetry
  2. Grafana Loki - Like Prometheus, but for logs
    • Grafana Loki 是一个水平可扩展高可用性多租户日志聚合系统
    • Grafana Loki 的设计非常经济高效且易于操作,不会为日志内容编制索引,而是为每个日志流编制一组标签
    • OpenTelemetry 为对应的日志打上 TraceIdSpanId 等标签
    • Grafana Loki 并不能高效分析和处理大型生产系统的日志