菜单
文档面包屑箭头 Grafana Alloy面包屑箭头 教程面包屑箭头 日志和重新标签基础知识
开源

Grafana Alloy 中的日志和重新标签基础知识

本教程介绍了一些基本的指标重新标签操作,并展示了如何将日志发送到 Loki。

开始之前

完成本教程

重新标签指标

构建了基本 pipeline 并抓取了一些指标后,您可以使用 prometheus.relabel 组件对指标进行重新标签。

prometheus.relabel 组件添加到您的 pipeline

prometheus.relabel 组件允许您对指标执行 Prometheus 重新标签操作,类似于 Prometheus 抓取配置中的 relabel_configs 部分。

prometheus.relabel 组件添加到基本 pipeline 并添加标签。

alloy
prometheus.exporter.unix "localhost" { }

prometheus.scrape "default" {
    scrape_interval = "10s"

    targets    = prometheus.exporter.unix.localhost.targets
    forward_to = [
        prometheus.relabel.example.receiver,
    ]
}

prometheus.relabel "example" {
    forward_to = [
        prometheus.remote_write.local_prom.receiver,
    ]

    rule {
        action       = "replace"
        target_label = "os"
        replacement  = constants.os
    }
}

prometheus.remote_write "local_prom" {
    endpoint {
        url = "https://:9090/api/v1/write"
    }
}

您已创建以下 pipeline

Diagram of pipeline that scrapes prometheus.exporter.unix, relabels the metrics, and remote_writes them

这个 pipeline 有一个 prometheus.relabel 组件,其中包含一条规则。这条规则使用 replace 动作,将 os 标签的值替换为一个特殊值:constants.os。这个值是一个特殊的常量,会被替换为 Alloy 正在运行的主机的操作系统。您可以在constants 文档中查看其他可用常量。这个例子有一个 rule 块,但您可以根据需要添加任意多个。每个 rule 块按顺序应用。

如果您运行 Alloy 并访问https://:3000/explore,您可以在指标上看到 os 标签。尝试查询 node_context_switches_total 并查看标签。

重新标签使用与 Prometheus 相同的规则。您可以随时查阅prometheus.relabel rule-block 文档,获取可用选项的完整列表。

注意

您可以将多个组件转发到一个 prometheus.relabel 组件。这允许您将相同的重新标签规则应用于多个 pipeline。

警告

重新标签时,使用以 __(双下划线)开头的标签是一个常见问题。这些标签被认为是内部标签,在应用 prometheus.relabel 组件的重新标签规则之前会被丢弃。如果您想保留或处理这类标签,请使用 discovery.relabel 组件。

发送日志到 Loki

现在您已经创建了组件并将它们链接在一起,接下来可以收集一些日志并将它们发送到 Loki。

查找并收集日志

您可以使用 local.file_match 组件执行文件发现,使用 loki.source.file 收集日志,并使用 loki.write 组件将日志发送到 Loki。

在此之前,请确保您有一个日志文件可供抓取。您可以使用 echo 命令创建一个包含日志内容的文件。

bash
mkdir -p /tmp/alloy-logs
echo "This is a log line" > /tmp/alloy-logs/log.log

现在您有了日志文件,可以创建一个 pipeline 来抓取它。

alloy
local.file_match "tmplogs" {
    path_targets = [{"__path__" = "/tmp/alloy-logs/*.log"}]
}

loki.source.file "local_files" {
    targets    = local.file_match.tmplogs.targets
    forward_to = [loki.write.local_loki.receiver]
}

loki.write "local_loki" {
    endpoint {
        url = "https://:3100/loki/api/v1/push"
    }
}

这个 pipeline 的大致流程是

Diagram of pipeline that collects logs from /tmp/alloy-logs and writes them to a local Loki instance

如果您访问https://:3000/explore 并将数据源切换到 Loki,您可以查询 {filename="/tmp/alloy-logs/log.log"} 并看到之前创建的日志行。尝试运行以下命令向文件中添加更多日志。

bash
echo "This is another log line!" >> /tmp/alloy-logs/log.log

如果您重新执行查询,您可以看到新的日志行。

Grafana Explore view of example log lines

如果您好奇 Alloy 如何跟踪它在日志文件中的位置,您可以查看 data-alloy/loki.source.file.local_files/positions.yml 文件。如果删除此文件,Alloy 将再次从文件开头读取,这就是为什么将 Alloy 的数据目录保存在持久位置是理想选择的原因。

练习

以下练习将指导您如何为日志添加标签并过滤结果。

为日志添加标签

这个练习包含两个部分,并建立在前一个示例的基础上。首先,像 Prometheus 示例一样,为您收集的所有日志添加一个 os 标签。

修改以下代码片段,添加值为 os 常量的 os 标签。

alloy
local.file_match "tmplogs" {
    path_targets = [{"__path__" = "/tmp/alloy-logs/*.log"}]
}

loki.source.file "local_files" {
    targets    = local.file_match.tmplogs.targets
    forward_to = [loki.write.local_loki.receiver]
}

loki.write "local_loki" {
    endpoint {
        url = "https://:3100/loki/api/v1/push"
    }
}

提示

您可以使用 loki.relabel 组件进行重新标签和添加标签,就像使用 prometheus.relabel 组件一样。

运行 Alloy 并执行以下操作

bash
echo 'level=info msg="INFO: This is an info level log!"' >> /tmp/alloy-logs/log.log
echo 'level=warn msg="WARN: This is a warn level log!"' >> /tmp/alloy-logs/log.log
echo 'level=debug msg="DEBUG: This is a debug level log!"' >> /tmp/alloy-logs/log.log

导航至https://:3000/explore 并将数据源切换到 Loki。尝试查询 {filename="/tmp/alloy-logs/log.log"},看看能否找到新标签。

添加新标签后,您还可以根据它们进行过滤。尝试查询 {os!=""}。您应该只看到上一步中添加的行。

从日志中提取并添加标签

注意

这个练习比上一个更具挑战性。如果您遇到困难,可以跳过它,转到下一节,其中涵盖了此处使用的一些概念。您可以稍后返回完成此练习。

这个练习建立在前一个的基础上,但更复杂。

假设您想从日志中提取 level 并将其添加为标签。作为起点,请查看 loki.process。此组件允许您对日志执行处理,包括从日志内容中提取值。

尝试修改上一节中的配置,以从日志中提取 level 并将其添加为标签。如果需要,您可以在上一节的末尾找到上一个练习的解决方案。

提示

loki.processstage.logfmtstage.labels 块可能会有所帮助。

运行 Alloy 并执行以下操作

bash
echo 'level=info msg="INFO: This is an info level log!"' >> /tmp/alloy-logs/log.log
echo 'level=warn msg="WARN: This is a warn level log!"' >> /tmp/alloy-logs/log.log
echo 'level=debug msg="DEBUG: This is a debug level log!"' >> /tmp/alloy-logs/log.log

导航至https://:3000/explore 并将数据源切换到 Loki。尝试查询 {level!=""},查看新标签的效果。

Grafana Explore view of example log lines, now with the extracted 'level' label

结束和后续步骤

您已经了解了组件、属性和表达式的概念。您还看到了如何使用一些标准库组件来收集指标和日志。在下一个教程中,您将学习如何使用 loki.process 组件从日志中提取值并使用它们。