2016-11-29 2 views
0

Я стараюсь, чтобы мои руки на стеке ELK. У меня проблема с моей Кибаной. Одно из полей в моих данных имеет тип integer, но на Kibana он показывает тип как неопределенный. Ниже приведены примеры данных, с которыми я работаю.Kibana не принимает данные

{ 
     "took": 6, 
     "timed_out": false, 
     "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
     }, 
     "hits": { 
     "total": 1, 
     "max_score": 1, 
     "hits": [ 
      { 
      "_index": "products", 
      "_type": "logs", 
      "_id": "AVivMgCnKd2m9Wr-3jBk", 
      "_score": 1, 
      "_source": { 
       "message": "product10,990\r", 
       "@version": "1", 
       "@timestamp": "2016-11-29T08:27:18.792Z", 
       "path": "/Users/B0079855/Documents/SERVERS/logstash-2.2.2/samples/products.csv", 
       "host": "LTB0079855-MAC.local", 
       "product_name": "product10", 
       "product_price": 990 
      } 
      } 
     ] 
     } 
    } 

Kibana не идентифицирует product_price как целое.

logstash конф:

input { 
    file { 
    path => "{filepath}" 
    # to read from the beginning of file 
    start_position => beginning 
    sincedb_path => "/dev/null" 
    } 
} 

filter { 
    csv { 
     columns => ["product_name", "product_price"] 
    } 
    mutate { 
     convert => { "product_price" => "integer" } 
    } 
} 

output { 
    elasticsearch { 
     hosts => ["localhost:9200"] 
     index => "products" 
    } 
    stdout { codec => rubydebug } 
} 

Как сделать эту работу?

+0

Я читаю данные через logstash из файла, и я преобразовываю его в целое число в фильтр. Моя конфигурация logstash для фильтра, как: 'фильтр { CSV { столбцы => [ "product_name", "PRODUCT_PRICE"] } мутировать { \t преобразования => { "PRODUCT_PRICE"=> "целое число"} \t} } ' –

+0

Не могли бы вы показать нам logstash conf. С какого типа вы пытаетесь преобразовать? Вы используете плагин 'mutate'? Что делать, если вы не конвертируете его из своего логсташа и обновляете его через свое сопоставление, как я уже упоминал в ответе ниже? – Kulasangar

+0

В случае, если я это сделаю с помощью инструкции обновления, мне придется делать это для каждого индекса. Похоже, мой журнал.'Вход { файл { путь => "{путь_к_файлу}" # читать с начала файла начальная_позиция => начиная sincedb_path => "/ Dev/нуль" } } фильтр { CSV { столбцы => [ "product_name", "PRODUCT_PRICE"] } мутировать { \t преобразования => { "PRODUCT_PRICE" => "целое число"} \t}} выход { elasticsearch { \t хостов => [ "локальный: 9200"] \t \t индекс => "продукты" \t} STDOUT {кодек => rubydebug} } ' –

ответ

1

Если вы не отображаются ваши поля с помощью Mapping, вы могли бы сделать что-то вроде ниже, для того, чтобы создать mapping, прежде чем создать индекс:

PUT запрос: http://yourhost:9200/yourindex

Запрос ТЕЛО:

{ 
    "mappings": { 
    "your_type": { <--- document_type value in logstash conf 
     "properties": { 
     "product_price": { 
      "type": "integer" 
     } 
     } 
    } 
    } 
} 

Если вы не можете даже обновить отображение индекса обратно с PUT отображения API:

curl -XPUT 'http://localhost:9200/your_index/_mapping/your_type' -d ' 
{ 
    "yout_type" : { 
     "properties" : {    
      //your new mapping properties 
      "product_price": { 
      "type": "integer" 
      } 
     } 
    } 
}' 

Надеюсь, что это также поможет SO.

EDIT:

В вашем случае, поскольку вы превращающий его с помощью logstash, вы tryign, чтобы преобразовать его пределами csv плагина. Попробуйте преобразовать его внутри самого модуля;

filter { 
    csv { 
    columns => ["product_name", "product_price"] 
    mutate { 
     convert => { "product_price" => "integer" } 
    } 
    } 
} 
Смежные вопросы