F'Badoo, aħna kontinwament nissorveljaw teknoloġiji ġodda u nevalwaw jekk humiex ta' min jużahom fis-sistema tagħna. Nixtiequ naqsmu wieħed minn dawn l-istudji mal-komunità. Hija ddedikata għal Loki, sistema ta' aggregazzjoni ta' zkuk.
Loki huwa soluzzjoni għall-ħażna u l-wiri taz-zkuk, u dan il-munzell jipprovdi wkoll sistema flessibbli biex jiġu analizzati u tibgħat id-dejta lil Prometheus. F'Mejju, ġie rilaxxat aġġornament ieħor, li huwa promoss b'mod attiv mill-ħallieqa. Konna interessati x'jista' jagħmel Loki, liema kapaċitajiet jipprovdi, u sa liema punt jista' jaġixxi bħala alternattiva għal ELK, il-munzell li nużaw issa.
X'inhu Loki
Grafana Loki huwa sett ta 'komponenti għal sistema kompluta ta' ħidma biż-zkuk. B'differenza minn sistemi oħra simili, Loki huwa bbażat fuq l-idea li jiġu indiċjati biss metadata ta 'log - tikketti (l-istess bħal fil-Prometheus), u tikkompressa z-zkuk infushom f'biċċiet separati.
Qabel ma nidħlu f'dak li tista 'tagħmel ma' Loki, irrid niċċara x'nifhmu b' "l-idea li tiġi indiċjata biss metadejta." Ejja nqabblu l-approċċ Loki u l-approċċ għall-indiċjar f'soluzzjonijiet tradizzjonali bħal Elasticsearch, billi tuża l-eżempju ta 'linja mil-log nginx:
Is-sistemi tradizzjonali jeżaminaw ir-ringiela kollha, inklużi oqsma b'numru kbir ta 'valuri uniċi user_id u item_id, u jaħżnu kollox f'indiċi kbar. Il-vantaġġ ta 'dan l-approċċ huwa li tista' tmexxi mistoqsijiet kumplessi malajr, peress li kważi d-dejta kollha tinsab fl-indiċi. Iżda dan jiġi bi spiża li l-indiċi jsir kbir, li jissarraf f'rekwiżiti ta 'memorja. Bħala riżultat, l-indiċi tal-ġurnal tat-test sħiħ huwa komparabbli fid-daqs maż-zkuk infushom. Sabiex tfittex malajr permezz tiegħu, l-indiċi għandu jitgħabba fil-memorja. U iktar ma jkun hemm zkuk, aktar ma jikber malajr l-indiċi u aktar ma jikkonsma memorja.
L-approċċ Loki jeħtieġ li d-dejta meħtieġa biss tiġi estratta minn string, li n-numru ta 'valuri tagħha huwa żgħir. B'dan il-mod niksbu indiċi żgħir u nistgħu nfittxu d-dejta billi niffiltrawha skont il-ħin u b'oqsma indiċjati, u mbagħad niskennjaw il-bqija b'espressjonijiet regolari jew tfittxija substring. Il-proċess ma jidhirx li huwa l-aktar mgħaġġel, iżda Loki jaqsam it-talba f'diversi partijiet u tesegwixxihom b'mod parallel, u jipproċessa ammont kbir ta 'dejta fi żmien qasir. In-numru ta 'shards u talbiet paralleli fihom huwa konfigurabbli; għalhekk, l-ammont ta' data li jista' jiġi pproċessat għal kull unità ta' żmien jiddependi b'mod lineari fuq l-ammont ta' riżorsi pprovduti.
Dan il-kompromess bejn indiċi kbir u veloċi u indiċi ta' forza bruta żgħira parallela jippermetti lil Loki jikkontrolla l-ispiża tas-sistema. Jista 'jiġi kkonfigurat u estiża b'mod flessibbli skont il-ħtiġijiet.
Il-munzell Loki jikkonsisti fi tliet komponenti: Promtail, Loki, Grafana. Promtail jiġbor zkuk, jipproċessahom u jibgħathom lil Loki. Loki jżommhom. U Grafana jista 'jitlob dejta mingħand Loki u juriha. B'mod ġenerali, Loki jista 'jintuża mhux biss għall-ħażna ta' zkuk u tiftix minnhom. Il-munzell kollu jipprovdi opportunitajiet kbar għall-ipproċessar u l-analiżi tad-dejta li tidħol bl-użu tal-mod Prometheus.
Tista 'tinstab deskrizzjoni tal-proċess ta' installazzjoni hawn.
Fittex minn zkuk
Tista' tfittex ir-zkuk f'interface ta' Grafana speċjali - Explorer. Il-mistoqsijiet jużaw il-lingwa LogQL, li hija simili ħafna għall-PromQL użata fi Prometheus. Fil-prinċipju, jista 'jitqies bħala grep distribwit.
L-interface tat-tfittxija tidher bħal din:
It-talba nnifisha tikkonsisti f'żewġ partijiet: selettur u filtru. Selettur huwa tfittxija li juża metadejta indiċjata (tikketti) li huma assenjati għal zkuk, u filtru huwa string ta 'tfittxija jew regexp li jiffiltra r-rekords definiti mis-selettur. Fl-eżempju mogħti: Fi ċineg kaboċċi hemm selettur, kollox wara huwa filtru.
{image_name="nginx.promtail.test"} |= "index"
Minħabba l-mod kif jaħdem Loki, ma tistax tagħmel mistoqsijiet mingħajr selettur, iżda t-tikketti jistgħu jsiru ġenerali kif tixtieq.
Selettur huwa valur ta' valur ewlieni f'ċingi kaboċċi. Tista' tgħaqqad is-seletturi u tispeċifika kundizzjonijiet ta' tfittxija differenti billi tuża l-operaturi =, != jew espressjonijiet regolari:
{instance=~"kafka-[23]",name!="kafka-dev"}
// Найдёт логи с лейблом instance, имеющие значение kafka-2, kafka-3, и исключит dev
Filtru huwa test jew regexp li jiffiltra d-dejta kollha riċevuta mis-selettur.
Huwa possibbli li jinkisbu graffs ad hoc ibbażati fuq id-dejta riċevuta fil-modalità metrika. Pereżempju, tista 'ssir taf kemm-il darba entrata li fiha l-indiċi tal-istring tidher fil-logs nginx:
Deskrizzjoni sħiħa tal-kapaċitajiet tista 'tinstab fid-dokumentazzjoni LogQL.
Log parsing
Hemm diversi modi kif tiġbor zkuk:
Bl-użu ta 'Promtail, komponent standard tal-munzell għall-ġbir taz-zkuk.
Uża Fluentd jew Fluent Bit, li tista 'tibgħat data lil Loki. B'differenza minn Promtail, għandhom parsers lesti għal kważi kull tip ta 'log u jistgħu wkoll jimmaniġġjaw zkuk b'ħafna linji.
Normalment Promtail jintuża għall-parsing. Jagħmel tliet affarijiet:
Isib sorsi tad-dejta.
Waħħal it-tikketti magħhom.
Jibgħat data lil Loki.
Bħalissa Promtail jista' jaqra zkuk minn fajls lokali u minn systemd journal. Għandu jiġi installat fuq kull magna li minnha jinġabru zkuk.
Hemm integrazzjoni ma 'Kubernetes: Promtail awtomatikament, permezz tal-Kubernetes REST API, jirrikonoxxi l-istat tal-cluster u jiġbor zkuk minn node, servizz jew pod, immedjatament tpoġġi tikketti bbażati fuq metadata minn Kubernetes (isem tal-pod, isem tal-fajl, eċċ.) .
Tista' wkoll hang tikketti bbażati fuq dejta mir-reġistru billi tuża Pipeline. Pipeline Promtail jista 'jikkonsisti f'erba' tipi ta 'stadji. Aktar dettalji fi dokumentazzjoni uffiċjali, Immedjatament ninnota xi sfumaturi.
Stadji ta' parsing. Dan huwa l-istadju RegEx u JSON. F'dan l-istadju, aħna estratt dejta miz-zkuk fl-hekk imsejħa mappa estratta. Nistgħu niġbdu minn JSON billi sempliċement nikkupjaw l-oqsma li neħtieġu fil-mappa estratta, jew permezz ta 'espressjonijiet regolari (RegEx), fejn il-gruppi msemmija huma "mappjati" fil-mappa estratta. Il-mappa Estratt hija maħżen tal-valur ewlieni, fejn iċ-ċavetta hija l-isem tal-qasam, u l-valur huwa l-valur tagħha miċ-zkuk.
Ittrasforma l-istadji. Dan l-istadju għandu żewġ għażliet: trasformazzjoni, fejn nissettjaw ir-regoli tat-trasformazzjoni, u sors - is-sors tad-dejta għat-trasformazzjoni mill-mappa estratta. Jekk ma jkunx hemm qasam bħal dan fil-mappa estratta, se tinħoloq. Dan il-mod huwa possibbli li jinħolqu tikketti li mhumiex ibbażati fuq il-mappa estratta. F'dan l-istadju nistgħu jimmanipulaw id-data fil-mappa estratta bl-użu ta 'pjuttost qawwija Mudell Golang. Barra minn hekk, irridu niftakru li l-mappa estratta hija mgħobbija għal kollox waqt l-analiżi, li jagħmilha possibbli, pereżempju, li jiġi ċċekkjat il-valur fiha: "{{jekk .tag}jeżisti valur tat-tikketta{end}}". Template jappoġġja kundizzjonijiet, loops, u xi funzjonijiet string bħal Ibdel u Ittrimmja.
Stadji ta' azzjoni. F'dan il-punt tista 'tagħmel xi ħaġa bil-kontenut estratt:
Oħloq tikketta mid-dejta estratta, li tkun indiċjata minn Loki.
Ibdel jew issettja l-ħin tal-avveniment mill-ġurnal.
Ibdel id-dejta (test tal-log) li se tmur għal Loki.
Oħloq metriċi.
Stadji ta 'filtrazzjoni. L-istadju tal-partita, fejn nistgħu jew nibagħtu entrati li m'għandniex bżonn /dev/null jew nibgħatuhom għal aktar proċessar.
Bl-użu ta 'eżempju ta' pproċessar ta 'zkuk nginx regolari, ser nuri kif tista' tparsa zkuk billi tuża Promtail.
Għat-test, ejja nieħdu bħala nginx-proxy immaġini nginx modifikata jwilder/nginx-proxy:alpine u daemon żgħir li jista' jistaqsi lilu nnifsu permezz ta' HTTP. Id-daemon għandu diversi endpoints, li għalihom jista 'jipprovdi tweġibiet ta' daqsijiet differenti, bi status HTTP differenti u b'dewmien differenti.
Aħna se niġbru zkuk minn kontenituri docker, li jistgħu jinstabu tul il-mogħdija /var/lib/docker/containers/ / -json.log
F'docker-compose.yml aħna nikkonfiguraw Promtail u nispeċifikaw il-mogħdija għall-konfigurazzjoni:
Żid il-mogħdija għar-zkuk għal promtail.yml (hemm għażla "docker" fil-konfigurazzjoni, li tagħmel l-istess ħaġa f'linja waħda, iżda ma tkunx daqshekk ċara):
scrape_configs:
- job_name: containers
static_configs:
labels:
job: containerlogs
__path__: /var/lib/docker/containers/*/*log # for linux only
Meta din il-konfigurazzjoni tkun attivata, zkuk mill-kontenituri kollha jintbagħtu lil Loki. Biex nevitaw dan, aħna nibdlu s-settings tat-test nginx f'docker-compose.yml - żid qasam tat-tikketta tal-illoggjar:
Jekk irnexxielna npoġġu l-qasam tat-tikketta fil-mappa estratta, allura bl-użu tar-reġexp aħna estratt l-ismijiet tal-immaġni u l-kontenitur.
- labels:
image_name:
container_name:
Aħna jassenjaw tikketti. Jekk iċ-ċwievet image_name u container_name jinstabu fid-dejta estratta, allura l-valuri tagħhom jiġu assenjati lit-tikketti korrispondenti.
- match:
selector: '{job="docker",container_name="",image_name=""}'
action: drop
Nermu z-zkuk kollha li m'għandhomx it-tikketti installati isem_immaġni u isem_kontenitur.
Għaż-zkuk kollha li image_name tagħhom huwa nginx.promtail.test, iġbed il-qasam tar-reġistru mir-reġistru tas-sors u poġġih fil-mappa estratta biċ-ċavetta tal-filliera.
Ejja parse request_url. Bl-użu regexp aħna niddeterminaw l-iskop tat-talba: għal data statika, għal ritratti, għal API u ssettja ċ-ċavetta korrispondenti fil-mappa estratta.
- template:
source: request_type
template: "{{if .photo}}photo{{else if .static_type}}static{{else if .api_request}}api{{else}}other{{end}}"
Billi nużaw operaturi kondizzjonali f'Mudell, aħna niċċekkjaw l-oqsma installati fil-mappa estratta u nissettjaw il-valuri meħtieġa għall-qasam request_type: photo, static, API. Assenja ieħor jekk jonqos. request_type issa fih it-tip ta' talba.
Aħna waqqafna t-tikketti api_request, virtual_host, request_type u status (HTTP status) ibbażati fuq dak li rnexxielna npoġġu fil-mappa estratta.
- output:
source: nginx_log_row
Bidla l-output. Issa l-log nginx imnaddaf mill-mappa estratta jmur għand Loki.
Wara li tħaddem il-konfigurazzjoni ta 'hawn fuq, tista' tara li kull entrata hija assenjata tikketti bbażati fuq dejta mir-reġistru.
Ħaġa waħda li wieħed iżomm f'moħħu huwa li l-irkupru ta 'tikketti b'numru kbir ta' valuri (kardinalità) jista 'jnaqqas b'mod sinifikanti Loki. Jiġifieri, m'għandekx tpoġġi, pereżempju, user_id fl-indiċi. Aqra aktar dwar dan fl-artiklu "Kif it-tikketti f'Loki jistgħu jagħmlu l-mistoqsijiet dwar il-log aktar malajr u aktar faċli" Iżda dan ma jfissirx li ma tistax tfittex minn user_id mingħajr indiċi. Ikollok bżonn tuża filtri meta tfittex (“qabbad” id-dejta), u l-indiċi hawn jaġixxi bħala identifikatur tal-fluss.
Viżwalizzazzjoni ta 'zkuk
Loki jista' jaġixxi bħala sors ta' dejta għal graffs Grafana bl-użu ta' LogQL. Il-karatteristiċi li ġejjin huma appoġġjati:
rata — numru ta' rekords kull sekonda;
għadd matul iż-żmien — in-numru ta’ rekords fil-medda speċifikata.
Hemm ukoll funzjonijiet ta 'aggregazzjoni Somma, Medja u oħrajn. Tista 'tibni graffs pjuttost kumplessi, pereżempju graff tan-numru ta' żbalji HTTP:
Is-sors tad-dejta standard Loki huwa kemmxejn imnaqqas fil-funzjonalità meta mqabbel mas-sors tad-dejta Prometheus (per eżempju, ma tistax tbiddel il-leġġenda), iżda Loki jista 'jkun konness bħala sors mat-tip Prometheus. M'inix ċert jekk din hijiex imġieba dokumentata, imma niġġudikaw mir-rispons tal-iżviluppaturi "Kif tikkonfigura Loki bħala datasource Prometheus? · Ħarġa #1222 · grafana/loki”, pereżempju, huwa kompletament legali, u Loki huwa kompletament kompatibbli ma 'PromQL.
Żid Loki bħala sors tad-dejta bit-tip Prometheus u żid URL /loki:
U nistgħu nagħmlu graffs, bħallikieku qed naħdmu b'metriċi minn Prometheus:
Naħseb li d-diskrepanza fil-funzjonalità hija temporanja u l-iżviluppaturi se jikkoreġu dan fil-futur.
Metriċi
Loki jipprovdi l-abbiltà li jiġbed metriċi numeriċi minn zkuk u jibgħathom lil Prometheus. Pereżempju, il-log nginx fih in-numru ta 'bytes għal kull tweġiba, kif ukoll, b'ċerta modifika tal-format standard tal-log, il-ħin f'sekondi li ħadet biex tirrispondi. Din id-dejta tista’ tiġi estratta u mibgħuta lil Prometheus.
L-għażla tippermettilek tiddefinixxi u taġġorna metriċi bbażati fuq data mill-mappa estratta. Dawn il-metriċi ma jintbagħtux lil Loki - jidhru fl-endpoint Promtail/metrics. Prometheus għandu jiġi kkonfigurat biex jirċievi d-dejta riċevuta f'dan l-istadju. Fl-eżempju ta 'hawn fuq, għal request_type = "api" aħna niġbru metrika tal-istogramma. B'dan it-tip ta 'metriċi huwa konvenjenti li jinkisbu perċentili. Għal statiċi u ritratti, aħna niġbru s-somma ta 'bytes u n-numru ta' ringieli li fihom irċevejna bytes biex nikkalkulaw il-medja.
B'dan il-mod tista 'ssir taf, pereżempju, l-erba' mistoqsijiet l-aktar bil-mod. Tista 'wkoll twaqqaf monitoraġġ għal dawn il-metriċi.
Skalar
Loki jista 'jkun jew f'modalità binarja waħda jew f'modalità sharded (modalità li tista' tiġi skalata orizzontalment). Fit-tieni każ, tista 'tiffranka d-dejta fis-sħaba, u l-biċċiet u l-indiċi huma maħżuna separatament. Il-verżjoni 1.5 tintroduċi l-abbiltà li taħżen f'post wieħed, iżda għadu mhux rakkomandat li tużaha fil-produzzjoni.
Il-biċċiet jistgħu jinħażnu f'ħażna kompatibbli ma 'S3, u databases li jistgħu jiġu skalati orizzontalment jistgħu jintużaw biex jaħżnu indiċi: Cassandra, BigTable jew DynamoDB. Partijiet oħra ta 'Loki - Distributuri (għall-kitba) u Querier (għall-mistoqsijiet) - huma mingħajr stat u wkoll skala orizzontalment.
Fil-konferenza DevOpsDays Vancouver 2019, wieħed mill-parteċipanti Callum Styan ħabbar li ma 'Loki il-proġett tiegħu għandu petabytes ta' zkuk b'indiċi ta 'inqas minn 1% tad-daqs totali: "Kif Loki Jikkorrelata l-Metriċi u z-Zkuk — U jiffranka l-Flus".
Tqabbil ta 'Loki u ELK
Daqs tal-indiċi
Biex tittestja d-daqs ta 'l-indiċi li jirriżulta, ħadt zkuk mill-kontenitur nginx li għalih il-Pipeline ta' hawn fuq ġie kkonfigurat. Il-log file kien fih 406 linja b'volum totali ta' 624 MB. Logs ġew iġġenerati fi żmien siegħa, madwar 109 daħla kull sekonda.
Eżempju ta' żewġ linji mill-ġurnal:
Meta indiċjat minn ELK, dan ta daqs ta 'indiċi ta' 30,3 MB:
Fil-każ ta' Loki, dan irriżulta f'madwar 128 KB ta' indiċi u madwar 3,8 MB ta' dejta f'biċċiet. Ta 'min jinnota li l-ġurnal ġie ġġenerat artifiċjalment u ma kellux varjetà kbira ta' data. Gzip sempliċi fuq il-log Docker JSON oriġinali bid-dejta ta kompressjoni ta '95,4%, u meta jitqies il-fatt li l-log nginx imnaddaf biss intbagħat lil Loki innifsu, kompressjoni sa 4 MB tinftiehem. In-numru totali ta 'valuri uniċi għat-tikketti Loki kien 35, li jispjega d-daqs żgħir tal-indiċi. Għal ELK il-ġurnal ġie mnaddaf ukoll. Għalhekk, Loki kkompressat id-dejta oriġinali b'96%, u ELK b'70%.
Konsum tal-memorja
Jekk inqabblu l-munzell kollu ta 'Prometheus u ELK, allura Loki "jiekol" bosta drabi inqas. Huwa ċar li servizz Go jikkonsma inqas minn servizz Java, u t-tqabbil tad-daqs tal-JVM Heap Elasticsearch u l-memorja allokata għal Loki mhuwiex korrett, iżda madankollu ta 'min jinnota li Loki juża ħafna inqas memorja. Il-vantaġġ tas-CPU tiegħu mhuwiex daqshekk ovvju, iżda huwa wkoll preżenti.
Veloċità
Loki "jidħol" zkuk aktar malajr. Il-veloċità tiddependi fuq ħafna fatturi - x'tip ta 'zkuk huma, kif sofistikati aħna parse minnhom, in-netwerk, id-diska, eċċ - iżda hija definittivament ogħla minn dik ta' ELK (fit-test tiegħi - madwar darbtejn). Dan huwa spjegat mill-fatt li Loki ipoġġi ħafna inqas dejta fl-indiċi u, għaldaqstant, iqatta 'inqas ħin fuq l-indiċjar. Bil-veloċità tat-tfittxija, is-sitwazzjoni hija l-oppost: Loki jonqos b'mod notevoli fuq data akbar minn diversi gigabytes, filwaqt li l-veloċità tat-tfittxija ta 'ELK ma tiddependix mid-daqs tad-data.
Fittex minn zkuk
Loki huwa ferm inferjuri għal ELK f'termini ta 'kapaċitajiet ta' tfittxija ta 'log. Grep b'espressjonijiet regolari huwa qawwi, iżda huwa inferjuri għal database matura. In-nuqqas ta 'mistoqsijiet dwar il-firxa, l-aggregazzjoni biss minn tikketti, l-inkapaċità li tfittex mingħajr tikketti - dan kollu jillimitana fit-tfittxija għal informazzjoni ta' interess f'Loki. Dan ma jfissirx li xejn ma jista 'jinstab bl-użu ta' Loki, iżda jiddefinixxi l-fluss ta 'ħidma ma' zkuk meta l-ewwel issib problema fil-mapep Prometheus, u mbagħad uża dawn it-tikketti biex tfittex dak li ġara fil-zkuk.
Interface
L-ewwelnett, huwa sabiħ (skużani, ma setgħetx tirreżisti). Grafana għandha interface sabiħa, iżda Kibana hija ħafna aktar rikk fil-karatteristiċi.
Vantaġġi u liżvantaġġi ta 'Loki
Wieħed mill-vantaġġi huwa li Loki jintegra ma 'Prometheus, għalhekk inġibu metriċi u twissija barra mill-kaxxa. Huwa konvenjenti għall-ġbir taz-zkuk u l-ħażna tagħhom minn Kubernetes Pods, peress li għandha skoperta tas-servizz wiret minn Prometheus u awtomatikament tehmeż tikketti.
L-iżvantaġġ huwa dokumentazzjoni dgħajfa. Xi affarijiet, pereżempju, il-karatteristiċi u l-kapaċitajiet ta 'Promtail, skoprejt biss fil-proċess ta' studju tal-kodiċi, fortunatament huwa open-source. Żvantaġġ ieħor huwa kapaċitajiet ta 'parsing dgħajfa. Pereżempju, Loki ma jistax janalizza zkuk b'ħafna linji. Żvantaġġ ieħor huwa li Loki hija teknoloġija relattivament żgħira (il-ħruġ 1.0 kien f'Novembru 2019).
Konklużjoni
Loki hija teknoloġija 100% interessanti li hija adattata għal proġetti ta 'daqs żgħir u medju, li tippermettilek issolvi ħafna problemi ta' aggregazzjoni ta 'zkuk, tfittxija ta' zkuk, monitoraġġ u analiżi ta 'log.
Aħna ma nużawx Loki f'Badoo għax għandna munzell ta 'ELK li jixraq lilna u li kien imkabbar b'diversi soluzzjonijiet tad-dwana matul is-snin. Għalina, l-ostaklu huwa t-tiftix permezz taz-zkuk. Bi kważi 100 GB ta’ zkuk kuljum, huwa importanti għalina li nkunu nistgħu nsibu kollox u ftit aktar u nagħmluh malajr. Għall-iċċartjar u l-monitoraġġ, nużaw soluzzjonijiet oħra li huma mfassla għall-bżonnijiet tagħna u integrati ma 'xulxin. Il-munzell Loki għandu benefiċċji tanġibbli, iżda mhux se jagħtina aktar milli diġà għandna, u l-benefiċċji tiegħu żgur mhux se jegħlbu l-ispiża tal-migrazzjoni.
U għalkemm wara riċerka deher ċar li ma nistgħux nużaw Loki, nittamaw li din il-kariga tgħinek fl-għażla tiegħek.
Ir-repożitorju bil-kodiċi użat fl-artikolu jinsab hawn.