Удаление точек с ненужными значениями поля из измерения InfluxDB

InfluxDB позволяет удалять точки на основе условий WHERE tag='value', но не по значению поля.

Например, если вы случайно сохранили измерение со значением -1 в серии положительных поплавков (например, использование ЦП), DELETE FROM metrics WHERE cpu=-1 вернет эту ошибку:

поля, не поддерживаемые в предложении WHERE во время удаления

Ответ 1

Это невозможно в InfluxDB - см. Билет 3210.

Вы можете перезаписать точку некоторыми другими значениями, вставив в измерение точку с той же временной меткой и набором тегов:

Точка уникально идентифицируется по имени измерения, набору тегов и метке времени. Если вы отправляете новую точку с теми же измерениями, набором тегов и отметкой времени, что и существующая точка, набор полей становится объединением старого набора полей и нового набора полей, где любые связи переходят в новый набор полей. Это предполагаемое поведение.

Так как вы не должны вставлять нули, вы, вероятно, захотите повторить значения из предыдущих пунктов.

Вы можете подумать о вставке точки с той же отметкой времени и установке уникального значения для одного из тегов, а затем о выполнении удаления для этого тега:

DELETE FROM measurement WHERE some_existing_tag='deleteme'

Это не будет работать, хотя. Вы получите две точки с одной и той же временной меткой, а одна из них будет иметь тег deleteme.

Ответ 2

Дорогой подход

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

# Drop existing dirty measurement
DROP measurement metrics

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

Совет. Если вы знаете, в каком временном интервале у вас есть грязные данные, добавьте их и замените запрос DROP на DELETE

Ответ 3

Уродливое и медленное, но достаточно надежное решение: сохраняйте временные метки, затем удаляйте записи по временным меткам.

N.B. это работает, только если поля имеют уникальные метки времени! Например. если для одной временной отметки имеется несколько полей, все эти поля будут удалены с помощью команды ниже.

curl -G 'http://localhost:8086/query?db=smarthome' \
  --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' \
    --data-urlencode "q=DELETE FROM metrics WHERE time='$i'"; 
done