„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Predlagam, da se seznanite z razlago poročila Romana Havronenka "ExtendedPromQL"

Predvajaj video

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Na kratko o meni. Ime mi je Roman. Delam v CloudFlare, živim v Londonu. Sem tudi vzdrževalec VictoriaMetrics.
In sem avtor ClickHouse vtičnika za Grafano in ClickHouse-proxy – to je majhen proxy za ClickHouse.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Začeli bomo s prvim delom, ki se imenuje 'Težave pri prevodu', kjer bom govoril o tem, da je vsak jezik ali celo preprosto komunikacijski jezik zelo pomemben. To je način, kako prenesete svoje misli drugemu človeku ali sistemu, kako oblikujete svoj zahtevek. Ljudje na internetu razpravljajo o tem, kateri jezik je boljši – java ali kateri drug. Zame sem se odločil, da izberem tistega, ki ustreza nalogi, saj je vse to specifično.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Začnimo od začetka. Kaj je PromQL? PromQL je jezik poizvedovanja Prometheus. To je način, kako oblikujemo poizvedbe v Prometheusu, da pridobimo časovne serije podatkov.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Kaj so podatki časovne serije? Če do dobesedno, so to trije parametri.

To je:

  • Na kaj gledamo.
  • Kdaj na to gledamo.
  • In katero vrednost kaže.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Če pogledamo to diagramo (to je diagram s mojega telefona, ki prikazuje statistiko mojih korakov), lahko hitro odgovorimo na ta vprašanja.

Gledamo na korake. Vidimo vrednost in vidimo čas, ko gledamo na to. To pomeni, da je preprosto reči, da sem v nedeljo prehodil približno 15.000 korakov. To so podatki časovne serije.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Zdaj razdelimo (pretvorimo) te podatke v drugo podatkovno strukturo v obliki tabele. Tu imamo spet to, na kar gledamo. Dodal sem dodatne podatke, ki jih bomo imenovali meta-podatki, torej to niso bili samo jaz, temveč dva človeka, recimo Jay in Silent Bob. To je tisto, na kar gledamo; kaj to prikazuje in kdaj prikazuje to vrednost.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka
Zdaj poskusimo shraniti vse te podatke v bazo podatkov. Za primer sem vzel sintakso ClickHouse. Tukaj ustvarjamo eno tabelo, ki se imenuje 'Steps', torej na kar gledamo. Tam je čas, ko na to gledamo; kaj to prikazuje in nekaj meta-podatkov, kjer bomo shranili, kdo sta to: Jay in Silent Bob.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In da bi vse to poskušali vizualizirati, bomo uporabili Grafano, ker je to estetsko privlačno.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Tudi mi bomo uporabili ta vtičnik. Za to sta dva razloga. Prvi je, ker sem ga napisal. In točno vem, kako težko je pridobiti časovne serije iz ClickHouse, da jih prikažemo v Grafani.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Prikazali bomo v Graf Panel. To je najbolj priljubljena plošča v Grafani, ki prikazuje odvisnost vrednosti od časa, zato potrebujemo le dva parametra.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka
Napišimo najprej najprej najpreprostejši poizvedbo – kako prikazati statistiko korakov v Grafani, ki te podatke shranjuje v ClickHouse, v tisti tabeli, ki smo jo ustvarili. In napisali bomo takšno preprosto poizvedbo. Izberemo iz korakov. Izberemo vrednost in čas teh vrednosti, torej istih treh parametrov, o katerih smo govorili.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In rezultat bo tak graf. Kdo ve, zakaj je tako nenavaden?

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Prav, potrebno ga je razvrstiti po času.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In na koncu bomo dobili že boljši, a še vedno nenavaden graf. Kdo ve, zakaj? Prav, tam sta dva udeleženca, in v Grafani posredujemo dve časovni seriji, ker če se ponovno poglobimo v podatkovni model, je vsaka časovna serija edinstvena kombinacija imena in vseh ključ-vrednostnih oznak.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Zato moramo izbrati določenega človeka. Izberemo Jaya.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In narišemo še enkrat. Zdaj graf okusno spominja na resnico. Zdaj je to normalen graf in vse deluje dobro.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In verjetno veste, kako narediti približno enako, vendar v Prometheusu preko PromQL. Približno tako. Malenkost lažje. In še razdelili bomo vse to. Vzeli smo korake. In filtriramo po Jayu. Tu ne navajamo, da moramo pridobiti vrednost in ne izbiramo časa.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Zdaj poskusimo izračunati hitrost premikanja Jaya ali Silent Boba. V ClickHouse bomo morali uporabiti runningDifference, torej izračunati razliko med pari točk in jo deliti s časom, da dobimo natančno hitrost. Poizvedba bo izgledala približno takole.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In prikazal bo približno takšne vrednosti, torej približno 1,8 koraka na sekundo dela Silent Bob ali Jay.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In v Prometheusu veste, kako to narediti tudi. Veliko lažje, kot je bilo prej.

„ExtendedPromQL“ — transkripcija izlaganja Romana KhavronenkaDa bi to ostalo jednostavno za rad u Grafani, dodao sam ovu omotnicu koja veoma slično izgleda kao PromQL. Zove se Rate Macros ili kako god želite da je nazovete. U Grafani jednostavno napišete „rate“, ali negde u dubini to se transformiše u ovako veliki upit. I ne morate ni da ga gledate, on je negde tu, ali štedite puno vremena, jer pisanje ovako ogromnih SQL upita je uvek skupo. Možete lako napraviti grešku i zatim dugo ne shvatati šta se događa.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

A ovo je upit koji se nije mogao stati čak ni na jedan slajd, pa sam ga morao razbiti na dve kolone. Ovo je takođe upit u ClickHouse-u koji radi isto što i rate, ali za obe vremenske serije: Silent Bob i Jay, da bismo imali dve vremenske serije na našem panelu. I to je već veoma komplikovano, po mom mišljenju.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

I za Prometheus to će biti sum(rate). Za ClickHouse sam napravio poseban makro koji se zove RateColumns, koji izgleda kao upit u Prometheus.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Pogledali smo i izgleda da je PromQL savršen, ali naravno da ima ograničenja.

To je:

  • Ograničen SELECT.
  • Granični JOIN.
  • Nema podrške za HAVING.

I ako ste dugo radili sa njim, znate da je ponekad veoma teško uraditi nešto u PromQL, dok u SQL-u možete uraditi praktično sve, jer su svi ovi slučajevi koje smo sada razgovarali mogli da budu uradjeni u SQL-u. Da li bi to bilo praktično za korišćenje? To me navodi na pomisao da nije uvek najmoćniji jezik i najpraktičniji.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Zato ponekad treba birati jezik prema zadacima. To je kao borba Betmena sa Supermanom. Jasno je da je Superman jači, ali Betmen je uspeo da ga pobedi, jer je praktičniji i tačno je znao šta radi.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

A sledeći deo je proširivanje PromQL.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Ponovo o VictoriaMetrics. Šta je VictoriaMetrics? To je time series baza podataka, open-source, distribuiramo njene single i cluster verzije. Prema našim benchmarkom, ona je najbrža na tržištu sada, a po kompresiji slično, tj. živi ljudi prijavljaju kompresiju negde oko 0,4 bajta po tački, dok je u Prometheus-u to 1,2-1,4.

Podržavamo ne samo Prometheus. Podržavamo InfluxDB, Graphite, OpenTSDB.

U nas možete "pisati", tj. možete prenositi stare podatke.

I još savršeno radimo sa Prometheus-om i Grafanom, tj. podržavamo PromQL engine. I u Grafani možete jednostavno promeniti Prometheus endpoint na VictoriaMetrics i svi vaši dashboardi će raditi kao i ranije.

Toda pa lahko uporabite dodatne funkcije, ki jih ponuja VictoriaMetrics.

Hitro bomo prešli skozi funkcije, ki smo jih dodali.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Omit interval param – lahko preskočite parameter interval v Grafani. Ko nočete prejeti nenavadnih grafik pri zoom-in/out na plošči, je priporočljivo uporabiti spremenljivko {$__interval}. To je interna spremenljivka Grafane in sama izbira podatkovni razpon. VictoriaMetrics pa lahko sama razume, kakšen ta razpon mora biti. In ni vam treba posodabljati vseh vaših poizvedb. Bodo veliko lažje.Druga funkcija je referencing intervala. Ta interval lahko uporabite v svojih izrazih. Lahko ga množite, delite, predajate, nanj se lahko sklicujete.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Nato družina rollup funkcij. Rollup funkcija transformira vaše časovne serije v tri ločene časovne serije. To so min, max in avg. Meni se zdi, da je to zelo priročno, ker včasih lahko pokaže nekatere anomalije in neusklajenosti.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In če preprosto uporabljate irate ali rate, verjetno lahko preskočite nekatere primere, ko se časovna serija obnaša drugače, kot ste predvidevali. S to funkcijo je veliko lažje videti, recimo, da je max zelo oddaljen od avg.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Naprej je spremenljivka default. Default pomeni, katero vrednost moramo prikazati v Grafani, če trenutno nimamo časovne serije. Kdaj se to zgodi? Na primer, izvažate neko metriko glede napak. In imate tako dobro aplikacijo, da ko ste jo zagnali, nimate napak in celo naslednje tri ure ali dan ni napak. In imate nadzorne plošče, ki prikazujejo razmerje med uspehom in napako. In pokazale vam bodo nič, ker nimate metrike napak. V default lahko navedete karkoli.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Keep_last_Value – shrani zadnjo vrednost metrike, če je ta izginila. Če Prometheus po naslednjem skriptu ne najde metrike v 5 minutah, bomo tukaj zapomnili njeno zadnjo vrednost in vaši grafi se ne bodo znova pokvarili.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Scrape_interval – prikazuje, kako pogosto Prometheus zbira podatke o vaši metrični vrednosti, s kakšno frekvenco. Tukaj lahko vidite zamudo, na primer.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Label replace – priljubljena funkcija. Menimo pa, da je nekoliko zapletena, ker sprejema več argumentov. In morate se ne le spomniti 5 argumentov, temveč tudi njihov vrstni red.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka
Label replace – популярная функция. Но мы считаем, что она немного сложная, потому что она принимает целых аргументов. И вам надо не только помнить 5 аргументов, но еще и помнить их последовательность.
„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka
Zato, zakaj jih ne bi poenostavili? T. j. razbiti na manjše funkcije s pregledno sintakso.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In zdaj najbolj zanimivo. Zakaj menimo, da je to razširjeni PromQL? Ker podpiramo skupne tabelarne izraze. Oglejte si QR kodo (https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/ExtendedPromQL), si oglejte povezave z primeri, s playgroundom, kjer lahko izvajate poizvedbe neposredno v VictoriaMetrics brez namestitve, kar lahko storite preprosto v brskalniku.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In kaj to sploh je? Ta zgornja poizvedba je precej priljubljena. Mislim, da v kateri koli nadzorni plošči v mnogih podjetjih uporabljate enak filter za vse. Običajno je tako. A ko morate dodati nov filter, morate posodobiti vsako ploščo ali prenesti nadzorno ploščo, jo odpreti v JSON-u, opraviti iskanje in zamenjavo, kar prav tako vzame čas. Zakaj tega vrednosti ne bi shranili v spremenljivko in jo ponovno uporabili? To se mi zdi veliko preprostejše in bolj razumljivo.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Na primer, ko moram posodabljati filtre v Grafani v vseh poizvedbah, nadzorna plošča pa je lahko ogromna ali jih je morda več. Kako bi želel rešiti to težavo v Grafani?

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

To težavo rešujem tako, da naredim commonFilter in v njem določim ta filter, nato pa ga ponovno uporabim v poizvedbah. A če sedaj storite prav tako, to ne bo delovalo, ker Grafana ne dovoli, da uporabljate spremenljivke znotraj spremenljivk poizvedb. To je malce čudno.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In zato sem naredil takšno različico, ki to omogoča. Če vas zanima ali želite to funkcijo, potem podprite to ali izrazite nezadovoljstvo, če vam ta ideja ni všeč. https://github.com/grafana/grafana/pull/16694

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Naprej o razširjenem PromQL. Tukaj ne definiramo le spremenljivke, ampak kar celo funkcijo. Poimenujemo jo ru (poraba virov). Ta funkcija sprejema proste vire, omejitev virov in filter. Zdi se, da je sintaksa zelo preprosta in izjemno enostavno je uporabiti to funkcijo ter izračunati odstotek prostega pomnilnika. T. j. koliko pomnilnika imamo, kakšna je omejitev in kako filtrirati. To se zdi veliko bolj priročno, če bi vse to pisali, pri čemer bi ponovno uporabljali iste filtre, ker bi se to spremenilo v ogromen ogromen poizvedbeni stavek.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

In this example, we have a very large query. It's from the official NodeExporter dashboard for Grafana. However, I have a limited understanding of what's happening here. I mean, I get it if I look closely, but the number of parentheses can quickly diminish the motivation to figure out what's going on. So why not make it simpler and clearer?

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

For instance, like this, highlighting important elements or parts in variables. Then perform your basic math. This already looks more like programming, and that's what I would like to see in the future in Grafana.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Here’s a second example of how we can make it even simpler if we already had that function 'ru', which is already available directly in VictoriaMetrics. Then you simply pass the cached value that you've defined in the CTE.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

I've already talked about how important it is to use the right programming language. And probably in every company, something unique is happening in Grafana. You likely also provide access to Grafana to your developers, and they do their own thing. And they all do it in different ways. It would be nice to have some consistency, i.e., to standardize everything.

Suppose you not only have system engineers, but perhaps even experts, DevOps, or SREs. Maybe you have experts who know what monitoring is, who are familiar with Grafana, having worked with it for years, and they know exactly how to do it right. They've already written it a hundred times and explained it to everyone, yet for some reason, no one listens.

What if they could embed that knowledge directly into Grafana so that other users could reuse those functions? If they needed to calculate the percentage of free memory, they would just apply the function. What if the exporters' creators also provided a set of functions for working with their metrics along with their product because they know exactly what those metrics are and how to calculate them correctly?

This actually doesn't exist. I created this myself. This is library support in Grafana. Suppose the folks who made NodeExporter did what I described and also provided a set of functions.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

To je, kako to izgleda. Povežete to knjižnico v Grafano, vstopite v urejanje in tu je zelo preprosto napisano v JSON-u, kako delati s to metriko. To je, nek paket funkcij, njihovo opisovanje in v kaj se razvijajo.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Po mojem mnenju bi to lahko bilo koristno, saj bi potem v Grafani preprosto pisali tako. In Grafana vam "pravi", da obstaja taka funkcija iz te knjižnice – pojdimo jo uporabiti. Mislim, da bi to bilo res super.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Malo o VictoriaMetrics. Delamo veliko zanimivih stvari. Preberite naše članke o kompresiji, o naših tekmovanjih z drugimi aplikacijami za podatkovne časovne vrste, naše razlage, kako delati s PromQL, saj je tu še veliko novincev, ter o vertikalni skalabilnosti in nasprotovanju Thanosu.

„ExtendedPromQL“ — transkripcija izlaganja Romana Khavronenka

Vprašanja:

Začel bom svoje vprašanje s preprosto življenjsko zgodbo. Ko sem prvič začel uporabljati Grafano, sem napisal zelo prepričljiv poizvedbo dolžine 5 vrstice. Na koncu je nastal zelo prepričljiv graf. Ta graf se je skoraj odpravil v produkcijo. A ob podrobnejšem pregledu je bilo ugotovljeno, da ta graf kaže absolutno neumnost, ki nima nobene zveze z resničnostjo, čeprav številke padejo v razpon, ki smo ga pričakovali. In moje vprašanje. Imamo knjižnice, imamo funkcije, kako pa pišemo teste za Grafano? Napisali ste kompleksno poizvedbo, od katere je odvisna poslovna odločitev – naročiti pravi strežnik ali ne naročiti. In kako vemo, da ta funkcija, ki riše graf, izgleda kot resnica. Hvala.

Hvala za vprašanje. Tu sta dve strani. Prva - imam občutek, na podlagi svojih izkušenj, da večina uporabnikov, ko gleda svoje grafikone, ne razume, kaj jim prikazujejo. Nekako so ljudje zelo dobri v izmišljevanju opravičil za kakršne koli anomalije, ki se pojavijo na grafikah, celo če gre za napako v funkciji. In druga del - mislim, da bi bila uporaba takih funkcij veliko bolj primerna za rešitev vaše težave, namesto da bi vsak vaš razvijalec delal svoj načrt zmogljivosti in se zmotil z neko verjetnostjo.

Kako preveriti?

Kako preveriti? Verjetno nekako ne.

V obliki testa v Grafani.

Kaj ima Grafana s tem? Grafana posreduje to poizvedbo neposredno v DataSource.

Dodajamo malo v parametre.

Ne, v Grafana nič ne dodajajo. Tam so lahko GET-parametri, kot je na primer step. Ta se ne navaja izrecno, ampak ga lahko prepišete, lahko pa tudi ne, vendar se samodejno doda. Tukaj ne morete napisati testov. Menim, da se ne bi smeli zanašati na Grafano kot vir resnice.

Hvala za poročilo! Hvala za stiskanje! Omenili ste mapping spremenljivke v grafu, da v Grafani ne morete uporabiti spremenljivke znotraj druge spremenljivke. Razumete, o čem govorim?

Da.

To je bilo prvotno glavobol, ko sem želel narediti alert v Grafani. In tam je potrebno narediti alert za vsako napravo posebej. Ali ta zadeva, ki ste jo naredili, deluje za alerte v Grafani?

Če se Grafana ne obrača na spremenljivke na kak način drugače, potem - ja, delovala bo. Ampak moj nasvet je, da v Grafani sploh ne uporabljate alertiranja, bolje je uporabiti alertmanager.

Da, uporabljam ga, vendar se je v Grafani to zdelo lažje za nastavitev, vseeno hvala za nasvet!

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster