从 InfluxDB 测量中删除具有不需要的字段值的点

Posted

技术标签:

【中文标题】从 InfluxDB 测量中删除具有不需要的字段值的点【英文标题】:Delete points with unwanted field values from InfluxDB measurement 【发布时间】:2017-02-02 18:01:29 【问题描述】:

InfluxDB 允许您根据WHERE tag='value' 条件而不是字段值来delete points。

例如,如果您不小心将值为 -1 的测量值存储在一系列正浮点数中(例如 CPU 利用率),DELETE FROM metrics WHERE cpu=-1 将返回此错误:

删除期间 WHERE 子句中不支持的字段

【问题讨论】:

很难相信 InfluxDB 自 2018 年 1 月起不支持此功能。 【参考方案1】:

这在 InfluxDB 中仍然 (2015 - 2020) 是不可能的 - 请参阅 ticket 3210。

您可以通过在测量中插入具有相同timestamp and tag set 的点来用其他值覆盖该点:

一个点由测量名称、标签集和时间戳唯一标识。如果您提交与现有点具有相同测量值、标签集和时间戳的新点,则该字段集将成为旧字段集和新字段集的并集,其中任何关联都将转到新字段集。这是预期的行为。

由于您是not supposed to insert nulls,您可能希望重复上一点的值。

您可能会考虑插入具有相同时间戳的点,并为其中一个标签设置唯一值,然后对该标签运行删除:

DELETE FROM measurement WHERE some_existing_tag='deleteme'

但这行不通。当您插入第二个deleteme 点时,由于deleteme 标记,它具有不同的标记集,因此InfluxDB 将为它创建一个新点。然后DELETE 命令将删除it,而不是你要删除的原始点。

【讨论】:

【参考方案2】:

昂贵的方法

没有时间范围

# Copy all valid data to a temporary measurement
SELECT * INTO metrics_clean FROM metrics WHERE cpu!=-1 GROUP BY *

# Drop existing dirty measurement
DROP measurement metrics

# Copy temporary measurement to existing measurement
SELECT * INTO metrics FROM metrics_clean GROUP BY *

有时间范围

# Copy all valid data to a temporary measurement within timerange
SELECT * INTO metrics_clean FROM metrics WHERE cpu!=-1 and time > '<start_time>' and time '<end_time>' GROUP BY *;

# Delete existing dirty data within timerange
DELETE FROM metrics WHERE time > '<start_time>' and time '<end_time>';

# Copy temporary measurement to existing measurement
SELECT * INTO metrics FROM metrics_clean GROUP BY *

【讨论】:

我正在处理SELECT * INTO ... 语句中的ERR: timeout。这可以通过在/etc/influxdb/influxdb.conf 中增加write-timeouthttp_timeout 来解决。 只运行SELECT * INTO metrics_clean FROM metrics 将turn any tags into field。你应该使用GROUP BY *【参考方案3】:

丑陋而缓慢但相当健壮的解决方案:存储时间戳,然后按时间戳删除条目,可选择使用附加标签过滤 DELETE 语句。

注意这仅适用于具有唯一时间戳的字段!例如。如果一个时间戳有多个字段,则使用以下命令删除所有这些字段。使用epoch=ns 实际上可以缓解这种情况,除非您每秒有大约十亿个数据点

curl -G 'http://localhost:8086/query?db=DATABASE&epoch=ns' \
  --data-urlencode "q=SELECT * FROM metrics WHERE cpu=-1" |\
  jq -r "(.results[0].series[0].values[][0])" > delete_timestamps.txt

for i in $(cat delete_timestamps.txt); do
  echo $i;
  curl -G 'http://localhost:8086/query?db=DATABASE&epoch=ns' \
    --data-urlencode "q=DELETE FROM metrics WHERE time=$i AND cpu=-1"; 
done

【讨论】:

我安排了一个 cron 作业每 5 分钟运行一次,这对我来说非常有效。谢谢!

以上是关于从 InfluxDB 测量中删除具有不需要的字段值的点的主要内容,如果未能解决你的问题,请参考以下文章

如何在InfluxDB中删除系列的列

在 Influxdb 中,如何删除所有测量值?

influxDB:如何在 influxDB v2.0 中将字段转换为标签

如何在 InfluxDB 中编辑测量值(= 带有时间戳的值集)?

InfluxDB Flux - 过滤字段匹配值的位置

使用替换字段值查询后将系列转储回 InfluxDB