{"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\/hr\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","title":{"rendered":"Bioyino \u2014 distribuirani, skalabilni agregator metrika","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Dakle, prikupljate metrike. Kao i mi. Tako\u0111er prikupljamo metrike. Naravno, one potrebne za poslovanje. Danas \u0107emo govoriti o prvom \u010dlanu sustava na\u0161eg pra\u0107enja \u2014 statsd-kompatibilnom agregacijskom serveru <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2Noxg1M\">bioyino<\/a><\/noindex>, za\u0161to smo ga napisali i za\u0161to smo se odrekli brubecka. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 distribuirani, skalabilni agregator metrika\" 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\u017eete saznati da smo do jednog trenutka oznake prikupljali pomo\u0107u <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">brubeck<\/a><\/noindex>. Napisan je na C-u. Sa stajali\u0161ta koda \u2014 jednostavan kao \u010dep (to je va\u017eno kada \u017eelite sudjelovati) i, \u0161to je najva\u017enije, bez posebnih problema se nosi s na\u0161im optere\u0107enjima od 2 milijuna metrika u sekundi (MPS) u vr\u0161nim trenucima. Dokumentacija navodi podr\u0161ku za 4 milijuna MPS uz napomenu. To zna\u010di da \u0107ete navedeni broj dobiti ako ispravno postavite mre\u017eu na Linuxu. (Koliko MPS se mo\u017ee posti\u0107i ako mre\u017ea ostane kakva jest, ne znamo). Unato\u010d tim prednostima, imali smo nekoliko ozbiljnih pritu\u017ebi na brubecka.<\/p>\n<p><\/p>\n<p><em>Pritu\u017eba 1.<\/em> Github \u2014 razvijatelj projekta \u2014 prestao je s njegovom podr\u0161kom: objavljivati zakrpe i ispravke, prihva\u0107ati na\u0161e (i ne samo na\u0161e) PR. U posljednjih nekoliko mjeseci (negdje od velja\u010de-o\u017eujka 2018.) aktivnost je ponovno o\u017eivjela, ali prije toga je bilo gotovo 2 godine potpune ti\u0161ine. Osim toga, projekt se razvija <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\/pull\/31#issuecomment-325907734\">za interne potrebe Githuba<\/a><\/noindex>, \u0161to mo\u017ee postati ozbiljna prepreka za uvo\u0111enje novih mogu\u0107nosti.<\/p>\n<p><\/p>\n<p><em>Pritu\u017eba 2.<\/em> To\u010dnost izra\u010duna. Brubeck prikuplja za agregaciju samo 65536 vrijednosti. U na\u0161em slu\u010daju, za neke metrike u razdoblju agregacije (30 sekundi) mo\u017ee dolaziti mnogo vi\u0161e vrijednosti (1 527 392 u vr\u0161nim trenucima). Kao rezultat takvog uzorkovanja, vrijednosti maksimuma i minimuma izgledaju beskorisno. Na primjer, ovako: <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 distribuirani, skalabilni agregator metrika\" src=\"\/wp-content\/uploads\/2019\/11\/4222a1a7d1e127137220595241f5276c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Kako je bilo<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 distribuirani, skalabilni agregator metrika\" src=\"\/wp-content\/uploads\/2019\/11\/c8f0025c61f708584328ea30aacf7bc0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Kako je to trebalo izgledati<\/em><\/p>\n<p><\/p>\n<p>Iz istog razloga, zbrojevi se uop\u0107e smatraju neto\u010dnima. Dodajte ovome gre\u0161ku s prepunjenjem 32-bitnog float-a, koja uop\u0107e \u0161alje server u segfault prilikom primanja naizgled nevine metrike, i postaje stvarno izvrsno. Gre\u0161ka, usput, tako i nije ispravljena.<\/p>\n<p><\/p>\n<p>I, na kraju, <em>Pritu\u017eba X<\/em>. U trenutku pisanja ovog \u010dlanka, spremni smo predstaviti svima 14 vi\u0161e-manje funkcionalnih implementacija statsd, koje smo uspjeli prona\u0107i. Zamislite da neka posebna infrastruktura naraste toliko da 4 milijuna MPS vi\u0161e nije dovoljno. Ili mo\u017eda jo\u0161 nije narasla, ali su vam metri\u010dki podaci ve\u0107 toliko va\u017eni da \u010dak i kratki, 2-3 minute prekidi na grafovima mogu postati kriti\u010dni i izazvati napade nepodno\u0161ljive depresije kod menad\u017eera. Kako je lije\u010denje depresije nezahvalno, potrebna su tehni\u010dka rje\u0161enja.<\/p>\n<p><\/p>\n<p>Prvo, otpornost na gre\u0161ke, kako iznenadni problemi na poslu\u017eitelju ne bi prouzro\u010dili psihoze u uredu. Drugo, skalabilnost, kako bismo mogli primati vi\u0161e od 4 milijuna MPS, a pritom ne kopati duboko u mre\u017enom stogu Linuxa, ve\u0107 mirno rasti \"\u0161iroko\" do potrebnih veli\u010dina.<\/p>\n<p><\/p>\n<p>Budu\u0107i da smo imali rezervu za skalabilnost, odlu\u010dili smo prvo krenuti s otporno\u0161\u0107u na gre\u0161ke. \"O! Otpornost na gre\u0161ke! To je lako, to znamo raditi\", pomislili smo i pokrenuli 2 poslu\u017eitelja, podi\u017eu\u0107i na svakom kopiju brubeck-a. Za to smo morali kopirati promet s metrima na oba poslu\u017eitelja i \u010dak napisati za to <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/udpdup\">mali alat.<\/a><\/noindex>Ovim smo rje\u0161ili problem otpornosti na gre\u0161ke, ali... ne ba\u0161 dobro. U po\u010detku je sve izgledalo prili\u010dno dobro: svaki brubeck prikuplja svoju verziju agregacije, zapisuje podatke u Graphite svakih 30 sekundi, prepisuju\u0107i stari interval (to se radi na strani Graphite-a). Ako jedan poslu\u017eitelj iznenada zaka\u017ee, uvijek imamo drugi s vlastitom kopijom agregiranih podataka. Ali postoji problem: ako poslu\u017eitelj zaka\u017ee, na grafovima se pojavljuje \"testera\". To je povezano s tim da 30-sekundni intervali kod brubeck-a nisu sinkronizirani, a u trenutku kvara jedan od njih se ne prepisuje. Pri pokretanju drugog poslu\u017eitelja doga\u0111a se isto. Sasvim podno\u0161ljivo, ali \u017eelimo bolje! Problem skalabilnosti tako\u0111er nije nestao. Sve metrike i dalje \"lete\" na jedan poslu\u017eitelj, pa smo stoga ograni\u010deni na istih 2-4 milijuna MPS, ovisno o snazi mre\u017ee.<\/p>\n<p><\/p>\n<p>Ako malo razmislimo o problemu i istovremeno zakopamo snijeg lopatom, mo\u017ee nam pasti na pamet jedna o\u010dita ideja: potrebna nam je statsd verzija koja mo\u017ee raditi u distribuiranom re\u017eimu. Drugim rije\u010dima, ona koja ima implementiranu sinhronizaciju izme\u0111u nodova prema vremenu i metrikh. 'Naravno, takvo rje\u0161enje sigurno ve\u0107 postoji', rekli smo i krenuli pretra\u017eivati\u2026 a ni\u0161ta nismo na\u0161li. Pretra\u017euju\u0107i dokumentaciju razli\u010ditih 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 prona\u0161li doslovno ni\u0161ta. \u010cini se da ni developeri ni korisnici tih rje\u0161enja jo\u0161 nisu imali posla s TAKVIM brojem metrika, ina\u010de bi sigurno ne\u0161to smislili.<\/p>\n<p><\/p>\n<p>I tada smo se sjetili o 'igra\u010dka' statsd - bioyino, kojeg smo sastavili na hackathonu samo iz zabave (ime projekta generirao je skript prije po\u010detka hackathona) i shvatili smo da nam hitno treba vlastiti statsd. Za\u0161to?<\/p>\n<p><\/p>\n<ul>\n<li>jer u svijetu ima premalo klonova statsd,<\/li>\n<li>jer mo\u017eemo osigurati \u017eeljenu ili blisku \u017eeljenoj otpornost na kvarove i skalabilnost (uklju\u010duju\u0107i sinhronizaciju agregiranih metrika izme\u0111u poslu\u017eitelja i rje\u0161avanje problema sukoba prilikom slanja),<\/li>\n<li>jer mo\u017eemo ra\u010dunati metrike preciznije nego \u0161to to \u010dini brubeck,<\/li>\n<li>jer mo\u017eemo sami prikupiti detaljniju statistiku, koju nam brubeck gotovo da nije pru\u017eao,<\/li>\n<li>jer nam se pru\u017eila prilika da programiramo vlastiti hyperperformancedistributedscaleapplication koji ne\u0107e potpuno ponavljati arhitekturu sli\u010dnog hyperfor\u2026 nupvoneli. <\/li>\n<\/ul>\n<p><\/p>\n<p>Na \u010demu pisati? Naravno, na Rustu. Za\u0161to?<\/p>\n<p><\/p>\n<ul>\n<li>jer ve\u0107 je postojao prototip rje\u0161enja,<\/li>\n<li>jer je autor \u010dlanka u to vrijeme ve\u0107 znao Rust i \u017eelio je napisati ne\u0161to za produkciju s mogu\u0107no\u0161\u0107u objavljivanja u open-source,<\/li>\n<li>jer jezici s GC nisu prikladni zbog prirode dobivene prometa (prakti\u010dki realtime) i GC pauze su gotovo neprihvatljive, <\/li>\n<li>jer je potrebna maksimalna izvedba, usporediva s C-om<\/li>\n<li>jer Rust nam pru\u017ea fearless concurrency, a po\u010dev\u0161i pisati to na C\/C++, dobili bismo jo\u0161 vi\u0161e ranjivosti, prepunjenja bafera, race conditions i drugih stra\u0161nih rije\u010di nego kod brubecka.<\/li>\n<\/ul>\n<p><\/p>\n<p>Postojao je i argument protiv Rusta. Tvrtka nije imala iskustva u stvaranju projekata na Rustu, i sada ga tako\u0111er ne planiramo koristiti u glavnom projektu. Stoga su postojala ozbiljna uvjerenja da ni\u0161ta ne \u0107e uspjeti, ali odlu\u010dili smo riskirati i poku\u0161ati.<\/p>\n<p><\/p>\n<p>Vrijeme je prolazilo\u2026<\/p>\n<p><\/p>\n<p>Napokon, nakon nekoliko neuspje\u0161nih poku\u0161aja, prva funkcionalna verzija je bila spremna. \u0160to smo ostvarili? Izgledalo je ovako.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 distribuirani, skalabilni agregator metrika\" src=\"\/wp-content\/uploads\/2019\/11\/322c4136ed033b80b31a89d7b5f63af8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Svaka \u010dvor dobiva svoj vlastiti skup metrika i akumulira ih kod sebe, pri \u010demu ne agregira metrike za one tipove gdje bi za kona\u010dnu agregaciju bio potreban cjelokupan skup. \u010cvorovi su povezani me\u0111usobno kroz odre\u0111eni protokol distribuirane blokade (distributed lock), koji omogu\u0107ava odabir onog jedinog (ovdje smo plakala), koji je dostojan slanja metrika Velikom. Trenutno se ovaj problem rje\u0161ava pomo\u0107u <noindex><a rel=\"nofollow\" href=\"https:\/\/www.consul.io\/docs\/guides\/leader-election.html\">Consul<\/a><\/noindex>, ali u budu\u0107nosti autorove ambicije prote\u017eu se do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-consensus\">vlastitog<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Albibek\/raft-tokio\">implementaciji<\/a><\/noindex> Rafta, gdje \u0107e onaj dostojni, naravno, biti vo\u0111a konsenzusa. Osim konsenzusa, \u010dvorovi dovoljno \u010desto (po defaultu jednom u sekundi) \u0161alju svojim susjedima one dijelove preagregiranih metrika koje je uspjelo prikupiti u toj sekundi. Tako se skalabilnost i otpornost na gre\u0161ke zadr\u017eavaju \u2014 svaki od \u010dvorova i dalje zadr\u017eava cjelokupan skup metrika, ali metrike se pritom \u0161alju ve\u0107 agregirane, putem TCP-a i s kodiranjem u binarni protokol, stoga se tro\u0161kovi duplikacije u usporedbi s UDP-om znatno smanjuju. Unato\u010d prili\u010dno velikom broju ulaznih metrika, akumulacija zahtijeva vrlo malo memorije i jo\u0161 manje CPU-a. Za na\u0161e dobro komprimirane metrike to je samo nekoliko desetaka megabajta podataka. Dodatna prednost je izostanak nepotrebnih prepisivanja podataka u Graphiteu, kao \u0161to je to bio slu\u010daj s burbeck.<\/p>\n<p><\/p>\n<p>UDP paketi s metrima raspore\u0111eni su izme\u0111u nodova na mre\u017enoj opreme putem jednostavnog Round Robin. Naravno, mre\u017eni ure\u0111aj ne analizira sadr\u017eaj paketa i stoga mo\u017ee obraditi mnogo vi\u0161e od 4M paketa u sekundi, a da ne spominjemo metrike o kojima uop\u0107e ne zna. Ako uzmemo u obzir da metrike ne dolaze jedna po jedna u svakom paketu, ne predvi\u0111amo probleme s performansama na ovom mjestu. U slu\u010daju pada poslu\u017eitelja, mre\u017eni ure\u0111aj brzo (u roku od 1-2 sekunde) otkriva tu \u010dinjenicu i uklanja pao poslu\u017eitelj iz rotacije. Kao rezultat toga, pasivni (tj. ne lideri) nodovi mogu se uklju\u010divati i isklju\u010divati gotovo bez uo\u010dljivih padova na grafikonima. Najvi\u0161e \u0161to gubimo je dio metrika koji do\u0111e u posljednjoj sekundi. Iznenadni gubitak\/isklju\u010divanje\/prebacivanje lidera i dalje \u0107e prikazati neznatnu anomaliju (30-sekundni interval i dalje je desinkroniziran), ali uz prisustvo veze izme\u0111u nodova mo\u017ee se minimizirati i te probleme, na primjer, slanjem sinkroniziraju\u0107ih paketa.<\/p>\n<p><\/p>\n<p>Malo o unutarnjoj strukturi. Aplikacija je naravno vi\u0161enitna, ali arhitektura niti se razlikuje od one koja se koristi u brubeck. Niti u brubecku su identi\u010dne \u2014 svaka od njih odgovara istovremeno za prikupljanje informacija i za agregaciju. U bioyinu radni niti (workers) su podijeljeni u dvije grupe: odgovorne za mre\u017eu i odgovorne za agregaciju. Ova podjela omogu\u0107uje fleksibilnije upravljanje aplikacijom ovisno o vrsti metrika: gdje je potrebna intenzivna agregacija, mo\u017ee se dodati vi\u0161e agregatora, a gdje je puno mre\u017enog prometa \u2014 dodati broj mre\u017enih niti. Trenutno na na\u0161im poslu\u017eiteljima radimo s 8 mre\u017enih i 4 agregatne niti.<\/p>\n<p><\/p>\n<p>Dio koji se bavi ra\u010dunom (odgovoran za agregaciju) prili\u010dno je dosadan. Napunjene baferi mre\u017enih niti raspore\u0111uju se izme\u0111u ra\u010dunarskih niti, gdje se kasnije obra\u0111uju i agregiraju. Na zahtjev, metrike se daju za slanje na druge nodove. Sve to, uklju\u010duju\u0107i slanje podataka izme\u0111u nodova i rad s Consul-om, obavlja se asinkrono, radi na okviru <noindex><a rel=\"nofollow\" href=\"https:\/\/tokio.rs\">tokio<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Znatan ve\u0107i problemi pri razvoju izazvala je mre\u017ena komponenta odgovorna za prijem metrika. Glavni cilj izdvajanja mre\u017enih tokova u zasebne entitete bio je smanjiti vreme koje tok tro\u0161i <em>ne<\/em> na \u010ditanje podataka iz soketa. Opcije sa asinkronim UDP-om i obi\u010dnim recvmsg brzo su otpale: prvi tro\u0161i previ\u0161e CPU resursa korisni\u010dkog prostora na obradu doga\u0111aja, dok drugi zahteva previ\u0161e kontekstualnih prebacivanja. Stoga se trenutno koristi <noindex><a rel=\"nofollow\" href=\"https:\/\/linux.die.net\/man\/2\/recvmmsg\">recvmmsg<\/a><\/noindex> s velikim baferima (a baferi, gospodo oficiri, to vam nije ne\u0161to bezna\u010dajno!). Podr\u0161ka za obi\u010dan UDP ostavljena je za nenametljive slu\u010dajeve kada recvmmsg nije potrebna. U multimessage re\u017eimu posti\u017ee se glavno: prevladavaju\u0107e vreme mre\u017enog toka provodi se sre\u0111uju\u0107i red \u010dekanja OS-a \u2014 \u010ditaju\u0107i podatke iz soketa i prebacuju\u0107i ih u bafer korisni\u010dkog prostora, samo povremeno prebacuju\u0107i se kako bi predali popunjen bafer agregatorima. Red u soketu prakti\u010dki se ne nakuplja, a broj odba\u010denih paketa gotovo da ne raste. <\/p>\n<p>\n<b class=\"spoiler_title\">Napomena<\/b><\/p>\n<p>U zadanim postavkama veli\u010dina bafera postavljena je dovoljno velika. Ako odlu\u010dite probati server samostalno, mogli biste nai\u0107i na situaciju da nakon slanja malog broja metrika, one ne stignu u Graphite, ostaju\u0107i u baferu mre\u017enog toka. Za rad s malim brojem metrika, potrebno je postaviti u konfiguraciji bufsize i task-queue-size manje vrednosti.<\/p>\n<p><\/p>\n<p>Na kraju \u2014 malo grafova za ljubitelje grafova.<\/p>\n<p><\/p>\n<p>Statistika broja dolaznih metrika po svakom serveru: preko 2 milijuna MPS.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 distribuirani, skalabilni agregator metrika\" src=\"\/wp-content\/uploads\/2019\/11\/c6cb1a36c267657d55ec22df518f8d03.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Isklju\u010divanje jednog od \u010dvorova i preusmjeravanje dolaznih metrika.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 distribuirani, skalabilni agregator metrika\" src=\"\/wp-content\/uploads\/2019\/11\/106af265a6bc2a8b31fe34df69e9c200.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistika o odlaznim metricama: uvijek \u0161alje samo jedan \u010dvor \u2014 rajboss.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 distribuirani, skalabilni agregator metrika\" src=\"\/wp-content\/uploads\/2019\/11\/582730b501a42bb3a371a84bf2e2394b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Statistika rada svakog \u010dvora uzimaju\u0107i u obzir gre\u0161ke u raznim modulima sistema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 distribuirani, skalabilni agregator metrika\" src=\"\/wp-content\/uploads\/2019\/11\/101377281c3add8c598c6439ca25d271.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detaljizacija dolaznih metrika (imena metrika su skrivene).<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Bioyino \u2014 distribuirani, skalabilni agregator metrika\" src=\"\/wp-content\/uploads\/2019\/11\/6cf0b61b454b0414799460c482e03242.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0160to planiramo u\u010diniti s tim dalje? Naravno, pisati kod, bla bla\u2026! Projekt je prvotno zami\u0161ljen kao open-source i ostati \u0107e takav tijekom cijelog svog postojanja. U bliskoj budu\u0107nosti planiramo prijelaz na vlastitu verziju Rafta, promjenu peer-protokola na prenosiviji, uvo\u0111enje dodatnih unutarnjih statistika, novih tipova metrike, ispravljanje gre\u0161aka i druga pobolj\u0161anja. <\/p>\n<p><\/p>\n<p>Naravno, svi koji \u017eele pomo\u0107i u razvoju projekta su dobrodo\u0161li: stvarajte PR, Issues, odgovarat \u0107emo koliko mo\u017eemo, doraditi itd.<\/p>\n<p><\/p>\n<p>Na tome, kako se to ka\u017ee, to je to, ljudi, kupujte na\u0161e slonove!<\/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=\"Pogledajte 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\/hr\/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=\"hr_HR\" \/>\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\/hr\/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 distribuirani, skalabilni agregator metrika | ProHoster","description":"Dakle, prikupljate metrike. Kao i mi. I mi tako\u0111er prikupljamo metrike. Naravno, one potrebne za poslovanje.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/bioyino-raspredelyonnyj-masshtabiruemyj-agregator-metrik","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/52113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=52113"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/52113\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=52113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=52113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=52113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}