#logstash
#logstash
Вопрос:
У меня есть вариант использования, когда строковое поле иногда содержит одно значение, а иногда содержит несколько значений. Это вызывает проблему ниже по потоку, потому что наша схема avro указывает тип «Array» в этом поле, но иногда получает тип «String».
У меня нет способа изменить логику нисходящего потока, и я бы предпочел избежать преобразования моих массивов в объединенные строки в качестве обходного пути. Есть ли способ создать массив из одного элемента в Logstash?
Исследования
В Logstash есть фильтр преобразования, но он явно не разрешает преобразование в строковые массивы, и следующее не работает:
mutate {
convert => {"FieldName" => "[string]"}
}
Я также пытался явно воссоздать поле как массив, но безуспешно.
mutate {
add_field => { "[FieldName_temp]" => "%{FieldName}" }
remove_field => { "FieldName" }
}
mutate {
rename => { "[FieldName_temp]" => "[FieldName]" }
}
Возможно ли то, что я пытаюсь, в Logstash?
Ответ №1:
Общая опция фильтра add_field преобразует строку в массив, если поле уже существует, или добавляет запись в массив, после чего вы можете удалить последнюю запись в массиве.
mutate { add_field => { "foo" => 2 } }
mutate { remove_field => [ "[foo][-1]" ] }
Вы также можете сделать это с помощью фильтра ruby, но я думаю, что это сложнее понять:
ruby { code => 'event.set("foo", [ event.get("foo") ].flatten)' }
Комментарии:
1. Не совсем необходимо, но знаете ли вы, какое из этих двух решений более эффективно?
2. Я бы предположил, что фильтр ruby более эффективен, но оба они настолько дешевы, что я бы не стал использовать это для выбора между ними.