Структураванне неструктураваных даных з дапамогай GROK
Калі вы карыстаецеся стэк Elastic (ELK) і зацікаўлены ў супастаўленні карыстацкіх часопісаў Logstash з Elasticsearch, то гэты пост для вас.
Стэк ELK - гэта абрэвіятура для трох праектаў з адкрытым зыходным кодам: Elasticsearch, Logstash і Kibana. Разам яны ўтвараюць платформу кіравання часопісамі.
- Elasticsearch - гэта пошукавая і аналітычная сістэма.
- Logstash – гэта серверны канвеер апрацоўкі дадзеных, які прымае дадзеныя з некалькіх крыніц адначасова, пераўтворыць іх і затым адпраўляе ў “схованку”, напрыклад Elasticsearch.
- Kibana дазваляе карыстальнікам візуалізаваць дадзеныя з дапамогай дыяграм і графікаў у Elasticsearch.
ўдары з'явіўся пазней і з'яўляецца лёгкім грузаадпраўшчыкам дадзеных. Увядзенне Beats пераўтварыла Elk Stack у Elastic Stack, але гэта не галоўнае.
Гэты артыкул прысвечана Grok, якая з'яўляецца функцыяй у Logstash, якая можа пераўтварыць вашыя часопісы, перш чым яны будуць адпраўленыя ў схованку. Для нашых мэт я буду казаць толькі аб апрацоўцы дадзеных з Logstash у Elasticsearch.
Grok-гэта фільтр ўнутры Logstash, які выкарыстоўваецца для разбору неструктураваных дадзеных на нешта структураванае і дзейнік запыце. Ён знаходзіцца па-над рэгулярным выразам (regex) і выкарыстоўвае тэкставыя шаблоны для супастаўлення радкоў у файлах часопісаў.
Як мы ўбачым у наступных раздзелах, выкарыстанне Grok мае вялікае значэнне, калі гаворка заходзіць аб эфектыўным кіраванні часопісамі.
Без Grok вашыя дадзеныя часопіса Неструктураваны
Без Grok, калі часопісы адпраўляюцца з Logstash у Elasticsearch і візуалізуюцца ў Kibana, яны з'яўляюцца толькі ў значэнні паведамлення.
Запыт значнай інфармацыі ў гэтай сітуацыі абцяжараны, паколькі ўсе дадзеныя часопіса захоўваюцца ў адным ключы. Было б лепш, калі б паведамленні часопіса былі арганізаваны лепш.
Неструктураваныя дадзеныя з логаў
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
Калі вы ўважліва паглядзіце на неапрацаваныя дадзеныя, то ўбачыце, што яны насамрэч складаюцца з розных частак, кожная з якіх падзелена прабелам.
Для больш вопытных распрацоўшчыкаў вы, верагодна, можаце здагадацца, што азначае кожная з частак і што гэта паведамленне часопіса ад выкліку API. Прадстаўленне кожнага пункта выкладзена ніжэй.
Структураваны від нашых дадзеных
- localhost == environment
- GET == method
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == response_status
- 46ms == response_time
- 5bc6e716b5d6cb35fc9687c0 == user_id
Як мы бачым у структураваных дадзеных, існуе парадак для неструктураваных часопісаў. Наступны крок - гэта праграмная апрацоўка неапрацаваных дадзеных. Вось дзе Грок ззяе.
Шаблоны Grok
Убудаваныя шаблоны Grok
Logstash пастаўляецца з больш за 100 убудаванымі шаблонамі для структуравання неструктураваных дадзеных. Вы, безумоўна, павінны скарыстацца гэтай перавагай, калі гэта магчыма для агульных сістэмных часопісаў, такіх як apache, linux, haproxy, aws і гэтак далей.
Аднак што адбываецца, калі ў вас ёсць карыстацкія часопісы, як у прыведзеным вышэй прыкладзе? Вы павінны пабудаваць свой уласны шаблон Grok.
Кастомныя шаблоны Grok
Трэба паспрабаваць, каб пабудаваць свой уласны шаблон Grok. Я выкарыстаў
Звярніце ўвагу, што сінтаксіс шаблонаў Grok выглядае наступным чынам: %{SYNTAX:SEMANTIC}
Першае, што я паспрабаваў зрабіць, гэта перайсці на ўкладку Адкрыйце для сябе у адладчыку Grok. Я падумаў, што было б выдатна, калі б гэты інструмент мог аўтаматычна генераваць шаблон Grok, але гэта было не занадта карысна, бо ён знайшоў толькі два супадзенні.
Выкарыстоўваючы гэтае адкрыццё, я пачаў ствараць свой уласны шаблон на адладчыку Grok, выкарыстоўваючы сінтаксіс, знойдзены на старонцы Github Elastic.
Пагуляўшы з рознымі сінтаксісамі, я нарэшце змог структураваць дадзеныя часопіса так, як мне хацелася.
Спасылка на адладчык Grok
Зыходны тэкст:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0
шаблон:
%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}
Тое, што атрымалася ў выніку
{
"environment": [
[
"localhost"
]
],
"method": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"response_status": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"response_time": [
[
"46ms"
]
],
"user_id": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}
Маючы ў руках шаблон Grok і супастаўленыя дадзеныя, апошні крок - дадаць яго ў Logstash.
Абнаўленне файла канфігурацыі Logstash.conf
На сэрвэры, на якім вы ўсталявалі стэк ELK, перайдзіце да канфігурацыі Logstash:
sudo vi /etc/logstash/conf.d/logstash.conf
Устаўце змены.
input {
file {
path => "/your_logs/*.log"
}
}
filter{
grok {
match => { "message" => "%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}"}
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
Пасля захавання змен перазапусціце Logstash і праверце яго стан, каб пераканацца, што ён усё яшчэ працуе.
sudo service logstash restart
sudo service logstash status
Нарэшце, каб пераканацца, што змены ўступілі ў сілу, абавязкова абновіце індэкс Elasticsearch для Logstash у Kibana!
З Grok вашыя дадзеныя з логаў структураваныя!
Як мы бачым, на малюнку вышэй, Grok здольны аўтаматычна супастаўляць дадзеныя часопіса з Elasticsearch. Гэта палягчае кіраванне часопісамі і хуткі запыт інфармацыі. Замест таго каб капацца ў файлах часопісаў для адладкі, вы можаце проста адфільтраваць тое, што вы шукаеце, напрыклад асяроддзе ці url-адрас.
Паспрабуйце даць Grok expressions шанец! Калі ў вас ёсць іншы спосаб зрабіць гэта ці ў вас ёсць якія-небудзь праблемы з прыкладамі вышэй, проста напішыце каментар ніжэй, каб паведаміць мне пра гэта.
Дзякуй за чытанне - і, калі ласка, прытрымлівайцеся за мной тут, на Medium, для атрымання больш цікавых артыкулаў па праграмнай інжынерыі!
Рэсурсы
Тэлеграм-канал па
Крыніца: habr.com