у меня есть 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 в верхней части снимка экрана, и посмотрите, исправит ли это его.