Понадобилось отправлять данные с файла, который содержит данные в формате json
в elasticsearch. Для этого конечно я решил использовать filebeat, собственно он и служит для мониторинга файлов.
Итоговая схема доставки: filebeat -> logstash -> elasticsearch.
Настройка filebeat
Тут в целом ничего сложного просто добавляем новый input
и задаём файл для мониторинга.
sudo vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /tmp/*.json
json.keys_under_root: true
json.overwrite_keys: true
json.add_error_key: true
json.expand_keys: true
processors:
- add_tags:
tags: [json-test]
sudo systemctl restart filebeat
Добавляем данные в файл
Для этого просто создаём файл json
в каталоге tmp
и заполняем его данными. Для генерации тестовых данных можно воспользоваться онлайн генератором.
Ошибка failed to parse field of type [keyword]
И вроде всё работает, и я получаю данные, т.е. документы появляются в index
: filebeat-*
, но только если я записываю в файл простой массив без вложенностей.
{"balance":"$3,357.79","picture":"http://placehold.it/32x32","eyeColor":"brown","name":"Murray Suarez","gender":"male","company":"IDEALIS","email":"murraysuarez@idealis.com","phone":"+1 (833) 600-3849","address":"986 Beverly Road, Gulf, Pennsylvania, 9249","registered":"2019-04-24T03:48:24 -06:00","greeting":"Hello, Murray Suarez! You have 10 unread messages.","favoriteFruit":"apple"}
Но вот как только я пытаюсь проиндексировать уже сложный массив я получаю ошибку: failed to parse field [friends] of type [keyword]. Ошибка появляется на этапе передачи документа в elasticsearch, т.е. на последнем этапе.
{"balance":"$1,325.77","picture":"http://placehold.it/32x32","eyeColor":"green","name":"Janette Becker","gender":"female","company":"TETAK","email":"janettebecker@tetak.com","phone":"+1 (908) 551-2528","address":"106 Coleman Street, Frizzleburg, Iowa, 1948","registered":"2020-06-08T05:07:20 -06:00","greeting":"Hello, Janette Becker! You have 5 unread messages.","favoriteFruit":"banana","friends":[{"id":0,"name":"Kristie Ewing"},{"id":1,"name":"Vance Wooten"},{"id":2,"name":"Clark Mcfadden"}]}
Решение failed to parse field of type [keyword]
Ошибка заключается в том, что elasticsearch не может правильно сопоставить тип поля. И нужно вручную сопоставить тип поля в шаблоне (mapping
).
Но если там куча полей сопоставлять их вручную это ад. Один из вариантов упростить это, который я и выбрал будет просто проиндексировать всё в новый index в следствии чего автоматом сделается нормальный mapping
, который мы можем дальше использовать для шаблона.
sudo vim /etc/logstash/conf.d/output.conf
output {
if "filebeat" in [agent][type] and "json-test" in [tags] {
elasticsearch {
hosts => ["https://elk-1:9000","https://elk-2:9000","https://elk-3:9000"]
index => "json-test-%{+YYYY.MM.dd}"
}
}
if "filebeat" in [agent][type] and "json-test" not in [tags] {
elasticsearch {
hosts => ["https://elk-1:9000","https://elk-2:9000","https://elk-3:9000"]
index => "filebeat-%{+YYYY.MM.dd}"
}
}
}
В итоге всё проиндексировалось, и я получил данные. Дальше можно получить весь mapping
и уже дальше его использовать в своём template
, ну а так как мне всё равно нужен был новый index
меня всё устраивает.
Если проанализировать вывод ниже понятно, что elasticsearch пытался создать поле friends
с типом keyword
, тогда как тип должен быть long
.
GET json-test-2021.12.08/_mapping
{
"json-test-2021.12.08" : {
"mappings" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"@version" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"address" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"agent" : {
"properties" : {
"ephemeral_id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"hostname" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"type" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"version" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"balance" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"company" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"ecs" : {
"properties" : {
"version" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"email" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"eyeColor" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"favoriteFruit" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"friends" : {
"properties" : {
"id" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"gender" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"greeting" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"host" : {
"properties" : {
"architecture" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"containerized" : {
"type" : "boolean"
},
"hostname" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"ip" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"mac" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"os" : {
"properties" : {
"codename" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"family" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"kernel" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"platform" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"type" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"version" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
},
"input" : {
"properties" : {
"type" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"log" : {
"properties" : {
"file" : {
"properties" : {
"path" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"offset" : {
"type" : "long"
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"phone" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"picture" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"registered" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"tags" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
Комментарии