在使用 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'
并且成功了。
如果我可以使用像
{*~="+*"}
这样的东西来覆盖每个流,那么这种方法就很好了。但这似乎不可能(在流选择器级别),或者是吗?
有
查询 Loki 时被过滤掉
真的意味着,当你查询它们时,它们不会出现,而它们仍然被存储?
是的,确实就是这个意思。这并不“奇怪”,因为删除是相当昂贵的操作,如果您只需要删除几行,物理删除存储的数据可能是不合理的。
我相信对于您的“全部删除”解决方案来说,这不是正确的方法。
关于流选择器:实际上你需要使用一些标签来进行选择。
通常有很多标签可以帮助完成这项任务。我相信,最好的候选者是标签
job
,以及选择器 {job!=""}
。
如果您的记录完全缺乏任何“无所不在的标签”,您有两种选择:使用标签列表,以便每个记录中至少存在该列表中的一个标签,并通过循环此列表来创建删除任务。或者在 Loki 解决方案本地进行设置,这将清除它的存储空间。