Могу ли я создать массив из одного элемента в Logstash?

#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 более эффективен, но оба они настолько дешевы, что я бы не стал использовать это для выбора между ними.