4. 日志处理与转换:使用 Processor 对日志进行清洗、富化和采样

在 OpenTelemetry Collector 的数据流水线中,Processor 是连接 Receiver 与 Exporter 的核心中间件。它负责对采集到的日志记录执行清洗、格式转换、字段富化、数据采样等操作,是保障日志质量、控制存储成本、提升可观测性的关键环节。

4.1 Processor 在流水线中的位置与作用

Processor 位于 Receiver 之后、Exporter 之前,可以串联多个形成处理链。每个 Processor 接收日志数据,经过内部逻辑处理后,将结果传递给下一个 Processor 或最终的 Exporter。

Processor 在 OpenTelemetry Collector 流水线中的位置 Processor 在 OpenTelemetry Collector 流水线中的位置 数据源 Receiver Processor 1 Processor 2 Processor N Exporter 后端存储 Processor 链可以串联多个处理步骤,按顺序执行 清洗、富化、采样等操作,形成完整的日志处理流水线

4.2 核心 Processor 类型与功能

OpenTelemetry Collector 提供了丰富的内置 Processor,以下是在日志场景中最常用的三种:

Processor 名称 核心功能 典型应用场景
attributes 对日志记录的属性(attributes)进行增、删、改、正则替换 添加环境标签、脱敏敏感字段、统一字段命名规范
batch 将多条日志合并为一批,按时间或数量触发发送 降低网络开销、提升 Exporter 吞吐量、减少后端写入压力
filter 根据条件表达式过滤日志记录,决定保留或丢弃 丢弃调试日志、只保留 ERROR 级别日志、按服务名筛选

4.3 attributes Processor:日志清洗与富化

attributes Processor 是日志处理中最灵活的组件,支持以下操作:

  • 插入(insert):向日志记录中添加新的属性键值对。
  • 更新(update):修改已有属性的值。
  • 删除(delete):移除不需要的属性。
  • 哈希(hash):对指定属性值进行 SHA-1 哈希,用于脱敏。
  • 提取(extract):从已有属性中通过正则表达式提取子串,生成新属性。
  • 转换(convert):改变属性值的数据类型。

实战案例:日志清洗与富化配置

processors:
  attributes/log_clean:
    actions:
      # 1. 删除敏感字段
      - key: password
        action: delete
      - key: credit_card
        action: delete
      # 2. 对用户 ID 进行哈希脱敏
      - key: user_id
        action: hash
      # 3. 插入环境标签
      - key: environment
        value: "production"
        action: insert
      # 4. 从日志消息中提取错误码
      - key: error_code
        pattern: "ERR-([0-9]{4})"
        action: extract
      # 5. 将时间戳转换为标准格式
      - key: timestamp
        action: convert
        converted_type: int

4.4 batch Processor:日志批处理与性能优化

batch Processor 通过聚合日志记录来优化传输效率,是生产环境中必不可少的组件。其核心参数包括:

参数 默认值 说明
timeout 200ms 等待批处理完成的最长时间,超时后即使未满也发送
send_batch_size 8192 触发发送的日志条目数阈值
send_batch_max_size 0(无限制) 单个批次的最大条目数上限,防止内存溢出

性能调优建议:对于高吞吐日志场景,建议将 timeout 设置为 500ms-1s,send_batch_size 设置为 16384-32768,以平衡延迟与吞吐量。注意监控 Collector 的内存使用情况,避免 send_batch_max_size 设置过大导致 OOM。

4.5 filter Processor:日志采样与过滤

filter Processor 支持基于日志级别、服务名称、属性值等条件进行过滤,是控制日志存储成本的核心手段。

filter Processor 日志过滤与采样决策流程 filter Processor 日志过滤与采样决策流程 输入日志流 过滤条件判断 级别 / 服务 / 属性 采样决策 概率 / 速率限制 保留 丢弃 输出到 Exporter INFO 及以下级别日志按 10% 概率采样 WARN 及以上级别日志全部保留

实战案例:基于日志级别的采样配置

processors:
  filter/log_level_sampling:
    logs:
      # 保留所有 ERROR 及以上级别日志
      - severity_text: "ERROR"
        severity_text: "FATAL"
      # 对 INFO 级别日志进行概率采样
      - severity_text: "INFO"
        probabilistic_sampler:
          sampling_percentage: 10.0
      # 丢弃 DEBUG 级别日志
      - severity_text: "DEBUG"
        action: drop

4.6 Processor 链编排与最佳实践

在实际部署中,多个 Processor 通常按以下顺序编排:

  1. filter Processor(最先执行):尽早丢弃不需要的日志,减少后续处理压力。
  2. attributes Processor(中间执行):对保留的日志进行清洗、脱敏、富化。
  3. batch Processor(最后执行):将处理后的日志聚合为批次,发送给 Exporter。

注意事项:

  • filter Processor 应放在最前面,避免对无用日志执行昂贵的清洗操作。
  • batch Processor 应放在最后,确保所有属性修改完成后再进行聚合。
  • 避免在 Processor 链中重复执行相同操作,例如多次哈希同一个字段。
  • 生产环境中建议为每个 Processor 配置独立的 id,便于监控和调试。

4.7 完整流水线配置示例

以下是一个完整的日志处理流水线配置,展示了 Processor 链的串联方式:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317

processors:
  filter/drop_debug:
    logs:
      - severity_text: "DEBUG"
        action: drop

  attributes/enrich:
    actions:
      - key: environment
        value: "production"
        action: insert
      - key: source
        value: "kubernetes"
        action: insert

  batch/optimize:
    timeout: 500ms
    send_batch_size: 16384
    send_batch_max_size: 32768

exporters:
  otlphttp/prometheus:
    endpoint: http://prometheus-server:9090/api/v1/otlp
  elasticsearch:
    endpoints: ["http://elasticsearch:9200"]

service:
  pipelines:
    logs:
      receivers: [otlp]
      processors: [filter/drop_debug, attributes/enrich, batch/optimize]
      exporters: [otlphttp/prometheus, elasticsearch]

通过合理配置 Processor 链,可以实现对日志数据的精细化控制,在保证可观测性的同时,有效降低存储成本和网络开销。