Meie Badoos jälgime pidevalt uusi tehnoloogiaid ja hindame, kas neid oma süsteemis kasutada või mitte. Soovime üht neist uuringutest kogukonnaga jagada. See on pühendatud Lokile, logide koondamissüsteemile.
Loki on lahendus logide salvestamiseks ja vaatamiseks ning see virn pakub ka paindlikku süsteemi nende analüüsimiseks ja andmete Prometheusele saatmiseks. Mais ilmus veel üks värskendus, mida loojad aktiivselt reklaamivad. Meid huvitas, mida Loki teha suudab, milliseid funktsioone see pakub ja mil määral saab see alternatiivina ELK-le, praegu kasutatavale pinule.
Mis on Loki
Grafana Loki on komponentide komplekt tervikliku logisüsteemi jaoks. Erinevalt teistest sarnastest süsteemidest põhineb Loki ideel indekseerida ainult logide metaandmeid - silte (nagu Prometheuses) ja tihendada logid ise kõrvuti eraldi tükkideks.
Enne kui hakkan arutama, mida saate Lokiga teha, tahan selgitada, mida tähendab "ainult metaandmete indekseerimise idee". Võrdleme Loki lähenemisviisi ja indekseerimismeetodit traditsioonilistes lahendustes, nagu Elasticsearch, kasutades nginxi logi rea näidet:
Traditsioonilised süsteemid sõeluvad kogu rea, sealhulgas väljad, millel on palju kordumatuid user_id ja item_id väärtusi, ning salvestavad kõik suurtes indeksites. Selle lähenemisviisi eeliseks on see, et saate kiiresti käivitada keerulisi päringuid, kuna peaaegu kõik andmed on registris. Kuid selle eest peate maksma, kuna indeks muutub suureks, mis tähendab mälunõudeid. Sellest tulenevalt on palkide täistekstiindeks suuruselt võrreldav logide endaga. Selle kiireks otsimiseks tuleb indeks mällu laadida. Ja mida rohkem logisid, seda kiiremini indeks suureneb ja seda rohkem mälu kulub.
Loki lähenemine nõuab, et stringist eraldataks ainult vajalikud andmed, mille väärtuste arv on väike. Nii saame väikese indeksi ja saame otsida andmeid, filtreerides need aja ja indekseeritud väljade järgi ning seejärel skannides ülejäänud regulaaravaldiste või alamstringi otsingutega. Protsess ei tundu kõige kiirem, kuid Loki jagab päringu mitmeks osaks ja täidab need paralleelselt, töödeldes lühikese aja jooksul suure hulga andmeid. Nendes olevate kildude ja paralleelsete päringute arv on seadistatav; seega sõltub ajaühikus töödeldavate andmete hulk lineaarselt pakutavate ressursside hulgast.
See kompromiss suure kiire indeksi ja väikese paralleelse brute-force indeksi vahel võimaldab Lokil süsteemi kulusid kontrollida. Seda saab vastavalt teie vajadustele paindlikult konfigureerida ja laiendada.
Loki stäkk koosneb kolmest komponendist: Promtail, Loki, Grafana. Promtail kogub logisid, töötleb neid ja saadab Lokile. Loki hoiab neid. Ja Grafana saab Lokilt andmeid küsida ja neid näidata. Üldiselt saab Loki kasutada mitte ainult palkide hoidmiseks ja nende kaudu otsimiseks. Kogu pinu pakub suurepäraseid võimalusi sissetulevate andmete töötlemiseks ja analüüsimiseks Prometheuse meetodil.
Paigaldusprotsessi kirjelduse leiate siin.
Logi otsing
Logidest saate otsida spetsiaalses liideses Grafana — Explorer. Päringutes kasutatakse LogQL-i keelt, mis on väga sarnane Prometheuse kasutatavale PromQL-ile. Põhimõtteliselt võib seda pidada hajutatud grepiks.
Otsingu liides näeb välja selline:
Päring ise koosneb kahest osast: selektor ja filter. Selektor on otsing indekseeritud metaandmete (siltide) järgi, mis on määratud logidele, ja filter on otsingustring või regexp, mis filtreerib välja valija määratud kirjed. Antud näites: lokkis sulgudes - valija, kõik pärast - filter.
{image_name="nginx.promtail.test"} |= "index"
Loki tööviisi tõttu ei saa te päringuid teha ilma valijata, kuid silte saab muuta suvaliselt üldiseks.
Valija on lokkis sulgudes oleva väärtuse võtmeväärtus. Saate kombineerida valijaid ja määrata erinevaid otsingutingimusi, kasutades operaatoreid =, != või regulaaravaldisi:
{instance=~"kafka-[23]",name!="kafka-dev"}
// Найдёт логи с лейблом instance, имеющие значение kafka-2, kafka-3, и исключит dev
Filter on tekst või regexp, mis filtreerib välja kõik valija saadud andmed.
Mõõdikute režiimis on võimalik saada vastuvõetud andmete põhjal ad-hoc graafikuid. Näiteks saate indeksi stringi sisaldava kirje esinemissageduse nginxi logides teada saada:
Funktsioonide täieliku kirjelduse leiate dokumentatsioonist LogQL.
Kasutage Fluentd või Fluent Bit, mis saab Lokile andmeid saata. Erinevalt Promtailist on neil valmis parserid peaaegu igat tüüpi logide jaoks ja saavad hakkama ka mitmerealiste logidega.
Tavaliselt kasutatakse parsimiseks Promtaili. See teeb kolme asja:
Otsib andmeallikaid.
Kinnitage neile sildid.
Saadab andmed Lokile.
Praegu saab Promtail lugeda logisid kohalikest failidest ja systemd ajakirjast. See tuleb paigaldada igale masinale, kust palke kogutakse.
Kubernetesiga on integreeritud: Promtail tuvastab Kubernetes REST API kaudu automaatselt klastri oleku ja kogub logid sõlmest, teenusest või kaustast, postitades kohe Kubernetese metaandmetel põhinevad sildid (podi nimi, faili nimi jne).
Pipeline'i abil saate ka logi andmete põhjal silte riputada. Pipeline Promtail võib koosneda nelja tüüpi etapist. Täpsem info - sisse ametlik dokumentatsioon, märgin kohe mõned nüansid.
Parsimise etapid. See on RegExi ja JSONi etapp. Selles etapis eraldame logidest andmed nn väljavõetud kaardile. Saate JSON-ist ekstraheerida, kopeerides meile vajalikud väljad ekstraheeritud kaardile või regulaaravaldiste (RegEx) abil, kus nimega rühmad kaardistatakse ekstraheeritud kaardile. Ekstraheeritud kaart on võtmeväärtuste salvestusruum, kus võti on välja nimi ja väärtus on selle väärtus logidest.
Transformatsiooni etapid. Sellel etapil on kaks võimalust: teisendus, kus me määrame teisendusreeglid, ja allikas – ekstraheeritud kaardilt teisenduse andmeallikas. Kui ekstraheeritud kaardil sellist välja pole, siis see luuakse. Seega on võimalik luua silte, mis ei põhine väljavõetud kaardil. Selles etapis saame ekstraheeritud kaardil olevate andmetega manipuleerida, kasutades üsna võimsat golangi mall. Lisaks peame meeles pidama, et eraldatud kaart laaditakse sõelumise ajal täielikult, mis võimaldab näiteks kontrollida selles olevat väärtust: “{{if .tag}tag väärtus eksisteerib{end}}”. Mall toetab tingimusi, silmuseid ja mõningaid stringifunktsioone, nagu Asenda ja Kärbi.
Tegevuse etapid. Selles etapis saate ekstraheeritud materjaliga midagi ette võtta:
Looge ekstraheeritud andmetest silt, mille Loki indekseerib.
Muutke või määrake sündmuse aeg logist.
Muutke Lokile minevaid andmeid (logiteksti).
Loo mõõdikud.
Filtreerimise etapid. Sobitamisetapp, kus saame saata kirjed, mida me ei pea määrama /dev/null, või saata need edasiseks töötlemiseks.
Kasutades tavaliste nginxi logide töötlemise näidet, näitan, kuidas saate Promtaili abil logisid sõeluda.
Testi jaoks võtame modifitseeritud nginx jwilder/nginx-proxy:alpine kujutise ja väikese deemoni, mis suudab endalt HTTP kaudu päringuid teha nginx-puhverserverina. Deemonil on mitu lõpp-punkti, millele see võib anda erineva suurusega, erineva HTTP oleku ja erineva viivitusega vastuseid.
Kogume palke dokkekonteineritelt, mille leiab tee /var/lib/docker/containers/ / -json.log
Docker-compose.yml seadistame Promtaili ja määrame konfiguratsiooni tee:
Lisage logide tee aadressi promtail.yml (konfiguratsioonis on valik "docker", mis teeb sama ühes reas, kuid see poleks nii ilmne):
scrape_configs:
- job_name: containers
static_configs:
labels:
job: containerlogs
__path__: /var/lib/docker/containers/*/*log # for linux only
Kui see konfiguratsioon on lubatud, saab Loki logid kõikidest konteineritest. Selle vältimiseks muudame failis docker-compose.yml test nginxi sätteid - lisage sildiväljale logimine:
Kõigi logide puhul, mille pildi_nimi on võrdne väärtusega nginx.promtail.test, eraldame logivälja lähtelogist ja lisame selle reaklahviga ekstraktitud kaardile.
Määrasime sildid api_request, virtual_host, request_type ja status (HTTP staatus) selle põhjal, mida meil õnnestus ekstraheeritud kaardile lisada.
- output:
source: nginx_log_row
Muutke väljundit. Nüüd läheb ekstraheeritud kaardilt puhastatud nginxi logi Lokile.
Pärast ülaltoodud konfiguratsiooni käivitamist näete, et iga kirje on märgistatud logi andmete põhjal.
Pidage meeles, et suure hulga väärtustega (kardinaalsus) siltide eraldamine võib Loki oluliselt aeglustada. See tähendab, et te ei tohiks indeksisse panna näiteks kasutaja_id. Lisateavet selle kohta leiate artiklistKuidas saavad Loki sildid logipäringuid kiiremaks ja lihtsamaks muuta". Kuid see ei tähenda, et te ei saaks otsida kasutaja_id järgi ilma indeksiteta. Otsimisel on vaja kasutada filtreid (andmete järgi "haara") ja siinne register toimib voo identifikaatorina.
Logi visualiseerimine
Loki võib toimida LogQL-i abil Grafana diagrammide andmeallikana. Toetatakse järgmisi funktsioone:
kiirus - kirjete arv sekundis;
count over time – kirjete arv antud vahemikus.
Samuti on koondamisfunktsioonid Sum, Avg ja teised. Saate koostada üsna keerukaid graafikuid, näiteks HTTP-vigade arvu graafiku:
Loki vaikeandmeallikas on natuke vähem funktsionaalne kui Prometheuse andmeallikas (näiteks ei saa legendi muuta), kuid Loki saab ühendada Prometheuse tüüpi allikana. Ma pole kindel, kas see on dokumenteeritud käitumine, kuid otsustades arendajate vastuse järgi "Kuidas konfigureerida Loki Prometheuse andmeallikaks? · Väljaanne #1222 · grafana/loki”, näiteks on see täiesti seaduslik ja Loki ühildub täielikult PromQL-iga.
Lisage Loki andmeallikana tüübiga Prometheus ja lisage URL /loki:
Ja saate teha graafikuid, nagu töötaksime Prometheuse mõõdikutega:
Arvan, et funktsionaalsuse lahknevus on ajutine ja arendajad parandavad selle tulevikus.
Mõõdikud
Loki pakub võimalust logidest numbrilisi mõõdikuid eraldada ja Prometheusele saata. Näiteks sisaldab nginxi logi baitide arvu vastuse kohta ja standardse logivormingu teatud muudatusega ka aega sekundites, mis kulus vastamiseks. Neid andmeid saab ekstraktida ja Prometheusele saata.
See valik võimaldab määrata ja värskendada mõõdikuid ekstraktitud kaardi andmete põhjal. Neid mõõdikuid ei saadeta Lokile – need kuvatakse lõpp-punktis Promtail /metrics. Prometheus peab olema konfigureeritud sellest etapist andmeid vastu võtma. Ülaltoodud näites kogume päringu_tüüp="api" jaoks histogrammi mõõdiku. Seda tüüpi mõõdikutega on mugav protsentiile hankida. Staatika ja fotode jaoks kogume keskmise arvutamiseks baitide summa ja ridade arvu, milles saime baite.
Nii saad teada näiteks neli kõige aeglasemat päringut. Samuti saate nende mõõdikute jälgimist konfigureerida.
Skaleerimine
Loki võib olla nii üksikbinaarrežiimis kui ka killustatud (horisontaalselt skaleeritav režiim). Teisel juhul saab see andmeid pilve salvestada ning tükid ja indeks salvestatakse eraldi. Versioonis 1.5 on ühes kohas salvestamise võimalus juurutatud, kuid tootmises seda veel kasutada ei soovita.
Tükke saab salvestada S3-ga ühilduvasse salvestusruumi, indeksite salvestamiseks kasutage horisontaalselt skaleeritavaid andmebaase: Cassandra, BigTable või DynamoDB. Loki muud osad – Levitajad (kirjutamiseks) ja Querier (päringute jaoks) – on olekuta ja ka horisontaalselt skaleeritavad.
Saadud indeksi suuruse testimiseks võtsin logid nginxi konteinerist, mille jaoks ülaltoodud Pipeline oli konfigureeritud. Logifail sisaldas 406 624 rida kogumahuga 109 MB. Logid loodi tunni jooksul, umbes 100 kirjet sekundis.
Näide kahest reast logist:
ELK indekseerides andis see indeksi suuruseks 30,3 MB:
Loki puhul andis see tükkidena umbes 128 KB indeksit ja umbes 3,8 MB andmeid. Väärib märkimist, et logi loodi kunstlikult ja see ei sisaldanud väga erinevaid andmeid. Lihtne gzip algse Dockeri JSON-logi andmetega andis tihenduseks 95,4% ja arvestades, et Lokile saadeti ainult puhastatud nginxi logi, on tihendamine 4 MB-ni arusaadav. Loki siltide unikaalsete väärtuste koguarv oli 35, mis seletab indeksi väiksust. ELK jaoks sai ka palgi koristatud. Nii tihendas Loki algandmeid 96% ja ELK 70%.
Mälu tarbimine
Kui võrrelda kogu Prometheuse ja ELK stäkki, siis Loki "sööb" kordades vähem. On selge, et Go-teenus tarbib vähem kui Java-teenus ning Heap Elasticsearch JVM-i suuruse ja Loki jaoks eraldatud mälu võrdlemine on vale, kuid sellegipoolest väärib märkimist, et Loki kasutab palju vähem mälu. Selle protsessori eelis pole nii ilmne, kuid see on ka olemas.
Kiirus
Loki "õgib" palke kiiremini. Kiirus sõltub paljudest teguritest - millistest logidest, kui keerukalt neid sõelume, võrk, ketas jne -, kuid see on kindlasti suurem kui ELK-l (minu testis - umbes kaks korda). Seda seletatakse asjaoluga, et Loki paneb indeksisse palju vähem andmeid ja kulutab seetõttu indekseerimisele vähem aega. Otsingukiirusega on sel juhul olukord vastupidine: Loki aeglustub märgatavalt mõnest gigabaidist suurematel andmetel, samas kui ELK puhul ei sõltu otsingukiirus andmemahust.
Logi otsing
Loki jääb logiotsingu võimekuse poolest ELK-le oluliselt alla. Regulaaravaldistega Grep on tugev asi, kuid jääb alla täiskasvanute andmebaasile. Vahemikupäringute puudumine, koondamine ainult siltide järgi, võimetus otsida ilma siltideta - kõik see piirab meid Lokis huvipakkuva teabe otsimisel. See ei tähenda, et Loki abil midagi ei leita, kuid see määrab logidega töötamise voo, kui leiate esmalt Prometheuse diagrammidelt probleemi ja seejärel otsite nende siltide abil logidest, mis juhtus.
liides
Esiteks on see ilus (vabandust, ei suutnud vastu panna). Grafanal on kena välimusega liides, kuid Kibana on palju funktsionaalsem.
Loki plussid ja miinused
Plussidest võib märkida, et Loki integreerub vastavalt Prometheusega, saame mõõdikud ja hoiatamise karbist välja. See on mugav logide kogumiseks ja Kubernetes Podidega salvestamiseks, kuna sellel on Prometheuselt päritud teenusetuvastus ja see lisab sildid automaatselt.
Miinustest - halb dokumentatsioon. Mõned asjad, nagu Promtaili funktsioonid ja võimalused, avastasin alles koodi uurimise käigus, avatud lähtekoodiga eelised. Teine puudus on nõrk sõelumisvõimalus. Näiteks ei saa Loki sõeluda mitmerealisi logisid. Samuti on puuduste hulgas asjaolu, et Loki on suhteliselt noor tehnoloogia (väljalase 1.0 ilmus 2019. aasta novembris).
Järeldus
Loki on 100% huvitav tehnoloogia, mis sobib väikestele ja keskmistele projektidele, võimaldades lahendada paljusid palkide koondamise, palkide otsimise, jälgimise ja analüüsimise probleeme.
Lokit me Badoos ei kasuta, sest meil on meile sobiv ELK stäkk, mis on aastate jooksul erinevate kohandatud lahendustega üle kasvanud. Meie jaoks on komistuskiviks otsimine palkidest. Ligi 100 GB logiga päevas on meie jaoks oluline, et suudaksime kõik ja natuke rohkemgi üles leida ning teha seda kiiresti. Diagrammi koostamiseks ja jälgimiseks kasutame muid lahendusi, mis on meie vajadustele kohandatud ja omavahel integreeritud. Loki pinal on käegakatsutavad eelised, kuid see ei anna meile rohkem kui see, mis meil on, ja selle eelised ei kaalu täpselt üles migratsiooni kulusid.
Ja kuigi pärast uurimistööd sai selgeks, et me ei saa Lokit kasutada, loodame, et see postitus aitab teid valiku tegemisel.