Tutvustan Romain Khavroenko raporti "ExtendedPromQL" sisukokkuvÔtet.


LĂŒhidalt minust. Minu nimi on Romain. Töötoime CloudFlare'is, elan Londonis. Olen ka VictoriaMetrics'i hooldaja.
Ja ma olen autor Grafana jaoks ja â see on vĂ€ike proxy ClickHouse'i jaoks.

Kasutame esimest osa, mis kannab nime "TĂ”lke keerukused", kus rÀÀgin, et iga keel vĂ”i isegi lihtsalt suhtlemiskeel on vĂ€ga oluline. Sest see on viis, kuidas edastate oma mĂ”tteid teisele inimesele vĂ”i sĂŒsteemile, kuidas te esitate pĂ€ringu. Internetis vaieldakse selle ĂŒle, milline keel on parem â java vĂ”i mĂ”ni muu. Otsustasin, et tuleb valida vastavalt ĂŒlesandele, sest kĂ”ik see on spetsiifiline.

Alustame algusest. Mis on PromQL? PromQL on Prometheuse pÀringukeel. See on viis, kuidas me vormistame pÀringud Prometheuses, et saada ajaseeria andmeid.

Mis on ajaseeria andmed? Kui vÔtta sÔnasÔnaliselt, siis need on kolm parameetrit.
Need on:
- Millele me vaatame.
- Millal me sellele vaatame.
- Ja milline vÀÀrtus nÀitab.

Kui vaadata seda diagrammi (see diagramm on minu telefonist, mis nĂ€itab minu samblaste statistikat), siis saame kiiresti sellele kĂŒsimusele vastata.
Me vaatame samme. NĂ€eme vÀÀrtust ja aega, mil me sellele vaatame. Seega, vaadates seda diagrammi, on lihtne öelda, et pĂŒhapĂ€eval kĂ”ndisin umbes 15 000 sammu. Need on ajaseeria andmed.

NĂŒĂŒd proovime "jaotada" (muuta) need teise andmemudeli kujul tabelina. Siin on meil samuti see, millele me vaatame. Siia olen lisanud tĂ€iendavaid andmeid, mida nimetame metaandmeteks, seega see ei olnud mitte mina, vaid kaks inimest, oletame, Jay ja Silent Bob. See on see, millele me vaatame; mida see nĂ€itab ja millal see vÀÀrtus nĂ€itab.

NĂŒĂŒd proovime salvestada kĂ”ik need andmed andmebaasi. NĂ€iteks vĂ”tsin ClickHouse'i sĂŒntaksi. Siin loome ĂŒhe tabeli, mis kannab nime "Steps", st millele me vaatame. Siin on aeg, mil me sellele vaatame; mida see nĂ€itab ja mĂ”ned metaandmed, kus me salvestame, kes see on: Jay ja Silent Bob.

Ja et proovida seda kÔike visualiseerida, kasutame Grafana't, sest eelkÔige on see ilus.

Me kasutame ka seda pistikprogrammi. Selleks on kaks pÔhjust. Esiteks, sest mina selle kirjutasin. Ja ma tean tÀpselt, kui keeruline on time series andmete eraldamine ClickHouse'ist, et neid Grafanas nÀidata.

KÀtkeme Graph Panelis. See on kÔige populaarsem paneel Grafanas, mis kuvab vÀÀrtuse sÔltuvust ajast, seega vajame ainult kahte parameetrit.

Kirjutame kĂ”ige lihtsama pĂ€ringu â kuidas nĂ€idata samme Grafanas, mille andmed on salvestatud ClickHouse'i, tabelisse, mille me lĂ”ime. Ja me kirjutame sellise lihtsa pĂ€ringu. Valime sammudest. Valime vÀÀrtuse ja valime nende vÀÀrtuste aja, st samad kolm parameetrit, millest me rÀÀkisime.

Ja tulemuseks saame sellise graafiku. Kas keegi teab, miks see nii kummaline on?

Ăige, tuleb sorteerida ajas.

Ja lĂ”puks saame juba parem, aga ikka kummalise graafiku. Kas keegi teab, miks? Ăige, seal on kaks osalejat, ja me saame Grafanas kaks time series, sest kui vaatame tĂŒpoloogiat veel kord, siis iga time series on ainulaadne kombinatsioon nimest ja kĂ”igist vĂ”tme-vÀÀrtuse labelitest.

Seega peame valima konkreetse isiku. Valime Jay.

Ja joonistame uuesti. NĂŒĂŒd nĂ€eb graafik vĂ€lja nagu tĂ”de. NĂŒĂŒd on see normaalne graafik ja kĂ”ik töötab hĂ€sti.

Ja ilmselt teate, kuidas teha umbes sama ka Prometheuses lÀbi PromQL. Umbes nii. Veidi lihtsam. Ja veel jagame selle kÔik. Me vÔtsime Steps. Ja filtreerime Jay jÀrgi. Me ei nÀita siin, et me tahame saada vÀÀrtust ja me ei vali aega.

Aga nĂŒĂŒd proovime arvutada Jay vĂ”i Silent Bob'i liikuvuse kiirus. ClickHouse'is peame tegema runningDifference, st arvutama paaride punktide erinevuse ja jagama nad ajaga, et saada tĂ€pne kiirus. PĂ€ring nĂ€eb vĂ€lja umbes nii.

Ja see nÀitab umbes selliseid vÀÀrtusi, st umbes 1,8 sammu sekundis teeb Silent Bob vÔi Jay.

Ja Prometheuses teate, kuidas seda teha samuti. Oluliselt lihtsam, kui see oli varem.
Ja et see oleks Grafanas lihtne, lisasin ma sellise mĂ€hise, mis sarnaneb PromQL-iga. Seda nimetatakse Rate Macros vĂ”i kuidas iganes soovite. Grafanas kirjutate lihtsalt ârateâ, kuid kuskil sĂŒgaval muudetakse see suureks pĂ€ringuks. Teie ei pea isegi sellele vaatama, see on seal kuskil, kuid sÀÀstate rohkesti aega, sest selliste suurte SQL-pĂ€ringute kirjutamine on alati aeganĂ”udev. Te vĂ”ite kergesti eksida ja hiljem kaua aru saada, mis toimub.

Ja see on pĂ€ring, mis ei mahtunud isegi ĂŒhele slaidile ja pidin selle jagama kaheks veeruks. See on samuti pĂ€ring ClickHouse'is, mis teeb sama rate'i, kuid mĂ”lema aega seeria kohta: nii Silent Bobi kui ka Jay kohta, et meil oleks paneelil kaks aega seeriat. Ja see on juba vĂ€ga keeruline, minu arvates.

Ja Prometheusele on see sum (rate). ClickHouse'i jaoks tegin ma eraldi makro, mida nimetatakse RateColumns, mis nÀeb vÀlja nagu pÀring Prometheuses.

Me vaatasime ja tundus, et PromQL on tÔeliselt Àge, kuid sellel on loomulikult omad piirangud.
Need on:
- Piiratud SELECT.
- Piiratud JOIN.
- Puudub HAVING tugi.
Ja kui olete sellega kaua töötanud, siis teate, et mÔnikord on PromQL'is midagi teha vÀga raske, samas kui SQL-is saab teha praktiliselt kÔike, sest kÔik need variandid, millest me praegu rÀÀkisime, oleks saanud teostada SQL-is. Kuid kas oleks mugav seda kasutada? Ja see viib mind mÔtlema, et mitte alati ei pruugi kÔige vÔimsam keel olla kÔige mugavam.

SeetĂ”ttu tuleb mĂ”nikord valida keel ĂŒlesannete jĂ€rgi. See on nagu Batmani ja Supermani lahing. Selge, et Superman on tugevam, kuid Batman suutis ta vĂ”ita, sest ta on praktilisem ja teadis tĂ€pselt, mida teeb.

Ja jÀrgmine osa on Extending PromQL.

Veel kord VictoriaMetricsist. Mis on VictoriaMetrics? See on ajalooliste andmete baas, mis on OpenSource, me jagame selle single- ja klastriversioone. Meie benchmarkide kohaselt on see kiireim, mis turul praegu on ja kompressioon on samuti sarnane, st elavad inimesed teatavad kompressioonist umbes 0,4 bait/punkt, kui Prometheuse puhul on see 1,2-1,4.
Me toetame mitte ainult Prometheust. Me toetame InfluxDB-d, Graphite'i, OpenTSDB-d.
Meisse saab "kirjutada", st vanu andmeid saab ĂŒle kanda.
Ja me töötame ideaalselt Prometheuse ja Grafanaga, st toetame PromQL mootorit. Ja Grafanas vÔite lihtsalt vahetada Prometheuse lÔpp-punkti VictoriaMetricsi vastu, ja teie kÔik armatuurlaud toimib nagu enne.
Kuid saate kasutada ka tÀiendavaid funktsioone, mida VictoriaMetrics pakub.
Vaatame kiiresti funktsioone, mille me oleme lisanud.

Omandage interval'i parameeter â saate Grafanas vahe parameetreid vahele jĂ€tta. Kui te ei soovi saada kummalisi graafikuid, kui zoomite sisse/vĂ€lja paneelil, siis on soovitatav kasutada muutujat $__interval. See on Grafana sisemine muutuja ja see valib ise andmete vahemiku. Ja VictoriaMetrics suudab ise mĂ”ista, milline see vahemik olema peab. Te ei pea uuendama oma pĂ€ringuid. See on palju lihtsam.

Teine funktsioon on intervalli viitamine. Saate seda intervalli kasutada oma vÀljendites. Saate seda korrutada, jagada, edastada ja viidata sellele.

Edasi liikudes rollup funktsioonide kogum. Rollup funktsioon muudab teie ajaseeriad kolmeks eraldi ajaseeriaks. Need on min, max ja avg. Arvan, et see on vÀga mugav, kuna see vÔib mÔnikord nÀidata teatud kÔrvalekaldeid ja ebatÀpsusi.

Ja kui te lihtsalt teete irate vÔi rate, siis on tÔenÀoline, et vÔite mÔnda juhtumit kÔrvale jÀtta, kui ajaseeria kÀitub mitte nii, nagu te oletate. Selle funktsiooniga on palju lihtsam nÀha, et nÀiteks max on palju kÔrgem kui avg.

Edasi muutuja default. Default tĂ€hendab, millist vÀÀrtust peame Grafanas joonistama, kui meil ei ole ajaseeriat hetkel. Millal see juhtub? Oletame, et ekspordite mĂ”nda veateavet. Ja teil on nii suur rakendus, et kui te alustate, siis ei ole teil vigu ja isegi kolme tunni jooksul vĂ”i isegi pĂ€eva jooksul ei ole vigu. Ja teil on armatuurlaud, mis nĂ€itab suhete suhet edus ja vigades. Ja nad nĂ€itavad teile mitte midagi, kuna teil ei ole veateavet. Default's saate mÀÀrata ĂŒkskĂ”ik mida.

Keep_last_Value â salvestab viimase mÔÔtme vÀÀrtuse, kui see kaob. Kui Prometheus ei leia jĂ€rgmisel hÀÀlestamisel seda viie minuti jooksul, siis salvestame selle viimase vÀÀrtuse ja teie graafikud ei purune uuesti.

Scrape_interval â nĂ€itab, kui tihti Prometheus kogub andmeid teie mÔÔdiku kohta, kui sageli. Siit on nĂ€iteks vĂ”imalik nĂ€ha lĂŒnki.

Label replace â populaarne funktsioon. Kuid meie arvates on see pisut keeruline, kuna see vĂ”tab terveid argumente. Ja peate mitte ainult meeles pidama 5 argumenti, vaid ka nende jĂ€rjekorda.

SeetĂ”ttu, miks mitte teha neid lihtsamaks? St. jagada vĂ€ikesteks funktsioonideks, millel on arusaadav sĂŒntaks.

Ja nĂŒĂŒd tuleb huvitav osa. Miks me arvame, et see on extended PromQL? Sest toetame Ăhislauda. Sa saad skaneerida QR-koodi (), vaadata nĂ€idiste linke, mĂ€nguvĂ€ljakku, kus saad teostada pĂ€ringuid otse VictoriaMetrics'is ilma selle installimata lihtsalt brauseris.

Ja mis see siis on? See ĂŒlalpool olev pĂ€ring â see on ĂŒsna populaarne pĂ€ring. Ma arvan, et igas andmevisualiseerimises paljudes ettevĂ”tetes kasutad sama filtrit kĂ”igi jaoks. Tavaliselt nii. Aga kui pead lisama mingi uue filtri, tuleb iga paneel uuendada vĂ”i laadida andmevisualiseerimine alla, avada JSON-is, teha find replace, mis ka vĂ”tab aega. Miks mitte hoida seda vÀÀrtust muutujas ja taaskasutada seda? See tundub minu arvates palju lihtsam ja arusaadavam.

NÀiteks, kui mul on vaja uuendada filtreid Grafanas kÔigis pÀringutes, ja andmevisualiseerimine vÔib olla tohutu vÔi neid vÔib olla isegi mitu. Ja kuidas ma sooviksin seda probleemi Grafanas lahendada?

Lahendan selle probleemi nii: teen commonFilteri ja mÀÀratlen selles filtris, ning seejĂ€rel taaskasutada seda pĂ€ringutes. Kuid kui sa teed nĂŒĂŒd samamoodi, ei toimi see, sest Grafana ei luba sul kasutada muutujaid sisemistes pĂ€ringumuutujates. Ja see on veidi kummaline.

Ja seetÔttu tegin sellise variandi, mis lubab seda teha. Ja kui see huvitab sind vÔi soovid sellist funktsiooni, siis toeta vÔi hinda negatiivselt, kui sulle ei meeldi selline idee.

Edasi extended PromQL'i kohta. Siin mÀÀratleme mitte ainult muutuja, vaid lausa terve funktsiooni. Ja nimetame selle ru (resource usage). See funktsioon vĂ”tab vastu vabad ressursid, ressursi piirangu ja filtri. SĂŒntaks tundub olema lihtne. Ja on vĂ€ga lihtne kasutada seda funktsiooni ning arvutada meie vabade mĂ€lu protsent. St. kui palju meil on mĂ€lu, mis on piirang ja kuidas filtreerida. See tundub oluliselt mugavam, sest kirjutades kĂ”ik kasutada sama filtrit, see muutuks suureks-pĂ€devaks pĂ€ringuks.

Ja, ja nÀide sellisest suurest pÀringust. See on ametlikust NodeExporter'i juhtpaneelist Grafanas. Aga ma ei saa aru, mis siin toimub. T. e., muidugi, ma saan aru, kui tÀhelepanelikult vaadata, aga sulgede arv vÔib kohe motivatsiooni alandada mÔista, mis siin toimub. Ja miks mitte teha seda lihtsamaks ja selgemaks?

NÀiteks nii, tuues esile olulised asjad vÔi osad muutujatesse. Ja siis tehes oma baasmatemaatika. See on juba rohkem nagu programmeerimine, see on see, mida ma tahaksin tulevikus Grafanas nÀha.

See on teine nÀide, kuidas saame seda veelgi lihtsamaks teha, kui meil oleks see funktsioon ru, ja see on juba olemas VictoriaMetrics'is. Ja siis edastate lihtsalt vahemÀlus oleva vÀÀrtuse, mille olete CTE's kuulutanud.

Ma olen juba rÀÀkinud, kui oluline on kasutada Ă”iget programmeerimiskeelt. Ja ilmselt igas ettevĂ”ttes toimub Grafanas midagi oma. Ja ilmselt annate ka oma arendajatele juurdepÀÀsu Grafanale, ja arendajad teevad midagi oma. Ja kĂ”ik nad teevad seda kuidagi erinevalt. Ja oleks hea, kui saaks kuidagi ĂŒhtsemalt, t. e. viia see ĂŒhise standardini.
Eeldame, et teil on mitte ainult sĂŒsteemiinsenerid, vĂ”ib-olla on teil isegi eksperdid, devops'id vĂ”i SRE'd. VĂ”ib-olla on teil eksperdid, kes teavad, mis asi on jĂ€lgimine, teavad, mis asi on Grafana, t. e. nad on sellega töötanud aastaid ja teavad tĂ€pselt, kuidas Ă”igesti teha. Ja nad on seda juba 100 korda kirjutanud ja kĂ”igile seletanud, aga mingil pĂ”hjusel keegi ei kuula.
Ja mis siis, kui nad saaksid need teadmised otse Grafanasse panna, et teised kasutajad saaksid funktsioone taaskasutada? Ja kui peaks arvutama vaba mÀlu protsendi, siis nad lihtsalt rakendaksid funktsiooni. Aga mis siis, kui eksportijate tegijad kaasneksid oma tootega ka funktsioonide kogumitega, kuidas töötada nende mÔÔtmetega, sest nad teavad tÀpselt, mis need mÔÔtmed on ja kuidas neid Ôigesti arvutada?
Seda tegelikult ei eksisteeri. Selle tegin mina ise. See on toetuse raamatukogude jaoks Grafanas. Eeldame, et poisid, kes tegid NodeExporter'i, tegid seda, millest ma rÀÀkisin. Ja pakkusid ka funktsioonide kogumit.

See, it looks something like this. You connect this library in Grafana, you go into editing, and here itâs very simply written in JSON how to work with this metric. That is, itâs some set of functions, their descriptions, and how they unfold.

I think this could be useful, because then in Grafana you would just write like this. And Grafana 'tells' you that there is such a function from a certain library â letâs use it. I think that would be really great.

A bit about VictoriaMetrics. We are doing a lot of interesting things. Read our articles about compression, about our competitions with other time series data applications, our explanations on how to work with PromQL, because there are still many newcomers, as well as about vertical scalability and our confrontation with Thanos.

KĂŒsimused:
I will start my question with a simple life story. When I first started using Grafana, I wrote a very convincing query that was five lines long. In the end, I got a very convincing graph. This graph almost went into production. But upon closer inspection, it turned out that this graph shows absolute nonsense, having nothing to do with reality, although the numbers fall within the range we expected to see. And my question is. We have libraries, we have functions, but how do we write tests for Grafana? You wrote a complex query that depends on a business decision â whether to order a real container of servers or not. And how do we know that this function, which draws the graph, resembles the truth? Thank you.
Thanks for the question. There are two parts. First â I have the impression, based on my practice, that most users, when looking at their graphs, do not understand what they are showing. For some reason, people are very good at coming up with justifications for any anomalies that occur on the graphs, even if itâs an error inside the function. And the second part â it seems to me that using such functions would suit your problem much better, instead of each of your developers doing their own capacity planning and being wrong with some probability.
How to check?
How to check? Probably, no way.
In the form of a test in Grafana.
What does Grafana have to do with it? Grafana translates this query directly into the DataSource.
Adding a little bit to the parameters.
Ei, Grafanas ei lisata midagi. Seal vĂ”ivad olla GET-parameetrid, nagu nĂ€iteks step. Seda ei öelda selgelt, kuid saate selle ĂŒletada, vĂ”ite mitte ĂŒletada, kuid see lisatakse automaatselt. Te ei kirjuta siia teste. Ma arvan, et ei tasu Grafanat tĂ”e allikana usaldada.
AitÀh ettekande eest! AitÀh kompresseerimise eest! Te mainisite, et grafikus ei saa kasutada muutujaid muutuja sees, kas saate aru, millest ma rÀÀgin?
Jah.
See oli algselt peavalu, kui ma tahtsin Grafanas hoiatust teha. Ja seal tuleb hoiatust teha iga hosti jaoks eraldi. Kas see, mille te tegite, töötab hoiatuste jaoks Grafanas?
Kui Grafana ei kĂ€sitle muutujaid kuidagi teisiti, siis jah, see töötab. Kuid minu soovitus on mitte kasutada Grafanas hoiatamist ĂŒldse, teil on parem kasutada alertmanagerit.
Jah, ma kasutan seda, aga lihtsalt tundus Grafanas seadistamine kergem, aga aitÀh nÀpunÀite eest!
Allikas: habr.com
