菜单
开源

OpenTelemetry Collector 和 Loki 入门教程

OpenTelemetry Collector 提供了一种厂商无关的实现,用于接收、处理和导出遥测数据。随着 Loki 中引入 OTLP 端点,您现在可以使用 OpenTelemetry Collector 以原生 OTLP 格式将通过 OpenTelemetry 插桩的应用程序日志发送到 Loki。在此示例中,我们将教您如何配置 OpenTelemetry Collector 以接收 OpenTelemetry 格式的日志,并使用 OTLP HTTP 协议将其发送到 Loki。这将涉及配置 OpenTelemetry Collector 中的以下组件:

  • OpenTelemetry Receiver(接收器):该组件将通过 HTTP 和 gRPC 接收 OpenTelemetry 格式的日志。
  • OpenTelemetry Processor(处理器):该组件将接受来自其他 otelcol.* 组件的遥测数据,并将其批量处理。批量处理提高了数据压缩率,并减少了传输数据所需的传出网络请求数量。
  • OpenTelemetry Exporter(导出器):该组件将接受来自其他 otelcol.* 组件的遥测数据,并使用 OTLP HTTP 协议通过网络写入。我们将使用此导出器将日志发送到 Loki 的原生 OTLP 端点。

依赖项

开始之前,请确保您具备以下条件才能运行演示:

  • Docker
  • Docker Compose

提示

另外,您可以在我们的交互式学习环境中试用此示例:OpenTelemetry Collector 和 Loki 入门教程

这是一个完全配置好的环境,所有依赖项都已安装。

Interactive

请在 Grafana Killercoda 存储库 中提供反馈、报告错误并提出教程问题。

场景

在此场景中,我们有一个名为“食肉温室”的微服务应用程序。此应用程序包含以下服务:

  • 用户服务:管理应用程序的用户数据和身份验证。例如创建用户和登录。
  • 植物服务:管理新植物的创建,并在创建新植物时更新其他服务。
  • 模拟服务:为每棵植物生成传感器数据。
  • Websocket 服务:管理应用程序的 Websocket 连接。
  • Bug 服务:一个服务,启用后会随机导致服务失败并生成额外的日志。
  • 主应用程序:将所有服务联系起来的主应用程序。
  • 数据库:存储用户和植物数据的数据库。

每个服务都使用 OpenTelemetry SDK 生成日志,并以 OpenTelemetry 格式 (OTLP) 导出到 OpenTelemetry Collector。然后,Collector 摄取日志并将其发送到 Loki。

步骤 1:环境设置

在此步骤中,我们将通过克隆包含我们演示应用程序的存储库并使用 Docker Compose 启动我们的可观测性技术栈来设置我们的环境。

  1. 首先,克隆包含我们演示应用程序的存储库

    bash
    git clone -b microservice-otel-collector  https://github.com/grafana/loki-fundamentals.git
  2. 接下来,我们将使用 Docker Compose 启动我们的可观测性技术栈

    bash
    docker compose -f loki-fundamentals/docker-compose.yml up -d

    要检查服务状态,我们可以运行以下命令

    bash
    docker ps -a

    注意

    OpenTelemetry Collector 容器将显示为 StoppedExited (1) About a minute ago。这是预期行为,因为我们提供了一个空的配置文件。我们将在下一步更新此文件。

在完成 OpenTelemetry Collector 配置并将日志发送到 Loki 后,我们将能够在 Grafana 中查看日志。要检查 Grafana 是否已启动并运行,请导航到以下 URL:https://:3000

步骤 2:配置 OpenTelemetry Collector

要配置 Collector 以摄取来自我们应用程序的 OpenTelemetry 日志,我们需要提供一个配置文件。此配置文件将定义组件及其关系。我们将在该配置文件中构建整个可观测性管线。

打开您的代码编辑器并找到 otel-config.yaml 文件

配置文件使用 YAML 配置语法编写。首先,我们将在代码编辑器中打开 otel-config.yaml 文件

  1. 在您选择的代码编辑器中打开 loki-fundamentals 目录。
  2. loki-fundamentals 目录(顶层目录)中找到 otel-config.yaml 文件。
  3. 单击 otel-config.yaml 文件,在代码编辑器中打开它。

您将复制以下所有三个配置片段到 otel-config.yaml 文件中。

通过 gRPC 和 HTTP 接收 OpenTelemetry 日志

首先,我们将配置 OpenTelemetry Receiver。otlp: 通过 HTTP 和 gRPC 接受 OpenTelemetry 格式的日志。我们将使用此接收器接收 Carnivorous Greenhouse 应用程序的日志。

现在将以下配置添加到 otel-config.yaml 文件中

yaml
# Receivers
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

在此配置中:

  • receivers:接收遥测数据的接收器列表。在本例中,我们使用 otlp 接收器。
  • otlp:接受 OpenTelemetry 格式日志的 OpenTelemetry 接收器。
  • protocols:接收器支持的协议列表。在本例中,我们使用 grpchttp
  • grpc:gRPC 协议配置。接收器将通过 4317 端口接收 gRPC 日志。
  • http:HTTP 协议配置。接收器将通过 4318 端口接收 HTTP 日志。
  • endpoint:监听的 IP 地址和端口号。在本例中,我们在所有 IP 地址上监听 gRPC 的 4317 端口和 HTTP 的 4318 端口。

有关 otlp 接收器配置的更多信息,请参阅 OpenTelemetry Receiver OTLP 文档

使用 OpenTelemetry 处理器创建日志批次

接下来将以下配置添加到 otel-config.yaml 文件中

yaml
# Processors
processors:
  batch:

在此配置中:

  • processors:处理遥测数据的处理器列表。在本例中,我们使用 batch 处理器。
  • batch:接受来自其他 otelcol 组件的遥测数据并将其批量处理的 OpenTelemetry 处理器。

有关 batch 处理器配置的更多信息,请参阅 OpenTelemetry Processor Batch 文档

使用 OpenTelemetry 导出器将日志导出到 Loki

我们将使用 otlphttp/logs 导出器将日志发送到 Loki 的原生 OTLP 端点。将以下配置添加到 otel-config.yaml 文件中

yaml
# Exporters
exporters:
  otlphttp/logs:
    endpoint: "http://loki:3100/otlp"
    tls:
      insecure: true

在此配置中:

  • exporters:导出遥测数据的导出器列表。在本例中,我们使用 otlphttp/logs 导出器。
  • otlphttp/logs:接受来自其他 otelcol 组件的遥测数据,并使用 OTLP HTTP 协议通过网络写入的 OpenTelemetry 导出器。
  • endpoint:发送遥测数据的 URL。在本例中,我们将日志发送到 http://loki:3100/otlp 的 Loki 原生 OTLP 端点。
  • tls:导出器的 TLS 配置。在本例中,我们将 insecure 设置为 true 以禁用 TLS 验证。
  • insecure:禁用 TLS 验证。由于我们使用的是不安全连接,因此将其设置为 true

有关 otlphttp/logs 导出器配置的更多信息,请参阅 OpenTelemetry Exporter OTLP HTTP 文档

创建管线

现在我们已经配置了接收器、处理器和导出器,我们需要创建一个管线来连接这些组件。将以下配置添加到 otel-config.yaml 文件中

yaml
# Pipelines
service:
  pipelines:
    logs:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp/logs]

在此配置中:

  • pipelines:连接接收器、处理器和导出器的管线列表。在本例中,我们使用 logs 管线,但也有用于指标、追踪和连续分析的管线。
  • receivers:接收遥测数据的接收器列表。在本例中,我们使用之前创建的 otlp 接收器组件。
  • processors:处理遥测数据的处理器列表。在本例中,我们使用之前创建的 batch 处理器组件。
  • exporters:导出遥测数据的导出器列表。在本例中,我们使用之前创建的 otlphttp/logs 组件导出器。

加载配置

在将配置加载到 OpenTelemetry Collector 之前,请将您的配置与下方完整的配置进行比较

yaml
# Receivers
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
        
# Processors
processors:
  batch:

# Exporters
exporters:
  otlphttp/logs:
    endpoint: "http://loki:3100/otlp"
    tls:
      insecure: true
      
# Pipelines
service:
  pipelines:
    logs:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp/logs]

接下来,我们需要将配置应用到 OpenTelemetry Collector。为此,我们将重新启动 OpenTelemetry Collector 容器

bash
docker restart loki-fundamentals-otel-collector-1

这将使用新配置重新启动 OpenTelemetry Collector 容器。您可以查看 OpenTelemetry Collector 容器的日志,以确认配置是否成功加载

bash
docker logs loki-fundamentals-otel-collector-1

在日志中,您应该看到以下消息

console
2024-08-02T13:10:25.136Z        info    service@v0.106.1/service.go:225 Everything is ready. Begin running and processing data.

卡住了?需要帮助?

如果您遇到困难或需要创建配置方面的帮助,可以使用以下完整配置文件复制并替换整个 otel-config.yaml

bash
cp loki-fundamentals/completed/otel-config.yaml loki-fundamentals/otel-config.yaml
docker restart loki-fundamentals-otel-collector-1

步骤 3:启动 Carnivorous Greenhouse

在此步骤中,我们将启动 Carnivorous Greenhouse 应用程序。要启动应用程序,请运行以下命令

注意

此 docker-compose 文件依赖于 loki-fundamentals_loki Docker 网络。如果您尚未启动可观测性技术栈,则需要先启动它。

bash
docker compose -f loki-fundamentals/greenhouse/docker-compose-micro.yml up -d --build 

这将启动以下服务

console
 ✔ Container greenhouse-db-1                 Started                                                         
 ✔ Container greenhouse-websocket_service-1  Started 
 ✔ Container greenhouse-bug_service-1        Started
 ✔ Container greenhouse-user_service-1       Started
 ✔ Container greenhouse-plant_service-1      Started
 ✔ Container greenhouse-simulation_service-1 Started
 ✔ Container greenhouse-main_app-1           Started

启动后,您可以通过 https://:5005 访问 Carnivorous Greenhouse 应用程序。通过以下方式与应用程序交互以生成一些日志

  1. 创建一个用户。
  2. 登录。
  3. 创建一些植物进行监控。
  4. 启用 bug 模式以激活 bug 服务。这将导致服务失败并生成额外的日志。

最后,要在 Loki 中查看日志,请导航到 Grafana 中的 Loki 日志探索视图:https://:3000/a/grafana-lokiexplore-app/explore

总结

在此示例中,我们配置了 OpenTelemetry Collector,使其接收来自示例应用程序的日志,并使用原生 OTLP 端点将其发送到 Loki。请务必查阅 Loki 配置文件 loki-config.yaml,以了解我们如何配置 Loki 来接收来自 OpenTelemetry Collector 的日志。

进一步阅读

有关 OpenTelemetry Collector 和 Loki 原生 OTLP 端点的更多信息,请参阅以下资源

完整的指标、日志、追踪和分析示例

如果您想使用包含 Mimir、Loki、Tempo 和 Grafana 的演示,可以使用 Grafana 中的指标、日志、追踪和分析简介Intro-to-mltp 提供了一个自包含的环境,用于学习 Mimir、Loki、Tempo 和 Grafana。

该项目包含每个组件的详细解释和单实例部署的注释配置。来自 intro-to-mltp 的数据也可以推送到 Grafana Cloud。