菜单
开源 RSS

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 相同的服务发现机制,尽管它目前仅支持 statickubernetes 服务发现。这种限制是由于 Promtail 作为守护程序部署到每台本地机器上,因此无法从其他机器发现标签。kubernetes 服务发现从 Kubernetes API 服务器获取所需的标签,而 static 通常涵盖所有其他用例。

就像 Prometheus 一样,promtail 使用 scrape_configs 节进行配置。relabel_configs 允许对要摄入的内容、要丢弃的内容以及要附加到日志行的最终元数据进行精细控制。有关配置 Promtail 的更多详细信息,请参阅文档。

支持压缩文件

Promtail 现在原生支持摄入压缩文件。如果发现的目标已配置解压缩,Promtail 将懒惰地解压缩压缩文件并将解析后的数据推送到 Loki。下面的 Promtail 配置示例展示了如何设置解压缩

yaml
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 配置文件中配置

yaml
server:
  http_listen_address: 127.0.0.1
  http_listen_port: 9080