Siūlau perskaityti Romano Khavronenko pranešimo „ExtendedPromQL“ stenogramą
Trumpai apie mane. Mano vardas Romanas. Aš dirbu CloudFlare ir gyvenu Londone. Bet aš taip pat esu „VictoriaMetrics“ prižiūrėtojas.
Ir aš esu autorius
Pradėsime nuo pirmosios dalies, kuri vadinasi „Vertimo sunkumai“ ir joje kalbėsiu apie tai, kad bet kokia kalba ar net tik bendravimo kalba yra labai svarbi. Nes taip savo mintis perteiki kitam žmogui ar sistemai, kaip suformuluoji prašymą. Internete žmonės ginčijasi, kuri kalba geresnė – java ar kokia kita. Dėl savęs nusprendžiau, kad reikia pasirinkti užduotį, nes visa tai yra specifinė.
Pradėkime nuo pat pradžių. Kas yra PromQL? PromQL yra Prometheus užklausų kalba. Taip Prometheus formuojame užklausas, kad gautume laiko eilučių duomenis, laiko eilutes.
Kas yra laiko eilučių duomenys? Žodžiu, tai yra trys parametrai.
Jie yra:
- Ką mes žiūrime.
- Kai žiūrime į tai.
- Ir kokią vertę tai parodo.
Jei pažvelgsite į šią diagramą (ši diagrama yra iš mano telefono, kurioje rodoma mano žingsnių statistika), tada čia galite greitai atsakyti į šiuos klausimus.
Mes žiūrime į žingsnius. Mes matome prasmę ir matome laiką, kai žiūrime į jį. Tai yra, pažvelgus į šią diagramą, galite lengvai pasakyti, kad sekmadienį nuėjau apie 15 000 žingsnių. Tai laiko eilučių duomenys.
Dabar juos „sulaužykime“ (paverskime) į kitą duomenų modelį lentelės pavidalu. Čia taip pat turime tai, į ką žiūrime. Čia pridėjau šiek tiek papildomų duomenų, kuriuos vadinsime metaduomenimis, tai yra, perėjau ne aš, o du žmonės, pavyzdžiui, Jay ir Silent Bob. Štai į ką mes žiūrime; ką jis rodo ir kada parodo tą vertę.
Dabar pabandykime visus šiuos duomenis saugoti duomenų bazėje. Pavyzdžiui, aš paėmiau ClickHouse sintaksę. Ir čia mes kuriame vieną lentelę pavadinimu „Žingsniai“, t.y., į ką žiūrime. Čia yra laikas, kai mes į tai žiūrime; ką jis rodo, ir kai kuriuos metaduomenis, kur saugosime, kas tai yra: Jay ir Silent Bob.
O kad pabandytume visa tai vizualizuoti, naudosime Grafana, nes, pirma, ji graži.
Taip pat naudosime šį papildinį. Tam yra dvi priežastys. Pirma, nes aš tai parašiau. Ir aš tiksliai žinau, kaip sunku iš „ClickHouse“ ištraukti laiko eilučių duomenis, kad juos būtų galima parodyti „Grafana“.
Rodysime grafikų skydelyje. Tai populiariausias „Grafana“ skydelis ir rodo vertę, palyginti su laiku, todėl mums reikia tik dviejų parametrų.
Parašykime paprasčiausią užklausą – kaip parodyti žingsnių statistiką Grafana, išsaugant šiuos duomenis ClickHouse, į mūsų sukurtą lentelę. Ir mes rašome tokią paprastą užklausą. Renkamės iš žingsnių. Mes pasirenkame reikšmę ir pasirenkame šių reikšmių laiką, ty tuos pačius tris parametrus, apie kuriuos kalbėjome.
Ir kaip rezultatas, mes gauname šį grafiką. Kas žino, kodėl jis toks keistas?
Teisingai, reikia rūšiuoti pagal laiką.
Ir galiausiai gauname geresnį, bet vis tiek keistą tvarkaraštį. Kas žino kodėl? Taip, yra du dalyviai, o „Grafana“ atiduodame dvi laiko eilutes, nes jei dar kartą susidorosime su duomenų modeliu, kiekviena laiko eilutė yra unikalus pavadinimo ir visų etikečių raktų-reikšmių derinys.
Todėl turime pasirinkti konkretų žmogų. Mes pasirenkame Jay.
Ir vėl piešti. Dabar grafikas atrodo kaip tiesa. Dabar tai normalus grafikas ir viskas veikia gerai.
Ir tikriausiai žinote, kaip padaryti tą patį, bet „Prometheus“ per PromQL. Maždaug taip. Šiek tiek lengviau. Ir viską suskaidykime. Žengėme žingsnius. Ir filtruoti pagal Jay. Čia nenurodome, kad reikia gauti vertę ir nesirenkame laiko.
Dabar pabandykime apskaičiuoti Jay arba Silent Bob judėjimo greitį. „ClickHouse“ turėsime atlikti „runDifference“, ty apskaičiuoti skirtumą tarp taškų porų ir padalyti jas iš laiko, kad gautume tikslų greitį. Prašymas atrodys maždaug taip.
Ir jis parodys apytiksliai šias reikšmes, t. y. maždaug 1,8 žingsnio per sekundę Tylus Bobas ar Jay.
Ir Prometėjas jūs taip pat žinote, kaip tai padaryti. Daug lengviau nei anksčiau.
O kad tai būtų lengva padaryti ir Grafana, pridėjau tokį įvyniojimą, kuris atrodo labai panašus į PromQL. Tai vadinama greičio makrokomandomis arba kaip norite tai pavadinti. Grafanoje tiesiog rašai „rate“, bet kažkur giliai tai transformuojasi į tokį didelį prašymą. Ir net nereikia į jį žiūrėti, jis kažkur yra, bet sutaupai daug laiko, nes rašyti tokias milžiniškas SQL užklausas visada brangu. Galite lengvai suklysti ir ilgai nesuprasti, kas vyksta.
Ir tai yra užklausa, kuri net netilpo vienoje skaidrėje, ir aš turėjau ją padalinti į du stulpelius. Tai taip pat yra užklausa „ClickHouse“, kuri sukuria tą patį rodiklį, tačiau abiem laiko eilutėms: „Silent Bob“ ir „Jay“, kad skydelyje būtų dvi laiko eilutės. O tai jau labai sunku, mano nuomone.
O pagal Prometėją tai bus suma (kursas). „ClickHouse“ sukūriau atskirą makrokomandą „RateColumns“, kuri atrodo kaip „Prometheus“ užklausa.
Mes pažiūrėjome ir atrodo, kad PromQL yra toks šaunus, tačiau, žinoma, jis turi apribojimų.
Jie yra:
- Ribotas SELECT.
- Edge JOIN.
- NĖRA TURĖTI paramos.
Ir jei dirbate su juo ilgą laiką, tada žinote, kad kartais labai sunku ką nors padaryti PromQL, o SQL galite padaryti beveik viską, nes visas šias parinktis, apie kurias ką tik kalbėjome, galima padaryti SQL . Bet ar būtų patogu juo naudotis? Ir tai verčia mane galvoti, kad ne visada galingiausia kalba gali būti pati patogiausia.
Todėl kartais reikia pasirinkti kalbą užduotims atlikti. Tai tarsi mūšis tarp Betmeno ir Supermeno. Aišku, kad Supermenas stipresnis, bet Betmenas sugebėjo jį nugalėti, nes yra praktiškesnis ir tiksliai žinojo, ką daro.
O kita dalis – PromQL išplėtimas.
Dar kartą apie VictoriaMetrics. Kas yra VictoriaMetrics? Tai laiko eilučių duomenų bazė, ji yra atvirojo kodo, platiname jos vienos ir klasterio versijas. Pagal mūsų etalonus jis yra greičiausias, koks dabar yra rinkoje, o glaudinimo prasme panašus, t.y. gyvi žmonės praneša apie 0,4 baito suspaudimą taške, kai Prometheus turi 1,2–1,4.
Mes palaikome ne tik Prometėją. Mes palaikome InfluxDB, Graphite, OpenTSDB.
Galite "rašyti" pas mus, tai yra, galite perkelti senus duomenis.
Taip pat puikiai dirbame su Prometheus ir Grafana, t.y. palaikome PromQL variklį. O „Grafana“ galite tiesiog pakeisti „Prometheus“ galinį tašką į „VictoriaMetrics“ ir visos jūsų prietaisų skydeliai veiks taip, kaip veikia.
Tačiau taip pat galite naudoti papildomus „VictoriaMetrics“ pateiktus lustus.
Greitai peržiūrėsime pridėtas funkcijas.
Praleisti intervalo parametrą – galite praleisti parametrų intervalą Grafana. Kai nenorite gauti keistų grafikų didinant/mažinant skydelį, rekomenduojama naudoti kintamąjį $__interval
. Tai vidinis „Grafana“ pakeitimas ir pats pasirenka duomenų diapazoną. Ir „VictoriaMetrics“ pati gali suprasti, koks turėtų būti šis diapazonas. Ir jums nereikia atnaujinti visų savo užklausų. Bus daug lengviau.
Antroji funkcija yra intervalų nuoroda. Šį tarpą galite naudoti savo išraiškose. Galite dauginti, dalyti, perkelti, remtis.
Kitas yra sujungimo funkcijų šeima. Apibendrinimo funkcija paverčia bet kurią jūsų laiko eilutę į tris atskiras laiko eilutes. Tai yra min., maks. ir vid. Man tai labai patogu, nes kartais gali pasirodyti kažkokių nukrypimų (anomalijų) ir netikslumų.
Ir jei jūs tiesiog pykstate ar vertinate, tikriausiai galite praleisti kai kuriuos atvejus, kai laiko eilutė elgiasi ne taip, kaip norėjote. Tai daug lengviau matyti naudojant šią funkciją, tarkime, maksimalus dydis labai skiriasi nuo vid.
Kitas yra numatytasis kintamasis. Numatytasis - tai reiškia, kokią vertę turime nubrėžti Grafana, jei šiuo metu neturime laiko eilutės. Kada tai įvyksta? Tarkime, kad eksportuojate tam tikrą klaidų metriką. Ir jūs turite tokią šaunią programą, kurią paleidę per ateinančias tris valandas ar net dieną neturite klaidų ir net jokių klaidų. Ir jūs turite informacijos suvestines, kuriose rodomi santykiai nuo sėkmės iki klaidų. Ir jie jums nieko nerodys, nes neturite klaidų metrikos. Ir pagal nutylėjimą galite nurodyti bet ką.
Keep_last_Value – išsaugo paskutinę metrikos reikšmę, jei jos trūksta. Jei Prometėjas po kito įbrėžimo jo nerado per 5 minutes, tai čia mes atsiminsime paskutinę jo reikšmę ir jūsų diagramos daugiau nenutrūks.
Scrape_interval – parodo, kaip dažnai Prometheus renka duomenis apie jūsų metriką ir kokiu dažnumu. Pavyzdžiui, čia galite pamatyti leidimą.
Etiketės keitimas yra populiari funkcija. Bet mes manome, kad tai šiek tiek sudėtinga, nes reikia sveikųjų skaičių. Ir reikia ne tik atsiminti 5 argumentus, bet ir atsiminti jų seką.
Todėl kodėl gi jų nesupaprastinus? Tai yra, suskaidykite jį į mažas funkcijas su aiškia sintaksė.
O dabar įdomiausia. Kodėl manome, kad tai išplėstas PromQL? Kadangi palaikome bendrąsias lentelės išraiškas. Galite sekti QR kodą (
Ir kas tai yra? Šis prašymas iš viršaus yra gana populiarus prašymas. Manau, kad daugelyje įmonių prietaisų skydelyje viskam naudojate tą patį filtrą. Paprastai taip. Bet kai reikia pridėti naują filtrą, turite atnaujinti kiekvieną skydelį arba atsisiųsti prietaisų skydelį, atidaryti jį JSON, atlikti radimo pakeitimą, o tai taip pat užtrunka. Kodėl neišsaugojus šios reikšmės kintamajame ir nepanaudojus jos dar kartą? Mano nuomone, tai atrodo daug paprasčiau ir aiškiau.
Pavyzdžiui, kai man reikia atnaujinti „Grafana“ filtrus visose užklausose, o prietaisų skydelis gali būti didžiulis arba jų gali būti net keli. Ir kaip aš norėčiau išspręsti šią problemą Grafana?
Šią problemą sprendžiu taip: sukuriu commonFilter ir apibrėžiu jame šį filtrą, o tada vėl naudoju jį užklausose. Bet jei tą patį padarysite dabar, tai neveiks, nes „Grafana“ neleidžia naudoti kintamųjų užklausos kintamuosiuose. Ir tai šiek tiek keista.
Taigi aš padariau parinktį, kuri leidžia jums tai padaryti. O jei domitės ar norite tokios funkcijos, tuomet palaikykite arba nepatinka, jei ši idėja jums nepatinka.
Daugiau apie PromQL išplėstą. Čia apibrėžiame ne tik kintamąjį, bet ir tiesiogiai visą funkciją. Ir mes tai vadiname ru (resursų naudojimas). Ir ši funkcija priima nemokamus išteklius, išteklių limitą ir filtrą. Sintaksė atrodo paprasta. O naudotis šia funkcija ir apskaičiuoti, kiek procentų turime laisvos atminties, labai paprasta. Tai yra, kiek atminties turime, kokia riba ir kaip filtruoti. Atrodytų daug geriau, jei viską parašytumėte pakartotinai naudodami tuos pačius filtrus, nes tai virstų didele, didele užklausa.
Ir štai tokio didelio, didelio prašymo pavyzdys. Tai iš oficialios „Grafana“ skirtos „NodeExporter“ prietaisų skydelio. Bet aš nelabai suprantu, kas čia vyksta. Tai, žinoma, suprantu, jei gerai įsižiūri, bet skliaustų skaičius gali iš karto sumažinti motyvaciją suprasti, kas čia vyksta. Ir kodėl gi to nepadarius paprasčiau ir aiškiau?
Pavyzdžiui, kaip šis, paryškinant reikšmingus dalykus ar dalis kintamuosiuose. Ir tada atlikite savo pagrindinę matematiką. Tai daugiau kaip programavimas, tai aš norėčiau ateityje pamatyti Grafana.
Štai antras pavyzdys, kaip galime padaryti dar lengviau, jei jau turėjome šią ru funkciją ir ji jau yra tiesiogiai „VictoriaMetrics“. Tada tiesiog perduodate talpykloje esančią vertę, kurią deklaravote CTE.
Jau kalbėjau apie tai, kaip svarbu naudoti tinkamą programavimo kalbą. Ir tikriausiai kiekvienoje įmonėje Grafana vyksta kažkas kitokio. Ir tikriausiai jūs vis tiek suteikiate prieigą prie „Grafana“ savo kūrėjams, o kūrėjai daro kažką savo. Ir visi jie tai daro skirtingai. Bet aš norėjau kažkaip to paties, tai yra, sumažinto iki bendro standarto.
Tarkime, kad jūs netgi neturite sistemos inžinierių, galbūt netgi turite ekspertų, devops ar SRE. Galbūt turite ekspertų, kurie žino, kas yra stebėjimas, žino, kas yra „Grafana“, t. y. jie su tuo dirba daugelį metų ir tiksliai žino, kaip tai padaryti teisingai. Ir jau 100 kartų rašė ir visiems aiškino, bet kažkodėl niekas neklauso.
O kas, jei jie galėtų šias žinias įdėti tiesiai į „Grafana“, kad kiti vartotojai galėtų pakartotinai panaudoti funkcijas? O jei reikėtų skaičiuoti laisvos atminties procentą, tai jie tiesiog pritaikytų funkciją. Tačiau kas būtų, jei eksportuotojų kūrėjai kartu su savo produktu pateiktų ir funkcijų rinkinį, kaip dirbti su savo metrikais, nes jie tiksliai žino, kas tai yra ir kaip teisingai juos apskaičiuoti?
Šis tikrai neegzistuoja. Štai ką aš padariau pats. Tai yra „Grafana“ bibliotekos palaikymas. Tarkime, vaikinai, kurie sukūrė „NodeExporter“, padarė tai, ką aprašiau. Taip pat pateikė funkcijų rinkinį.
Tai yra, tai atrodo maždaug taip. Šią biblioteką prijungiate prie „Grafana“, pradedate redaguoti, o štai JSON labai paprasta dirbti su šia metrika. Tai yra, tam tikras funkcijų rinkinys, jų aprašymas ir į ką jos išsiskleidžia.
Mano nuomone, tai galėtų būti naudinga, nes tada rašytum Grafana tiesiog taip. O Grafana jums „pasakoja“, kad iš tokios ir tokios bibliotekos yra tokia ir tokia funkcija – naudokimės. Manau, būtų labai šaunu.
Šiek tiek apie VictoriaMetrics. Mes darome daug įdomių dalykų. Skaitykite mūsų straipsnius apie glaudinimą, apie mūsų konkurenciją su kitomis laiko eilučių duomenų programomis, mūsų paaiškinimus, kaip dirbti su PromQL, nes čia yra daug daugiau pradedančiųjų, taip pat apie vertikalų mastelio keitimą ir apie konfrontaciją su Thanos.
Klausimai:
Savo klausimą pradėsiu nuo paprastos gyvenimo istorijos. Kai pirmą kartą pradėjau naudoti „Grafana“, parašiau labai įtikinamą 5 eilučių užklausą. Galutinis rezultatas yra labai įtikinama diagrama. Šis grafikas beveik pradėtas gaminti. Tačiau atidžiau pažiūrėjus paaiškėjo, kad ši diagrama rodo absoliučią nesąmonę, kuri neturi nieko bendra su realybe, nors skaičiai patenka į tą diapazoną, kurį tikėjomės pamatyti. Ir mano klausimas. Mes turime bibliotekas, turime funkcijas, bet kaip parašyti „Grafana“ testus? Parašėte sudėtingą užklausą, kuri turi įtakos verslo sprendimui – užsakyti tikrą serverių konteinerį ar ne. Ir, kaip žinome, ši funkcija, nubrėžianti grafiką, yra panaši į tiesą. Ačiū.
Ačiū už klausimą. Čia yra dvi dalys. Pirma, remdamasis savo patirtimi susidaro įspūdis, kad dauguma vartotojų, žiūrėdami į savo diagramas, nesupranta, ką jie rodo. Kažkaip žmonės labai gerai sugalvoja pasiteisinimą bet kokiai diagramose pasitaikančiam anomalijai, net jei tai yra funkcijos klaida. Ir antroji dalis – man atrodo, kad tokių funkcijų naudojimas daug labiau tiktų jūsų problemai spręsti, o ne kiekvienas jūsų kūrėjas pats planuotų pajėgumus ir su tam tikra tikimybe klystytų.
Kaip patikrinti?
Kaip patikrinti? Tikriausiai ne.
Kaip išbandymas Grafanoje.
O kaip Grafana? „Grafana“ verčia šią užklausą tiesiai į duomenų šaltinį.
Šiek tiek pridedant prie parametrų.
Ne, prie Grafanos nieko nepridėta. Gali būti GET parametrai, pvz., žingsnis. Jis nėra aiškiai nurodytas, bet jūs galite jį nepaisyti, negalite jo nepaisyti, bet jis pridedamas automatiškai. Testų čia nerašysi. Nemanau, kad čia reikėtų pasikliauti Grafana kaip tiesos šaltiniu.
Ačiū už pranešimą! Ačiū už suspaudimą! Jūs prisiminėte apie kintamojo atvaizdavimą grafike, kad Grafana negalite naudoti kintamojo kintamajame. Ar supranti, ką aš turiu galvoje?
Taip.
Iš pradžių tai buvo galvos skausmas, kai norėjau įspėti Grafaną. Ir čia reikia perspėti kiekvieną pagrindinį kompiuterį atskirai. Štai ką jūs padarėte: ar jis veikia su įspėjimais sistemoje „Grafana“?
Jei Grafana nepasiekia kintamųjų kitu būdu, tada taip, jis veiks. Bet aš patariu iš viso nenaudoti įspėjimų Grafana, geriau naudoti alertmanager.
Taip, aš jį naudoju, bet atrodė, kad tai lengviau nustatyti Grafana, bet ačiū už patarimą!
Šaltinis: www.habr.com