OpenTelemetry 和 Fluent Bit 集成,入门教程

通过将 OpenTelemetry Collector 与 FluentBit 集成,用户可以简化其可观察性,并为日志、指标和跟踪创建高效、可扩展的数据管道。通过提供的配置文件和 Docker Compose 设置,开始使用这个强大的组合变得简单明了。

作者 译文

OpenTelemetry 和 Fluent Bit 怎么集成?常见做法是让 Fluent Bit 负责轻量日志、指标或示例 Trace 采集与转发,让 OpenTelemetry Collector 负责统一接收、处理、路由并导出到 Jaeger、Prometheus 或其他后端。

本文通过 Docker Compose 示例演示 Fluent Bit 的 OpenTelemetry 输出插件如何把数据发送到 OpenTelemetry Collector,并由 Collector 分别导出到 Jaeger、Prometheus 和日志输出。

核心要点

  • Fluent Bit 是轻量级日志处理器和转发器,适合靠近数据源做采集和转发。
  • OpenTelemetry Collector 更适合做统一接收、批处理、协议转换、路由和后端导出。
  • Fluent Bit 的 OpenTelemetry 输出插件可以将 logs、metrics、traces 发送到 Collector 的 OTLP HTTP 端点。
  • 本文示例使用 Docker Compose 启动 Jaeger、Prometheus 和 OpenTelemetry Collector,适合作为本地验证环境。
  • 生产环境不能只照搬示例,还需要补充持久化、重试、资源限制、认证和 Collector 自身监控。

关于 OpenTelemetry 和 FluentBit

OpenTelemetry 是一个开源可观测性工具,用于监视和跟踪分布式应用程序。它提供 API、库和代理来从应用程序和服务收集遥测数据,例如指标、日志和跟踪。Fluent Bit 是一个高性能、轻量级的日志处理器和转发器,支持多种输入和输出插件,使其对不同的数据管道具有高度适应性。

opentelemetry-integrate-fluentbit

OpenTelemetry 和 FluentBit 的优点

将 OpenTelemetry Collector 与 Fluent Bit 集成具有多种优势,包括:

  • 全面的可观察性:将来自不同来源的日志、指标和跟踪合并到统一的数据管道中。
  • 可扩展性:OpenTelemetry 和 FluentBit 都旨在以最少的资源消耗处理大量数据。
  • 解耦数据源和后端:Fluent Bit 负责把数据送出,Collector 负责决定送到哪里、如何处理、是否需要转换或批量发送。

FluentBit 的 OpenTelemetry 插件

Fluent Bit 的 OpenTelemetry 输出插件使用户能够将日志、指标和跟踪发送到 OpenTelemetry Collector。它支持 OpenTelemetry HTTP 端点,可以轻松配置将数据转发到 OpenTelemetry Collector。

FluentBit OpenTelemetry 插件入门

本节将演示如何设置 OpenTelemetry Collector 和 FluentBit,以及如何使用 Docker Compose 将数据发送到 Jaeger UI 和 Prometheus。

在此计划中,我们将使用 AWS EC2 实例 (Amazon Linux) 的免费套餐。还可以使用 GCP 上的 Rocky Linux、CentOS 或 Ubuntu 创建类似的环境。

请注意,此设置正常工作需要先决条件:Docker 和 Docker Compose。必须在您的环境中安装这两个项目才能使安装顺利运行。

首先,使用提供的内容创建一个 docker-compose.yaml 文件。

version: "3"
services:

  # Jaeger
  jaeger:
    image: jaegertracing/all-in-one:latest
    container_name: jaeger
    ports:
      - "16686:16686"
      - "14250:14250"

  # Prometheus
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus.yaml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  # OtelCollector
  otel-collector:
    image: otel/opentelemetry-collector:latest
    container_name: otel-collector
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    ports:
      - "13133:13133" # Health_check extension
      - "4318:4318"   # OTLP http receiver
    depends_on:
      - jaeger
      - prometheus
    restart: on-failure

此文件定义 Jaeger、Prometheus 和 OpenTelemetry Collector 的服务。确保 OpenTelemetry Collector 容器公开了适当的端口,并且依赖于 Jaeger 和 Prometheus 服务。

接下来,使用提供的内容创建一个名为 flb-out-otel.conf 的 Fluent Bit 配置文件。

[SERVICE]
    Flush                1
    Log_level            info

[INPUT]
    Name                 node_exporter_metrics
    Tag                  node_metrics
    Scrape_interval      2

[INPUT]
    Name                 event_type
    Type                 traces
    Tag                  node_metrics

[INPUT]
    Name                 tail
    Tag                  sample.log
    Path                 /var/log/sample.log
    Read_from_Head       True

[OUTPUT]
    Name                 opentelemetry
    Match                *
    Host                 127.0.0.1
    Port                 4318
    Metrics_uri          /v1/metrics
    Traces_uri           /v1/traces
    Logs_uri             /v1/logs
    Log_response_payload True

此文件定义了 node_exporter_metricsevent_type tracestail 的输入,并配置 OpenTelemetry 输出插件以将数据发送到 OpenTelemetry Collector。

输入插件 node_exporter_metrics 将从操作系统收集系统级指标,例如CPU、磁盘、网络和进程统计信息。跟踪插件 event_type traces 将生成示例跟踪数据以用于演示目的。 tail 输入插件可以监控一个或多个文本文件。有关 tail 插件的更多信息,可以学习这篇文章:Fluentbit 入门教程(1):tail 插件

使用提供的内容创建名为 otel-collector-config.yaml 的 OpenTelemetry Collector 配置文件。

receivers:
  otlp:
    protocols:
      http:
        endpoint: 0.0.0.0:4318

exporters:
  logging:
    verbosity: detailed

  otlp/jaeger:
    endpoint: jaeger:14250
    tls:
      insecure: true

  prometheus:
    endpoint: 0.0.0.0:9090
    send_timestamps: true
    namespace: promexample
    const_labels:
      label1: value1

processors:
  batch:
    timeout: 10s

extensions:
  health_check:

service:
  extensions: [health_check]
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp/jaeger]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [prometheus]
    logs:
      receivers: [otlp]
      processors: [batch]
      exporters: [logging]

此文件为 Jaeger、Prometheus 和日志记录设置 OTLP 接收器和导出器。以下是每个部分的细分。

  • 接收器:本节定义收集器的输入接收器。在本例中,我们仅指定具有 HTTP 端点 0.0.0.0:4318 的 OTLP 接收器。
  • 导出器:此部分定义收集器的输出导出器。它包括日志记录、Jaeger 和 Prometheus 的导出器。
  • 处理器:本节定义将应用于数据的处理器。在这种情况下,仅使用批处理器,该处理器对传入数据进行批处理以最小化网络开销。
  • Extensions:此部分定义服务将使用的任何扩展。在本例中,包含 health_check 扩展,它提供了健康检查的端点。
  • service :此部分定义服务管道,指定如何处理和导出数据。定义了跟踪、指标和日志管道,每个管道都有各自的接收器、处理器和导出器。例如,跟踪管道从 OTLP 接收器接收数据,应用批处理器,并将其导出到 Jaeger 导出器。

最后,使用提供的内容创建一个名为 prometheus.yaml 的 Prometheus 配置文件。

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: prometheus

    scrape_interval: 5s
    scrape_timeout: 2s
    honor_labels: true

    static_configs:
      - targets: ["localhost:9090"]

该文件设置 Prometheus 的全局抓取间隔、评估间隔和抓取配置。

所有配置文件就位后,运行 docker-compose up -d 启动服务。Fluent Bit 现在将收集日志、指标和跟踪,并将它们转发到 OpenTelemetry Collector,后者又将数据导出到 Jaeger、Prometheus 和日志记录导出器。

接下来,您可以执行命令 fluent-bit -c flb-out-otel.conf 来启动 Fluent Bit。Fluent Bit 输出将显示连接状态。

[2023/03/27 17:25:41] [ info] [input:event_type:event_type.1] [OK] collector_time
[2023/03/27 17:25:42] [ info] [output:opentelemetry:opentelemetry.0] 127.0.0.1:4318, HTTP status=200

现在,您可以通过在 Web 浏览器中输入 http://localhost:16686 来访问 Jaeger UI。到达那里后,找到以服务名称 OTLPResourceNoServiceName 导出的跟踪。

Jaeger UI

访问 http://localhost:9090 可以检查 Prometheus 上可用的指标。您可以发现 Prometheus 公开的有关其自身活动的特定指标,称为 promhttp_metric_handler_requests_total。该指标记录了 Prometheus 服务器已处理的 /metrics 请求总数。

Prometheus UI

要监视 OpenTelemetry Collector 的输出日志,您可以使用命令 docker logs -f otel-collector 来跟踪 Collector 输出。

现在所有步骤都已完成。如果需要关闭进程并正常关闭 Docker Compose 堆栈,可以使用 docker-compose down 命令。此命令停止并删除由 docker-compose up 创建的容器、网络和卷。

验证路径

完成配置后,可以按以下顺序验证:

  1. 查看 Fluent Bit 输出中是否出现 HTTP 200,确认数据已经发送到 Collector。
  2. 打开 Jaeger UI,检查示例 Trace 是否能被查询到。
  3. 打开 Prometheus UI,确认指标是否可查询。
  4. 查看 Collector 日志,确认 logs pipeline 是否收到并输出日志数据。
  5. 如果某一类数据缺失,先检查 Fluent Bit 输出插件的 URI,再检查 Collector 对应 pipeline 的 receiver、processor 和 exporter。

生产环境注意事项

示例配置适合入门验证,不等于生产配置。生产环境至少要补齐以下内容:

  • Collector 和 Fluent Bit 的资源限制,避免日志高峰导致节点或容器 OOM。
  • 下游不可用时的重试、队列和背压策略。
  • OTLP 端点的认证、网络隔离和 TLS 配置。
  • Collector 自身指标监控,例如接收数量、拒绝数量、导出失败数量和队列长度。
  • 日志字段规范,尤其是 service.name、环境、实例、trace_id、span_id 等关联字段。

常见问题

已经有 Fluent Bit,还需要 OpenTelemetry Collector 吗?

不一定,但在需要统一接收多类遥测数据、做协议转换、多后端路由、采样或集中治理时,Collector 会更合适。Fluent Bit 可以继续做靠近数据源的采集和转发。

Fluent Bit 应该直接写后端,还是先写 Collector?

如果只有单一日志后端,直接写后端也可以。如果要把日志、指标、Trace 统一治理,或者未来可能切换后端,先写 Collector 更容易保持应用侧和采集侧稳定。

本文示例为什么同时使用 Jaeger 和 Prometheus?

它们分别验证 Trace 和 Metrics 两类数据流。Jaeger 用于查看链路追踪,Prometheus 用于查询指标。这样能快速确认 Fluent Bit -> Collector -> 后端的基础路径是否打通。

总结

通过将 OpenTelemetry Collector 与 Fluent Bit 集成,用户可以简化其可观测性架构,并为日志、指标和跟踪创建高效、可扩展的数据管道。通过本文提供的配置文件和 Docker Compose 设置,可以快速验证这个组合的基本工作方式。

真正上线时,请把示例中的“能跑通”升级为“能稳定运行”:补齐资源限制、重试、认证、队列、字段规范和 Collector 自监控,才能把入门配置变成可运维的数据管道。

原文:https://fluentd.ctc-america.com/blog/first-steps-opentelemetry-collector-fluentbit

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云