在可观测性体系建设中,边缘采集层扮演着“第一入口”的角色。其核心目标是保证数据在靠近源头时就具备完整性、可靠性与可扩展性,避免因高负载或链路抖动造成数据丢失。方案选用 Vector 作为统一的边缘采集与汇聚出口,理由如下:
这样,边缘节点只需运行一个轻量化 Vector 进程,即可完成采集、缓冲与转发;而复杂的处理、路由和多后端分发由 OTel Gateway 完成,职责边界清晰。
组件 | 核心覆盖维度 | 可靠性 | 资源/开销 | 协议与生态 | 适合角色 | 局限/注意 |
---|---|---|---|---|---|---|
Vector Agent(本选型) | 指标、日志、(简要)追踪、重映射/加工 | 成熟背压、内/磁缓冲、重试、限速、自监控 | 低~中(可限内存/CPU) | Prom 拉取、file/journald、Loki、OTLP 等 | 边缘统一汇聚与出口 | 原生 Trace 生态不如 OTel;无 DeepFlow 专用解码 |
OTel Collector(Agent 模式) | 指标/日志/追踪(原生) | sending_queue + file_storage(持久化队列)、重试、批处理 | 中(配置更多、进程更重) | OTel 原生,处理器/路由器丰富 | 可作网关或边缘 | 边缘上全开处理器易复杂;资源敏感节点负担较大 |
DeepFlow Agent | eBPF/Net(L4/L7) | 自身环形队列,高压下可能丢包 | 中 | 面向 DeepFlow 生态 | 网络探针 | 输出协议相对封闭;缺少统一多后端/缓冲 |
node_exporter / process-exporter | 主机/进程指标 | 无背压与缓冲(Prom pull) | 极低 | Prometheus 生态 | 轻量指标探针 | 仅指标;不做日志/追踪;无法统一转发 |
(可选对比)Promtail/Fluent Bit | 日志 | 有限的缓冲与重试 | 低 | Loki/多后端 | 仅日志通道 | 跨类型(metrics/traces)能力弱 |
设计目标:至少一次投递(at-least-once)偏好,优先保证不丢;在极限情况下阻塞而非静默丢弃;自监控可告警。
关键机制
when_full: block
。/metrics
,重点看:buffer 使用率/磁盘占用、events dropped/overflows/retries、请求失败率/延迟。Vector 样例(YAML, 按目录拆分)
推荐以 目录加载方式运行:
vector --config-dir /etc/vector/
目录结构: /etc/vector/ sources/*.yaml transforms/*.yaml sinks/*.yaml vector.yaml # 全局开关(data_dir/api等)
vector.yaml
data_dir: /var/lib/vector
api:
enabled: true
address: "0.0.0.0:8686"
sources/prom.yaml
— 拉取 node_exporter / process-exporter
sources:
node_exporter:
type: prometheus_scrape
endpoints: ["http://127.0.0.1:9100/metrics"]
scrape_interval_secs: 15
process_exporter:
type: prometheus_scrape
endpoints: ["http://127.0.0.1:9256/metrics"]
scrape_interval_secs: 15
sources/logs.yaml
— DeepFlow 与系统日志
sources:
journald:
type: journald
current_journal_only: true
deepflow_file:
type: file
include: ["/var/log/deepflow/*.json", "/var/log/deepflow/*.log"]
read_from: beginning
ignore_older_secs: 2592000 # 30d
transforms/normalize.yaml
— 统一标签与抑噪(VRL)
transforms:
add_tags:
type: remap
inputs: [node_exporter, process_exporter, journald, deepflow_file]
source: |
.labels.host = get_env("VECTOR_HOSTNAME") ?? .labels.host ?? .host
.labels.cluster = .labels.cluster ?? "prod"
.labels.region = .labels.region ?? "ap-northeast-1"
# 示例:丢弃过长行或明显无效日志
if exists(.message) && bytes!(.message) > 1_000_000 { drop() }
sinks/otlp.yaml
— 统一输出到 OTel Gateway(关键:磁盘缓冲+阻塞)
sinks:
to_otlp:
type: opentelemetry # Vector 的 OTLP sink
inputs: [add_tags]
protocol: grpc
endpoint: "http://otel-gw.svc:4317"
request:
timeout_secs: 10
batch:
max_events: 10000
timeout_secs: 2
buffer:
type: disk
max_size: 50GiB
when_full: block
healthcheck:
enabled: true
说明:
职责分层
otelcol 最小可用配置(YAML)
extensions:
file_storage:
directory: /var/lib/otelcol/wal
zpages: {}
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
memory_limiter:
check_interval: 1s
limit_percentage: 75
spike_limit_percentage: 15
batch:
timeout: 5s
send_batch_size: 10000
exporters:
otlphttp/openobserve:
endpoint: https://otel.svc.plus/api/default/
headers:
Authorization: "Basic <REDACTED>"
# 关键:开启发送队列并接入 file_storage,形成 WAL 持久化
sending_queue:
enabled: true
num_consumers: 8
queue_size: 20000
storage: file_storage
retry_on_failure:
enabled: true
initial_interval: 1s
max_interval: 10s
max_elapsed_time: 0 # 无限重试
# 可选:原始扇出到 Kafka,供离线 ETL/回放
kafka/traces:
brokers: ["kafka-1:9092","kafka-2:9092"]
topic: traces_raw
protocol_version: 2.0.0
encoding: otlp_proto
service:
extensions: [file_storage, zpages]
pipelines:
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlphttp/openobserve]
logs:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlphttp/openobserve]
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlphttp/openobserve, kafka/traces] # 可增/减
组合要点
统一输出的取舍
ExecStart=/usr/bin/vector --config-dir /etc/vector
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。