У меня есть сервер Elastic Stack
(на Hyper-v
), который принимает данные с помощью команды logstash
exec
и выполняет на нем аналитику. . Все работает отлично, кроме поля даты, которое отображается в виде числа.
Как мне получить logstash
, Elasticsearch
или Kibana
для распознавания поля дата вместо числа?
Данные представляют собой эпоху Unix
время в миллисекундах
.
Данные, выводимые 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 и шаблон в выводе 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'
Я предполагаю здесь, потому что я не знаком с платформами и программами, о которых вы говорите. Однако на скриншоте вы указали, что изменили тип данных на Duration, но похоже, что тип данных по-прежнему «число», а «формат» - это продолжительность. Если бы мне пришлось продолжать гадать, я бы сказал, что ваша платформа все еще пытается сериализовать ваше поле в виде числа, потому что его тип данных по-прежнему «число». Измените этот тип на «дата», как в поле @timestamp в верхней части снимка экрана, и посмотрите, исправит ли это его.