„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Doporučuji se seznámit s přepisem přednášky Romana Chavronenka "ExtendedPromQL"

Přehrát video

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Krátce o mně. Jmenuji se Roman. Pracuji v CloudFlare, žiji v Londýně. Ale také jsem udržovatel VictoriaMetrics.
A jsem autorem ClickHouse plug-inu pro Grafanu a ClickHouse-proxy – to je malý proxy pro ClickHouse.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Začneme s první částí, která se jmenuje "Obtíže s překladem" a budu mluvit o tom, že každý jazyk nebo dokonce jen jazyk komunikace – je velmi důležitý. Protože to, jak předáváte své myšlenky jinému člověku nebo systému, jak formulujete svou žádost. Lidé na internetu se hádají o tom, který jazyk je lepší – java nebo nějaký jiný. Pro sebe jsem se rozhodl, že je třeba vybírat podle úkolu, protože všechno je to specifické.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Začněme od začátku. Co je to PromQL? PromQL – je to Jazyk dotazů pro Prometheus. To je způsob, jakým formulujeme dotazy v Prometheusu, abychom získali časové řady dat, časové řady.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Co jsou to časové řady dat? Pokud to bereme doslovně, tak to jsou tři parametry.

To je:

  • Na co se díváme.
  • Kdy se na to díváme.
  • A jakou hodnotu to ukazuje.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Pokud se podíváme na tento graf (tento graf z mého telefonu, který ukazuje statistiku mých kroků), tak zde můžeme rychle odpovědět na tyto otázky.

Sledujeme kroky. Vidíme hodnotu a vidíme čas, kdy se na to díváme. Tedy, kdy se díváme na tento graf, můžeme snadno říct, že jsem v neděli ušel přibližně 15 000 kroků. To jsou časové řady dat.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Nyní pojďme "rozbít" (transformovat) je do jiné datové modelu ve formě tabulky. Zde také máme to, na co se díváme. Trochu jsem přidal další data, která budeme nazývat metadatami, totiž to nešel já, ale dva lidé, dejme tomu Jay a Silent Bob. Toto je to, na co se díváme; co to ukazuje a kdy to ukazuje tuto hodnotu.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka
Nyní se pokusíme uložit všechny tyto údaje do databáze. Pro příklad jsem vzal syntaxi ClickHouse. A zde vytváříme jednu tabulku, která se nazývá "Kroky", tedy na co se díváme. Zde je čas, kdy se na to díváme; co to ukazuje a nějaká metadata, kde budeme uchovávat, kdo to je: Jay a Silent Bob.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A aby se pokusili to všechno vizualizovat, použijeme Grafanu, protože, za prvé, to vypadá pěkně.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Také budeme používat tento plugin. Důvodů je hned několik. První je, že jsem ho napsal. A přesně vím, jak je těžké získat časové řady z ClickHouse, abychom je mohli zobrazit v Grafana.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Zobrazíme je v Graph Panel. To je nejpopulárnější panel v Grafana, který ukazuje závislost hodnoty na čase, takže potřebujeme pouze dva parametry.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka
Napišme si nejjednodušší dotaz – jak zobrazit statistiku kroků v Grafana, přičemž tyto údaje ukládáme v ClickHouse, v té tabulce, kterou jsme vytvořili. Napíšeme takový jednoduchý dotaz. Vybereme z kroků. Vybereme hodnotu a vybereme čas těchto hodnot, tedy ty tři parametry, o kterých jsme hovořili.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A výsledkem bude takovýto graf. Kdo ví, proč je tak podivný?

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Správně, musíme seřadit podle času.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A nakonec dostaneme už lepší, ale stále podivný graf. Kdo ví, proč? Správně, jsou tam dva účastníci, a v Grafana posíláme dvě časové řady, protože pokud se podíváme na datový model znovu, každá časová řada je unikátní kombinací názvu a všech klíčových hodnot labels.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Proto musíme vybrat konkrétního člověka. Vybereme Jaye.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A nakreslíme to znovu. Nyní už graf vypadá spolehlivě. Teď to je normální graf a vše funguje dobře.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A pravděpodobně víte, jak udělat něco podobného, ale v Prometheus pomocí PromQL. Přesně takto. O něco jednodušeji. A ještě to všechno rozložíme. Brali jsme kroky a filtrujeme podle Jaye. Nebudeme uvádět, že potřebujeme získat hodnotu, a nevybíráme čas.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A teď zkusíme spočítat rychlost pohybu Jaye nebo Silent Boba. V ClickHouse budeme muset provést runningDifference, tedy spočítat rozdíl mezi dvojicemi bodů a vydělit je časem, abychom získali přesnou rychlost. Dotaz bude vypadat přibližně takto.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A ukáže přibližně takovéto hodnoty, tedy přibližně 1,8 kroku za sekundu dělá Silent Bob nebo Jay.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A v Prometheus víte, jak to udělat také. Mnohem jednodušeji, než to bylo předtím.

„ExtendedPromQL“ – přepis přednášky Romana ChavronenkaAby to bylo stejně snadné i v Grafaně, přidal jsem tento obal, který vypadá velmi podobně jako PromQL. Nazývá se Rate Macros, nebo jak chcete. V Grafaně jednoduše napíšete „rate“, ale někde uvnitř se to transformuje do takového velkého dotazu. A na něj se nemusíte ani dívat, je tam někde, ale ušetříte spoustu času, protože psaní takových obrovských SQL dotazů je vždy nákladné. Snadno se můžete mýlit a pak dlouho netušíte, co se děje.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A tohle je dotaz, který se nevešel ani na jeden snímek a musel jsem ho rozdělit na dva sloupce. To je také dotaz v ClickHouse, který dělá totéž rate, ale pro obě časové řady: pro Silent Boba a pro Jaye, abychom na panelu měli dvě časové řady. A to už je, podle mého názoru, velmi složité.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A co se týče Promethea, to bude sum (rate). Pro ClickHouse jsem udělal samostatný makro, které se nazývá RateColumns a vypadá jako dotaz v Prometheus.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Podívali jsme se a vypadá to, že PromQL je skvělý, ale má samozřejmě svá omezení.

To je:

  • Omezené SELECT.
  • Omezené JOIN.
  • Bez podpory HAVING.

A pokud jste s tím pracovali dlouho, víte, že někdy je velmi těžké něco udělat v PromQL, zatímco v SQL můžete dělat téměř cokoliv, protože všechny tyto varianty, o kterých jsme mluvili, by šly udělat v SQL. Ale bylo by pohodlné to používat? A to mě přivádí k myšlence, že ne vždy ten nejsilnější jazyk může být nejpohodlnější.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Proto je někdy potřeba vybírat jazyk podle úkolů. Je to jako bitva Batmana se Supermanem. Je jasné, že Superman je silnější, ale Batman ho dokázal porazit, protože byl praktičtější a přesně věděl, co dělá.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A další část – to je rozšiřování PromQL.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Ještě jednou o VictoriaMetrics. Co je VictoriaMetrics? Je to databáze časových řad, je open-source, distribujeme její single i clusterové verze. Podle našich benchmarků je to nejrychlejší, co je na trhu, a co se týče komprese, také srovnatelně, tj. živí lidé hlásí kompresi okolo 0,4 bajtu na bod, zatímco u Prometheuse je to 1,2-1,4.

Nepodporujeme pouze Prometheus. Podporujeme také InfluxDB, Graphite, OpenTSDB.

Můžete nám "psát", tj. můžete převádět stará data.

A také perfektně fungujeme s Prometheus a Grafana, tj. podporujeme motor PromQL. V Grafaně můžete jednoduše změnit koncový bod Prometheus na VictoriaMetrics a všechny vaše panely budou fungovat, jak byly nastaveny.

Ale můžete využít i další funkce, které nabízí VictoriaMetrics.

Rychle projdeme funkcemi, které jsme přidali.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Omit interval param – můžete vynechat intervalní parametry v Grafaně. Když nechcete dostávat podivné grafy při zoomování v panelu, doporučuje se používat proměnnou {$__interval}. Tato proměnná je interní v Grafaně a ona sama vybírá rozsah dat. A VictoriaMetrics dokáže pochopit, jaký tento rozsah má být. A nemusíte aktualizovat všechny vaše dotazy. Bude to mnohem jednodušší.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Druhá funkce – je to intervalní odkazování. Můžete tento interval používat ve svých výrazech. Můžete jej násobit, dělit, předávat, odkazovat na něj.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Dále rodina funkcí rollup. Rollup funkce transformují jakýkoli váš časový série do tří oddělených časových sérií. To je min, max a avg. Myslím, že je to velmi praktické, protože to občas může ukázat nějaké anomálie a nepřesnosti.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A pokud děláte irate nebo rate, pravděpodobně můžete přehlédnout některé případy, kdy časový série se chová jinak, než jste předpokládali. S touto funkcí je mnohem jednodušší vidět například, že max je velmi odlišný od avg.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Dále proměnná default. Default – to znamená, jakou hodnotu chceme vykreslit v Grafaně, pokud nemáme časový série v danou chvíli. Kdy se to může stát? Dejme tomu, že exportujete nějakou metriku chyb. A máte tak skvělou aplikaci, že když jste začali, nemáte žádné chyby a dokonce nemáte žádné chyby ani za další tři hodiny nebo dokonce den. A máte panely, které ukazují poměr mezi úspěchy a chybami. A ty vám nebudou nic ukazovat, protože nemáte metriky chyb. A v defaultu můžete uvést cokoliv.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Keep_last_Value – uchovává poslední hodnotu metriky, pokud zmizela. Pokud ji Prometheus po další době shrábání nenajde po dobu 5 minut, zapamatujeme si její poslední hodnotu a vaše grafy se znovu neporouchají.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Scrape_interval – ukazuje, jak často Prometheus sbírá data ohledně vaší metriky, jakou frekvencí. Zde můžete vidět vynechání, například.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka
Label replace – oblíbená funkce. Ale považujeme ji za trochu složitou, protože přijímá celkem argumentů. A musíte si nejen pamatovat 5 argumentů, ale také si zapamatovat jejich pořadí.
„ExtendedPromQL“ – přepis přednášky Romana Chavronenka
Proč je tedy neudělat jednodušší? T. j. rozdělit je na menší funkce s přehlednou syntaxi.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A teď to nejzajímavější. Proč považujeme toto za rozšířený PromQL? Protože podporujeme společné tabulkové výrazy. Můžete se podívat na QR kód (https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/ExtendedPromQL), prohlédnout si odkazy s příklady a playground, kde můžete provádět dotazy přímo ve VictoriaMetrics bez jejího nainstalování, jednoduše v prohlížeči.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A co to vlastně je? Ten dotaz nahoře – to je docela populární dotaz. Myslím, že v každém dashboardu ve spoustě firem používáte stejný filtr pro všechno. Obvykle to tak bývá. Ale když potřebujete přidat nový filtr, musíte aktualizovat každou panelu, nebo stáhnout dashboard, otevřít ho v JSON, provést find replace, což také zabere čas. Proč si neuchovat tuto hodnotu ve proměnné a nevyužít ji znovu? To vypadá, podle mého názoru, mnohem jednodušeji a srozumitelněji.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Například, když musím aktualizovat filtry v Grafaně ve všech dotazech, a dashboard může být obrovský, nebo jich může být dokonce několik. A jak bych chtěl tento problém vyřešit v Grafaně?

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Tento problém řeším takto: vytvořím commonFilter a v něm definuji tento filtr, a pak ho pře používám v dotazech. Ale pokud uděláte nyní to samé, nebude to fungovat, protože Grafana vám neumožňuje používat proměnné uvnitř proměnných dotazů. A to je trochu divné.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A proto jsem vytvořil takovou variantu, která to umožňuje. A pokud vás to zajímá nebo byste takovou funkci chtěli, podpořte to nebo dejte dislike, pokud se vám taková myšlenka nelíbí. https://github.com/grafana/grafana/pull/16694

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Dále o rozšířeném PromQL. Zde definujeme nejen proměnnou, ale přímo celou funkci. A nazýváme ji ru (resource usage). Tato funkce přijímá volné zdroje, omezení podle zdroje a filtr. Vypadá to, že syntaxi je celkem jednoduchá. A je velmi snadné tuto funkci použít a spočítat procento volné paměti u nás. T. j. kolik paměti máme, jaké je omezení a jak filtrovat. Vypadá to mnohem pohodlněji, pokud byste to všechno psali, přičemž byste znovu používali stejné filtry, protože by se to proměnilo v obrovský dotaz.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

A tady je příklad takového velkého dotazu. Pochází z oficiálního dashboardu NodeExporter pro Grafana. Ale moc nerozumím tomu, co se tady děje. Tedy, samozřejmě rozumím, pokud se na to podívám blíže, ale množství závorek může okamžitě snížit motivaci rozklíčovat, co se tady děje. A proč by to nemohlo být jednodušší a přehlednější?

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Například takto, když vyzdvihneme podstatné věci nebo části do proměnných. A pak provedeme svou základní matematiku. To už vypadá více jako programování, to je to, co bych chtěl vidět v budoucnu v Grafana.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Toto je druhý příklad, jak bychom to mohli udělat ještě jednodušeji, kdybychom už měli tuto funkci ru, která už existuje přímo ve VictoriaMetrics. A pak jen předáte uloženou hodnotu, kterou jste vyhlásili v CTE.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Už jsem mluvil o tom, jak důležité je používat správný programovací jazyk. A pravděpodobně v každé firmě v Grafana vzniká něco svého. A pravděpodobně také dáváte přístup k Grafana svým vývojářům, a vývojáři dělají něco svého. A všichni to dělají různě. Chtěl bych, aby to nějak odpovídalo standardu, tedy vracelo se k obecnému štandartu.

Předpokládejme, že máte nejen systémové inženýry, možná máte dokonce i experty, devopsy nebo SRE. Možná máte experty, kteří vědí, co je monitoring, vědí, co je Grafana, tedy s tím pracují léta a opravdu vědí, jak to dělat správně. A už to psali 100krát a všem vysvětlovali, ale z nějakého důvodu nikdo neposlouchá.

A co kdyby tyto znalosti mohli přímo vložit do Grafana, aby je mohli ostatní uživatelé znovu využít? A kdyby bylo třeba spočítat procento volné paměti, prostě by použili funkci. A co kdyby tvůrci exportérů spolu se svým produktem také poskytovali sadu funkcí, jak pracovat s jejich metrikami, protože přesně vědí, co jsou to za metriky a jak je správně počítat?

Toto ve skutečnosti neexistuje. Toto jsem udělal sám. To je podpora knihoven v Grafana. Představte si, že kluci, kteří vytvořili NodeExporter, udělali to, o čem mluvím. A také poskytli sadu funkcí.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Tedy to vypadá přibližně takto. Připojíte tuto knihovnu v Grafana, přejdete do úpravy a zde je velmi jednoduše v JSON popsáno, jak pracovat s touto metrikou. Tedy nějaká sada funkcí, jejich popis a do čeho se rozvíjejí.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Myslím, že by to mohlo být užitečné, protože pak byste v Grafana psali jednoduše tak. A Grafana vám "říká", že je tu taková funkce z takové knihovny – pojďme ji použít. Domnívám se, že by to bylo skvělé.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Trochu o VictoriaMetrics. Děláme spoustu zajímavých věcí. Přečtěte si naše články o kompresi, o našich soutěžích s jinými aplikacemi pro časové řady, naše vysvětlení, jak pracovat s PromQL, protože zde je stále spousta nováčků, a také o vertikální škálovatelnosti a o soutěžení s Thanos.

„ExtendedPromQL“ – přepis přednášky Romana Chavronenka

Otázky:

Začnu svou otázku jednoduchým životním příběhem. Když jsem poprvé začal používat Grafana, napsal jsem velmi přesvědčivý dotaz dlouhý 5 řádků. Výsledkem byl velmi přesvědčivý graf. Tento graf skoro šel do produkce. Ale při bližším zkoumání se ukázalo, že tento graf ukazuje absolutní nesmysl, který nemá žádný vztah k realitě, přestože čísla spadají do rozsahu, který jsme očekávali vidět. A moje otázka. Máme knihovny, máme funkce, ale jak píšeme testy pro Grafana? Napsali jste složitý dotaz, od kterého závisí podnikové rozhodnutí – objednat skutečný kontejner serverů nebo neobjednávat. A jak víme, že funkce, která kreslí graf, vypadá jako pravda. Děkuji.

Děkuji za otázku. Tady jsou dvě části. První – mám dojem, na základě své praxe, že většina uživatelů, když se dívá na své grafy, nechápe, co jim ukazují. Z nějakého důvodu jsou lidé velmi dobří v tom, aby vymysleli omluvu pro jakoukoli anomálii, která se na grafech objevuje, i když je to chyba uvnitř funkce. A druhá část – myslím, že použití takových funkcí by mnohem lépe posloužilo k řešení vaší problému, místo toho, aby každý z vašich vývojářů dělal své plánování kapacity a chyboval s nějakou pravděpodobností.

Jak zkontrolovat?

Jak zkontrolovat? Asi nijak.

Ve formě testu v Grafana.

Co má Grafana společného? Grafana přenáší tento dotaz přímo do DataSource.

Přidáním malého množství do parametrů.

Ne, v Grafaně se nic nepřidává. Mohou zde být parametry GET, jako například step. Ten není jednoznačně uveden, ale můžete ho přepsat, můžete ho nepřepsat, ale automaticky se přidává. Zde nebudete psát testy. Myslím, že na Grafanu se jako na zdroj pravdy spoléhat nevyplatí.

Děkuji za prezentaci! Děkuji za kompresi! Zmiňovali jste mapování proměnné v grafu, že v Grafaně nelze použít proměnnou v proměnné. Rozumíte, o čem mluvím?

Ano.

To byla původně velká bolest hlavy, když jsem chtěl vytvořit upozornění v Grafaně. A tam je potřeba dělat upozornění pro každý host zvlášť. Tohle, co jste udělali, funguje pro upozornění v Grafaně?

Pokud Grafana nekaždí proměnné nějak jinak, pak – ano, bude to fungovat. Ale moje rada je vůbec nepoužívat upozorňování v Grafaně, měli byste raději použít alertmanager.

Ano, používám ho, ale v Grafaně se mi to zdálo snadnější na nastavení, ale díky za radu!

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster