概述
OpenTelemetry 的自身定位很明确:数据采集和标准规范的统一,对于数据如何去使用、存储、展示、告警,官方是不涉及的
OpenTelemetry 要解决的是对可观测性的大一统,它提供了一组 API 和 SDK 来标准化遥测数据的采集和传输,opentelemetry 并不想对所有的组件都进行重写,而是最大程度复用目前业界在各大领域常用工具,通过提供了一个安全,厂商中立的能用协议、组件,这样就可以按照需要形成 pipeline 将数据发往不同的后端。
架构图
- receivers(接收者): 定义从 client 端的数据要以何种数据模型进行接收, 支持很多种数据模型.
- processors: 将 receivers 的数据进行某些处理,比如批量、性能分析等.
- exporters: 将 processors 后的数据导出到特定的后端,比如 metrics 数据存储到 prometheus 中.
OTLP协议: otlp 是 opentelemetry 中比较核心的存在,在遥测数据及 Collector 之间制定了包括编码(encoding)、传输(transport)、传递(delivery)等协议。
核心概念
- Specification: 是定义了 API/SDK 及数据模型,所有包含第三方实现的都需要遵循 spec 定义的规范。
- Semantic Conventions: OpenTelemetry 项目保证所有的 instrumentation(不论任何语言)都包含相同的语义信息
- Resource: resource 附加于某个 process 产生的所有 trace 的键值对,在初始化阶段指定并传递到 collector 中
- Baggage: 为添加在 metrics、log、traces 中的注解信息,键值对需要唯一,无法更改
- Propagators: 传播器,比如在多进程的调用中,开启传播器用于跨服务传播 spanContext。
- Attributes: 其实就是 tag, 可以给 span 添加 metadata 数据,SetAttributes属性可以多次添加,不存在就添加,存在就覆盖
- Events: 类似于日志, 比如在 trace 中嵌入请求体跟响应体。
- Collector: 它负责遥测数据源的接收、处理和导出三部分,提供了与供应商无关的实现。
- Data sources: OpenTelemetry 提供的数据源, 目前包含:
- Traces
- Metrics
- Logs
- Baggage
安装配置
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.41.0/otelcol_0.41.0_linux_amd64.deb
sudo dpkg -i otelcol_0.39.0_linux_amd64.deb
sudo systemctl restart otelcol
// 安装完成后配置路径位于
cat /etc/otelcol/config.yaml
配置基于三部分
receiver 配置
- https://github.com/open-telemetry/opentelemetry-collector/blob/main/receiver/README.md
- https://github.com/open-telemetry/opentelemetry-collector/blob/main/receiver/otlpreceiver/README.md
// 使用默认配置创建 otlp 收集器, grpc 使用 0.0.0.0:4317, http 使用 0.0.0.0:4318
receivers:
otlp:
protocols:
grpc:
http:
两个模块都可以展开, 分别配置对应项
- grpc 配置
- http 配置: 用于 grpc 的补充, 可以用 http/json 模式传递数据
receivers:
otlp:
protocols:
http:
endpoint: "localhost:4318"
cors:
allowed_origins:
- http://test.com
# Origins can have wildcards with *, use * by itself to match any origin.
- https://*.example.com
allowed_headers:
- Example-Header
max_age: 7200
除了 oltp 还支持很多其他的 receivers, 例如:
receivers:
# Data sources: logs
fluentforward:
listenAddress: 0.0.0.0:8006
# Data sources: metrics
hostmetrics:
scrapers:
cpu:
disk:
filesystem:
load:
memory:
network:
process:
processes:
swap:
# Data sources: traces
jaeger:
protocols:
grpc:
thrift_binary:
thrift_compact:
thrift_http:
# Data sources: traces
kafka:
protocol_version: 2.0.0
# Data sources: traces, metrics
opencensus:
# Data sources: traces, metrics, logs
otlp:
protocols:
grpc:
http:
# Data sources: metrics
prometheus:
config:
scrape_configs:
- job_name: "otel-collector"
scrape_interval: 5s
static_configs:
- targets: ["localhost:8888"]
# Data sources: traces
zipkin:
Processors
Processors 一般都有自己的默认配置, 但很多都需要配置, 配置完后会覆盖掉默认配置
配置Processor 并不会立马启动, 需要配置 service 模块
一般配置模板
processors:
# Data sources: traces
attributes:
actions:
- key: environment
value: production
action: insert
- key: db.statement
action: delete
- key: email
action: hash
# Data sources: traces, metrics, logs
batch:
# Data sources: metrics
filter:
metrics:
include:
match_type: regexp
metric_names:
- prefix/.*
- prefix_.*
# Data sources: traces, metrics, logs
memory_limiter:
check_interval: 5s
limit_mib: 4000
spike_limit_mib: 500
# Data sources: traces
resource:
attributes:
- key: cloud.zone
value: "zone-1"
action: upsert
- key: k8s.cluster.name
from_attribute: k8s-cluster
action: insert
- key: redundant-attribute
action: delete
# Data sources: traces
probabilistic_sampler:
hash_seed: 22
sampling_percentage: 15
# Data sources: traces
span:
name:
to_attributes:
rules:
- ^\/api\/v1\/document\/(?P<documentId>.*)\/update$
from_attributes: ["db.svc", "operation"]
separator: "::"
Exporters
Exporters 用于将处理好的数据发送到一个或多个 BACKEND, Exporters 一般支持一个或多个 DataSource
配置完通过 service 模块启动
下面提供了所有可用的导出器的基本示例。
exporters:
# Data sources: traces, metrics, logs
file:
path: ./filename.json
# Data sources: traces
jaeger:
endpoint: "http://jaeger-all-in-one:14250"
tls:
insecure: true
# Data sources: traces
kafka:
protocol_version: 2.0.0
# Data sources: traces, metrics, logs
logging:
loglevel: debug
# Data sources: traces, metrics
opencensus:
endpoint: "otelcol2:55678"
# Data sources: traces, metrics, logs
otlp:
endpoint: otelcol2:4317
tls:
insecure: true
# Data sources: traces, metrics
otlphttp:
endpoint: https://example.com:4318/v1/traces
# Data sources: metrics
prometheus:
endpoint: "prometheus:8889"
namespace: "default"
# Data sources: metrics
prometheusremotewrite:
endpoint: "http://some.url:9411/api/prom/push"
# Data sources: traces
zipkin:
endpoint: "http://localhost:9411/api/v2/spans"
Extensions
Extensions 主要用于非 Telemetry 数据处理, 包括运行状况监视、服务发现和数据转发。扩展名是可选
配置完通过 service 模块启动
extensions:
health_check:
pprof:
zpages:
memory_ballast:
size_mib: 512
zpages 用于调试安装不同组件的运行状态, 可以通过以下页面查看
- http://localhost:55679/debug/servicez
- http://localhost:55679/debug/pipelinez
- http://localhost:55679/debug/extensionz
- http://localhost:55679/debug/tracez
- http://localhost:55679/debug/rpcz
关于 memory_ballast 可以参考
通过 service 开启
service:
# Extensions specified below are going to be loaded by the service in the
# order given below, and shutdown on reverse order.
extensions: [memory_ballast, zpages]
service 配置
service 用于配置在Collector中启用哪些组件(receivers、processors、exporters和 extensions)
包含两个部分
- extensions: 之前已描述
- pipelines
Pipelines 支持以下类型
- traces
- metrics
- logs
pipeline 由receivers, processors and exporters 组成, 基本配置如下
service:
pipelines:
metrics:
receivers: [opencensus, prometheus]
exporters: [opencensus, prometheus]
traces:
receivers: [opencensus, jaeger]
processors: [batch]
exporters: [opencensus, zipkin]