目录
- 一、背景
- 二、概念
- 2.1 Traces & Span
- 2.2 Metrics
- 2.3 Logs
- 2.4 Baggage
- 2.5 OTel
- 2.6 OTLP
- 2.7 Resources
- 2.8 Instrumentation Scope
- 2.9 Sampling
- 三、核心组件
一、背景
OpenTelemetry是一个可观察性框架和工具包,旨在创建和管理遥测数据,如跟踪、指标和日志
。至关重要的是,OpenTelemetry与供应商
和工具
无关,这意味着它可以与各种各样的可观察性后端一起使用,包括Jaeger和Prometheus等开源工具,以及商业产品。OpenTelemetry是一个云原生计算基金会(CNCF)项目。
随着云计算、微服务架构和越来越复杂的业务需求的兴起,对可观察性的需求从未如此之大。可观察性是通过检查系统的输出来了解系统内部状态的能力。在软件的上下文中,这意味着能够通过检查遥测数据(包括跟踪、度量和日志)来了解系统的内部状态。
为了使一个系统可观察,它必须被检测。也就是说,代码必须发出跟踪、监控指标和日志。然后,测量的数据必须被发送到可观察性后端。
OpenTelemetry做了两件重要的事情:
- 允许您拥有自己生成的数据,而不是被专有的数据格式或工具所困。
- 允许你学习一套api和约定
这两者的结合使团队和组织在当今的现代计算世界中具有所需的灵活性。
OpenTelemetry是之前两个项目OpenTracing和OpenCensus合并的结果。这两个项目都是为了解决同一个问题而创建的:缺乏如何检测代码并将遥测数据发送到可观察性后端的标准。然而,两个项目都不能完全独立解决这个问题,所以两个项目合并形成OpenTelemetry,这样它们就可以结合各自的优势,真正提供一个统一的标准。
项目 | 维度 |
---|---|
OpenTracing | traces |
OpenCensus | traces, metrics |
OpenTelemetry | traces, metrics, logs |
OpenTelemetry不是一个像Jaeger、Prometheus或商业供应商那样的可观察性后端。OpenTelemetry专注于遥测数据的生成、收集、管理
和导出
。数据的存储和可视化有意留给其他工具。
二、概念
2.1 Traces & Span
trace由一个或多个span组成。第一个span表示root span。每个root span代表一个从开始到结束的请求。
父级下面的span提供了请求期间发生的事情(或者组成请求的步骤)的更深入的上下文。
- Tracer - trace由一个或多个span组成,表示一条完整的追踪链路,由traceId唯一标识。
- Context Propagation
- Context: trace_id, span_id, trace Flags, Trace State
- Propagation
- Span - 工作单元、操作 - 时间跨度(一段时间,起始时间)
- Name
- Parent span ID (empty for root spans)
- Start and End Timestamps
- Span Context - 跨Span关联关系
- Attributes: key-value pairs, contain metadata - Span携带的信息,如下单span携带Attrs: userId, itemId, cartId…
- key/value non-null,
- key: string
- value: string, boolean float, integer, or array of these values
- 语义Attr(系统保留的通用属性):Semantic Attributes
- Span Events - 时间点上的事件信息(记录日志)
- Span Links
- Span Status
- Unset
- OK
- Error
- Span Kind
- Client/Server - 同步调用
- Producer/Consumer - 异步队列、消息队列
- Internal - 不跨进程的操作(内部处理)
2.2 Metrics
metric是对运行时捕获的服务的measurement度量。捕获测量数据measurement的时刻称为度量事件(metrics event),它不仅包括测量数据本身,还包括捕获测量数据的时间和相关的元数据。应用程序和请求度量是可用性和性能的重要指标。自定义指标可以洞察可用性指标如何影响用户体验或业务。收集到的数据可用于警报中断或触发调度决策,以在高需求时自动扩展部署。
metric
- 名称
- 元数据(label或attr)
- 测量数据measurement(如float 64)
- 时间
Meter & Metric Instruments
- Name
- Kind
- Counter - 累加计数
- Asynchronous Counter - 异步计数
- UpDownCounter - 升降计数器
- Asynchoronous UpDownCounter - 异步升降计数器
- Gauge - 实时数值(仪表)计数器
- Histogram - 直方图,客户端聚合统计,例如请求延迟
- Unit (optional)
- Description (optional)
- Views - 自定义指标输出、忽略、聚合、属性
聚合Aggregation
一段时间内分散于不同时间点的多个指标 ==>汇聚成==> 一个描述该时间段内的统计结果的指标
2.3 Logs
带有时间戳的信息,可内嵌到span或trace中,支持结构化(推荐)、非结构化,带有metadata。
对于traces和metrics,OpenTelemetry采用全新的设计方法,指定一个新的API,并在多个语言sdk中提供该API的完整实现。
OpenTelemetry处理日志的方法是不同的。因为现有的日志解决方案在语言和操作生态系统中广泛存在,OpenTelemetry充当了这些logs、tracing和metrics信号以及其他OpenTelemetry组件之间的“bridge”。事实上,由于这个原因,日志API被称为Logs Bridge API
。
- Log Appender / Bridge
- Logger Provider(日志框架作者需关注)
- Logger(日志框架作者需关注)
- Log Record Exporter
- Log Record
日志记录表示对事件的记录。在OpenTelemetry中,日志记录包含两种字段:
- 指定类型和含义的命名top-level字段
- Resource和attributes任意值和类型的字段
top-level字段包括:
Field Name | Description |
---|---|
Timestamp | Time when the event occurred. |
ObservedTimestamp | Time when the event was observed. |
TraceId | Request trace ID. |
SpanId | Request span ID. |
TraceFlags | W3C trace flag. |
SeverityText | The severity text (also known as log level). |
SeverityNumber | Numerical value of the severity. |
Body | The body of the log record. |
Resource | Describes the source of the log. |
InstrumentationScope | Describes the scope that emitted the log. |
Attributes | Additional information about the event. |
2.4 Baggage
在OpenTelemetry中,Baggage是在span之间传递的上下文信息。它是一个与跟踪中的span上下文一起存在的键值存储,使得在跟踪中创建的任何span都可以访问值。
2.5 OTel
OpenTelemetry的缩写,OpenTelemetry的规范可参见:
https://opentelemetry.io/docs/specs/otel/
2.6 OTLP
The OpenTelemetry Protocol(OTLP)
规范描述了遥测数据源、中间节点(如采集器和遥测后端)之间遥测数据的编码、传输和传递机制。OTLP是OpenTelemetry项目范围内设计的通用遥测数据传输协议。
OTLP定义了遥测数据的编码和用于在客户机和服务器之间交换数据的协议,该规范定义了如何在gRPC
和HTTP 1.1
上实现OTLP传输,并规定了用于消息负载的Protocol Buffers schema定义。OTLP是一种请求/响应风格的协议:客户端发送请求,服务器用相应的响应进行应答。
OTLP协议可参见:
https://opentelemetry.io/docs/specs/otlp/
2.7 Resources
通过resource attrs表示产生telemetry的实体(如主机、Pod、Container等信息)
env OTEL_RESOURCE_ATTRIBUTES=deployment.environment=production yourApp
2.8 Instrumentation Scope
插桩范围,即监控的代码范围,如请求URI、类名::方法名、框架名等。
2.9 Sampling
采样状态:
- Sampled - 已采样
- Not Sampled - 未采样
分类:
-
Head Sampling
-头部抽样
是一种用于尽早做出抽样决策的抽样技术。抽样或删除跨度或跟踪的决定不是通过整体检查跟踪来做出的。例如consistent-probability-sampling基于概率的采样。 -
Tail Sampling
-尾部抽样
是通过考虑跟踪中的全部或大部分跨度来决定对跟踪进行抽样的地方。尾部采样为您提供了基于从跟踪的不同部分派生的特定标准对跟踪进行采样的选项,这不是头部采样的选项。
如何使用Tail Sampling
的一些例子包括:
- 总是采样包含错误的跟踪
- 基于总体延迟的采样跟踪
- 根据迹线中一个或多个跨度上特定属性的存在或值对迹线进行采样;例如,对来自新部署的服务的更多跟踪进行采样
- 根据一定的标准对迹线应用不同的采样率
Collector支持的采样处理器:
- Probabilistic Sampling Processor
- Tail Sampling Processor
三、核心组件
- OTel规范
- OTLP协议
- Language SDKs - 支持不同语言的客户端实现
- Library Ecosystem - 支持不同lib、框架的库生态系统
- 自动Instrumentation组件 - 无需修改代码
- Collector - 接收、处理、导出遥测数据的代理
- 其他工具
- OpenTelemetry Operator for Kubernetes
- OpenTelemetry Helm Charts
- community assets for FaaS
- 40+ Vendors
- Grafana Labs
- Apache Skywalking
- Jaeger
- …
Organization | OSS | Commercial | Distribution | Native OTLP | Learn more |
---|---|---|---|---|---|
Apache SkyWalking | Yes | No | No | Yes | https://skywalking.apache.org/docs/main/v9.0.0/en/setup/backend/opentelemetry-receiver/ |
Fluent Bit | Yes | No | No | Yes | https://docs.fluentbit.io/manual/pipeline/inputs/opentelemetry/ |
Jaeger | Yes | No | No | Yes | https://www.jaegertracing.io/docs/1.47/getting-started/ |
Teletrace | Yes | No | Yes | Yes | https://docs.teletrace.io/ |
ClickHouse | Yes | Yes | No | No | https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/clickhouseexporter |
Grafana Labs | Yes | Yes | Yes | Yes | https://grafana.com/oss/opentelemetry/ |
GreptimeDB | Yes | Yes | Yes | Yes | https://docs.greptime.com/user-guide/clients/otlp |
Highlight | Yes | Yes | Yes | Yes | https://www.highlight.io/docs/general/company/open-source/contributing/adding-an-sdk/ |
observIQ | Yes | Yes | Yes | Yes | https://docs.bindplane.observiq.com |
qryn | Yes | Yes | Yes | Yes | https://qryn.metrico.in/#/support?id=tempo-api |
SigNoz | Yes | Yes | Yes | Yes | https://signoz.io |
AppDynamics (Cisco) | No | Yes | Yes | Yes | https://docs.appdynamics.com/latest/en/application-monitoring/appdynamics-for-opentelemetry |
Aria by VMware (Wavefront) | No | Yes | No | Yes | https://docs.wavefront.com/opentelemetry_tracing.html |
Aspecto | No | Yes | Yes | Yes | https://www.aspecto.io |
AWS | No | Yes | Yes | No | https://aws-otel.github.io |
Azure | No | Yes | Yes | No | https://docs.microsoft.com/azure/azure-monitor/app/opentelemetry-overview |
Coralogix | No | Yes | Yes | Yes | https://coralogix.com/docs/opentelemetry/ |
Cribl | No | Yes | No | Yes | https://docs.cribl.io/stream/sources-otel |
DaoCloud | No | Yes | Yes | Yes | https://docs.daocloud.io/en/insight/06UserGuide/01quickstart/otel/otel/ |
Datadog | No | Yes | Yes | Yes | https://docs.datadoghq.com/tracing/setup_overview/open_standards |
Dynatrace | No | Yes | Yes | Yes | https://www.dynatrace.com/support/help/how-to-use-dynatrace/transactions-and-services/service-monitoring-settings/opentelemetry/ |
Elastic | No | Yes | Yes | Yes | https://www.elastic.co/guide/en/apm/get-started/current/open-telemetry-elastic.html |
F5 | No | Yes | No | Yes | https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/f5cloudexporter |
Google Cloud Platform | No | Yes | No | Yes | https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/googlecloudexporter |
Helios | No | Yes | Yes | Yes | https://gethelios.dev/ |
Honeycomb | No | Yes | Yes | Yes | https://docs.honeycomb.io/getting-data-in/ |
Instana | No | Yes | No | Yes | https://www.ibm.com/docs/en/obi/current?topic=apis-opentelemetry |
ITRS | No | Yes | Yes | Yes | https://docs.itrsgroup.com/docs/geneos/data-collection/opentelemetry/current/opentelemetry.html |
KloudFuse | No | Yes | No | Yes | https://kloudfuse.atlassian.net/wiki/spaces/EX/pages/753860609/APM#Sending-traces-to-Kloudfuse-data-plane%3A |
KloudMate | No | Yes | No | Yes | https://docs.kloudmate.com/using-opentelemetry-collector |
LogicMonitor | No | Yes | Yes | Yes | https://www.logicmonitor.com/support/tracing/getting-started-with-tracing |
LogScale by Crowdstrike (Humio) | No | Yes | No | Yes | https://library.humio.com/falcon-logscale/log-shippers-opentelemetry.html |
Logz.io | No | Yes | Yes | No | https://docs.logz.io/shipping/tracing-sources/opentelemetry.html#overview |
Lumigo | No | Yes | Yes | Yes | https://docs.lumigo.io/docs/opentelemetry |
New Relic | No | Yes | No | Yes | https://newrelic.com/solutions/opentelemetry |
Observe, Inc. | No | Yes | Yes | Yes | https://docs.observeinc.com/en/latest/content/integrations/otel/opentelemetry.html |
ObserveAny | No | Yes | No | Yes | https://www.observeany.com/learn/opentelemetry-receiver |
Oracle | No | Yes | No | Yes | https://docs.oracle.com/en-us/iaas/application-performance-monitoring/doc/configure-open-source-tracing-systems.html#GUID-4D941163-F357-4839-8B06-688876D4C61F |
Sentry | No | Yes | Yes | No | https://sentry.io/for/opentelemetry/ |
Sentry Software | No | Yes | Yes | Yes | https://www.sentrysoftware.com/products/hardware-sentry-opentelemetry-collector.html |
ServiceNow Cloud Observability (Lightstep) | No | Yes | Yes | Yes | https://github.com/lightstep?q=launcher |
ServicePilot | No | Yes | No | Yes | https://www.servicepilot.com/en/doc/apm#opentelemetry |
SolarWinds | No | Yes | Yes | Yes | https://documentation.solarwinds.com/en/success_center/observability/default.htm#cshid=third-otel-integration |
Splunk | No | Yes | Yes | Yes | https://docs.splunk.com/Observability/gdi/opentelemetry/opentelemetry.html |
Sumo Logic | No | Yes | Yes | Yes | https://help.sumologic.com/docs/send-data/opentelemetry-collector/ |
TelemetryHub | No | Yes | No | Yes | https://app.telemetryhub.com/docs |
TingYun | No | Yes | No | Yes | https://wukongdoc.tingyun.com/apm/userguide/deploy_manage/opentelemetry.html |
Traceloop | No | Yes | No | Yes | https://www.traceloop.com |
Uptrace | No | Yes | Yes | Yes | https://uptrace.dev |