Назад | Перейти на главную страницу

Поле даты представлено как целое число

у меня есть Elastic Stack сервер (на Hyper-v), который получает данные через logstash exec команда и выполнение аналитики по ней. Все работает отлично, кроме поля даты, которое отображается в виде числа.

Как я могу получить logstash, Elasticsearch или Kibana распознать в поле дату вместо числа?

Данные Unix epoch время в milliseconds.


Код:

Данные, выводимые python файл находится в JSON формат. Никакой реальной обработки не происходит, пока он не достигнет elasticsearch.

Конфигурация Logstash:

input {
  exec {
    command => "/home/elliot/BullhornConnector.py JobOrder isOpen,webResponses,submissions,sendouts,interviews,placements,address,numOpenings,employmentType,owner,title,clientCorporation"
    interval => 60
    codec => json
    tags => ["JobOrder"]
  }
  exec {
    command => "/home/elliot/BullhornConnector.py Lead owner,leadSource,firstName,lastName,status,dateAdded"
    interval => 60
    codec => json
    tags => ["Lead"]
  }
  exec {
    command => "/home/elliot/BullhornConnector.py Opportunity owner,isOpen,dealValue,weightedDealValue,clientCorporation,status"
    interval => 60
    codec => json
    tags => ["Opportunity"]
  }
}

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

Снимки экрана:

Вот скриншот необработанных данных:

Страница обзора шаблона индекса:

Детальный вид поля:

Спасибо!

Если я правильно прочитал документацию ElasticSearch https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html

JSON doesn’t have a date datatype, so dates in Elasticsearch can either be:

strings containing formatted dates, e.g. "2015-01-01" or "2015/01/01 12:10:30".
a long number representing milliseconds-since-the-epoch.
an integer representing seconds-since-the-epoch. 

Таким образом, ваше поле dateAdded, представленное как тип данных «число», логично: Elasticsearch просто переводил номер JSON в номер ES.

Если я посмотрю на свой собственный экземпляр ELK, то обнаружу, что поле «timestamp» представлено как тип данных «date». Logstash делает это автоматически.

За сценой logstash управляет «шаблоном отображения» для определения типов данных полей ES. В вашем случае он наивно переводит тип даты из JSON, а в случае метки времени он знает, что это дата, поэтому четко ее определите.

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

Документ сопоставления ES находится здесь https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html и Logstash может управлять им с помощью manage_template и template в выводе elasticsearch https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-template. Введение в отображение AS https://www.elastic.co/blog/found-elasticsearch-mapping-introduction.

Вы также можете посмотреть фактическое использование сопоставления с

curl -XGET 'localhost:9200/<index>/_mapping?pretty'

Я понял: вам нужно использовать плагин фильтра в logstash, в частности Дата плагин.

Вот фрагмент, который я добавил в свою конфигурацию logstash:

filter {
  date {
    match => [ "dateAdded", "UNIX_MS" ]
    target => "dateAddedCorrected"
  }
}

Я здесь предполагаю, потому что я не знаком с платформами и программами, о которых вы говорите. Однако на скриншоте вы указали, что изменили тип данных на Duration, но похоже, что тип данных по-прежнему «число», а «формат» - это продолжительность. Если бы мне пришлось продолжать гадать, я бы сказал, что ваша платформа все еще пытается сериализовать ваше поле в виде числа, потому что его тип данных по-прежнему «число». Измените этот тип на «дата», как в поле @timestamp в верхней части снимка экрана, и посмотрите, исправит ли это его.