使用 Alloy 通过 Kafka 将日志发送到 Loki
Alloy 原生支持通过 Kafka 接收日志。在本示例中,我们将配置 Alloy 使用两种不同的方法通过 Kafka 接收日志
- loki.source.kafka:使用消费者组读取 Kafka 消息,并将它们转发到其他
loki.*
组件。 - otelcol.receiver.kafka:接受来自 Kafka broker 的遥测数据,并将其转发到其他
otelcol.*
组件。
依赖项
开始之前,请确保您已安装以下组件以运行此演示
- Docker
- Docker Compose
提示
此外,您也可以在我们的交互式学习环境中尝试此示例:使用 Alloy 通过 Kafka 将日志发送到 Loki。
这是一个已完全配置好的环境,所有依赖项均已安装。
请在Grafana Killercoda 仓库 中提供反馈、报告错误和提出问题。
场景
在此场景中,我们有一个名为“食肉温室 (Carnivorous Greenhouse)”的微服务应用程序。该应用程序包含以下服务:
- 用户服务:管理应用程序的用户数据和身份验证。例如创建用户和登录。
- 植物服务:管理新植物的创建,并在创建新植物时更新其他服务。
- 模拟服务:为每棵植物生成传感器数据。
- Websocket 服务:管理应用程序的 websocket 连接。
- Bug 服务:启用后会随机导致服务失败并生成额外日志的服务。
- 主应用:将所有服务连接在一起的主应用程序。
- 数据库:存储用户和植物数据的数据库。
每个服务都会生成通过 Kafka 发送到 Alloy 的日志。在此示例中,日志被发送到两个不同的主题:
loki
:发送结构化日志格式的消息 (json)。otlp
:发送序列化的 OpenTelemetry 日志消息。
您通常不会在自己的应用程序中这样做,但出于本示例的目的,我们想展示 Alloy 如何处理通过 Kafka 传输的不同类型的日志消息。
步骤 1:环境设置
在此步骤中,我们将克隆包含演示应用程序的仓库,并使用 Docker Compose 启动可观测性堆栈来设置环境。
首先,克隆包含演示应用程序的仓库
git clone -b microservice-kafka https://github.com/grafana/loki-fundamentals.git
接下来,我们将使用 Docker Compose 启动可观测性堆栈
docker compose -f loki-fundamentals/docker-compose.yml up -d
这将启动以下服务:
✔ Container loki-fundamentals-grafana-1 Started ✔ Container loki-fundamentals-loki-1 Started ✔ Container loki-fundamentals-alloy-1 Started ✔ Container loki-fundamentals-zookeeper-1 Started ✔ Container loki-fundamentals-kafka-1 Started
我们将访问两个 UI 界面
- Alloy 地址:https://:12345
- Grafana 地址:https://:3000
步骤 2:配置 Alloy 摄取原始 Kafka 日志
在第一步中,我们将配置 Alloy 摄取原始 Kafka 日志。为此,我们将更新 config.alloy
文件以包含 Kafka 日志配置。
打开您的代码编辑器并找到 config.alloy
文件
Grafana Alloy 需要一个配置文件来定义组件及其关系。配置文件使用 Alloy 配置语法编写。我们将在该配置文件中构建整个可观测性管道。首先,我们将在代码编辑器中打开 config.alloy
文件
- 在您选择的代码编辑器中打开
loki-fundamentals
目录。 - 在顶层目录
loki-fundamentals
中找到config.alloy
文件。 - 点击
config.alloy
文件在代码编辑器中打开它。
您将把以下所有三个配置片段复制到 config.alloy
文件中。
从 Kafka 获取源日志
首先,我们将配置 Loki Kafka 源。loki.source.kafka
使用消费者组读取 Kafka 消息,并将它们转发到其他 loki.*
组件。
该组件会针对给定参数启动一个新的 Kafka 消费者组,并将传入的条目分发到 forward_to
中的接收器列表。
将以下配置添加到 config.alloy
文件中
loki.source.kafka "raw" {
brokers = ["kafka:9092"]
topics = ["loki"]
forward_to = [loki.write.http.receiver]
relabel_rules = loki.relabel.kafka.rules
version = "2.0.0"
labels = {service_name = "raw_kafka"}
}
在此配置中:
brokers
:要连接的 Kafka brokers。topics
:要消费的 Kafka 主题。在本例中,我们消费loki
主题。forward_to
:转发日志的接收器列表。在本例中,我们将日志转发到loki.write.http.receiver
。relabel_rules
:应用于传入日志的重打标签规则。这可以用于从 Kafka 源添加的临时内部标签生成标签。version
:要使用的 Kafka 协议版本。labels
:要添加到传入日志的标签。在本例中,我们添加一个service_name
标签,其值为raw_kafka
。这将在 Grafana 的日志浏览器应用中用于标识来自原始 Kafka 源的日志。
有关 loki.source.kafka
配置的更多信息,请参阅Loki Kafka 源文档。
根据 Kafka 主题创建动态重打标签
接下来,我们将配置 Loki 重打标签规则。loki.relabel
组件通过应用一个或多个重打标签规则来重写传递给其接收器的每个日志条目的标签集,并将结果转发到组件参数中的接收器列表。在本例中,我们直接从 loki.source.kafka
组件调用规则。
现在将以下配置添加到 config.alloy
文件中
loki.relabel "kafka" {
forward_to = [loki.write.http.receiver]
rule {
source_labels = ["__meta_kafka_topic"]
target_label = "topic"
}
}
在此配置中:
forward_to
:转发日志的接收器列表。在本例中,我们将日志转发到loki.write.http.receiver
。然而,在此例中,我们直接从loki.source.kafka
组件调用规则。因此,forward_to
用作占位符,因为loki.relabel
组件需要它。rule
:应用于传入日志的重打标签规则。在本例中,我们将__meta_kafka_topic
标签重命名为topic
。
有关 loki.relabel
配置的更多信息,请参阅Loki 重打标签文档。
将日志写入 Loki
最后,我们将配置 Loki 写入组件。loki.write
接收来自其他 Loki 组件的日志条目,并使用 Loki logproto 格式通过网络发送它们。
最后,将以下配置添加到 config.alloy
文件中
loki.write "http" {
endpoint {
url = "http://loki:3100/loki/api/v1/push"
}
}
在此配置中:
endpoint
:发送日志的端点。在本例中,我们将日志发送到 Loki HTTP 端点。
有关 loki.write
配置的更多信息,请参阅Loki 写入文档。
重新加载 Alloy 配置以检查更改
添加完成后,保存文件。然后运行以下命令请求 Alloy 重新加载配置
curl -X POST https://:12345/-/reload
新的配置将加载。您可以通过查看 Alloy UI 进行验证:https://:12345。
遇到困难?需要帮助?
如果遇到困难或在创建配置时需要帮助,您可以使用完整的配置文件复制并替换整个 config.alloy
文件
cp loki-fundamentals/completed/config-raw.alloy loki-fundamentals/config.alloy
curl -X POST https://:12345/-/reload
步骤 3:配置 Alloy 通过 Kafka 摄取 OpenTelemetry 日志
接下来,我们将配置 Alloy 也通过 Kafka 摄取 OpenTelemetry 日志,我们需要再次更新 Alloy 配置文件。我们将把新的组件添加到 config.alloy
文件中,与现有组件一起。
打开您的代码编辑器并找到 config.alloy
文件
像之前一样,我们在同一个 config.alloy
文件中生成下一个管道配置。您将在现有配置之外额外添加以下配置片段。实质上,我们在同一个 Alloy 配置文件中配置了两个管道。
从 Kafka 获取源 OpenTelemetry 日志
首先,我们将配置 OpenTelemetry Kafka 接收器。otelcol.receiver.kafka
接受来自 Kafka broker 的遥测数据,并将其转发到其他 otelcol.*
组件。
现在将以下配置添加到 config.alloy
文件中
otelcol.receiver.kafka "default" {
brokers = ["kafka:9092"]
protocol_version = "2.0.0"
topic = "otlp"
encoding = "otlp_proto"
output {
logs = [otelcol.processor.batch.default.input]
}
}
在此配置中:
brokers
:要连接的 Kafka brokers。protocol_version
:要使用的 Kafka 协议版本。topic
:要消费的 Kafka 主题。在本例中,我们消费otlp
主题。encoding
:传入日志的编码格式。将消息解码为 OTLP protobuf。output
:转发日志的接收器列表。在本例中,我们将日志转发到otelcol.processor.batch.default.input
。
有关 otelcol.receiver.kafka
配置的更多信息,请参阅OpenTelemetry Kafka 接收器文档。
发送前批量处理 OpenTelemetry 日志
接下来,我们将配置一个 OpenTelemetry 处理器。otelcol.processor.batch
接受来自其他 otelcol 组件的遥测数据并将其分批处理。批量处理提高了数据压缩效率,并减少了传输数据所需的传出网络请求数量。此处理器支持基于大小和时间的批量处理。
现在将以下配置添加到 config.alloy
文件中
otelcol.processor.batch "default" {
output {
logs = [otelcol.exporter.otlphttp.default.input]
}
}
在此配置中:
output
:转发日志的接收器列表。在本例中,我们将日志转发到otelcol.exporter.otlphttp.default.input
。
有关 otelcol.processor.batch
配置的更多信息,请参阅OpenTelemetry Batch 处理器文档。
将 OpenTelemetry 日志写入 Loki
最后,我们将配置 OpenTelemetry 导出器。otelcol.exporter.otlphttp
接受来自其他 otelcol 组件的遥测数据,并使用 OTLP HTTP 协议通过网络写入。我们将使用此导出器将日志发送到 Loki 原生 OTLP 端点。
最后,将以下配置添加到 config.alloy
文件中
otelcol.exporter.otlphttp "default" {
client {
endpoint = "http://loki:3100/otlp"
}
}
在此配置中:
client
:导出器的客户端配置。在本例中,我们将日志发送到 Loki OTLP 端点。
有关 otelcol.exporter.otlphttp
配置的更多信息,请参阅OpenTelemetry OTLP HTTP 导出器文档。
重新加载 Alloy 配置以检查更改
添加完成后,保存文件。然后运行以下命令请求 Alloy 重新加载配置
curl -X POST https://:12345/-/reload
新的配置将加载。您可以通过查看 Alloy UI 进行验证:https://:12345。
遇到困难?需要帮助(完整配置)?
如果遇到困难或在创建配置时需要帮助,您可以复制并替换整个 config.alloy
文件。这与之前的“遇到困难?需要帮助”部分不同,我们是用完整的配置文件替换整个配置文件,而不仅仅是添加第一个 Loki Raw 管道配置。
cp loki-fundamentals/completed/config.alloy loki-fundamentals/config.alloy
curl -X POST https://:12345/-/reload
步骤 3:启动食肉温室 (Carnivorous Greenhouse) 应用程序
在此步骤中,我们将启动食肉温室应用程序。要启动应用程序,请运行以下命令
注意
此 docker-compose 文件依赖于
loki-fundamentals_loki
docker 网络。如果尚未启动可观测性堆栈,则需要先启动它。
docker compose -f loki-fundamentals/greenhouse/docker-compose-micro.yml up -d --build
这将启动以下服务:
✔ 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。通过以下方式与应用程序交互来生成一些日志:
- 创建一个用户
- 登录
- 创建一些植物进行监控
- 启用 bug 模式以激活 bug 服务。这将导致服务失败并生成额外日志。
最后,要在 Loki 中查看日志,请在 Grafana 中导航到 Loki 日志浏览器视图:https://:3000/a/grafana-lokiexplore-app/explore。
总结
在此示例中,我们配置了 Alloy 通过 Kafka 摄取日志。我们配置 Alloy 摄取了两种不同格式的日志:原始日志和 OpenTelemetry 日志。接下来去哪里?
延伸阅读
有关 Grafana Alloy 的更多信息,请参阅以下资源:
完整的指标、日志、追踪和性能剖析示例
如果您想使用包含 Mimir、Loki、Tempo 和 Grafana 的演示,可以使用Grafana 指标、日志、追踪和性能剖析入门。Intro-to-mltp
提供了一个自包含的环境,用于学习 Mimir、Loki、Tempo 和 Grafana。
该项目包含对每个组件的详细解释以及单实例部署的带注释配置。来自 intro-to-mltp
的数据也可以推送到 Grafana Cloud。