{"id":75585,"date":"2020-03-27T07:42:28","date_gmt":"2020-03-27T05:42:28","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko"},"modified":"2020-03-27T07:42:28","modified_gmt":"2020-03-27T05:42:28","slug":"extendedpromql-rasshifrovka-doklada-romana-havronenko","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko","title":{"rendered":"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Zach\u0119cam do zapoznania si\u0119 z interpretacj\u0105 raportu Romana Hawronenko \"ExtendedPromQL\"<\/strong><\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"lWYaiagvmfw\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/lWYaiagvmfw\/hqdefault.jpg\" alt=\"Odtwarzaj wideo\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/54a175d9c74c90d9d313f8ff71476638.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kr\u00f3tko o mnie. Nazywam si\u0119 Roman. Pracuj\u0119 w CloudFlare, mieszkam w Londynie. Ale jestem tak\u017ce maintainerem VictoriaMetrics.<br \/>\nI jestem autorem <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Vertamedia\/clickhouse-grafana\">pluginu ClickHouse<\/a><\/noindex> dla Grafany i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Vertamedia\/chproxy\">ClickHouse-proxy<\/a><\/noindex> \u2013 to ma\u0142y proxy dla ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/fc1aa56b144def5db9fcee844d5016f1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zaczniemy od pierwszej cz\u0119\u015bci, kt\u00f3ra nosi tytu\u0142 \u201eTrudno\u015bci w t\u0142umaczeniu\u201d, gdzie b\u0119d\u0119 opowiada\u0107 o tym, \u017ce ka\u017cdy j\u0119zyk, a nawet po prostu j\u0119zyk komunikacji, jest bardzo wa\u017cny. Poniewa\u017c to spos\u00f3b, w jaki przekazujesz swoje my\u015bli innej osobie lub systemowi, jak formu\u0142ujesz zapytanie. Ludzko\u015b\u0107 w Internecie spiera si\u0119, kt\u00f3ry j\u0119zyk jest lepszy \u2013 java czy inny. Dla siebie zdecydowa\u0142em, \u017ce trzeba wybiera\u0107 w zale\u017cno\u015bci od zadania, poniewa\u017c wszystko jest specyficzne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/ea21f52ba5c2d3507e0106715c4ab96d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zacznijmy od pocz\u0105tku. Czym jest PromQL? PromQL to j\u0119zyk zapyta\u0144 Prometheusa. To spos\u00f3b, w jaki formu\u0142ujemy zapytania w Prometheusie, aby uzyska\u0107 dane szereg\u00f3w czasowych.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/56b1ef4cc04defdffeea8b2666fdc354.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Czym s\u0105 dane szereg\u00f3w czasowych? Je\u015bli chodzi o dos\u0142owne znaczenie, to s\u0105 trzy parametry. <\/p>\n<p><\/p>\n<p>One to:<\/p>\n<p><\/p>\n<ul>\n<li>Na co patrzymy. <\/li>\n<li>Kiedy na to patrzymy.<\/li>\n<li>I jaka warto\u015b\u0107 si\u0119 pokazuje. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/358a193e889204d28debe1b74b93df3a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je\u015bli spojrzysz na ten wykres (ten wykres jest z mojego telefonu, kt\u00f3ry pokazuje statystyki moich krok\u00f3w), to mo\u017cna szybko odpowiedzie\u0107 na te pytania. <\/p>\n<p><\/p>\n<p>Patrzymy na kroki. Widzimy warto\u015b\u0107 i czas, kiedy na to patrzymy. To znaczy, patrz\u0105c na ten wykres, \u0142atwo mo\u017cna powiedzie\u0107, \u017ce w niedziel\u0119 przeszed\u0142em oko\u0142o 15 000 krok\u00f3w. To s\u0105 dane szereg\u00f3w czasowych. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/859299ee9d25a3419c869b3ed6db6e72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz przejd\u017amy do \"rozbicia\" (przekszta\u0142cenia) ich w inn\u0105 model danych w formie tabeli. Tutaj mamy tak\u017ce to, na co patrzymy. Doda\u0142em nieco dodatkowych danych, kt\u00f3re b\u0119dziemy nazywa\u0107 metadanymi, tzn. nie by\u0142em to ja, a dw\u00f3ch ludzi, powiedzmy, Jay i Silent Bob. To jest to, na co patrzymy; co to pokazuje i kiedy pokazuje t\u0119 warto\u015b\u0107. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/fd7b48ea3c25b57c13605e84c4a52a2c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTeraz spr\u00f3bujmy zachowa\u0107 wszystkie te dane w bazie danych. Dla przyk\u0142adu u\u017cy\u0142em sk\u0142adni ClickHouse. I tutaj tworzymy jedn\u0105 tabel\u0119, kt\u00f3ra nazywa si\u0119 \u201eKroki\u201d, to znaczy, na co patrzymy. Tutaj jest czas, kiedy na to patrzymy; co to pokazuje i jakie\u015b metadane, gdzie b\u0119dziemy przechowywa\u0107, kto to: Jay i Silent Bob.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/bd01f9dc0b29d34aacbb8f012710a94f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I aby spr\u00f3bowa\u0107 zwizualizowa\u0107 to wszystko, u\u017cyjemy Grafany, poniewa\u017c, po pierwsze, to \u0142adne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/9f573241e9ae32e31d6d0b879115970b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>R\u00f3wnie\u017c b\u0119dziemy korzysta\u0107 z tej wtyczki. S\u0105 na to dwie przyczyny. Po pierwsze, poniewa\u017c j\u0105 napisa\u0142em. I dok\u0142adnie wiem, jak trudno jest wydobywa\u0107 dane szereg\u00f3w czasowych z ClickHouse, aby pokaza\u0107 je w Grafanie. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/29f2d72f9995afb54b23bb7b4230b840.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wy\u015bwietlimy to w Graph Panel. To najpopularniejszy panel w Grafanie, kt\u00f3ry pokazuje zale\u017cno\u015b\u0107 warto\u015bci od czasu, wi\u0119c potrzebujemy tylko dw\u00f3ch parametr\u00f3w.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/d820f63944ce0112660337b44a6c1f36.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNapiszmy najprostsze zapytanie \u2014 jak pokaza\u0107 statystyk\u0119 krok\u00f3w w Grafanie, przechowuj\u0105c te dane w ClickHouse, w tej tabeli, kt\u00f3r\u0105 stworzyli\u015bmy. I piszemy takie proste zapytanie. Wybieramy z krok\u00f3w. Wybieramy warto\u015b\u0107 i wybieramy czas tych warto\u015bci, tzn. te same trzy parametry, o kt\u00f3rych m\u00f3wili\u015bmy.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/ad7895105050178de5bc8a154da7e6e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I w rezultacie otrzymamy taki wykres. Kto wie, dlaczego jest taki dziwny?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/4a8108737e834cf35b7834be7b4db719.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W\u0142a\u015bnie, trzeba posortowa\u0107 wed\u0142ug czasu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/d37343c7a6a811e2012f1cbae4b9a5d5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I w ko\u0144cu otrzymamy lepszy, ale wci\u0105\u017c dziwny wykres. Kto wie, dlaczego? W\u0142a\u015bnie, s\u0105 dwaj uczestnicy, a w Grafanie oddajemy dwa szeregi czasowe, poniewa\u017c je\u015bli przyjrze\u0107 si\u0119 modelowi danych jeszcze raz, to ka\u017cdy szereg czasowy to unikalna kombinacja nazwy i wszystkich par klucz-warto\u015b\u0107 etykiet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/f19bf1a9f43ae8de22af6bf7b494902f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dlatego musimy wybra\u0107 konkretnego cz\u0142owieka. Wybieramy Jaya.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/b6a714d5d6ce4d4b27634da9414aa6f6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I rysujemy jeszcze raz. Teraz wykres przypomina rzeczywisto\u015b\u0107. Teraz to normalny wykres i wszystko dzia\u0142a dobrze.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/2a93b4cd548239c9314c3283c5b9f488.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I prawdopodobnie wiecie, jak zrobi\u0107 mniej wi\u0119cej to samo, ale w Prometheusie przez PromQL. Mniej wi\u0119cej tak. Troch\u0119 pro\u015bciej. I jeszcze rozbijemy to wszystko. Brali\u015bmy kroki. I filtrujemy po Jayu. Tutaj nie wskazujemy, \u017ce musimy otrzyma\u0107 warto\u015b\u0107 i nie wybieramy czasu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/5e080a1b88c156522af21bf00f3cd641.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A teraz spr\u00f3bujmy obliczy\u0107 pr\u0119dko\u015b\u0107 poruszania si\u0119 Jaya lub Silent Boba. W ClickHouse musimy zastosowa\u0107 runningDifference, tzn. obliczy\u0107 r\u00f3\u017cnic\u0119 mi\u0119dzy parami punkt\u00f3w i podzieli\u0107 je przez czas, aby uzyska\u0107 dok\u0142adn\u0105 pr\u0119dko\u015b\u0107. Zapytanie b\u0119dzie wygl\u0105da\u0107 mniej wi\u0119cej tak.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/13102b04ba4cf0ff9c955c36801044d0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I poka\u017ce to mniej wi\u0119cej takie warto\u015bci, tzn. Silent Bob lub Jay wykonuj\u0105 oko\u0142o 1,8 kroku na sekund\u0119.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/1c328f99da6f160bdca23ab5f461bda8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I w Prometheusie wiecie, jak to zrobi\u0107 r\u00f3wnie\u017c. Du\u017co \u0142atwiej ni\u017c wcze\u015bniej.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/a7145785dee9fafcc8ab573e920cb88e.jpeg\" style=\"display:block;margin: 0 auto;\" \/>Aby to by\u0142o tak samo proste do zrobienia w Grafanie, doda\u0142em tak\u0105 owijaj\u0105c\u0105 funkcj\u0119, kt\u00f3ra wygl\u0105da bardzo podobnie do PromQL. Nazywa si\u0119 Rate Macros lub jak tylko chcecie j\u0105 nazwa\u0107. W Grafanie piszecie po prostu \u201erate\u201d, ale gdzie\u015b w g\u0142\u0119bi przekszta\u0142ca si\u0119 to w tak du\u017c\u0105 kwerend\u0119. I nie musicie nawet na ni\u0105 patrze\u0107, gdzie\u015b tam jest, ale oszcz\u0119dzacie mn\u00f3stwo czasu, poniewa\u017c pisanie takich ogromnych zapyta\u0144 SQL zawsze wi\u0105\u017ce si\u0119 z kosztami. Mo\u017cecie \u0142atwo pope\u0142ni\u0107 b\u0142\u0105d i potem d\u0142ugo nie rozumie\u0107, co si\u0119 dzieje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/511bb35469567b07412a10bb7c0b7312.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A to jest zapytanie, kt\u00f3re nie zmie\u015bci\u0142o si\u0119 nawet na jednym slajdzie, wi\u0119c musia\u0142em je podzieli\u0107 na dwie kolumny. To r\u00f3wnie\u017c zapytanie w ClickHouse, kt\u00f3re robi to samo co rate, ale dla obu szereg\u00f3w czasowych: zar\u00f3wno dla Silent Boba, jak i dla Jaya, aby\u015bmy mieli dwa szeregi czasowe na panelu. I to ju\u017c jest bardzo skomplikowane, moim zdaniem. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/c9c1e6b58672069370153a151dceef3d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W przypadku Prometheusa to b\u0119dzie sum (rate). Dla ClickHouse stworzy\u0142em osobny makro, kt\u00f3ry nazywa si\u0119 RateColumns, kt\u00f3ry wygl\u0105da jak zapytanie w Prometheus.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/9743c6a4b3de4aab7cfb5bd3fd50fcfd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Spojrzeli\u015bmy i wydaje si\u0119, \u017ce PromQL jest \u015bwietny, ale ma oczywi\u015bcie swoje ograniczenia.<\/p>\n<p><\/p>\n<p>One to:<\/p>\n<p><\/p>\n<ul>\n<li>Ograniczone SELECT.<\/li>\n<li>Ograniczone JOIN.<\/li>\n<li>Brak wsparcia dla HAVING.<\/li>\n<\/ul>\n<p><\/p>\n<p>I je\u015bli d\u0142ugo z nim pracowali\u015bcie, to wiecie, \u017ce czasami bardzo trudno jest co\u015b zrobi\u0107 w PromQL, a w SQL mo\u017cna praktycznie wszystko, poniewa\u017c wszystkie te opcje, o kt\u00f3rych teraz rozmawiali\u015bmy, mo\u017cna by\u0142o zrobi\u0107 w SQL. Ale czy by\u0142oby wygodnie z tego korzysta\u0107? To prowadzi mnie do my\u015bli, \u017ce nie zawsze najpot\u0119\u017cniejszy j\u0119zyk mo\u017ce by\u0107 najwygodniejszy.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/ec8786f1d72a1f8652fa631cdffc9c25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dlatego czasami trzeba wybiera\u0107 j\u0119zyk odpowiedni do zada\u0144. To jak bitwa Batmana z Supermanem. Jasne, \u017ce Superman jest silniejszy, ale Batman zdo\u0142a\u0142 go pokona\u0107, poniewa\u017c by\u0142 bardziej praktyczny i dok\u0142adnie wiedzia\u0142, co robi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/59e5cb7e54ee14705a9e8a36db6f5541.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A nast\u0119pna cz\u0119\u015b\u0107 \u2013 to Extending PromQL.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/b806acf0e6c7c416614d3fd49004b4be.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jeszcze raz o VictoriaMetrics. Czym jest VictoriaMetrics? To baza danych szereg\u00f3w czasowych, jest w OpenSource, dystrybuujemy jej wersje pojedyncze i klastrowe. Z naszych benchmark\u00f3w wynika, \u017ce jest najszybsza na rynku i pod wzgl\u0119dem kompresji podobnie, czyli \u017cywi ludzie raportuj\u0105 kompresj\u0119 na poziomie oko\u0142o 0,4 bajta na punkt, podczas gdy w Prometheus to 1,2\u20131,4. <\/p>\n<p><\/p>\n<p>Obs\u0142ugujemy nie tylko Prometheus. Obs\u0142ugujemy InfluxDB, Graphite, OpenTSDB.<\/p>\n<p><\/p>\n<p>Mo\u017cemy \"zapisywa\u0107\" w nas, tzn. mo\u017cna przenosi\u0107 stare dane. <\/p>\n<p><\/p>\n<p>I jeszcze idealnie wsp\u00f3\u0142pracujemy z Prometheusem i Grafan\u0105, czyli wspieramy silnik PromQL. I w Grafanie mo\u017cecie po prostu zmieni\u0107 punkt ko\u0144cowy Prometheusa na VictoriaMetrics i wszystkie wasze pulpity b\u0119d\u0105 dzia\u0142a\u0107 jak wcze\u015bniej. <\/p>\n<p><\/p>\n<p>Ale mo\u017cesz tak\u017ce korzysta\u0107 z dodatkowych funkcji, kt\u00f3re oferuje VictoriaMetrics.<\/p>\n<p><\/p>\n<p>Szybko przejdziemy przez funkcje, kt\u00f3re dodali\u015bmy.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/78e9c0ce91fad48ab859fc2cf06a0689.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Omi\u0144 parametr interwa\u0142u \u2013 mo\u017cesz pomija\u0107 parametry interwa\u0142u w Grafana. Gdy nie chcesz uzyskiwa\u0107 dziwnych wykres\u00f3w przy powi\u0119kszaniu lub pomniejszaniu na panelu, zaleca si\u0119 u\u017cycie zmiennej <code>$__interval<\/code>. To wewn\u0119trzna zmienna Grafana i ona sama wybiera zakres danych. A VictoriaMetrics potrafi sama zrozumie\u0107, jaki ten zakres powinien by\u0107. Nie musisz aktualizowa\u0107 wszystkich swoich zapyta\u0144. To b\u0119dzie znacznie \u0142atwiejsze.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/4094c7b8b5e6eef6134b5aa344ef7409.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Drug\u0105 funkcj\u0105 jest referencjonowanie interwa\u0142\u00f3w. Mo\u017cesz u\u017cywa\u0107 tego interwa\u0142u w swoich wyra\u017ceniach. Mo\u017cesz go mno\u017cy\u0107, dzieli\u0107, przekazywa\u0107, odnosi\u0107 si\u0119 do niego.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/967ca6166e588987bd69c1e1953dca31.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dalej mamy rodzin\u0119 funkcji rollup. Funkcja rollup przekszta\u0142ca ka\u017cd\u0105 Twoj\u0105 seri\u0119 czasow\u0105 w trzy oddzielne serie czasowe. To min, max i avg. Uwa\u017cam, \u017ce to bardzo wygodne, poniewa\u017c czasami mo\u017ce to pokaza\u0107 jakie\u015b odst\u0119pstwa (anomalia) i nie\u015bcis\u0142o\u015bci. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/d5ff7d6f6ae8f7550434a3dbbca09b20.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I je\u015bli po prostu robisz irate lub rate, to prawdopodobnie mo\u017cesz przeoczy\u0107 niekt\u00f3re przypadki, kiedy seria czasowa zachowuje si\u0119 inaczej ni\u017c si\u0119 spodziewa\u0142e\u015b. Z t\u0105 funkcj\u0105 znacznie \u0142atwiej zobaczy\u0107, na przyk\u0142ad, \u017ce max znacznie odbiega od avg.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/a4e9f0d246fa33459597f7140e09538c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dalej zmienna default. Default oznacza, jak\u0105 warto\u015b\u0107 musimy wy\u015bwietli\u0107 w Grafana, je\u015bli w danym momencie nie mamy serii czasowej. Kiedy to si\u0119 dzieje? Na przyk\u0142ad, eksportujesz jak\u0105\u015b metryk\u0119 dotycz\u0105c\u0105 b\u0142\u0119d\u00f3w. A Twoja aplikacja jest tak \u015bwietna, \u017ce po uruchomieniu nie masz b\u0142\u0119d\u00f3w, a nawet przez nast\u0119pne trzy godziny lub nawet dzie\u0144. Masz panele, kt\u00f3re pokazuj\u0105 stosunek sukces\u00f3w do b\u0142\u0119d\u00f3w. I nic Ci nie wyka\u017c\u0105, poniewa\u017c nie masz metryki b\u0142\u0119d\u00f3w. A w default mo\u017cesz wskaza\u0107 cokolwiek.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/cb4e23199194006186ac6907d2335cf6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Keep_last_Value \u2013 zapami\u0119tuje ostatni\u0105 warto\u015b\u0107 metryki, je\u015bli znikn\u0119\u0142a. Je\u015bli Prometheus po nast\u0119pnym skanowaniu nie znajdzie jej przez 5 minut, to zapami\u0119tamy jej ostatni\u0105 warto\u015b\u0107, a Twoje wykresy znowu si\u0119 nie zepsuj\u0105.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/ca202f8a70f071cbd85b33b98cd28bb5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Scrape_interval \u2013 pokazuje, jak cz\u0119sto Prometheus zbiera dane na temat Twojej metryki, z jak\u0105 cz\u0119stotliwo\u015bci\u0105. Tutaj mo\u017cesz zobaczy\u0107 pomini\u0119cie, na przyk\u0142ad. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/9e9f43c7e9ef9a24dcc0b43673558046.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLabel replace \u2013 popularna funkcja. Ale uwa\u017camy, \u017ce jest nieco skomplikowana, poniewa\u017c przyjmuje pi\u0119\u0107 argument\u00f3w. I musisz pami\u0119ta\u0107 nie tylko o pi\u0119ciu argumentach, ale tak\u017ce o ich kolejno\u015bci.<br \/>\n<img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/adfee335e9329f6b03d6f8a42ad8e7b8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDlatego dlaczego nie upro\u015bci\u0107 ich? To znaczy, podzieli\u0107 na mniejsze funkcje z czyteln\u0105 sk\u0142adni\u0105.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/e928549205018e7405cc2a81970a8514.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A teraz najciekawsze. Dlaczego uwa\u017camy, \u017ce to jest rozbudowane PromQL? Poniewa\u017c wspieramy wsp\u00f3lne wyra\u017cenia tabelaryczne. Mo\u017cesz zeskanowa\u0107 kod QR (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/wiki\/ExtendedPromQL\">https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/wiki\/ExtendedPromQL<\/a><\/noindex>), aby zobaczy\u0107 linki z przyk\u0142adami, z placem zabaw, gdzie mo\u017cesz wykona\u0107 zapytania bez instalacji VictoriaMetrics, po prostu w przegl\u0105darce.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/33259a4bcd1a92f2cab6e943b73502ad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I co to w\u0142a\u015bciwie jest? To zapytanie na g\u00f3rze \u2013 to do\u015b\u0107 popularne zapytanie. My\u015bl\u0119, \u017ce w ka\u017cdym pulpicie nawigacyjnym w wielu firmach u\u017cywasz tego samego filtru dla wszystkiego. Zwykle tak jest. Ale gdy musisz doda\u0107 nowy filtr, musisz zaktualizowa\u0107 ka\u017cdy panel lub pobra\u0107 pulpit nawigacyjny, otworzy\u0107 go w JSON, wykona\u0107 find replace, co r\u00f3wnie\u017c zajmuje czas. Dlaczego nie zachowa\u0107 t\u0119 warto\u015b\u0107 w zmiennej i ponownie j\u0105 wykorzysta\u0107? To wydaje mi si\u0119 znacznie prostsze i bardziej zrozumia\u0142e.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/60aea73cf49934ef7d9a7928a8e2f8e7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na przyk\u0142ad, gdy musz\u0119 aktualizowa\u0107 filtry w Grafanie we wszystkich zapytaniach, a pulpit nawigacyjny mo\u017ce by\u0107 ogromny lub mo\u017ce by\u0107 ich nawet kilka. Jak chcia\u0142bym rozwi\u0105za\u0107 ten problem w Grafanie?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/7cf9eb13219bbd9a5d3240bdda1839a2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rozwi\u0105zuj\u0119 ten problem w ten spos\u00f3b: robi\u0119 commonFilter i w nim definiuj\u0119 ten filtr, a potem ponownie go wykorzystuj\u0119 w zapytaniach. Ale je\u015bli teraz zrobisz tak samo, to nie zadzia\u0142a, poniewa\u017c Grafana nie pozwala ci u\u017cywa\u0107 zmiennych w zmiennych zapyta\u0144. I to jest troch\u0119 dziwne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/0b7a40976cb3eeda370518a242f78708.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I dlatego zrobi\u0142em tak\u0105 wersj\u0119, kt\u00f3ra to umo\u017cliwia. A je\u015bli jeste\u015b zainteresowany lub chcia\u0142by\u015b t\u0119 funkcj\u0119, to wesprzyj j\u0105 lub daj dislike, je\u015bli ta idea ci si\u0119 nie podoba. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/grafana\/grafana\/pull\/16694\">https:\/\/github.com\/grafana\/grafana\/pull\/16694<\/a><\/noindex><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/68e3a408ff2b554cdfd61a2da4c75bc0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dalej m\u00f3wimy o rozszerzonym PromQL. Tutaj definiujemy nie tylko zmienn\u0105, ale bezpo\u015brednio ca\u0142\u0105 funkcj\u0119. Nazywamy j\u0105 ru (zu\u017cycie zasob\u00f3w). Funkcja ta przyjmuje wolne zasoby, ograniczenia zasob\u00f3w i filtr. Sk\u0142adnia wydaje si\u0119 by\u0107 prosta. I bardzo \u0142atwo jest u\u017cywa\u0107 tej funkcji i obliczy\u0107 procent wolnej pami\u0119ci u nas. To znaczy, ile mamy pami\u0119ci, jakie mamy ograniczenia i jak filtrowa\u0107. To wydaje si\u0119 znacznie wygodniejsze, gdyby\u015b wszystko pisa\u0142, ponownie wykorzystuj\u0105c te same filtry, poniewa\u017c to zamieni\u0142oby si\u0119 w ogromne zapytanie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/4ca66e18ac665fe1038493709530b82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oto przyk\u0142ad takiego ogromnego zapytania. Pochodzi z oficjalnego panelu NodeExporter dla Grafany. Ale s\u0142abo rozumiem, co tutaj si\u0119 dzieje. To znaczy, oczywi\u015bcie, rozumiem, je\u015bli si\u0119 przyjrz\u0119, ale liczba nawias\u00f3w mo\u017ce natychmiast obni\u017cy\u0107 motywacj\u0119 do rozumienia, co tutaj si\u0119 wydarzy\u0142o. A czemu by nie uczyni\u0107 tego prostszym i bardziej zrozumia\u0142ym?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/50e01e7f0c1d03965b028266130413f0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na przyk\u0142ad, tak, wydobywaj\u0105c znacz\u0105ce rzeczy lub cz\u0119\u015bci do zmiennych. A potem przeprowadzaj\u0105c swoj\u0105 podstawow\u0105 matematyk\u0119. To ju\u017c bardziej przypomina programowanie, to jest to, co chcia\u0142bym zobaczy\u0107 w przysz\u0142o\u015bci w Grafanie.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/81f957d89f97ebf686abdf969982d3ba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oto drugi przyk\u0142ad, jak mogliby\u015bmy to jeszcze upro\u015bci\u0107, gdyby\u015bmy ju\u017c mieli t\u0119 funkcj\u0119 ru, a ona ju\u017c istnieje w VictoriaMetrics. Wtedy po prostu przekazujesz zaksi\u0119gowan\u0105 warto\u015b\u0107, kt\u00f3r\u0105 zadeklarowa\u0142e\u015b w CTE.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/415302741e14232228353db6ec57a2e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ju\u017c m\u00f3wi\u0142em, jak wa\u017cne jest u\u017cycie odpowiedniego j\u0119zyka programowania. I prawdopodobnie w ka\u017cdej firmie w Grafanie dzieje si\u0119 co\u015b w\u0142asnego. I zapewne dajesz dost\u0119p do Grafany swoim programistom, a programi\u015bci robi\u0105 co\u015b swojego. A wszyscy robi\u0105 to jako\u015b inaczej. A chcia\u0142bym, \u017ceby jako\u015b by\u0142o to jednolite, to znaczy sprowadzi\u0107 to do wsp\u00f3lnego standardu.<\/p>\n<p><\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce masz nie tylko in\u017cynier\u00f3w systemowych, mo\u017ce masz nawet ekspert\u00f3w, DevOps\u00f3w lub SRE. Mo\u017ce masz ekspert\u00f3w, kt\u00f3rzy wiedz\u0105, co to jest monitorowanie, wiedz\u0105, co to jest Grafana, to znaczy pracuj\u0105 z tym od lat i dok\u0142adnie wiedz\u0105, jak robi\u0107 to prawid\u0142owo. I pisali to ju\u017c 100 razy i wszystkim wyja\u015bniali, ale z jakiego\u015b powodu nikt ich nie s\u0142ucha.<\/p>\n<p><\/p>\n<p>A co, je\u015bli mogliby te wiedz\u0119 bezpo\u015brednio umie\u015bci\u0107 w Grafanie, aby inni u\u017cytkownicy mogli ponownie wykorzystywa\u0107 te funkcje? A je\u015bli trzeba by by\u0142o obliczy\u0107 procent wolnej pami\u0119ci, po prostu zastosowaliby funkcj\u0119. A co, je\u015bli tw\u00f3rcy eksporter\u00f3w, wraz ze swoim produktem, dostarczali r\u00f3wnie\u017c zestaw funkcji do pracy z ich metrykami, poniewa\u017c dok\u0142adnie wiedz\u0105, czym s\u0105 te metryki i jak je prawid\u0142owo oblicza\u0107?<\/p>\n<p><\/p>\n<p>To na prawd\u0119 nie istnieje. To zrobi\u0142em sam. To wsparcie dla bibliotek w Grafanie. Za\u0142\u00f3\u017cmy, \u017ce ch\u0142opaki, kt\u00f3rzy zrobili NodeExporter, zrobili to, o czym rozmawia\u0142em. I r\u00f3wnie\u017c dostarczyli zestaw funkcji. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/755391ee41fd2abf4cb74fad17cecaf0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>To znaczy, wygl\u0105da to mniej wi\u0119cej tak. Pod\u0142\u0105czasz t\u0119 bibliotek\u0119 w Grafanie, przechodzisz do edytora i wszystko jest bardzo prosto opisane w JSON-ie, jak dzia\u0142a\u0107 z t\u0105 metryk\u0105. To znaczy jaki\u015b zestaw funkcji, ich opisy i w co one s\u0105 rozwijane.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/78a85dd219a421757807be895c173a39.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Moim zdaniem mog\u0142oby to by\u0107 przydatne, poniewa\u017c wtedy w Grafanie pisaliby\u015bcie po prostu tak. I Grafana \"m\u00f3wi\", \u017ce jest taka funkcja z tej biblioteki \u2013 u\u017cyjmy jej. Uwa\u017cam, \u017ce to by\u0142oby bardzo fajne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/6e6b2b459c574d95d56251cd5fae5586.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kilka s\u0142\u00f3w o VictoriaMetrics. Robimy wiele interesuj\u0105cych rzeczy. Przeczytaj nasze artyku\u0142y o kompresji, o naszych rywalizacjach z innymi aplikacjami danych szereg\u00f3w czasowych, nasze wyja\u015bnienie, jak pracowa\u0107 z PromQL, poniewa\u017c w tym wci\u0105\u017c jest wielu nowicjuszy, a tak\u017ce o pionowej skalowalno\u015bci i o rywalizacji z Thanos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 interpretacja prezentacji Romana Chawronienko\" src=\"\/wp-content\/uploads\/2020\/03\/562829a25ee6131c7eaed8c561c6927c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pytania:<\/p>\n<p><\/p>\n<p><em>Zaczn\u0119 moje pytanie od prostej historii z \u017cycia. Kiedy po raz pierwszy zacz\u0105\u0142em korzysta\u0107 z Grafany, napisa\u0142em bardzo przekonuj\u0105ce zapytanie sk\u0142adaj\u0105ce si\u0119 z 5 linii. Ostatecznie powsta\u0142 bardzo przekonuj\u0105cy wykres. Ten wykres niemal trafi\u0142 do produkcji. Ale po bli\u017cszym przyjrzeniu okaza\u0142o si\u0119, \u017ce ten wykres pokazuje absolutne bzdury, kt\u00f3re nie maj\u0105 \u017cadnego zwi\u0105zku z rzeczywisto\u015bci\u0105, chocia\u017c liczby mieszcz\u0105 si\u0119 w zakresie, kt\u00f3ry spodziewali\u015bmy si\u0119 zobaczy\u0107. I moje pytanie. Mamy biblioteki, mamy funkcje, a jak piszemy testy dla Grafany? Napisa\u0142e\u015b skomplikowane zapytanie, od kt\u00f3rego zale\u017cy decyzja biznesowa \u2013 zam\u00f3wi\u0107 prawdziwy kontener serwer\u00f3w, czy nie zamawia\u0107. I jak mo\u017cemy mie\u0107 pewno\u015b\u0107, \u017ce ta funkcja, kt\u00f3ra rysuje wykres, przypomina prawd\u0119. Dzi\u0119kuj\u0119.<\/em><\/p>\n<p><\/p>\n<p>Dzi\u0119kuj\u0119 za pytanie. To ma dwie cz\u0119\u015bci. Po pierwsze \u2013 mam wra\u017cenie, na podstawie mojego do\u015bwiadczenia, \u017ce wi\u0119kszo\u015b\u0107 u\u017cytkownik\u00f3w, kiedy patrzy na swoje wykresy, nie rozumie, co one im pokazuj\u0105. Dlaczego\u015b ludzie s\u0105 bardzo dobrzy w wymy\u015blaniu usprawiedliwienia dla ka\u017cdej anomalii, kt\u00f3ra wyst\u0119puje na wykresach, nawet je\u015bli jest to b\u0142\u0105d wewn\u0105trz funkcji. A druga cz\u0119\u015b\u0107 \u2013 wydaje mi si\u0119, \u017ce u\u017cycie takich funkcji lepiej odpowiada\u0142oby na rozwi\u0105zanie twojego problemu, zamiast tego, by ka\u017cdy z twoich deweloper\u00f3w robi\u0142 sw\u00f3j planowanie pojemno\u015bci i myli\u0142 si\u0119 z jakim\u015b prawdopodobie\u0144stwem.<\/p>\n<p><\/p>\n<p><em>Jak sprawdzi\u0107?<\/em><\/p>\n<p><\/p>\n<p>Jak sprawdzi\u0107? Prawdopodobnie, wcale. <\/p>\n<p><\/p>\n<p><em>W formie testu w Grafanie.<\/em><\/p>\n<p><\/p>\n<p>Co ma z tym wsp\u00f3lnego Grafana? Grafana przek\u0142ada to zapytanie bezpo\u015brednio na DataSource.<\/p>\n<p><\/p>\n<p><em>Dodaj\u0105c troch\u0119 do parametr\u00f3w.<\/em><\/p>\n<p><\/p>\n<p>Nie, w Grafanie niczego nie dodaj\u0105. Mog\u0105 by\u0107 parametry GET, jak na przyk\u0142ad step. Nie jest on wyra\u017anie okre\u015blony, ale mo\u017cesz go nadpisa\u0107, mo\u017cesz go nie nadpisywa\u0107, ale dodawany jest automatycznie. Nie napiszesz tutaj test\u00f3w. My\u015bl\u0119, \u017ce nie warto polega\u0107 na Grafanie jako \u017ar\u00f3dle prawdy.<\/p>\n<p><\/p>\n<p><em>Dzi\u0119kuj\u0119 za prezentacj\u0119! Dzi\u0119kuj\u0119 za kompresj\u0119! Wspomnia\u0142e\u015b o mapowaniu zmiennej w wykresie, \u017ce w Grafanie nie mo\u017cna u\u017cywa\u0107 zmiennej w zmiennej. Rozumiesz, o co mi chodzi?<\/em><\/p>\n<p><\/p>\n<p>Tak.<\/p>\n<p><\/p>\n<p><em>To by\u0142a pierwotnie prawdziwa zmora, kiedy chcia\u0142em stworzy\u0107 alert w Grafanie. Musisz tworzy\u0107 alert dla ka\u017cdego hosta z osobna. Czy ta rzecz, kt\u00f3r\u0105 zrobi\u0142e\u015b, dzia\u0142a dla alert\u00f3w w Grafanie?<\/em><\/p>\n<p><\/p>\n<p>Je\u015bli Grafana nie odwo\u0142uje si\u0119 do zmiennych w inny spos\u00f3b, to tak, b\u0119dzie dzia\u0142a\u0107. Ale moj\u0105 rad\u0105 jest, aby w og\u00f3le nie u\u017cywa\u0107 alert\u00f3w w Grafanie, lepiej u\u017cy\u0107 alertmanagera.<\/p>\n<p><\/p>\n<p><em>Tak, u\u017cywam go, ale po prostu w Grafanie wydawa\u0142o si\u0119 to \u0142atwiejsze w konfiguracji, ale dzi\u0119kuj\u0119 za rad\u0119!<\/em><\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/494034\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e &quot;ExtendedPromQL&quot; \u041a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u043e \u043c\u043d\u0435. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0420\u043e\u043c\u0430\u043d. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 CloudFlare, \u0436\u0438\u0432\u0443 \u0432 \u041b\u043e\u043d\u0434\u043e\u043d\u0435. \u041d\u043e \u0442\u0430\u043a\u0436\u0435 \u044f \u043c\u0435\u0439\u0442\u0435\u043d\u0435\u0440 VictoriaMetrics. \u0418 \u044f \u0430\u0432\u0442\u043e\u0440 ClickHouse \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f Grafana \u0438 ClickHouse-proxy \u2013 \u044d\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u043e\u043a\u0441\u0438 \u0434\u043b\u044f ClickHouse. \u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430\u00bb \u0438 \u0432 \u043d\u0435\u0439 \u044f \u0431\u0443\u0434\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":75586,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-75585","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e &quot;ExtendedPromQL&quot;\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u00abExtendedPromQL\u00bb \u2014 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e &quot;ExtendedPromQL&quot;\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-27T05:42:28+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-27T05:42:28+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u201eExtendedPromQL\u201d \u2014 om\u00f3wienie prezentacji Romana Chavronenko | ProHoster","description":"Prosz\u0119 zapozna\u0107 si\u0119 z transkrypcj\u0105 wyst\u0105pienia Romana Hawronienki \"ExtendedPromQL\"","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u00abExtendedPromQL\u00bb \u2014 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e &quot;ExtendedPromQL&quot;","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-27T05:42:28+00:00","article:modified_time":"2020-03-27T05:42:28+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"75585","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:54:47","updated":"2022-09-28 07:46:53","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/75585","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=75585"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/75585\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/75586"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=75585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=75585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=75585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}