Men sizga Roman Xavronenkoning "ExtendedPromQL" hisobotining stenogrammasini o'qishni taklif qilaman.
Men haqimda qisqacha. Mening ismim Roman. Men CloudFlare-da ishlayman va Londonda yashayman. Lekin men ham VictoriaMetrics boshqaruvchisiman.
Va men muallifman
Biz “Tarjimaning qiyinchiliklari” deb nomlangan birinchi qismdan boshlaymiz va unda men har qanday til yoki shunchaki muloqot tili juda muhim ekanligi haqida gapiraman. Chunki siz o'z fikrlaringizni boshqa shaxs yoki tizimga mana shunday etkazasiz, so'rovni qanday shakllantirasiz. Internetdagi odamlar qaysi til yaxshiroq - java yoki boshqasi haqida bahslashmoqda. O'zim uchun men vazifaga ko'ra tanlashim kerak deb qaror qildim, chunki bularning barchasi o'ziga xosdir.
Eng boshidan boshlaylik. PromQL nima? PromQL - bu Prometey so'rovlar tili. Vaqt seriyalari ma'lumotlarini olish uchun biz Prometeyda so'rovlarni shunday shakllantiramiz.
Vaqt seriyali ma'lumotlari nima? To'liq ma'noda, bu uchta parametr.
Ular quyidagilardir:
- Biz nimaga qarayapmiz?
- Biz qaraganimizda.
- Va u qanday qiymatni ko'rsatadi?
Agar siz ushbu jadvalga qarasangiz (bu diagramma mening telefonimdan olingan boʻlib, u mening qadamlarimni koʻrsatadi), u bu savollarga tezda javob berishi mumkin.
Biz qadamlarni ko'rib chiqamiz. Biz unga qaraganimizda ma'noni ko'ramiz va vaqtni ko'ramiz. Ya'ni, ushbu diagrammaga qarab, yakshanba kuni men 15 000 ga yaqin qadamni bosib o'tganimni osongina aytishingiz mumkin. Bu vaqt seriyasi ma'lumotlari.
Endi ularni jadval ko'rinishidagi boshqa ma'lumotlar modeliga "ajratamiz" (aylantiramiz). Bu erda biz ko'rayotgan narsamiz ham bor. Bu erda men bir oz qo'shimcha ma'lumotlarni qo'shdim, biz ularni meta-ma'lumotlar deb ataymiz, ya'ni bu men emas, balki ikki kishi, masalan, Jey va Silent Bob. Bu biz ko'rib chiqayotgan narsa; u nimani ko'rsatadi va qachon bu qiymatni ko'rsatadi.
Keling, ushbu ma'lumotlarning barchasini ma'lumotlar bazasida saqlashga harakat qilaylik. Masalan, men ClickHouse sintaksisini oldim. Va bu erda biz "Qadamlar" deb nomlangan bitta jadvalni yaratamiz, ya'ni biz nimani ko'rib chiqamiz. Biz unga qaraydigan vaqt bor; u nimani ko'rsatadi va ba'zi meta-ma'lumotlar biz kimligini qaerda saqlaymiz: Jey va Silent Bob.
Va bularning barchasini tasavvur qilishga harakat qilish uchun biz Grafana-dan foydalanamiz, chunki birinchi navbatda u chiroyli.
Biz ham ushbu plagindan foydalanamiz. Buning ikkita sababi bor. Birinchisi, men yozganim uchun. Va men Grafana-da ko'rsatish uchun ClickHouse-dan vaqt seriyasi ma'lumotlarini olish qanchalik qiyinligini aniq bilaman.
Biz uni Grafik panelida ko'rsatamiz. Bu Grafana'dagi eng mashhur panel bo'lib, u qiymatning vaqtga bog'liqligini ko'rsatadi, shuning uchun bizga faqat ikkita parametr kerak.
Keling, eng oddiy so'rovni yozamiz - Grafana-da qadamlar statistikasini qanday ko'rsatish, ushbu ma'lumotlarni ClickHouse-da saqlash, biz yaratgan jadvalda. Va biz bu oddiy so'rovni yozamiz. Biz qadamlardan tanlaymiz. Biz qiymatni tanlaymiz va bu qiymatlarning vaqtini tanlaymiz, ya'ni biz gaplashgan bir xil uchta parametr.
Va natijada biz shunga o'xshash grafikni olamiz. Kim biladi u nega g'alati?
To'g'ri, vaqt bo'yicha saralashimiz kerak.
Va oxirida biz yaxshiroq, ammo g'alati jadvalga ega bo'lamiz. Kim biladi nega? To'g'ri, ikkita ishtirokchi bor va biz Grafana'da ikkita vaqt seriyasini taqdim etamiz, chunki agar siz ma'lumotlar modeliga yana qarasangiz, har bir vaqt seriyasi nom va barcha kalit-qiymat belgilarining noyob birikmasidir.
Shuning uchun, biz ma'lum bir odamni tanlashimiz kerak. Biz Jeyni tanlaymiz.
Va yana chizamiz. Endi grafik haqiqatga o'xshaydi. Endi bu oddiy jadval va hamma narsa yaxshi ishlaydi.
Va, ehtimol, siz taxminan bir xil narsani qanday qilishni bilasiz, lekin Prometeyda PromQL orqali. Shunga o'xshash narsa. Bir oz oddiyroq. Va keling, hammasini parchalab olaylik. Biz qadam tashladik. Va Jey tomonidan filtrlang. Bu erda biz qiymat olishimiz kerakligini va vaqtni tanlamaymiz.
Endi Jey yoki Silent Bobning harakat tezligini hisoblashga harakat qilaylik. ClickHouse-da biz runDifference-ni bajarishimiz kerak bo'ladi, ya'ni aniq tezlikni olish uchun juft nuqtalar orasidagi farqni hisoblab, ularni vaqtga bo'linadi. So'rov shunday ko'rinishga ega bo'ladi.
Va u taxminan bu qiymatlarni ko'rsatadi, ya'ni Silent Bob yoki Jay soniyada taxminan 1,8 qadamni oladi.
Va Prometeyda buni qanday qilishni bilasiz. Avvalgidan ancha oson.
Grafana-da buni ham oson qilish uchun men PromQL-ga juda o'xshash bo'lgan ushbu o'ramni qo'shdim. U Rate makroslari yoki siz uni nima deb atamoqchi bo'lsangiz, deyiladi. Grafana-da siz oddiygina “stavka” deb yozasiz, lekin chuqur qayerdadir bu katta talabga aylanadi. Va hatto unga qarashning hojati yo'q, u bir joyda bor, lekin siz ko'p vaqtni tejaysiz, chunki bunday katta SQL so'rovlarini yozish har doim qimmat. Siz osongina xato qilishingiz mumkin va keyin uzoq vaqt davomida nima bo'layotganini tushunmaysiz.
Va bu hatto bitta slaydga to'g'ri kelmaydigan so'rov va men uni ikkita ustunga bo'lishga majbur bo'ldim. Bu, shuningdek, ClickHouse-dagi so'rov bo'lib, u bir xil stavkani amalga oshiradi, lekin ikkala vaqt seriyasi uchun: Silent Bob va Jay, shuning uchun panelda ikkita vaqt seriyasi mavjud. Va bu, mening fikrimcha, allaqachon juda qiyin.
Va Prometeyga ko'ra bu summa (stavka) bo'ladi. ClickHouse uchun men Prometeydagi so'rovga o'xshab ko'rinadigan RateColumns deb nomlangan alohida makro yaratdim.
Biz buni ko'rib chiqdik va PromQL juda zo'r ko'rinadi, lekin u, albatta, cheklovlarga ega.
Ular quyidagilardir:
- Cheklangan SELECT.
- Borderline JOINs.
- HAVING qo'llab-quvvatlashi yo'q.
Va agar siz u bilan uzoq vaqt ishlagan bo'lsangiz, bilasizki, ba'zida PromQL-da biror narsa qilish juda qiyin, ammo SQL-da siz deyarli hamma narsani qilishingiz mumkin, chunki biz hozirgina aytib o'tgan barcha variantlarni SQL-da bajarish mumkin edi. . Ammo undan foydalanish qulay bo'ladimi? Va bu meni eng kuchli til har doim ham eng qulay bo'lishi mumkin emas deb o'ylaydi.
Shuning uchun, ba'zan siz vazifa uchun tilni tanlashingiz kerak. Bu Betmen Supermenga qarshi kurashga o'xshaydi. Supermen kuchliroq ekanligi aniq, ammo Betmen uni engishga muvaffaq bo'ldi, chunki u amaliyroq va nima qilayotganini aniq bilardi.
Va keyingi qism - PromQL-ni kengaytirish.
Yana bir bor VictoriaMetrics haqida. VictoriaMetrics nima? Bu vaqt seriyali ma'lumotlar bazasi, u OpenSource-da, biz uning yagona va klaster versiyalarini tarqatamiz. Bizning ko'rsatkichlarimizga ko'ra, u hozir bozorda mavjud bo'lgan har qanday narsadan tezroq va siqilish o'xshash, ya'ni haqiqiy odamlar har bir nuqta uchun taxminan 0,4 bayt siqilish haqida xabar berishadi, Prometeyniki esa 1,2-1,4.
Biz Prometeydan ko'proq narsani qo'llab-quvvatlaymiz. Biz InfluxDB, Graphite, OpenTSDB-ni qo'llab-quvvatlaymiz.
Siz bizga "yozishingiz" mumkin, ya'ni eski ma'lumotlarni uzatishingiz mumkin.
Va biz Prometey va Grafana bilan mukammal ishlaymiz, ya'ni biz PromQL dvigatelini qo'llab-quvvatlaymiz. Grafana-da siz Prometey so'nggi nuqtasini oddiygina VictoriaMetrics-ga o'zgartirishingiz mumkin va sizning barcha boshqaruv panellaringiz xuddi shunday ishlaydi.
Lekin siz VictoriaMetrics taqdim etgan qo'shimcha funktsiyalardan ham foydalanishingiz mumkin.
Biz qo'shgan xususiyatlarni tezda ko'rib chiqamiz.
Interval parametrini o'tkazib yuborish - Grafana'da interval parametrlarini o'tkazib yuborishingiz mumkin. Panelni kattalashtirish/kichraytirishda g'alati grafiklarni olishni istamasangiz, o'zgaruvchidan foydalanish tavsiya etiladi. $__interval
. Bu ichki Grafana o'zgarishi va u ma'lumotlar oralig'ini o'zi tanlaydi. Va VictoriaMetricsning o'zi bu diapazon nima bo'lishi kerakligini tushunishi mumkin. Va barcha so'rovlaringizni yangilashingiz shart emas. Bu ancha oson bo'ladi.
Ikkinchi funktsiya - intervalli havola. Ushbu intervalni ifodalaringizda ishlatishingiz mumkin. Siz ko'paytirishingiz, bo'lishingiz, o'tkazishingiz, unga murojaat qilishingiz mumkin.
Keyingi - yig'ish funktsiyalari oilasi. Rollup funksiyasi har qanday vaqt seriyasini uchta alohida vaqt seriyasiga aylantiradi. Bular min, maks va oʻrtacha. Men buni juda qulay deb bilaman, chunki ba'zida u ba'zi bir chet va noaniqliklarni ko'rsatishi mumkin.
Va agar siz shunchaki g'azablansangiz yoki baho bersangiz, vaqt seriyasi siz kutgandek ishlamaydigan ba'zi holatlarni o'tkazib yuborasiz. Bu funksiya yordamida buni ko'rish ancha oson, deylik, maks o'rtachadan ancha yuqori.
Keyingi - standart o'zgaruvchi. Standart - agar bizda hozirda vaqt seriyasi bo'lmasa, Grafana-da qanday qiymatni chizishimiz kerakligini anglatadi. Bu qachon sodir bo'ladi? Aytaylik, siz xato koʻrsatkichlarini eksport qilyapsiz. Va sizda shunday ajoyib dastur borki, siz boshlaganingizda, keyingi uch soat yoki hatto bir kun davomida sizda hech qanday xato va hatto xato bo'lmaydi. Va sizda muvaffaqiyatdan xatogacha bo'lgan munosabatlarni ko'rsatadigan asboblar paneli mavjud. Va ular sizga hech narsa ko'rsatmaydi, chunki sizda xato ko'rsatkichi yo'q. Va sukut bo'yicha siz har qanday narsani belgilashingiz mumkin.
Keep_last_Value - agar u etishmayotgan bo'lsa, ko'rsatkichning oxirgi qiymatini saqlaydi. Agar Prometey uni keyingi qirib tashlashdan keyin 5 minut ichida topa olmasa, bu erda biz uning oxirgi qiymatini eslaymiz va sizning jadvallaringiz yana buzilmaydi.
Scrape_interval - Prometey sizning ko'rsatkichingiz bo'yicha ma'lumotlarni qanchalik tez-tez va qaysi chastotada to'plashini ko'rsatadi. Bu erda, masalan, o'tishni ko'rishingiz mumkin.
Yorliqlarni almashtirish mashhur xususiyatdir. Ammo biz buni biroz murakkab deb hisoblaymiz, chunki u butun dalillarni talab qiladi. Va siz nafaqat 5 ta argumentni eslab qolmasdan, balki ularning ketma-ketligini ham eslab qolishingiz kerak.
Shuning uchun, nega ularni soddalashtirmaysiz? Ya'ni, uni tushunarli sintaksis bilan kichik funktsiyalarga bo'ling.
Va endi qiziqarli qism. Nima uchun biz bu kengaytirilgan PromQL deb o'ylaymiz? Chunki biz umumiy jadval ifodalarini qo'llab-quvvatlaymiz. QR kodini kuzatishingiz mumkin (
Va bu nima? Yuqoridagi so'rov juda mashhur. O'ylaymanki, ko'pgina kompaniyalarning har qanday asboblar panelida siz hamma narsa uchun bir xil filtrdan foydalanasiz. Odatda shunday. Lekin siz yangi filtr qo'shishingiz kerak bo'lganda, har bir panelni yangilashingiz yoki asboblar panelini yuklab olishingiz, JSON-da ochishingiz, almashtirishni topishingiz kerak, bu ham vaqt talab etadi. Nima uchun bu qiymatni o'zgaruvchida saqlamaslik va uni qayta ishlatmaslik kerak? Bu, mening fikrimcha, ancha sodda va tushunarli ko'rinadi.
Misol uchun, men barcha so'rovlarda Grafana filtrlarini yangilashim kerak bo'lganda va asboblar paneli juda katta bo'lishi mumkin yoki hatto ulardan bir nechtasi bo'lishi mumkin. Grafana-da bu muammoni qanday hal qilishni xohlayman?
Men bu muammoni shunday hal qilaman: men umumiy Filtrni yarataman va unda ushbu filtrni aniqlayman va keyin uni so'rovlarda qayta ishlataman. Agar hozir ham xuddi shunday qilsangiz, u ishlamaydi, chunki Grafana so‘rov o‘zgaruvchilari ichida o‘zgaruvchilardan foydalanishga ruxsat bermaydi. Va bu biroz g'alati.
Va shuning uchun men sizga buni amalga oshirishga imkon beradigan variantni yaratdim. Va agar siz bunday xususiyatga qiziqsangiz yoki xohlasangiz, uni qo'llab-quvvatlang yoki bu fikr sizga yoqmasa, uni yoqtirmang.
PromQL kengaytirilganligi haqida batafsil. Bu erda biz nafaqat o'zgaruvchini, balki butun funktsiyani aniqlaymiz. Va biz buni ru (resursdan foydalanish) deb ataymiz. Va bu funksiya bepul resurslarni, resurslarni cheklashni va filtrni qabul qiladi. Sintaksis oddiy ko'rinadi. Va bu funksiyadan foydalanish juda oson va bizda mavjud bo'lgan bo'sh xotira foizini hisoblash. Ya'ni, bizda qancha xotira bor, qanday cheklov va qanday filtrlash kerak. Agar siz hammasini bir xil filtrlardan qayta ishlatib yozsangiz, bu ancha qulayroq ko'rinadi, chunki u katta va katta so'rovga aylanadi.
Mana shunday katta, katta iltimosga misol. Bu Grafana uchun rasmiy NodeExporter boshqaruv panelidan. Ammo men bu erda nima bo'layotganini deyarli tushunmayman. Bu, albatta, agar siz diqqat bilan qarasangiz, tushunaman, lekin qavslar soni bu erda nima sodir bo'layotganini tushunish uchun motivatsiyani darhol kamaytirishi mumkin. Va nega buni sodda va tushunarli qilmaysiz?
Masalan, muhim narsalarni yoki qismlarni o'zgaruvchilarga ajratish kabi. Va keyin asosiy matematikangizni bajaring. Bu allaqachon dasturlashga o'xshaydi, men kelajakda Grafana'da ko'rishni xohlayman.
Mana, agar bizda ru funksiyasi allaqachon mavjud bo'lsa va u to'g'ridan-to'g'ri VictoriaMetrics-da mavjud bo'lsa, buni qanday qilib osonroq qilishimiz mumkinligiga ikkinchi misol. Va keyin siz CTE da e'lon qilgan keshlangan qiymatdan o'tasiz.
To'g'ri dasturlash tilidan foydalanish qanchalik muhimligi haqida yuqorida aytib o'tdim. Va, ehtimol, Grafanadagi har bir kompaniyada boshqacha narsa bor. Va, ehtimol, siz Grafana-ga dasturchilaringizga ruxsat berasiz va ishlab chiquvchilar o'zlarining ishlarini qilishadi. Va ularning barchasi buni qandaydir tarzda boshqacha qilishadi. Lekin men qandaydir tarzda bir xil bo'lishini, ya'ni umumiy standartga tushirishni xohlardim.
Aytaylik, sizda hatto tizim muhandislari ham yo'q, ehtimol sizda hatto mutaxassislar, devoplar yoki SRE ham bor. Balki sizda monitoring nimaligini biladigan, Grafana nima ekanligini biladigan, ya'ni u bilan yillar davomida ishlagan va buni qanday qilib to'g'ri bajarishni aniq biladigan mutaxassislaringiz bordir. Va ular buni allaqachon 100 marta yozib, hammaga tushuntirishdi, lekin negadir hech kim eshitmaydi.
Boshqa foydalanuvchilar funksiyalardan qayta foydalanishlari uchun ular ushbu bilimlarni to'g'ridan-to'g'ri Grafana-ga qo'yishsa nima bo'ladi? Va agar ular bo'sh xotira foizini hisoblashlari kerak bo'lsa, ular shunchaki funktsiyani qo'llashadi. Agar eksportchilarni yaratuvchilar o'z mahsuloti bilan bir qatorda o'z ko'rsatkichlari bilan qanday ishlash bo'yicha funktsiyalar to'plamini ham taqdim qilsalar, chunki ular bu ko'rsatkichlar nima ekanligini va ularni qanday to'g'ri hisoblashni yaxshi bilishadi?
Bu haqiqatan ham mavjud emas. Bu men o'zim qilgan ishim. Bu Grafana kutubxonasi yordami. Aytaylik, NodeExporter-ni yaratgan bolalar men aytgan narsani qilishdi. Va ular shuningdek, funktsiyalar to'plamini taqdim etdilar.
Ya'ni, shunga o'xshash narsa ko'rinadi. Siz ushbu kutubxonani Grafana-ga ulaysiz, siz tahrirlashga o'tasiz va JSON-da bu ko'rsatkich bilan qanday ishlash juda oddiy yozilgan. Ya'ni, ba'zi funktsiyalar to'plami, ularning tavsifi va ular nimaga aylanadi.
Menimcha, bu foydali bo'lishi mumkin, chunki Grafana'da siz xuddi shunday yozasiz. Va Grafana sizga falon kutubxonadan falon funksiya borligini "aytadi" - keling, undan foydalanaylik. Menimcha, bu juda zo'r bo'lar edi.
VictoriaMetrics haqida bir oz. Biz juda ko'p qiziqarli narsalarni qilamiz. Siqish haqidagi maqolalarimizni, boshqa vaqt seriyali ma'lumotlar ilovalari bilan musobaqalarimizni, PromQL bilan qanday ishlashni tushuntirishimizni o'qing, chunki bu borada hali ko'plab yangi boshlanuvchilar bor, shuningdek vertikal miqyoslilik va Thanos bilan qarama-qarshilik haqida.
Savollar:
Savolimni oddiy hayotiy voqeadan boshlayman. Men Grafana-dan birinchi marta foydalanishni boshlaganimda, men 5 qator uzunlikdagi juda jozibali so'rov yozdim. Yakuniy natija juda ishonchli grafikdir. Ushbu jadval deyarli ishlab chiqarishga kirdi. Ammo diqqat bilan o'rganib chiqqach, bu grafik haqiqatga hech qanday aloqasi bo'lmagan mutlaqo bema'nilikni ko'rsatayotgani ma'lum bo'ldi, garchi raqamlar biz kutgan diapazonga to'g'ri keladi. Va mening savolim. Bizda kutubxonalar bor, funktsiyalarimiz bor, lekin Grafana uchun testlarni qanday yozamiz? Siz biznes qaroriga bog'liq bo'lgan murakkab so'rov yozdingiz - serverlarning haqiqiy konteyneriga buyurtma berish yoki buyurtma bermaslik. Va biz bilganimizdek, grafikni chizadigan bu funktsiya haqiqatga o'xshaydi. Rahmat.
Savol uchun rahmat. Ikki qism mavjud. Birinchidan, men o'z tajribamga asoslanib, ko'pchilik foydalanuvchilar o'zlarining jadvallarini ko'rganlarida, ular nimani ko'rsatayotganini tushunmaydilar. Ba'zi sabablarga ko'ra, odamlar grafiklarda yuzaga keladigan har qanday anomaliya uchun bahona topishda juda yaxshi, hatto bu funktsiya ichidagi xato bo'lsa ham. Va ikkinchi qism - menimcha, har bir ishlab chiquvchi o'z imkoniyatlarini rejalashtirish va ba'zi bir ehtimollik bilan xato qilish o'rniga, bunday funktsiyalardan foydalanish muammoingizni hal qilishda ancha yaxshi yondashuv bo'ladi.
Qanday tekshirish kerak?
Qanday tekshirish kerak? Balki yo'q.
Grafanada test sifatida.
Grafananing bunga nima aloqasi bor? Grafana ushbu so'rovni to'g'ridan-to'g'ri DataSource-ga tarjima qiladi.
Parametrlarga bir oz qo'shiladi.
Yo'q, Grafana-ga hech narsa qo'shilmaydi. GET parametrlari bo'lishi mumkin, masalan, qadam. Bu aniq ko'rsatilmagan, lekin siz uni bekor qilishingiz mumkin yoki uni bekor qilmasligingiz mumkin, lekin u avtomatik ravishda qo'shiladi. Siz bu yerda testlarni yozmaysiz. Bu erda haqiqat manbai sifatida Grafanaga tayanmasligimiz kerak deb o'ylamayman.
Hisobot uchun rahmat! Siqish uchun rahmat! Grafanada o'zgaruvchini o'zgaruvchida ishlata olmasligingiz haqida grafikda o'zgaruvchini xaritalash haqida gapirdingiz. Nima demoqchi ekanligimni bilasizmi?
Ha.
Grafana'da ogohlantirish yaratmoqchi bo'lganimda, bu dastlab bosh og'rig'i edi. Va u erda siz har bir xost uchun alohida ogohlantirish qilishingiz kerak. Siz yaratgan bu narsa Grafana'da ogohlantirishlar uchun ishlaydimi?
Agar Grafana o'zgaruvchilarga boshqacha kirishmasa, ha, u ishlaydi. Lekin mening maslahatim: Grafana'da ogohlantirishni umuman ishlatmang, siz alertmanagerdan foydalanganingiz ma'qul.
Ha, men undan foydalanaman, lekin Grafana-da sozlash osonroq tuyuldi, lekin maslahat uchun rahmat!
Manba: www.habr.com