2016-12-27 2 views
0

У меня возникла проблема с конфигурацией logstash. Ниже вы можете найти мою конфигурацию logstash.Logstash to elasticsearch. Ключи с точками

Рубиновый фильтр удаляет каждую точку - "." из моих полей. Кажется, что все работает отлично - результат фильтрации данных правильный, но elasticsearch волшебно отвечает: "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"Field name [/ConsumerAdminWebService/getConsumerTransactions.call] cannot contain '.'"}, где getConsumerTransactions.call является одним из моих полевых ключей.

input { 
    http_poller { 
    urls => { 
     uatBackend1 => { 
     method => get 
     url => "http://some-url/" 
     headers => { 
      Accept => "application/json" 
     } 
     } 
    } 
    request_timeout => 60 
    # Run every 30 seconds 
    schedule => { cron => "* * * * * UTC"} 
    codec => "json" 
    metadata_target => "http_poller_metadata" 
} 
} 
filter { 
    ruby { 
    init => " 
     def remove_dots hash 
      new = Hash.new 
      hash.each { |k,v| 
       if v.is_a? Hash 
        v = remove_dots(v) 
       end 
       new[ k.gsub('.','_') ] = v 
       if v.is_a? Array 
        v.each { |elem| 
         if elem.is_a? Hash 
          elem = remove_dots(elem) 
         end 
         new[ k.gsub('.','_') ] = elem 
        } unless v.nil? 
       end 
      } unless hash.nil? 
      return new 
     end 
    " 
    code => " 
     event.instance_variable_set(:@data,remove_dots(event.to_hash)) 
    " 
} 
} 
output { 
    elasticsearch { 
    hosts => localhost 
    } 
} 

Я боюсь, что эта строка коды не является правильной: event.instance_variable_set(:@data,remove_dots(event.to_hash)) - данные результата каким-то образом прижаты к событию, но исходные данные сохраняются неизменными и доставляются Elasticsearch апи.

Я полагаю, необходимы здесь некоторые пояснения:

  • Я использую ES версии> 2,0 так точки не допускаются
  • Рубиновый фильтр должен заменить точки с «_», и он прекрасно работает - в результате чего данные полностью исправьте, однако ES отвечает с указанной ошибкой. Я подозреваю, что фильтр не заменяет данные событий, а просто добавляет новый объект в объект Event. Затем ES все еще считывает первичные данные, а не обновленные.

Чтобы быть честным Руби является магия для меня :)

+0

Какая версия ES вы используете? – Kulasangar

+0

Я бы предположил, что вы проверяете исключения: begin event.instance_variable_set (: @ data, remove_dots (event.to_hash)) rescue Exception => e event ['logstash_ruby_exception'] = 'очистка поля:' + e. сообщение конец –

+0

@Kulasangar Я использую ES версию 2.3.1. – adgon92

ответ

0

Если вы используете ES версии 2.0 это может быть версия проблема, где ES не подобрать поля, которые содержат . точек.

По этой реакции в этом thread:

Field names cannot contain the . character in Elasticsearch 2.0.

Как работа вокруг вас, возможно, придется mutate (переименовать) ваши имена полей в нечто вроде _ or - вместо использования . точки. Этот ticket в значительной степени объясняет эту проблему, где в версиях ES, которые после 2.0, могут использоваться . точек. Надеюсь, поможет!

+0

Извините, но это не поможет. Я знал об этом, и именно поэтому я добавил рекурсивный фильтр, который заменяет точки «-». Я добавил дополнительные сведения к моему вопросу. – adgon92

Смежные вопросы