Grafana Alloy 中的日志和重新标签基础知识
本教程介绍了一些基本的指标重新标签操作,并展示了如何将日志发送到 Loki。
开始之前
完成本教程
- 您必须先完成“第一个组件和标准库”教程。
重新标签指标
构建了基本 pipeline 并抓取了一些指标后,您可以使用 prometheus.relabel
组件对指标进行重新标签。
推荐阅读
将 prometheus.relabel
组件添加到您的 pipeline
prometheus.relabel
组件允许您对指标执行 Prometheus 重新标签操作,类似于 Prometheus 抓取配置中的 relabel_configs
部分。
将 prometheus.relabel
组件添加到基本 pipeline 并添加标签。
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

这个 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
命令创建一个包含日志内容的文件。
mkdir -p /tmp/alloy-logs
echo "This is a log line" > /tmp/alloy-logs/log.log
现在您有了日志文件,可以创建一个 pipeline 来抓取它。
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 的大致流程是

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

如果您好奇 Alloy 如何跟踪它在日志文件中的位置,您可以查看 data-alloy/loki.source.file.local_files/positions.yml
文件。如果删除此文件,Alloy 将再次从文件开头读取,这就是为什么将 Alloy 的数据目录保存在持久位置是理想选择的原因。
练习
以下练习将指导您如何为日志添加标签并过滤结果。
推荐阅读
为日志添加标签
这个练习包含两个部分,并建立在前一个示例的基础上。首先,像 Prometheus 示例一样,为您收集的所有日志添加一个 os
标签。
修改以下代码片段,添加值为 os
常量的 os
标签。
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 并执行以下操作
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!=""}
。您应该只看到上一步中添加的行。
// Let's learn about relabeling and send logs to Loki!
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.relabel.add_static_label.receiver]
}
loki.relabel "add_static_label" {
forward_to = [loki.write.local_loki.receiver]
rule {
target_label = "os"
replacement = constants.os
}
}
loki.write "local_loki" {
endpoint {
url = "https://:3100/loki/api/v1/push"
}
}
从日志中提取并添加标签
注意
这个练习比上一个更具挑战性。如果您遇到困难,可以跳过它,转到下一节,其中涵盖了此处使用的一些概念。您可以稍后返回完成此练习。
这个练习建立在前一个的基础上,但更复杂。
假设您想从日志中提取 level
并将其添加为标签。作为起点,请查看 loki.process
。此组件允许您对日志执行处理,包括从日志内容中提取值。
尝试修改上一节中的配置,以从日志中提取 level
并将其添加为标签。如果需要,您可以在上一节的末尾找到上一个练习的解决方案。
提示
loki.process
的stage.logfmt
和stage.labels
块可能会有所帮助。
运行 Alloy 并执行以下操作
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!=""}
,查看新标签的效果。

// Let's learn about relabeling and send logs to Loki!
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.process.add_new_label.receiver]
}
loki.process "add_new_label" {
// Extract the value of "level" from the log line and add it to the extracted map as "extracted_level"
// You could also use "level" = "", which would extract the value of "level" and add it to the extracted map as "level"
// but to make it explicit for this example, we will use a different name.
//
// The extracted map will be covered in more detail in the next section.
stage.logfmt {
mapping = {
"extracted_level" = "level",
}
}
// Add the value of "extracted_level" from the extracted map as a "level" label
stage.labels {
values = {
"level" = "extracted_level",
}
}
forward_to = [loki.relabel.add_static_label.receiver]
}
loki.relabel "add_static_label" {
forward_to = [loki.write.local_loki.receiver]
rule {
target_label = "os"
replacement = constants.os
}
}
loki.write "local_loki" {
endpoint {
url = "https://:3100/loki/api/v1/push"
}
}
结束和后续步骤
您已经了解了组件、属性和表达式的概念。您还看到了如何使用一些标准库组件来收集指标和日志。在下一个教程中,您将学习如何使用 loki.process
组件从日志中提取值并使用它们。