Introduzzjoni
Waqt l-iskjerament ta’ sistema oħra, konna ffaċċjati bil-ħtieġa li nipproċessaw numru kbir ta’ zkuk differenti. ELK intgħażel bħala l-għodda. Dan l-artikolu ser jiddiskuti l-esperjenza tagħna fit-twaqqif ta 'dan il-munzell.
Aħna ma nistabbilixxux mira li niddeskrivu l-kapaċitajiet kollha tagħha, iżda rridu nikkonċentraw speċifikament fuq is-soluzzjoni ta 'problemi prattiċi. Dan minħabba l-fatt li minkejja li hemm ammont pjuttost kbir ta’ dokumentazzjoni u immaġini lesti, hemm pjuttost ħafna nases, għall-inqas sibnahom.
Aħna skjerati l-munzell permezz ta 'docker-compose. Barra minn hekk, kellna docker-compose.yml miktub tajjeb, li ppermettilna ngħollu l-munzell kważi mingħajr problemi. U dehrilna li r-rebħa kienet diġà qrib, issa se nirranġawha ftit biex taqbel mal-bżonnijiet tagħna u hekk.
Sfortunatament, it-tentattiv biex tiġi kkonfigurata s-sistema biex tirċievi u tipproċessa zkuk mill-applikazzjoni tagħna ma rnexxiex immedjatament. Għalhekk, iddeċidejna li kien ta 'min nistudjaw kull komponent separatament, u mbagħad nerġgħu lura għall-konnessjonijiet tagħhom.
Allura, bdejna bil-logstash.
Ambjent, skjerament, tmexxija ta' Logstash f'kontenitur
Għall-iskjerament nużaw docker-compose; l-esperimenti deskritti hawn saru fuq MacOS u Ubuntu 18.0.4.
L-immaġni tal-logstash li kienet irreġistrata fid-docker-compose.yml oriġinali tagħna hija docker.elastic.co/logstash/logstash:6.3.2
Aħna se nużawha għal esperimenti.
Aħna ktibna docker-compose.yml separat biex imexxi logstash. Naturalment, kien possibbli li titnieda l-immaġni mil-linja tal-kmand, iżda konna nsolvu problema speċifika, fejn inmexxu kollox minn docker-compose.
Fil-qosor dwar il-fajls tal-konfigurazzjoni
Kif ġej mid-deskrizzjoni, logstash jista 'jitħaddem jew għal kanal wieħed, f'liema każ jeħtieġ li jgħaddi l-fajl *.conf, jew għal diversi kanali, f'liema każ jeħtieġ li jgħaddi l-fajl pipelines.yml, li, min-naħa tiegħu , se jorbtu mal-fajls .conf għal kull kanal.
Ħadna t-tieni triq. Deherna aktar universali u skalabbli. Għalhekk, ħloqna pipelines.yml, u għamilna direttorju tal-pipelines li fih se npoġġu fajls .conf għal kull kanal.
Ġewwa l-kontenitur hemm fajl ieħor ta 'konfigurazzjoni - logstash.yml. Ma nmissuhx, nużawha kif inhu.
Allura, l-istruttura tad-direttorju tagħna:
Biex tirċievi dejta tal-input, għalissa nassumu li dan huwa tcp fuq il-port 5046, u għall-output se nużaw stdout.
Hawnhekk hawn konfigurazzjoni sempliċi għall-ewwel tnedija. Minħabba li l-kompitu inizjali huwa li tniedi.
Allura, għandna dan docker-compose.yml
version: '3'
networks:
elk:
volumes:
elasticsearch:
driver: local
services:
logstash:
container_name: logstash_one_channel
image: docker.elastic.co/logstash/logstash:6.3.2
networks:
- elk
ports:
- 5046:5046
volumes:
- ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
- ./config/pipelines:/usr/share/logstash/config/pipelines:ro
X'naraw hawn?
- In-netwerks u l-volumi ttieħdu mid-docker-compose.yml oriġinali (dik fejn titnieda l-munzell kollu) u naħseb li ma jaffettwawx ħafna l-istampa ġenerali hawn.
- Noħolqu servizz(i) ta' logstash wieħed mill-immaġni docker.elastic.co/logstash/logstash:6.3.2 u isemmuha logstash_one_channel.
- Nibgħatu l-port 5046 ġewwa l-kontenitur, lejn l-istess port intern.
- Aħna nimmappaw il-fajl tal-konfigurazzjoni tal-pajp tagħna ./config/pipelines.yml għall-fajl /usr/share/logstash/config/pipelines.yml ġewwa l-kontenitur, fejn logstash se jtellgħu u jagħmlu jinqara biss, fil-każ.
- Aħna nimmappaw id-direttorju ./config/pipelines, fejn għandna fajls b'settings tal-kanal, fid-direttorju /usr/share/logstash/config/pipelines u nagħmluh ukoll jinqara biss.
Fajl Pipelines.yml
- pipeline.id: HABR
pipeline.workers: 1
pipeline.batch.size: 1
path.config: "./config/pipelines/habr_pipeline.conf"
Kanal wieħed bl-identifikatur HABR u t-triq għall-fajl tal-konfigurazzjoni tiegħu huma deskritti hawn.
U finalment il-fajl “./config/pipelines/habr_pipeline.conf”
input {
tcp {
port => "5046"
}
}
filter {
mutate {
add_field => [ "habra_field", "Hello Habr" ]
}
}
output {
stdout {
}
}
Ejja ma nidħlux fid-deskrizzjoni tagħha għalissa, ejja nippruvaw inħaddmu:
docker-compose up
X'naraw?
Il-kontenitur beda. Nistgħu niċċekkjaw it-tħaddim tiegħu:
echo '13123123123123123123123213123213' | nc localhost 5046
U naraw ir-rispons fil-console tal-kontenitur:
Iżda fl-istess ħin, naraw ukoll:
logstash_one_channel | [2019-04-29T11:28:59,790][ERROR][logstash.licensechecker.licensereader] Ma tistax tiġi rkuprata l-informazzjoni tal-liċenzja mis-server tal-liċenzja {:message=>“Elasticsearch Unreachable: [http://elasticsearch:9200/][Manticore ::ResolutionFailure] elasticsearch",...
logstash_one_channel | [2019-04-29T11:28:59,894][INFO ][logstash.pipeline ] Pipeline beda b'suċċess {:pipeline_id=>".monitoring-logstash", :thread =>"# "}
logstash_one_channel | [2019-04-29T11:28:59,988][INFO ][logstash.agent ] Pipelines running {:count=>2, :running_pipelines=>[:HABR, :".monitoring-logstash"], :non_running_pipelines=>[ ]}
logstash_one_channel | [2019-04-29T11:29:00,015][ERROR][logstash.inputs.metrics] X-Pack huwa installat fuq Logstash iżda mhux fuq Elasticsearch. Jekk jogħġbok installa X-Pack fuq Elasticsearch biex tuża l-karatteristika ta 'monitoraġġ. Karatteristiċi oħra jistgħu jkunu disponibbli.
logstash_one_channel | [2019-04-29T11:29:00,526][INFO ][logstash.agent ] Inbeda b'suċċess Logstash API endpoint {:port=>9600}
logstash_one_channel | [2019-04-29T11:29:04,478][INFO ][logstash.outputs.elasticsearch] Tmexxi verifika tas-saħħa biex tara jekk konnessjoni ta' Elasticsearch tkunx qed taħdem {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,487][WARN ][logstash.outputs.elasticsearch] Ipprova jqajjem konnessjoni ma' istanza ES mejta, iżda kiseb żball. {:url =>“
logstash_one_channel | [2019-04-29T11:29:04,704][INFO ][logstash.licensechecker.licensereader] Tmexxi verifika tas-saħħa biex tara jekk konnessjoni ta' Elasticsearch tkunx qed taħdem {:healthcheck_url=>http://elasticsearch:9200/, :path=> "/"}
logstash_one_channel | [2019-04-29T11:29:04,710][WARN ][logstash.licensechecker.licensereader] Ipprova jqajjem konnessjoni ma' istanza ES mejta, iżda kiseb żball. {:url =>“
U l-ġurnal tagħna qed jitkaxkar il-ħin kollu.
Hawnhekk enfasizzajt bl-aħdar il-messaġġ li l-pipeline nieda b’suċċess, bl-aħmar il-messaġġ ta’ żball u bl-isfar il-messaġġ dwar attentat ta’ kuntatt
Dan jiġri minħabba li logstash.conf, inkluż fl-immaġini, fih verifika għad-disponibbiltà elastika. Wara kollox, logstash jassumi li jaħdem bħala parti mill-munzell Elk, iżda aħna sseparajna.
Huwa possibbli li taħdem, iżda mhuwiex konvenjenti.
Is-soluzzjoni hija li tiddiżattiva dan il-kontroll permezz tal-varjabbli ambjentali XPACK_MONITORING_ENABLED.
Ejja nagħmlu bidla f'docker-compose.yml u erġa' nħaddmu:
version: '3'
networks:
elk:
volumes:
elasticsearch:
driver: local
services:
logstash:
container_name: logstash_one_channel
image: docker.elastic.co/logstash/logstash:6.3.2
networks:
- elk
environment:
XPACK_MONITORING_ENABLED: "false"
ports:
- 5046:5046
volumes:
- ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
- ./config/pipelines:/usr/share/logstash/config/pipelines:ro
Issa, kollox tajjeb. Il-kontenitur huwa lest għall-esperimenti.
Nistgħu nerġgħu nittajpja fil-console li jmiss:
echo '13123123123123123123123213123213' | nc localhost 5046
U ara:
logstash_one_channel | {
logstash_one_channel | "message" => "13123123123123123123123213123213",
logstash_one_channel | "@timestamp" => 2019-04-29T11:43:44.582Z,
logstash_one_channel | "@version" => "1",
logstash_one_channel | "habra_field" => "Hello Habr",
logstash_one_channel | "host" => "gateway",
logstash_one_channel | "port" => 49418
logstash_one_channel | }
Ħidma fi ħdan kanal wieħed
Għalhekk nedejna. Issa inti tista 'attwalment tieħu l-ħin biex tikkonfigura logstash innifsu. Ejja ma tmissx il-fajl pipelines.yml għalissa, ejja naraw x'nistgħu niksbu billi naħdmu ma 'kanal wieħed.
Irrid ngħid li l-prinċipju ġenerali ta 'ħidma mal-fajl tal-konfigurazzjoni tal-kanal huwa deskritt tajjeb fil-manwal uffiċjali, hawn
Jekk trid taqra bir-Russu, użajna dan
Ejja mmorru sekwenzjali mit-taqsima Input. Diġà rajna xogħol fuq TCP. X'iktar jista' jkun interessanti hawn?
Messaġġi tat-test bl-użu tat-taħbit tal-qalb
Hemm opportunità tant interessanti biex tiġġenera messaġġi tat-test awtomatiċi.
Biex tagħmel dan, jeħtieġ li tattiva l-plugin tal-qalb fit-taqsima tal-input.
input {
heartbeat {
message => "HeartBeat!"
}
}
Ixgħelha, ibda tirċievi darba fil-minuta
logstash_one_channel | {
logstash_one_channel | "@timestamp" => 2019-04-29T13:52:04.567Z,
logstash_one_channel | "habra_field" => "Hello Habr",
logstash_one_channel | "message" => "HeartBeat!",
logstash_one_channel | "@version" => "1",
logstash_one_channel | "host" => "a0667e5c57ec"
logstash_one_channel | }
Jekk irridu nirċievu aktar spiss, irridu nżidu l-parametru tal-intervall.
Hekk se nirċievu messaġġ kull 10 sekondi.
input {
heartbeat {
message => "HeartBeat!"
interval => 10
}
}
Irkupru tad-dejta minn fajl
Iddeċidejna wkoll li nħarsu lejn il-modalità tal-fajl. Jekk taħdem sew mal-fajl, allura forsi ma jkun meħtieġ l-ebda aġent, għall-inqas għall-użu lokali.
Skont id-deskrizzjoni, il-mod operattiv għandu jkun simili għal denb -f, i.e. jaqra linji ġodda jew, bħala għażla, jaqra l-fajl kollu.
Allura dak li rridu niksbu:
- Irridu nirċievu linji li huma mehmuża ma 'log file wieħed.
- Irridu nirċievu data li tinkiteb f'diversi log files, filwaqt li nkunu nistgħu nisseparaw dak li jiġi riċevut minn fejn.
- Irridu niżguraw li meta logstash jerġa' jinbeda, ma jerġax jirċievi din id-dejta.
- Irridu niċċekkjaw li jekk logstash jintefa, u d-dejta tkompli tinkiteb fil-fajls, allura meta nħaddmuha, nirċievu din id-dejta.
Biex twettaq l-esperiment, ejja nżidu linja oħra ma 'docker-compose.yml, u tiftaħ id-direttorju li fih inpoġġu l-fajls.
version: '3'
networks:
elk:
volumes:
elasticsearch:
driver: local
services:
logstash:
container_name: logstash_one_channel
image: docker.elastic.co/logstash/logstash:6.3.2
networks:
- elk
environment:
XPACK_MONITORING_ENABLED: "false"
ports:
- 5046:5046
volumes:
- ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
- ./config/pipelines:/usr/share/logstash/config/pipelines:ro
- ./logs:/usr/share/logstash/input
U ibdel is-sezzjoni tal-input f'habr_pipeline.conf
input {
file {
path => "/usr/share/logstash/input/*.log"
}
}
Ejja nibdew:
docker-compose up
Biex noħolqu u niktbu log files aħna se nużaw il-kmand:
echo '1' >> logs/number1.log
{
logstash_one_channel | "host" => "ac2d4e3ef70f",
logstash_one_channel | "habra_field" => "Hello Habr",
logstash_one_channel | "@timestamp" => 2019-04-29T14:28:53.876Z,
logstash_one_channel | "@version" => "1",
logstash_one_channel | "message" => "1",
logstash_one_channel | "path" => "/usr/share/logstash/input/number1.log"
logstash_one_channel | }
Yep, taħdem!
Fl-istess ħin, naraw li żidna awtomatikament il-qasam tal-passaġġ. Dan ifisser li fil-futur, inkunu nistgħu niffiltraw ir-rekords minnha.
Ejja nerġgħu nippruvaw:
echo '2' >> logs/number1.log
{
logstash_one_channel | "host" => "ac2d4e3ef70f",
logstash_one_channel | "habra_field" => "Hello Habr",
logstash_one_channel | "@timestamp" => 2019-04-29T14:28:59.906Z,
logstash_one_channel | "@version" => "1",
logstash_one_channel | "message" => "2",
logstash_one_channel | "path" => "/usr/share/logstash/input/number1.log"
logstash_one_channel | }
U issa għal fajl ieħor:
echo '1' >> logs/number2.log
{
logstash_one_channel | "host" => "ac2d4e3ef70f",
logstash_one_channel | "habra_field" => "Hello Habr",
logstash_one_channel | "@timestamp" => 2019-04-29T14:29:26.061Z,
logstash_one_channel | "@version" => "1",
logstash_one_channel | "message" => "1",
logstash_one_channel | "path" => "/usr/share/logstash/input/number2.log"
logstash_one_channel | }
Kbir! Il-fajl inġabar, it-triq kienet speċifikata b'mod korrett, kollox tajjeb.
Waqqaf logstash u ibda mill-ġdid. Ejja nistennew. Silenzju. Dawk. Aħna ma nirċievux dawn ir-rekords mill-ġdid.
U issa l-aktar esperiment awdaċi.
Installa logstash u esegwi:
echo '3' >> logs/number2.log
echo '4' >> logs/number1.log
Erġa' ħaddem logstash u ara:
logstash_one_channel | {
logstash_one_channel | "host" => "ac2d4e3ef70f",
logstash_one_channel | "habra_field" => "Hello Habr",
logstash_one_channel | "message" => "3",
logstash_one_channel | "@version" => "1",
logstash_one_channel | "path" => "/usr/share/logstash/input/number2.log",
logstash_one_channel | "@timestamp" => 2019-04-29T14:48:50.589Z
logstash_one_channel | }
logstash_one_channel | {
logstash_one_channel | "host" => "ac2d4e3ef70f",
logstash_one_channel | "habra_field" => "Hello Habr",
logstash_one_channel | "message" => "4",
logstash_one_channel | "@version" => "1",
logstash_one_channel | "path" => "/usr/share/logstash/input/number1.log",
logstash_one_channel | "@timestamp" => 2019-04-29T14:48:50.856Z
logstash_one_channel | }
Ħura! Kollox inġabar.
Imma rridu nwissuk dwar dan li ġej. Jekk il-kontenitur tal-logstash jitħassar (docker stop logstash_one_channel && docker rm logstash_one_channel), allura ma jinġabar xejn. Il-pożizzjoni tal-fajl sa fejn inqara kienet maħżuna ġewwa l-kontenitur. Jekk tmexxiha mill-bidu, taċċetta biss linji ġodda.
Qari ta 'fajls eżistenti
Ejja ngħidu li qed inniedu logstash għall-ewwel darba, iżda diġà għandna zkuk u nixtiequ nipproċessawhom.
Jekk inħaddmu logstash bit-taqsima tal-input li użajna hawn fuq, ma nġibu xejn. Linji ġodda biss se jiġu pproċessati minn logstash.
Sabiex il-linji minn fajls eżistenti jinġibdu 'l fuq, għandek iżżid linja addizzjonali mat-taqsima tal-input:
input {
file {
start_position => "beginning"
path => "/usr/share/logstash/input/*.log"
}
}
Barra minn hekk, hemm sfumatura: dan jaffettwa biss fajls ġodda li logstash għadu ma rax. Għall-istess fajls li kienu diġà fil-qasam tal-vista ta 'logstash, diġà ftakar id-daqs tagħhom u issa se jieħu biss daħliet ġodda fihom.
Ejja nieqfu hawn u nistudjaw it-taqsima tal-input. Għad hemm ħafna għażliet, iżda dan huwa biżżejjed għalina għal aktar esperimenti għalissa.
Rotot u Trasformazzjoni tad-Data
Ejja nippruvaw insolvu l-problema li ġejja, ejja ngħidu li għandna messaġġi minn kanal wieħed, xi wħud minnhom huma informattivi, u xi wħud huma messaġġi ta 'żball. Huma differenti minn tag. Xi wħud huma INFO, oħrajn huma ŻBALL.
Irridu nisseparawhom mal-ħruġ. Dawk. Aħna niktbu messaġġi ta 'informazzjoni f'kanal wieħed, u messaġġi ta' żball f'ieħor.
Biex tagħmel dan, imxi mit-taqsima tal-input għall-iffiltrar u l-output.
Bl-użu tas-sezzjoni tal-filtru, aħna se naħdmu l-messaġġ li jkun dieħel, billi niksbu hash (pari ewlenin-valur) minnu, li diġà nistgħu naħdmu miegħu, i.e. żarma skond il-kondizzjonijiet. U fit-taqsima tal-output, aħna se nagħżlu messaġġi u nibagħtu kull wieħed lill-kanal tiegħu stess.
Parsing messaġġ ma grok
Sabiex jiġu analizzati strings tat-test u tikseb sett ta 'oqsma minnhom, hemm plugin speċjali fit-taqsima tal-filtru - grok.
Mingħajr ma nistabbilixxi lili nnifsi l-għan li nagħti deskrizzjoni dettaljata tagħha hawn (għal dan nirreferi għalih
Biex tagħmel dan, trid tiddeċiedi dwar il-format tal-kordi tal-input. Jien għandihom hekk:
1 messaġġ INFO1
2 messaġġ ta' ŻBALL2
Dawk. L-identifikatur jiġi l-ewwel, imbagħad INFO/Żball, imbagħad xi kelma mingħajr spazji.
Mhuwiex diffiċli, iżda huwa biżżejjed li tifhem il-prinċipju ta 'operazzjoni.
Allura, fit-taqsima tal-filtru tal-plugin grok, irridu niddefinixxu mudell għall-parsing tal-kordi tagħna.
Se tidher bħal din:
filter {
grok {
match => { "message" => ["%{INT:message_id} %{LOGLEVEL:message_type} %{WORD:message_text}"] }
}
}
Essenzjalment hija espressjoni regolari. Jintużaw mudelli lesti, bħal INT, LOGLEVEL, WORD. Id-deskrizzjoni tagħhom, kif ukoll mudelli oħra, jistgħu jinstabu hawn
Issa, meta tgħaddi minn dan il-filtru, is-sekwenza tagħna tinbidel f'hash ta' tliet oqsma: message_id, message_type, message_text.
Dawn se jintwerew fit-taqsima tal-output.
Ir-rotta tal-messaġġi lejn it-taqsima tal-output bl-użu tal-kmand if
Fit-taqsima tal-output, kif niftakru, konna se naqsmu l-messaġġi f'żewġ flussi. Xi wħud - li huma iNFO, se jiġu output għall-console, u bi żbalji, aħna se toħroġ għal fajl.
Kif nisseparaw dawn il-messaġġi? Il-kundizzjoni tal-problema diġà tissuġġerixxi soluzzjoni - wara kollox, diġà għandna qasam dedikat message_type, li jista 'jieħu biss żewġ valuri: INFO u ERROR. Huwa fuq din il-bażi li se nagħmlu għażla billi nużaw id-dikjarazzjoni if.
if [message_type] == "ERROR" {
# Здесь выводим в файл
} else
{
# Здесь выводим в stdout
}
Deskrizzjoni tal-ħidma ma' oqsma u operaturi tista' tinstab f'din it-taqsima
Issa, dwar il-konklużjoni attwali nnifisha.
Output tal-console, kollox huwa ċar hawn - stdout {}
Iżda l-output għal fajl - ftakar li qed inħaddmu dan kollu minn kontenitur u sabiex il-fajl li fih niktbu r-riżultat ikun aċċessibbli minn barra, għandna bżonn niftħu dan id-direttorju f'docker-compose.yml.
Total:
Is-sezzjoni tal-output tal-fajl tagħna tidher bħal din:
output {
if [message_type] == "ERROR" {
file {
path => "/usr/share/logstash/output/test.log"
codec => line { format => "custom format: %{message}"}
}
} else
{stdout {
}
}
}
F'docker-compose.yml aħna nżidu volum ieħor għall-output:
version: '3'
networks:
elk:
volumes:
elasticsearch:
driver: local
services:
logstash:
container_name: logstash_one_channel
image: docker.elastic.co/logstash/logstash:6.3.2
networks:
- elk
environment:
XPACK_MONITORING_ENABLED: "false"
ports:
- 5046:5046
volumes:
- ./config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
- ./config/pipelines:/usr/share/logstash/config/pipelines:ro
- ./logs:/usr/share/logstash/input
- ./output:/usr/share/logstash/output
Innieduha, nippruvawha, u naraw diviżjoni f'żewġ flussi.
Sors: www.habr.com