执行速率限制和推送请求验证
如果请求超出使用阈值(速率限制错误)或无效(验证错误),Loki 将拒绝这些请求。
使用 loki_discarded_samples_total
和 loki_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_mb
和 ingestion_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_limit
和 per_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_behind
和 out_of_order
too_far_behind
和 out_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 错误请求 |