{"id":52113,"date":"2019-11-01T00:00:00","date_gmt":"2019-10-31T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik"},"modified":"2020-02-18T13:59:47","modified_gmt":"2020-02-18T10:59:47","slug":"bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino - distribuiran, raz\u0161irljiv agregator metrik","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tako, vi zbirate metrike. Tako kao i mi. I mi tako\u0111e prikupljamo metrike. Naravno, potrebne za biznis. Danas \u0107emo govoriti o prvom linku u sistemu na\u0161eg nadzora \u2014 serveru za agregaciju koji je kompatibilan sa statsd. <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, za\u0161to smo ga napisali i za\u0161to smo odustali od brubeck-a. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - distribuiran, raz\u0161irljiv agregator metrik\" src=\"\/wp-content\/uploads\/2019\/11\/312c9a706828acc65f638a6a8abfc5b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Iz na\u0161ih prethodnih \u010dlanaka (<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/avito\/blog\/335410\/\">1<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/avito\/blog\/343928\/\">2<\/a><\/noindex>) mo\u017ee se saznati da smo do odre\u0111enog trenutka ozna\u010dili metrike koriste\u0107i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. Napisan je u C-u. Sa ta\u010dke gledi\u0161ta koda \u2014 jednostavan poput \u010depa (\u0161to je va\u017eno kada \u017eelite da doprinosite) i, najva\u017enije, bez posebnih problema nosi se sa na\u0161im obimima od 2 miliona metrika u sekundi (MPS) na vrhuncu. Dokumentacija tvrdi da podr\u017eava 4 miliona MPS sa zvezdicom. To zna\u010di da \u0107ete dobiti navedeni broj ako pravilno konfiguri\u0161ete mre\u017eu na Linux-u. (Koliko MPS se mo\u017ee dobiti ako ostavite mre\u017eu kakva jeste, ne znamo). I pored tih prednosti, imali smo nekoliko ozbiljnih pritu\u017ebi na brubeck.<\/p>\n<p><\/p>\n<p><em>Pritu\u017eba 1.<\/em> Github \u2014 developer projekta \u2014 prestao je da ga podr\u017eava: objavljivati zakrpe i ispravke, prihvatati na\u0161e (i ne samo na\u0161e) PR. U poslednjih nekoliko meseci (negde od februara-marta 2018) aktivnost je obnovljena, ali pre toga je bilo skoro 2 godine potpunog zati\u0161ja. Osim toga, projekat se razvija <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">za unutra\u0161nje potrebe Gihub-a<\/a><\/noindex>, \u0161to mo\u017ee predstavljati ozbiljnu prepreku za implementaciju novih funkcionalnosti.<\/p>\n<p><\/p>\n<p><em>Pritu\u017eba 2.<\/em> Ta\u010dnost prora\u010duna. Brubeck prikuplja samo 65536 vrednosti za agregaciju. U na\u0161em slu\u010daju, za neke metrike tokom perioda agregacije (30 sekundi) mo\u017ee stizati mnogo vi\u0161e vrednosti (1 527 392 na vrhuncu). Kao rezultat takvog uzorkovanja, vrednosti maksimuma i minimuma izgledaju beskorisno. Na primer, ovako: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - distribuiran, raz\u0161irljiv agregator metrik\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Kot je bilo<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - distribuiran, raz\u0161irljiv agregator metrik\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Kako je to trebalo da izgleda<\/em><\/p>\n<p><\/p>\n<p>Iz istog razloga, zbirove se uop\u0161te smatraju neta\u010dnim. Dodajte ovome bug sa prelivanjem 32-bitnog float-a, koji uop\u0161te \u0161alje server u segfault prilikom primanja naizgled bezazlene metrike, i postaje zaista odli\u010dno. Bug, ina\u010de, nikada nije ispravljen.<\/p>\n<p><\/p>\n<p>In, kon\u010dno, <em>Pritu\u017eba X<\/em>. Ob trenutku pisanja \u010dlanka smo pripravljeni predstaviti vsem 14 bolj ali manj delujo\u010dim razli\u010dicam statsd, ki smo jih uspeli najti. Predstavljajmo si, da je neka infrastruktura zrasla toliko, da sprejemanje 4 milijone MPS ni ve\u010d dovolj. Ali pa naj ne bi bila \u0161e zrasla, vendar so metrike za vas \u017ee toliko pomembne, da tudi kratki, 2-3 minutni popadi na grafikonih lahko postanejo kriti\u010dni in povzro\u010dijo neustavljive napade depresije pri mened\u017eerjih. Ker je zdravljenje depresije hvale\u017eno delo, so potrebne tehni\u010dne re\u0161itve.<\/p>\n<p><\/p>\n<p>Prvi\u010d, odpornost na napake, da nenadna te\u017eava na stre\u017eniku ne povzro\u010di psihiatri\u010dnega zombija apokalipse v pisarni. Drugi\u010d, skalabilnost, da lahko sprejmete ve\u010d kot 4 milijone MPS, ne da bi kopali globoko v omre\u017eni kup Linux in mirno rasli 'v \u0161irino' do potrebnih dimenzij.<\/p>\n<p><\/p>\n<p>Ker smo imeli rezerve pri skalabilnosti, smo se odlo\u010dili, da za\u010dnemo z odpornostjo na napake. 'O! Odpornost na napake! To je preprosto, to znamo,' smo pomislili in zagnali 2 stre\u017enika, na vsakem smo postavili kopijo brubeck. Za to smo morali podvojiti promet z metriko na oba stre\u017enika in celo napisati za to <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">majhno orodje<\/a><\/noindex>. Ta problem odpornosti na napake smo re\u0161ili, ampak\u2026 ne ravno dobro. Sprva je vse izgledalo dobro: vsak brubeck zbira svojo razli\u010dico agregacije, pi\u0161e podatke v Graphite vsakih 30 sekund, prepisuje prej\u0161nji interval (to se dogaja na strani Graphite). \u010ce en stre\u017enik nenadoma odpove, imamo vedno drugega z lastno kopijo agregiranih podatkov. Ampak tukaj je te\u017eava: \u010de stre\u017enik odpove, se na grafikonih pojavi '\u017eaga'. To je povezano s tem, da 30-sekundni intervali na brubecku niso sinhronizirani, in v trenutku, ko eden od njih pade, se ne prepisuje. Pri zagonu drugega stre\u017enika se zgodi enako. \u010cisto sprejemljivo, vendar bi \u017eeleli bolje! Tudi problem skalabilnosti ni nikamor izginil. Vse metrike \u0161e vedno 'letijo' na en sam stre\u017enik, zato smo omejeni s temi istimi 2-4 milijoni MPS, odvisno od mo\u010di mre\u017ee.<\/p>\n<p><\/p>\n<p>\u010ce malo razmislimo o problemu in hkrati kopljemo sneg, nam lahko v misli pride ena o\u010ditna ideja: potrebujemo statsd, ki deluje v razdeljenem na\u010dinu. To pomeni, da mora biti implementirana sinhronizacija med vozli\u0161\u010di glede na \u010das in metrike. 'Seveda, to re\u0161itev zagotovo \u017ee imajo,' smo rekli in \u0161li iskati \u2026 in nismo na\u0161li ni\u010desar. Ko smo preleteli dokumentacijo o razli\u010dnih statsd (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations\">https:\/\/github.com\/etsy\/statsd\/wiki#server-implementations<\/a><\/noindex> na dan 11.12.2017), nismo na\u0161li prav ni\u010d. O\u010ditno niti razvijalci niti uporabniki teh re\u0161itev se do sedaj niso sre\u010dali s TAK\u0160NIM \u0161tevilom metrik, druga\u010de bi zagotovo \u017ee nekaj izumili.<\/p>\n<p><\/p>\n<p>In tukaj smo se spomnili na 'igra\u010darski' statsd - bioyino, ki smo ga pisali na hackatonu kar za zabavo (ime projekta je skrilpt pred za\u010detkom hackatona) in spoznali, da nujno potrebujemo svoj lastni statsd. Zakaj?<\/p>\n<p><\/p>\n<ul>\n<li>ker je na svetu premalo klonov statsd,<\/li>\n<li>ker lahko zagotovimo \u017eeleno ali skoraj \u017eeljeno odpornost in raz\u0161irljivost (vklju\u010dno s sinhronizacijo agregiranih metrik med stre\u017eniki in re\u0161itvijo problemov s konflikti pri po\u0161iljanju),<\/li>\n<li>ker lahko merimo metrike natan\u010dneje, kot to po\u010dne brubeck,<\/li>\n<li>ker lahko sami zbiramo bolj podrobne statistike, ki nam jih brubeck prakti\u010dno ni ponujal,<\/li>\n<li>ker se nam je ponudila prilo\u017enost, da programiramo svojo lastno visokozmogljivo distribuirano aplikacijo, ki ne bo popolnoma ponavljala arhitekture druge tak\u0161ne visokozmogljive \u2026 nuvyponele. <\/li>\n<\/ul>\n<p><\/p>\n<p>Na \u010dem pisati? Seveda na Rustu. Zakaj?<\/p>\n<p><\/p>\n<ul>\n<li>ker je \u017ee obstajal prototip re\u0161itve,<\/li>\n<li>ker je avtor \u010dlanka v tistem \u010dasu \u017ee poznal Rust in si je \u017eelel napisati nekaj za produkcijo z mo\u017enostjo objave v open-source,<\/li>\n<li>ker nam jeziki z GC ne ustrezajo glede na naravo prejetega prometa (prakti\u010dno v realnem \u010dasu) in so premori GC prakti\u010dno nesprejemljivi, <\/li>\n<li>ker potrebujemo maksimalno zmogljivost, primerljivo s C-jem<\/li>\n<li>ker nam Rust omogo\u010da brezskrbno so\u010dasnost, a \u010de bi za\u010deli pisati to v C\/C++, bi naleteli na \u0161e ve\u010d ranljivosti, prelivanja pomnilnika, race conditions in drugih stra\u0161nih besed.<\/li>\n<\/ul>\n<p><\/p>\n<p>Obstaja tudi argument proti Rustu. Podjetje ni imelo izku\u0161enj z razvojem projektov v Rustu, in tudi sedaj ne na\u010drtujemo, da bi ga uporabili v glavnem projektu. Zato smo imeli resne pomisleke, da nam ne bo uspelo, a smo se odlo\u010dili tvegati in poskusiti.<\/p>\n<p><\/p>\n<p>\u010cas je mineval\u2026<\/p>\n<p><\/p>\n<p>Nazadnje, po ve\u010d neuspe\u0161nih poskusih, je bila prva delujo\u010da razli\u010dica pripravljena. Kaj smo dosegli? Dosegli smo tole.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - distribuiran, raz\u0161irljiv agregator metrik\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vsaka vozli\u0161\u010da prejme svoj lasten nabor metrik in jih kopi\u010di pri sebi, pri \u010demer ne agregira metrik za tiste tipe, kjer bo za kon\u010dno agregacijo potreben njihov celoten nabor. Vozli\u0161\u010da so povezana med seboj preko nekega protokola razdeljene blokade (distributed lock), ki omogo\u010da, da izberejo tisto edino (tukaj smo jokali), ki je vredna po\u0161iljanja metrik Velikemu. Ta problem se trenutno re\u0161uje s sredstvi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, a v prihodnosti avtorjeve ambicije segajo do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">lastnega<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">izvedbo<\/a><\/noindex> Rafta, kjer bo seveda tista vredna vozli\u0161\u010da vodilno vozli\u0161\u010de konsenza. Poleg konsenza, vozli\u0161\u010da pogosto (privzeto enkrat na sekundo) po\u0161iljajo svojim sosedom tiste dele predagregiranih metrik, ki so jih uspeli zbrati v tej sekundi. Tako ostaja skalabilnost in odpornost na napake ohranjena \u2014 vsako vozli\u0161\u010de \u0161e vedno hrani celoten nabor metrik, a se metrike po\u0161iljajo \u017ee agregirane, preko TCP in z zapisovanjem v binarni protokol, kar znatno zni\u017euje stro\u0161ke podvajanja v primerjavi z UDP. Kljub precej\u0161njemu \u0161tevilu prihajajo\u010dih metrik, zbiranje zahteva zelo malo pomnilnika in \u0161e manj CPU. Za na\u0161e dobro stisnjene metrike je to le nekaj deset megabajtov podatkov. Dodatna prednost je odsotnost odve\u010dnih prepisov podatkov v Graphite, kot je to bilo v primeru z burbeck.<\/p>\n<p><\/p>\n<p>UDP paketi z metrikami so porazdeljeni med vozli na omre\u017eni opremi prek preprostega Round Robin. Samo po sebi, omre\u017ena oprema ne analizira vsebine paketov, zato lahko obdeluje veliko ve\u010d kot 4M paketov na sekundo, \u0161e posebej v zvezi z metriko, o kateri sploh ni\u010d ne ve. \u010ce upo\u0161tevamo, da metriki ne prihajajo posamezno v vsakem paketu, ne predvidevamo te\u017eav s u\u010dinkovitostjo na tem mestu. V primeru izpada stre\u017enika omre\u017ena naprava hitro (v 1\u20132 sekundah) odkrije to dejstvo in iz rotacije odstrani pokvarjeni stre\u017enik. Kot rezultat se pasivna (tj. ne vodilna) vozli\u0161\u010da lahko vklapljajo in izklapljajo prakti\u010dno neopa\u017eeno na grafih. Najve\u010d, kar izgubimo, je del metrike, ki je pri\u0161la v zadnji sekundi. Nenadna izguba\/izklop\/preklop vodilnega \u0161e vedno prika\u017ee manj\u0161o anomaliijo (30-sekundni interval je \u0161e vedno nesimetri\u010den), vendar lahko ob prisotnosti povezave med vozli\u0161\u010di te te\u017eave zmanj\u0161amo na minimum, na primer z razpo\u0161iljanjem sinhronizacijskih paketov.<\/p>\n<p><\/p>\n<p>Nekaj o notranji strukturi. Aplikacija je seveda ve\u010dnitna, vendar se architektura niti razlikuje od tiste, ki se uporablja v brubeck. Niti v brubeck so enake \u2013 vsaka odgovarja tako za zbiranje informacij kot tudi za agregacijo. V bioyino so delovni nizi (workers) razdeljeni v dve skupini: odgovorni za omre\u017eje in odgovorni za agregacijo. To lo\u010devanje omogo\u010da bolj fleksibilno upravljanje aplikacije glede na vrsto metrike: tam, kjer je potrebna intenzivna agregacija, lahko dodamo agregatorje, tam, kjer je veliko omre\u017enega prometa \u2013 pove\u010damo \u0161tevilo omre\u017enih niti. Trenutno na na\u0161ih stre\u017enikih delujemo z 8 omre\u017enimi in 4 agregacijskimi nitmi.<\/p>\n<p><\/p>\n<p>Del odgovoren za agregacijo je dovolj dolgo\u010dasen. Polnjeni omre\u017eni bufri se porazdelijo med izra\u010dunane niti, kjer se nato raz\u010dlenijo in agregirajo. Na zahtevo se metriki oddajo za po\u0161iljanje drugim vozli\u0161\u010dem. Vse to, vklju\u010dujo\u010d prenos podatkov med vozli\u0161\u010di in delo s Consulom, se izvaja asinkrono, izvaja se na ogrodju <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Razli\u010dni problemi pri razvoju nastali su zbog mre\u017enog dela zadu\u017eenog za primanje metrika. Glavni cilj izdvajanja mre\u017enih tokova u zasebne entitete bio je smanjenje vremena potrebnog za <em>ne<\/em> \u010ditanje podataka iz soketa. Opcije kori\u0161\u0107enja asinhronog UDP-a i obi\u010dnog recvmsg brzo su odba\u010dene: prvi tro\u0161i previ\u0161e CPU-ja na korisni\u010dkom nivou za obradu doga\u0111aja, drugi \u2014 previ\u0161e prebacivanja konteksta. Stoga se trenutno koristi <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> sa velikim baferima (jer, gospodine oficiri, baferi nisu za potcenjivanje!). Podr\u0161ka za obi\u010dan UDP zadr\u017eana je za neoptere\u0107ene slu\u010dajeve kada recvmmsg nije neophodan. U re\u017eimu multimessage uspeva se posti\u0107i glavno: velika ve\u0107ina vremena mre\u017eni tok razbistrava red OS-a \u2014 \u010dita podatke iz soketa i prebacuje ih u bafer korisni\u010dkog prostora, samo povremeno se prebacuju\u0107i da preda popunjeni bafer agregatorima. Red u soketu prakti\u010dno se ne akumulira, a broj odbacenih paketa gotovo da ne raste. <\/p>\n<p>\n<b class=\"spoiler_title\">Napomena<\/b><\/p>\n<p>U podrazumevanju, veli\u010dina bafera postavljena je dovoljno velika. Ako odlu\u010dite da isprobate server samostalno, mogli biste se suo\u010diti sa situacijom da, nakon slanja malog broja metrika, one ne stignu u Graphite, ostaju\u0107i u baferu mre\u017enog toka. Za rad sa malim brojem metrika potrebno je u konfiguraciji postaviti manje vrednosti za bufsize i task-queue-size.<\/p>\n<p><\/p>\n<p>Na kraju \u2014 malo grafova za ljubitelje grafova.<\/p>\n<p><\/p>\n<p>Statistika broja ulaznih metrika po svakom serveru: vi\u0161e od 2 miliona MPS-a.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - distribuiran, raz\u0161irljiv agregator metrik\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Isklju\u010denje jedne od nodova i preraspodela ulaznih metrika.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - distribuiran, raz\u0161irljiv agregator metrik\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistika o izlaznim metrikama: samo jedna nod uvek \u0161alje \u2014 rajboss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - distribuiran, raz\u0161irljiv agregator metrik\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistika rada svake nod-e uzimaju\u0107i u obzir gre\u0161ke u raznim modulima sistema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - distribuiran, raz\u0161irljiv agregator metrik\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detaljizacija ulaznih metrika (imena metrika su skrivena).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino - distribuiran, raz\u0161irljiv agregator metrik\" src=\"\/wp-content\/uploads\/2019\/11\/6cf0b61b454b0414799460c482e03242.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0427\u0442\u043e \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0441 \u044d\u0442\u0438\u043c \u0432\u0441\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435? \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u0431\u043b&#8230;! \u041f\u0440\u043e\u0435\u043a\u0442 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a\u0430\u043a open-source \u0438 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u0432\u0441\u044e \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u044c. \u0412 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u043f\u043b\u0430\u043d\u0430\u0445 \u2014 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e Raft, \u0441\u043c\u0435\u043d\u0430 peer-\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0439, \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438, \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043c\u0435\u0442\u0440\u0438\u043a, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f. <\/p>\n<p><\/p>\n<p>Seveda, vsi, ki \u017eelijo pomagati pri razvoju projekta, so dobrodo\u0161li: ustvarite PR, te\u017eave, po mo\u017enosti bomo odgovarjali, dopolnjevali itd.<\/p>\n<p><\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, that&#8217;s all folks, \u043f\u043e\u043a\u0443\u043f\u0430\u0439\u0442\u0435 \u043d\u0430\u0448\u0438\u0445 \u0441\u043b\u043e\u043d\u043e\u0432!<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"siCiIyg4ZZY\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/siCiIyg4ZZY\/hqdefault.jpg\" alt=\"Predvajaj video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<br \/>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/354714\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u0441\u0430\u043c\u043e\u043c \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0432\u0435\u043d\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u2014 statsd-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 bioyino, \u0437\u0430\u0447\u0435\u043c \u043c\u044b \u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043e\u0442 brubeck. \u0418\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043d\u0430\u0448\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 (1, 2) \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0435\u0442\u043a\u0438 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52113","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.\" \/>\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\/sl\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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\udd47Bioyino \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik\" \/>\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=\"2019-10-31T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:59:47+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\udd47Bioyino \u2014 distribuiran, raz\u0161irljiv agregator metrik | ProHoster","description":"Torej, zbirate metrike. Tako kot mi. Mi tudi zbiramo metrike. Seveda, tiste, ki so potrebne za posel.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\udd47Bioyino \u2014 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u0440\u0438\u043a | ProHoster","og:description":"\u0418\u0442\u0430\u043a, \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u0430\u043a \u0438 \u043c\u044b. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441\u0430.","og:url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","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":"2019-10-31T21:00:00+00:00","article:modified_time":"2020-02-18T10:59:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52113","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":"2026-01-24 02:30:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:49:49","updated":"2026-01-24 02:30:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}