OpenTelemetry

概述

参考:

OpenTelemetry(开放式遥测技术,简称 OTel) 是一组 API、SDK、工具、更是一种遥测标准,旨在创建和管理 Telemetry Data(遥测数据)。通过 OpenTelemetry 标准创建的程序,可以采集 OpenTelemetry 标准的遥测数据,并发送到我们指定的后端中。OpenTelemetry 支持各种流行的开源后端项目,比如 Prometheus、Jaeger 等。

遥测数据包括

Notes:OpenTelemetry 不是像 Prometheus、Jaeger 那样的可观测性后端。相反,OpenTelemetry 支持将数据导出到各种开源和商业的后端产品中,它提供了一个可插拔的架构,因此可以轻松添加其他技术协议和格式。

OTel 之于可观测性系统,类似 OCI 之于容器。但是能比 OCI 提供更多。

OpenTelemetry 组件

目前,OpenTelemetry 主要包含如下组件:

  • 规范 # 与编程语言无关的规范,规定了遥测数据格式等
  • 工具 # 用于 采集/接收、转换、导出 遥测数据的工具。比如官方提供的 OTel Collector
  • SDK # 用于为各种编程语言提供编写符合 OpenTelemetry 规范的工具
  • 自动 instrumentation 和 贡献包 # TODO: 没搞懂这是什么?

Signals

https://opentelemetry.io/docs/concepts/signals/

OpenTelemetry 创建了一个名词,将 可观测数据(遥测数据) 抽象为 Signals。

OpenTelemetry 是围绕 Signals 或 遥测类别 构建的。Metrics、Logs、Traces、Baggage 都是一种 Signals。每个 Signals 代表一组连贯的、独立的功能。每个信号都遵循单独的生命周期,定义其当前的稳定性级别。

OpenTelemetry 的目的是收集、处理和导出 Signals。传统定义中,Signal(信号) 是系统输出,描述操作系统和应用程序的底层活动。在 OpenTelemetry 中,Signals 可以是想要在特定时间点测量的内容,例如温度或内存使用情况,也可以是想要跟踪的分布式系统组件的事件。可以将不同的 Signals 组合在一起,从不同角度观察同一项技术的内部运作情况。

Resource

https://opentelemetry.io/docs/concepts/resources/

Resource 是属性的集合,用来表示生成遥测数据的实体。比如 Kubernetes 一个容器, 其中的进程名称、Pod 名称、命名空间、etc. 都是该实体的资源。

OpenTelemetry SDK 提供了一些属性。其中之一是 service.name ,表示服务的逻辑名称。默认情况下,SDK 会为此值分配 unknown_service ,因此建议明确设置它,可以在代码中设置,也可以通过设置环境变量 OTEL_SERVICE_NAME 来设置。

[!Note] 截至 2025-05-19,怎么感觉 Collector 的各种类型的组件都没有指定 service.name 呢?比如 filelog, journald 都是 unknown_service。但是 otelcol 自身的日志如果发送到自己的 otlp 接收器,就是包含 service.name,值为 otelcol-contrib

此外,SDK 还将提供以下资源属性来标识自身: telemetry.sdk.name 、 telemetry.sdk.language 和 telemetry.sdk.version

OpenTelemetry 实现

GitHub 项目,grafana/agent #

GitHub 项目,flashcatcloud/categraf # 通过配置文件,采集所有数据,然后 Push 给 Prom(Prom 需要使用 --web.enable-remote-write-receiver 为自身开启远程写功能),暂时没有等待 pull 的功能(截止 2022.6.1 v0.1.0 版本)

https://www.guance.com/ 观测云。。。。这个产品。。怎么说呢。。上来就让人各种注册才能体验的感觉很不好。。而且在云原生社区可观测性 SIG 群里,这家人的表达方式和处理事情的态度给人的感觉也不好~工作内部矛盾放在群里说。。还揭露个人隐私。。。。o(╯□╰)o

GitHub 项目,open-telemetry/opentelemetry-go-instrumentation # 使用 Go 语言利用 eBPF 实现的 OpenTelemetry 自动 Instrumentation

Grafana Agent

参考:

Grafana Agent 收集遥测数据并将其转发到 Grafana Stack、Grafana Cloud 或 Grafana Enterprise 的开源部署,然后可以在其中分析您的数据。您可以在 Kubernetes 和 Docker 上安装 Grafana Agent,或者作为 Linux、macOS 和 Windows 机器的系统进程。

Grafana Agent 是开源的,其源代码可在 GitHub 上的https://github.com/grafana/agent上获得。

Grafana Agent 适用于希望收集和转发遥测数据以进行分析和待命警报的工程师、操作员或管理员。那些运行 Grafana Agent 的人必须安装和配置 Grafana Agent 才能正确收集遥测数据并监控正在运行的代理的健康状况。

最佳实践

公众号 - 云原生小白,Opentelemetry 实践分享 - Golang篇

OpenTelemetry Demo

参考:

OpenTelemetry Demo 是一个由用不同编程语言编写的微服务组成的 Demo 系统,这些微服务通过 gRPC 和 HTTP 相互通信;以及一个使用 [Locust](https: locust.io/) 来伪造用户流量的负载生成器。

这是一个基于微服务的分布式系统,旨在说明 OpenTelemetry 在近乎真实的环境中的实现,这个 demo 中提供了许多的服务,而且包含了几乎所有主流的语言,可以很好的模拟我们实际的使用场景。

  • 提供可用于演示 OpenTelemetry 仪器和可观测性的分布式系统的实际示例。
  • 为供应商、工具作者和其他人构建一个基础,以扩展和演示他们的 OpenTelemetry 集成。
  • 为 OpenTelemetry 贡献者创建一个活生生的示例,用于测试新版本的 API、SDK 以及其他组件或增强功能。

架构图来源: https://opentelemetry.io/docs/demo/architecture/

graph TD
subgraph Service Diagram
accountingservice(Accounting Service):::dotnet
adservice(Ad Service):::java
cache[(Cache<br/>&#40redis&#41)]
cartservice(Cart Service):::dotnet
checkoutservice(Checkout Service):::golang
currencyservice(Currency Service):::cpp
emailservice(Email Service):::ruby
frauddetectionservice(Fraud Detection Service):::kotlin
frontend(Frontend):::typescript
frontendproxy(Frontend Proxy <br/>&#40Envoy&#41):::cpp
imageprovider(Image Provider <br/>&#40nginx&#41):::cpp
loadgenerator([Load Generator]):::python
paymentservice(Payment Service):::javascript
productcatalogservice(Product Catalog Service):::golang
quoteservice(Quote Service):::php
recommendationservice(Recommendation Service):::python
shippingservice(Shipping Service):::rust
queue[(queue<br/>&#40Kafka&#41)]

Internet -->|HTTP| frontendproxy
frontendproxy -->|HTTP| frontend
loadgenerator -->|HTTP| frontendproxy
frontendproxy -->|HTTP| imageprovider

queue -->|TCP| accountingservice
queue -->|TCP| frauddetectionservice

frontend -->|gRPC| cartservice
frontend -->|gRPC| currencyservice

checkoutservice -->|gRPC| cartservice --> cache
checkoutservice -->|gRPC| productcatalogservice
checkoutservice -->|gRPC| currencyservice
checkoutservice -->|HTTP| emailservice
checkoutservice -->|gRPC| paymentservice
checkoutservice -->|gRPC| shippingservice
checkoutservice -->|TCP| queue

frontend -->|gRPC| adservice
frontend -->|gRPC| productcatalogservice
frontend --->|gRPC| checkoutservice
frontend ---->|gRPC| recommendationservice -->|gRPC| productcatalogservice

shippingservice -->|HTTP| quoteservice

end

classDef dotnet fill:#178600,color:white;
classDef cpp fill:#f34b7d,color:white;
classDef erlang fill:#b83998,color:white;
classDef golang fill:#00add8,color:black;
classDef java fill:#b07219,color:white;
classDef javascript fill:#f1e05a,color:black;
classDef kotlin fill:#560ba1,color:white;
classDef php fill:#4f5d95,color:white;
classDef python fill:#3572A5,color:white;
classDef ruby fill:#701516,color:white;
classDef rust fill:#dea584,color:black;
classDef typescript fill:#e98516,color:black;
graph TD
subgraph Service Legend
  dotnetsvc(.NET):::dotnet
  cppsvc(C++):::cpp
  erlangsvc(Erlang/Elixir):::erlang
  golangsvc(Go):::golang
  javasvc(Java):::java
  javascriptsvc(JavaScript):::javascript
  kotlinsvc(Kotlin):::kotlin
  phpsvc(PHP):::php
  pythonsvc(Python):::python
  rubysvc(Ruby):::ruby
  rustsvc(Rust):::rust
  typescriptsvc(TypeScript):::typescript
end

classDef dotnet fill:#178600,color:white;
classDef cpp fill:#f34b7d,color:white;
classDef erlang fill:#b83998,color:white;
classDef golang fill:#00add8,color:black;
classDef java fill:#b07219,color:white;
classDef javascript fill:#f1e05a,color:black;
classDef kotlin fill:#560ba1,color:white;
classDef php fill:#4f5d95,color:white;
classDef python fill:#3572A5,color:white;
classDef ruby fill:#701516,color:white;
classDef rust fill:#dea584,color:black;
classDef typescript fill:#e98516,color:black;

Demo 中的 Collector 的配置在 otelcol-config.yml 这里找到

graph TB
subgraph tdf[Telemetry Data Flow]
    subgraph subgraph_padding [ ]
        style subgraph_padding fill:none,stroke:none;
        %% padding to stop the titles clashing
        subgraph od[OpenTelemetry Demo]
        ms(Microservice)
        end

        ms -.->|"OTLP<br/>gRPC"| oc-grpc
        ms -.->|"OTLP<br/>HTTP POST"| oc-http

        subgraph oc[OTel Collector]
            style oc fill:#97aef3,color:black;
            oc-grpc[/"OTLP Receiver<br/>listening on<br/>grpc://localhost:4317"/]
            oc-http[/"OTLP Receiver<br/>listening on <br/>localhost:4318<br/>"/]
            oc-proc(Processors)
            oc-prom[/"OTLP HTTP Exporter"/]
            oc-otlp[/"OTLP Exporter"/]

            oc-grpc --> oc-proc
            oc-http --> oc-proc

            oc-proc --> oc-prom
            oc-proc --> oc-otlp
        end

        oc-prom -->|"localhost:9090/api/v1/otlp"| pr-sc
        oc-otlp -->|gRPC| ja-col

        subgraph pr[Prometheus]
            style pr fill:#e75128,color:black;
            pr-sc[/"Prometheus OTLP Write Receiver"/]
            pr-tsdb[(Prometheus TSDB)]
            pr-http[/"Prometheus HTTP<br/>listening on<br/>localhost:9090"/]

            pr-sc --> pr-tsdb
            pr-tsdb --> pr-http
        end

        pr-b{{"Browser<br/>Prometheus UI"}}
        pr-http ---->|"localhost:9090/graph"| pr-b

        subgraph ja[Jaeger]
            style ja fill:#60d0e4,color:black;
            ja-col[/"Jaeger Collector<br/>listening on<br/>grpc://jaeger:4317"/]
            ja-db[(Jaeger DB)]
            ja-http[/"Jaeger HTTP<br/>listening on<br/>localhost:16686"/]

            ja-col --> ja-db
            ja-db --> ja-http
        end

        subgraph gr[Grafana]
            style gr fill:#f8b91e,color:black;
            gr-srv["Grafana Server"]
            gr-http[/"Grafana HTTP<br/>listening on<br/>localhost:3000"/]

            gr-srv --> gr-http
        end

        pr-http --> |"localhost:9090/api"| gr-srv
        ja-http --> |"localhost:16686/api"| gr-srv

        ja-b{{"Browser<br/>Jaeger UI"}}
        ja-http ---->|"localhost:16686/search"| ja-b

        gr-b{{"Browser<br/>Grafana UI"}}
        gr-http -->|"localhost:3000/dashboard"| gr-b
    end
end

Find the Protocol Buffer Definitions in the /pb/ directory.

OpenTelemetry 历史

OTel 于 2019 年 5 月,由 OpenTracing 与 OpenCensus 合并而成(Google Open Source),

OpenTelemetry Protocol

参考:

OpenTelemetry Protocol(简称 OTLP)


最后修改 June 10, 2025: optimize hugo config (153d0808)