Promtail 代理
注意
Promtail 现已弃用,并将从 2025 年 2 月 13 日起进入长期支持(LTS)阶段。这意味着 Promtail 将不再接收任何新功能更新,但会获得关键的错误修复和安全修复。商业支持将在 LTS 阶段结束后终止,我们预计该阶段将持续约 12 个月,直到 2026 年 2 月 28 日。Promtail 的生命周期结束(EOL)阶段将在 LTS 结束后开始。Promtail 预计将在 2026 年 3 月 2 日达到 EOL,此后将不再提供任何支持或更新。所有未来的功能开发将在 Grafana Alloy 中进行。
如果您目前正在使用 Promtail,您应计划将迁移到 Alloy。Alloy 迁移文档包含一个迁移工具,只需一条命令即可将您的 Promtail 配置转换为 Alloy 配置。
Promtail 是一个代理,用于将本地日志的内容发送到私有 Grafana Loki 实例或 Grafana Cloud。它通常部署在需要监控的应用程序运行的每台机器上。
它主要执行以下操作:
- 发现目标
- 将标签附加到日志流
- 将它们推送到 Loki 实例。
目前,Promtail 可以跟踪两个来源的日志:本地日志文件和 systemd journal(在 ARM 和 AMD64 机器上)。
日志文件发现
在 Promtail 将日志文件中的任何数据发送到 Loki 之前,它需要了解其环境信息。具体而言,这意味着发现向需要监控的文件发出日志行的应用程序。
Promtail 借用了与 Prometheus 相同的服务发现机制,尽管它目前仅支持 static
和 kubernetes
服务发现。这种限制是由于 Promtail 作为守护程序部署到每台本地机器上,因此无法从其他机器发现标签。kubernetes
服务发现从 Kubernetes API 服务器获取所需的标签,而 static
通常涵盖所有其他用例。
就像 Prometheus 一样,promtail
使用 scrape_configs
节进行配置。relabel_configs
允许对要摄入的内容、要丢弃的内容以及要附加到日志行的最终元数据进行精细控制。有关配置 Promtail 的更多详细信息,请参阅文档。
支持压缩文件
Promtail 现在原生支持摄入压缩文件。如果发现的目标已配置解压缩,Promtail 将懒惰地解压缩压缩文件并将解析后的数据推送到 Loki。下面的 Promtail 配置示例展示了如何设置解压缩
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /var/lib/promtail/positions.yaml
clients:
- url: https://:3100/loki/api/v1/push
scrape_configs:
- job_name: system
decompression:
enabled: true
initial_delay: 10s
format: gz
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/**.gz
重要细节如下:
- 它依赖于
\n
字符将数据分隔成不同的日志行。 - 压缩文件中的最大预期日志行大小为 2MB。
- 数据按 4096 字节的块解压缩。例如:它首先从压缩文件中获取 4096 字节的块并进行处理。处理完此块并将数据推送到 Loki 后,它会获取接下来的 4096 字节,依此类推。
- 它支持以下扩展名:
.gz
:数据将使用原生的 Gunzip Golang 包 (pkg/compress/gzip
) 进行解压缩。.z
:数据将使用原生的 Zlib Golang 包 (pkg/compress/zlib
) 进行解压缩。.bz2
:数据将使用原生的 Bzip2 Golang 包 (pkg/compress/bzip2
) 进行解压缩。.tar.gz
:数据将与.gz
扩展名完全一样进行解压缩。但是,由于tar
会在其压缩文件开头添加元数据,因此解析的第一行将包含元数据和您的日志行。这在./clients/pkg/promtail/targets/file/decompresser_test.go
中有所说明。
- 目前不支持
.zip
扩展名,因为它不支持 Promtail 所需的一些接口。 - 解压缩非常消耗 CPU 资源,并且预计会发生大量分配,尤其取决于文件的大小。您可以预期垃圾收集运行次数和 CPU 使用率会急剧增加,但预计不会发生内存泄漏。
- 支持位置。这意味着,如果您在解析并推送(例如)45% 的压缩文件数据后中断 Promtail,您可以预期 Promtail 将从最后抓取的那一行继续工作,并处理剩余的 55%。
- 由于解压缩和推送可能非常快,取决于压缩文件的大小,Loki 可能会限制您的摄入速率。在这种情况下,您可以配置 Promtail 的
limits
阶段来减慢速度,或者增加 Loki 上的摄入限制。 - 不支持对压缩文件进行日志轮转(对普通文件完全支持日志轮转),主要是因为它需要我们修改 Promtail 以依赖文件 inodes 而不是文件名。
- 如果您在正在抓取的文件夹下压缩文件,Promtail 可能会在您完成压缩之前尝试摄入您的文件。为避免这种情况,请选择一个足以避免此问题的
initial_delay
。
Loki Push API
Promtail 也可以配置为通过使用 Promtail loki_push_api 抓取配置暴露 Loki Push API 来接收来自另一个 Promtail 或任何 Loki 客户端的日志。
在以下几种情况下,这可能会有所帮助:
- 复杂的网络基础设施,其中许多机器的出站流量不理想。
- 使用 Docker 日志驱动并希望提供复杂的流水线或从日志中提取指标。
- 无服务器设置,其中许多临时日志源希望发送到 Loki,发送到
use_incoming_timestamp
== false 的 Promtail 实例可以避免乱序错误,并避免使用高基数标签。
从 Syslog 接收日志
当使用 Syslog 目标时,可以使用 syslog 协议将日志写入配置的端口。
AWS
如果您需要在 Amazon Web Services EC2 实例上运行 Promtail,可以使用我们的详细教程。
标签和解析
在服务发现期间,会确定元数据(pod 名称、文件名等),这些元数据可以作为标签附加到日志行,以便在 Loki 中查询日志时更容易识别。通过 relabel_configs
,发现的标签可以转换为所需的格式。
为了之后进行更复杂的过滤,Promtail 不仅允许从服务发现设置标签,还可以根据每条日志行的内容设置标签。pipeline_stages
可用于添加或更新标签、纠正时间戳或完全重写日志行。有关流水线的更多详细信息,请参阅文档。
发送
一旦 Promtail 拥有目标集(即,要从中读取的内容,如文件)并且所有标签都已正确设置,它将开始跟踪(持续读取)目标的日志。一旦读取到足够的内存数据或达到可配置的超时时间后,它将作为一个批次刷新到 Loki。
当 Promtail 从源(文件和 systemd journal,如果配置)读取数据时,它将在位置文件中跟踪最后读取的偏移量。默认情况下,位置文件存储在 /var/log/positions.yaml
中。位置文件有助于 Promtail 在 Promtail 实例重启的情况下从上次停止的位置继续读取。
API
Promtail 提供了一个嵌入式 Web 服务器,在 /
暴露 Web 控制台以及以下 API 端点:
GET /ready
当 Promtail 启动并运行,并且至少有一个正常工作的目标时,此端点返回 200。
GET /metrics
此端点返回用于 Prometheus 的 Promtail 指标。有关导出的指标列表,请参阅观测 Grafana Loki。
Promtail Web 服务器配置
Promtail 暴露的 Web 服务器可以在 Promtail 的 .yaml
配置文件中配置
server:
http_listen_address: 127.0.0.1
http_listen_port: 9080