菜单
开源版

执行速率限制和推送请求验证

如果请求超出使用阈值(速率限制错误)或无效(验证错误),Loki 将拒绝这些请求。

使用 loki_discarded_samples_totalloki_discarded_bytes_total 指标可以观察到所有这些错误的发生情况。以下各节描述了这些指标的 reason 标签中指定的各种可能原因。

建议 Loki 运维人员配置这些指标的告警或仪表盘,以检测速率限制或验证错误的发生。

术语

  • sample: 带有结构化元数据的日志行
  • stream: 具有唯一标签组合的 sample
  • active stream: 存在于 ingester 中的流 - 这些流最近在 chunk_idle_period 周期内(默认:30 分钟)接收到日志行

速率限制错误

当 Loki 无法处理来自租户的更多请求时,将强制执行速率限制。

rate_limited

当租户超出其配置的日志摄取速率限制时,将强制执行此速率限制。

如果你看到由于 rate_limited 导致的 sample 丢弃,一个解决方案是简单地增加 Loki 集群上的速率限制。这些限制可以在 limits_config 块中全局修改,或在 运行时覆盖 文件中按租户进行修改。要使用的配置选项是 ingestion_rate_mbingestion_burst_size_mb

请注意,你需要确保你的 Loki 集群配置了足够的资源来适应这些更高的限制。否则,当集群尝试处理更高容量的待摄取日志行时,可能会出现性能下降。

解决由于 rate_limits 导致 sample 丢弃的另一种选择是简单地降低发送到 Loki 集群的日志行速率。可以考虑从较少的目标收集日志,或在 Promtail 中设置 drop 阶段来过滤掉某些日志行。Promtail 的限制配置也允许你控制 Promtail 远程写入 Loki 集群的日志量。

属性
由...强制执行distributor
结果请求被拒绝
可重试
Sample 被丢弃
可按租户配置
HTTP 状态码429 请求过多

per_stream_rate_limit

当单个流达到其速率限制时,将强制执行此限制。

每个流都应用了速率限制,以防止单个流压垮它所分发到的一组 ingester(这组的大小等于 replication_factor 值)。

此值可以在 limits_config 块中全局修改,或在 运行时覆盖 文件中按租户进行修改。需要调整的配置选项是 per_stream_rate_limitper_stream_rate_limit_burst

另一个你可以考虑用来降低由于 per_stream_rate_limit 导致的 sample 丢弃速率的选项是将被速率限制的流分成几个更小的流。第三个选项是使用 Promtail 的limit 阶段 来限制发送到命中 per_stream_rate_limit 的流的 sample 速率。

我们通常建议将 per_stream_rate_limit 设置不超过 5MB,将 per_stream_rate_limit_burst 设置不超过 20MB。

属性
由...强制执行ingester
结果请求被拒绝
可重试
Sample 被丢弃
可按租户配置
HTTP 状态码429 请求过多

stream_limit

当租户达到其最大活动流数时,将强制执行此限制。

活动流保存在 ingester 的内存缓冲区中,如果该值变得足够大,将导致 ingester 内存不足。

此值可以在 limits_config 块中全局修改,或在 运行时覆盖 文件中按租户进行修改。要增加允许的活动流数,请调整 max_global_streams_per_user。另外,可以通过删除无关标签或删除过多的唯一标签值来减少活动流数。

属性
由...强制执行ingester
结果请求被拒绝
可重试
Sample 被丢弃
可按租户配置
HTTP 状态码429 请求过多

验证错误

当请求违反 Loki 定义的验证规则时,会发生验证错误。

line_too_long

当日志行超过允许的最大长度(字节)时,会发生此错误。HTTP 响应将包含违规日志行所属的流及其大小(字节)。

此值可以在 limits_config 块中全局修改,或在 运行时覆盖 文件中按租户进行修改。要增加最大行大小,请调整 max_line_size。出于性能原因,我们建议不要将此值增加到 256kb 以上。另外,可以通过使用 max_line_size_truncate 选项配置 Loki 来摄取超过长度限制的截断日志行。

属性
由...强制执行distributor
可重试
Sample 被丢弃
可按租户配置

invalid_labels

当提交的流中的一个或多个标签验证失败时,会发生此错误。

Loki 使用与 Prometheus 相同的验证规则来验证标签。

标签名称可以包含 ASCII 字母、数字以及下划线。它们必须匹配正则表达式 [a-zA-Z_][a-zA-Z0-9_]*。以 __ 开头的标签名称保留供内部使用。

属性
由...强制执行distributor
可重试
Sample 被丢弃
可按租户配置

missing_labels

当提交的流不包含任何标签时,将返回此验证错误。

属性
由...强制执行distributor
可重试
Sample 被丢弃
可按租户配置

too_far_behindout_of_order

too_far_behindout_of_order 的原因相同。设置了 unordered_writes=true(自 Loki v2.4 起为默认值)的 Loki 集群使用 reason=too_far_behind。设置了 unordered_writes=false 的 Loki 集群使用 reason=out_of_order

当提交的流乱序时,将返回此验证错误。此处提供了有关 Loki 排序约束的更多详细信息。

unordered_writes 配置值可以在 limits_config 块中全局修改,或在 运行时覆盖 文件中按租户修改,而 max_chunk_age 是全局配置。

可以通过确保日志投递配置正确或增加 max_chunk_age 值来解决此问题。

建议不要修改 max_chunk_age 的默认值,因为这会带来其他影响,而是应该尝试查明日志投递延迟的原因。还应注意,这是一个按流发生的错误,因此通过简单地分割流(添加更多标签)可以规避此问题,特别是当多个主机正在为一个流发送 sample 时。

属性
由...强制执行ingester
可重试
Sample 被丢弃
可按租户配置

greater_than_max_sample_age

如果 reject_old_samples 配置选项设置为 true(默认值为 true),则如果 sample 的时间戳早于 reject_old_samples_max_age 值,这些 sample 将因 reason=greater_than_max_sample_age 而被拒绝。如果 reject_old_samples=false,则不应看到因 reason=greater_than_max_sample_age 而被拒绝的 sample。

此值可以在 limits_config 块中全局修改,或在 运行时覆盖 文件中按租户修改。可以通过增加 reject_old_samples_max_age 值或调查此特定流的日志投递为何延迟来解决此错误。相关的流将在 HTTP 响应的正文中返回。

属性
由...强制执行distributor
结果请求被拒绝
可重试
Sample 被丢弃
可按租户配置
HTTP 状态码400 错误请求

too_far_in_future

如果 sample 的时间戳大于当前时间戳,Loki 会允许一个特定的宽限期,在此期间 sample 会被接受。如果超出宽限期,将发生此错误。

此值可以在 limits_config 块中全局修改,或在 运行时覆盖 文件中按租户修改。可以通过增加 creation_grace_period 值或调查此特定流的时间戳为何超前过多来解决此错误。相关的流将在 HTTP 响应的正文中返回。

属性
由...强制执行distributor
结果请求被拒绝
可重试
Sample 被丢弃
可按租户配置
HTTP 状态码400 错误请求

max_label_names_per_series

如果提交的 sample 的标签数量超出 Loki 配置允许的最大数量,它将因 max_label_names_per_series 原因而被拒绝。注意,Loki 中的“series”与“stream”是同一概念 - “series”是一个遗留名称。

此值可以在 limits_config 块中全局修改,或在 运行时覆盖 文件中按租户修改。可以通过增加 max_label_names_per_series 值来解决此错误。相关的 sample(即具有过多标签名称的那个)所属的流将在 HTTP 响应的正文中返回。

属性
由...强制执行distributor
结果请求被拒绝
可重试
Sample 被丢弃
可按租户配置
HTTP 状态码400 错误请求

label_name_too_long

如果发送的 sample 的标签名称长度(字节)超出 Loki 配置允许的最大长度,它将因 label_name_too_long 原因而被拒绝。

此值可以在 limits_config 块中全局修改,或在 运行时覆盖 文件中按租户修改。可以通过增加 max_label_name_length 值来解决此错误,但出于性能原因,我们不建议将其大幅提高到默认值 1024 以上。相关的流将在 HTTP 响应的正文中返回。

属性
由...强制执行distributor
结果请求被拒绝
可重试
Sample 被丢弃
可按租户配置
HTTP 状态码400 错误请求

label_value_too_long

如果 sample 的标签值长度(字节)超出 Loki 配置允许的最大长度,它将因 label_value_too_long 原因而被拒绝。

此值可以在 limits_config 块中全局修改,或在 运行时覆盖 文件中按租户修改。可以通过增加 max_label_value_length 值来解决此错误。相关的流将在 HTTP 响应的正文中返回。

属性
由...强制执行distributor
结果请求被拒绝
可重试
Sample 被丢弃
可按租户配置
HTTP 状态码400 错误请求

duplicate_label_names

如果发送的 sample 包含两个或更多相同的标签,它将因 duplicate_label_names 原因而被拒绝。

相关的流将在 HTTP 响应的正文中返回。

属性
由...强制执行distributor
结果请求被拒绝
可重试
Sample 被丢弃
可按租户配置
HTTP 状态码400 错误请求