从 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-timeout
和http_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 v2.0 中将字段转换为标签