2013-03-24 traffic analysis tool
by Vasil Kolev(докъде стигнах, да качвам код в github)
https://github.com/krokodilerian/trafstat.git
Система за събиране и анализ на трафик, базирано на tcp retransmit-и и bgp routing таблици.
Аз я използвам на няколко места да си анализирам трафика и да го балансирам откъде да минава. Имаме пусната една версия на ts.hahpss.com, на която може да гледате от един български сайт как изглежда трафика към вас.
Системата за мен е много по-хубава от различните варианти с ping от време на време (smokeping, mtr и т.н.), понеже е върху целия трафик на web сървъра, който реално потребителите виждат, а не нещо, което може да има различно поведение и различни shaper-и.
Кодът е леко допипнат, за да става за публична употреба, но има още доста да се желае (например трябва да сложа един __packed__ атрибут на една структура, дето пращам по мрежата). В момента може да се каже, че е в works-for-me версия, но мисля, че повечето админи биха се справили да го подкарат при себе си. Изисква да може да си пипнете web сървъра и да може да вземете отнякъде read-only BGP feed.
Състои се от няколко компонента:
– модул за nginx, който за всеки request взима колко трафик е направен, колко е било mss-то на връзката (за да може да се изчисли броя сегменти) и броя tcp retransmit-и, и го праща до един централен сървър по UDP. Мариян е навит да напише същия модул за apache.
– сървър, който получава udp пакетите и ги пише във файл (реално може да прави директно заявки в базата и може да го оправя в бъдеще).
– cron script, който попълва в базата данни за всички router-и, за които знае системата routing таблиците им (prefix-и и aspath-ове).
– друг cron script, който на колкото-време-му-кажете хваща лога на демона, сдъвква го и вади заявки, с които да запише трафика по префикси и типове.
– още един скрипт, който веднъж на час почиства нулевите редове и архивира данните в една таблица, за да може да се анализират (т.е. дава ви почасови данни).
Има и някакви визуализиращи неща, които ще се появят по-късно.
Не съм решил какъв да е лиценза, защото и вътре има няколко неща, които не са мои (bgpdump от ripe), приемам идеи.
March 28th, 2013 at 23:39
Демона е сила хахахаха , тва с ротирането на лога и сигнала e мазно :D . Гледам и неква идея и имало за тредове ама не са видели бел свят. Кода не е само works for me ами е и за govnokod.ru . Без лоши чувства ;)
March 29th, 2013 at 00:13
@Георги, реално кодът вършеше много други неща и писането на лога му беше странична дейност. Има още неща за почистване, но няма особена нужда.
Иначе, submit-ни го, ще ми е интересно ако го приемат какъв толкова проблем ще видят в него :)
March 29th, 2013 at 14:16
Къв ли ?
Я си виж main-а fopen-a и след тва setlinebuf :)
March 29th, 2013 at 14:24
Не виждам особен проблем. Мога да напиша един check някъде там какво ми е върнало, но как точно ще изгърми (щото ако не може да напише лога, няма смисъл да прави квото и да е) няма значение.
March 29th, 2013 at 14:31
Понеже оставам без думи от аргумента ти – http://img.over-blog.com/600×523/2/87/79/27/bibi-over-here-fdp/facefloor.jpg
March 29th, 2013 at 15:58
@Георги Иванов ти усещаш ли се, че не допринасяш с нищо като се надуваш с неаргументирани коментари. До тук коментарите ти мога да ги категоризирам като *тролене*. Много са ми антипатични такива надувки, дето много говорят, мислят се за изключителни, а всъщност нищо съществено не казват/немогат.
March 29th, 2013 at 16:45
Много си ми незначителен за да ти отговарям.
March 29th, 2013 at 16:50
@Георги, има тривиален начин да има смисъл от коментарите ти, пусни един patch, github дава лесен начин. Core or shut up :)
March 29th, 2013 at 16:56
Маниаксе целях друго като коментирах ама аре като се видим на кафе ше ти обесня :)
March 29th, 2013 at 17:01
Виждам аз, че целиш да се лигавиш :)
March 29th, 2013 at 17:09
Следвайки препоръката от постът по-нагоре:
http://govnokod.ru/12826
@бацето, разглеждайки кода в github:
1) Според посочения Makefile всичко се компилира с debug символи
2) Използват се много hardcoded стойности, които спокойно могат да са параметри
3) Използват се глобални променливи
4) На едни места char ip[16], на други char ip[256]
5) Съществува функция daemon(), която може да замени void daemonize()
6) На всякъде се презюмира, че open()/fopen() връща успешно файлов дескриптор, не се проверява за грешки
7) Смесват се threads и signals по странен начин
8) Не се проверява резултата от malloc()
9) На едни места memcpy(), на други strcpy()
10) Грам коментар няма да обясни магически конструкции от рода: time(&tm); if (pmsg->msg.tm+20msg.tm-20>tm){
И даже не съм гледал съдържанието на cron директорията и .sh/.php писанията там :)
Но, за да завършим по-весело … прочетете коментара в govnokod.ru :D
March 29th, 2013 at 17:18
1) да, това за текущия стадий е нормално
2) да, щото идва от такова място. Ще проима config файл някой ден
3) и?
4) това е в списъка за оправяне
5) може
6) това може да го оправя един хубав ден
7) всъщност thread-ове няма, точно в тоя код, иначе – няма проблем със сигнала, това много съм го ровил
8) да, вероятно ще сложа един wrapper с умиране
9) на различни места има нужда от различни неща
10) нищо магическо няма в тоя код :) ако е по-старо съобщението с 20 секунди, се реже
Иначе, благодаря, тва е по-смислен коментар, нищо, че идва от изпаднал трол:)
March 29th, 2013 at 19:53
За това говорим – конструктивен диалог/разговор, който се вижда от последните два коментара, това кефи, а не празните приказки.
March 29th, 2013 at 19:55
Пък дори и само две точки от всички точки на @Иво Вачков да бяха споменати, u c?
April 2nd, 2013 at 17:52
Хм като гледам вече мина известно време има 11 коментара под кода ти, оценката му е 0 за сега – http://govnokod.ru/12826, тоест струва ми се, че хората там не го намират за лош код.
@Vasil поглеждал ли си там и какво мислиш?