我如何通过其API删除loki中的所有日志?

问题描述 投票:0回答:1

在使用 loki api 时,我很难为我们的应用程序的“删除全部”按钮实现一个干净的解决方案。

设置:Loki 在集群中处于整体模式

目标:Loki 接受一个 api 请求,触发删除其所有存储的日志。

我的问题更详细

按照其文档中所述,通过

configuration
启用 /loki/api/v1/delete API 后,我必须选择一个
deletion_mode

第一个选项:仅过滤器

filter-only
说:

查询 Loki 时,与删除请求中的查询匹配的日志行将被过滤掉。它们不会从存储中移除。

我很难理解这一点。有吗

查询 Loki 时被过滤掉

真的意味着,当你查询它们时,它们不会出现,而它们仍然被存储?这会很奇怪,我认为解释是错误的。所以我认为这意味着,查询的数据将被保留,而其他所有内容都会被删除。

一个快速测试:

curl -g -X POST 'http://loki-gateway.xxx.svc.cluster.local:PORT/loki/api/v1/delete?query={label="YYY"}&start=1591616227' -H 'X-Scope-OrgID: 1'

确实教了我其他方面。没有删除任何内容,但已收到请求:

GET /loki/api/v1/delete`

查询

{label="YYY"}
已通过多种方式选择。要么是一个虚构的标签,要么是一个真实的标签。

此时,我认为我对这个端点缺乏理解。

第二个选项:过滤并删除

filter-only
说:

查询 Loki 时,与删除请求中的查询匹配的日志行会被过滤掉,并且也会从存储中删除。

在这里我需要查询我想要删除的流。我不认为这对我来说是一个干净的解决方案,因为添加流需要通过其标签扩展此请求,或者我需要为每个新流提供一些无所不在的标签,仅用于删除查询目的。

这两种解决方案对我来说似乎都是可扩展的。但我测试了它:

curl -g -X POST 'http://loki-gateway.xxx.svc.cluster.local:PORT/loki/api/v1/delete?query={real_label="real_value"}&start=1591616227' -H 'X-Scope-OrgID: 1'

并且成功了。

如果我可以使用像

{*~="+*"}
这样的东西来覆盖每个流,那么这种方法就很好了。但这似乎不可能(在流选择器级别),或者是吗?

grafana-loki http-delete
1个回答
0
投票

查询 Loki 时被过滤掉

真的意味着,当你查询它们时,它们不会出现,而它们仍然被存储?

是的,确实就是这个意思。这并不“奇怪”,因为删除是相当昂贵的操作,如果您只需要删除几行,物理删除存储的数据可能是不合理的。

我相信对于您的“全部删除”解决方案来说,这不是正确的方法。


关于流选择器:实际上你需要使用一些标签来进行选择。

通常有很多标签可以帮助完成这项任务。我相信,最好的候选者是标签

job
,以及选择器
{job!=""}

如果您的记录完全缺乏任何“无所不在的标签”,您有两种选择:使用标签列表,以便每个记录中至少存在该列表中的一个标签,并通过循环此列表来创建删除任务。或者在 Loki 解决方案本地进行设置,这将清除它的存储空间。

© www.soinside.com 2019 - 2024. All rights reserved.