<br>Go and program it but don't hope that this will ever become nagios4 - nagios name is trademark and its entirely up to Ethan what it gets used for. But that does not mean its bad to have different compatible (as far as config and database and frontened).<br>
<br>Nagios has very long history so chances of rewrite in different language are very low although I kind-of hope people would open up to at least C++. But as far as language for something alike nagios, but new, python is not bad but its rather inflexible in how it forces you to write (both good and bad, don't start pointless discussion here) and does not give you quite as much flexibility for memory and few other ops. Also looking at your architecture I immediately see that best language for it is probably Erlang, but then finding people to support and develop it further would be a lot more difficult. So if you want to do it in python go for it, just don't hope that id would become nagios4 but do report back on your progress time-time if you like (this would call for plugins written in python too, and preferred language is actually perl). Personally if I'm to consider rewriting nagios in interpreted language I'd wait for Perl6 to come out, it'd be taken a lot better by nagios users.<br>
<br><div class="gmail_quote">On Tue, Dec 1, 2009 at 9:09 AM, nap <span dir="ltr"><<a href="mailto:naparuba@gmail.com">naparuba@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi list,<br>
<br>
I would like to have your feed back about a (unfinished)<br>
reimplementation of Nagios named "Shinken" I wrote in Python that is<br>
faster and more modular than the current Nagios implementation in C<br>
(yes faster, you read correctly. I was the first surprised by that).<br>
<br>
== The Shinken's history ==<br>
Few months, I start to work on a proof of concept for Nagios focus on<br>
distributed environments and performances. The main goal was to look<br>
for a distributed and high availability architecture. I was also<br>
thinking that Nagios' performances were quite good, but we can have<br>
more.<br>
<br>
For quick test and development, I used Python. I thought a process<br>
pool can make Nagios be quicker instead of forking a new process to<br>
kill it few seconds after for each checks. I also bypass the reaping<br>
way of Nagios : reading flat file is just too slow. Instead, the<br>
results are a structure that is send directly to the scheduler. No<br>
files, more performances. To be equal to Nagios, I add the same<br>
monitoring logic in the scheduler : HARD/SOFT states, dependencies<br>
(parents, servicedep, hostdep, etc) and database export (Merlin).<br>
Shinken used the standard Nagios conf file.<br>
<br>
And the perf are quite good : with a Nagios3,  a small check (do a<br>
echo + exit) and a medium range server I run at 10000 checks in<br>
5minutes (latency near 1s), 30K with full tweaks. With my tool, I run<br>
150K !!<br>
<br>
<br>
== The global architecture ==<br>
For the Architecture, I think we must use the Unix Way of doing things<br>
: one tool by usage. For now, Nagios do nearly every things : reads<br>
conf, schedule, launch checks and raise notifications. I try an<br>
architecture where the administrator can have any host/services he<br>
wants and the daemons are just resources to manage this. The<br>
architecture I propose is the following :<br>
*Arbiter : a daemon that read the configuration, cut it automatically<br>
(keep relations like parents in the same conf) in N confs, where N is<br>
the number of schedulers we have. It dispatchs the configuration and<br>
also read the orders in nagios.cmd and dispatch orders to schedulers.<br>
*Schedulers : do the scheduling by looking at states of<br>
hosts/services. It just do checks/notifications/event handlers queues<br>
for others daemons. Same things for event broker informations : it's<br>
just a queue.<br>
*pollers : use a processes Pool, get checks to launch in schedulers<br>
and returns results to schedulers.<br>
*reactionners : same than pollers, but for notifications and event handlers.<br>
*brokers : get event broker informations from schedulers and "do<br>
things" why them (like create the service-perfdata file, or fill<br>
databases).<br>
<br>
The poller way of doing is like DNX, nothing new here. The<br>
reactionners allow the administrators to have a unique daemon to send<br>
all notifications of all his schedulers (usefull for SMTP<br>
authorizations or the fill of a unique RSS file with all<br>
notifications). The schedulers do not launch checks, so they do not<br>
get latency when they launch notifications or event handlers.<br>
<br>
The load balancing is automatic : the arbiter cuts the conf and<br>
dispatch thems. For the high availability : there can be spare daemons<br>
: if a daemon die, another take it's configuration (the Arbiter "ping"<br>
daemons, and if a daemon failed, it just send the configuration to a<br>
spare). The daemon are reach by network, so all daemons can be in<br>
different servers (and it's better for high availability to not put<br>
all daemons in the same server :) ). For now, the Arbiter do not have<br>
a spare, but it will be add in the future.<br>
<br>
You can see this Architecture in the file shinken-architecture.png.<br>
<br>
If the user configuration do not defined such daemons, Shinken<br>
automatically create defaults one (in localhost with default ports).<br>
<br>
== Advanced architecture ==<br>
In the architecture we saw, all reactionners/pollers/brokers take<br>
orders from ALL schedulers. It can be a problem with reactionners<br>
(with 3 SMTP servers (USA, Europe, Asia), it's hard to forced Asia<br>
notifications to go in the Asia SMTP server). Same for poller : it<br>
polls checks to run, and get checks from a very distant scheduler can<br>
be very slow.<br>
To manage this, Shinken use a way of cutting the architecture : Realms.<br>
<br>
A realm is a pool of daemons that work togethers. A host is tag with a<br>
realm (and only one) so it will be managed by this realm's<br>
schedulers/pollers/reactionners/brokers. A realm can have sub-realms<br>
so you can put a reactionners in the higher Realm and it will managed<br>
all schedulers of sub-realms. A picture is worth a thousand words. You<br>
can have a better look of what realm is in the file<br>
shinken-architecture-global-realm.png.<br>
<br>
Same for daemons : if the user configuration do not defined realm, a<br>
default one is created by Shinken.<br>
<br>
== What is not managed by Shinken ? ==<br>
A lot of stuffs ! But the more important are regexp configurations,<br>
inherits_parents of hosts/services dependencies (always 1 in Shinken)<br>
and notification escalations. It also do not have exclude timeperiod<br>
support (like Nagios in fact ;) )<br>
<br>
The current implementation doc is at<br>
<a href="http://wiki.nagios-fr.org/nagios/shinken/start" target="_blank">http://wiki.nagios-fr.org/nagios/shinken/start</a> in french. I am writing<br>
the english documentation, and it will be it's primary language in the<br>
future.<br>
<br>
== What is managed ? ==<br>
All classics stuffs are managed (SOFT/HARD, complex inheritances,<br>
volatile services, freshness, timeperiods with no exclude, flapping<br>
states...). It also have NDO and Merlin database support in MySQL. It<br>
also have NDO support with Oracle (yes, like Icinga)!! The NDO support<br>
is not full, some objects are not managed (like notifications) but<br>
it's not difficult to add them. It also supports UTF8 names.<br>
<br>
<br>
==How do I test this freaking tool? ==<br>
Just get the VirtualBox VM at <a href="http://www.megaupload.com/?d=57BGSL09" target="_blank">http://www.megaupload.com/?d=57BGSL09</a><br>
(yes, there can be a legal file in megaupload :) ). It's in OVF format<br>
so you need to import it with Virtual Box.<br>
It's a Ubuntu-server with DHCP nic, the account is shinken/shinken.<br>
You can launch all daemons with:<br>
./launch_all.sh<br>
and kill all with :<br>
./stop_all.sh<br>
<br>
Look at the small README file to see how to watch output of daemons<br>
(tail -f debug files). The current configuration is quite small (1500<br>
services) so it will run with no problem. You have a Ninja interface<br>
at <a href="http://IP_OF_THE_VM/ninja" target="_blank">http://IP_OF_THE_VM/ninja</a> with monitor/monitor to watch the work.<br>
Warning : Ninja do not seem to see more than one instance_id in<br>
database, so you will see only half of hosts/services You can remove<br>
one of the schedulers in etc/conf.cfg : all hosts will be add<br>
automatically in the last active scheduler :)<br>
<br>
You can test your current Nagios conf with Shinken, It will create<br>
daemons configuration if need.<br>
<br>
<br>
If you want to install it from scratch, it's not so difficult :<br>
Shinken just need:<br>
*python-2.6<br>
*pyro (a Python module like Corba)<br>
*python-graph-core (on Ubuntu : sudo apt-get install python-setuptools<br>
&& sudo easy_install python-graph-core). I will drop this dependancie<br>
soon (I just use a loop check, so a module for it is just too much...)<br>
<br>
You can get the code with :<br>
git clone git://<a href="http://shinken.git.sourceforge.net/gitroot/shinken/shinken" target="_blank">shinken.git.sourceforge.net/gitroot/shinken/shinken</a><br>
<br>
Remember to change etc/nagios.cfg and etc/conf.cfg with your directory<br>
and, optionally, in conf.cfg the "plugin" object to put your ndo or<br>
merlin database user/pass/database. You just need to launch in<br>
shinken/src (here with 5 shells, no daemon for easy test):<br>
python shinken-scheduler.py<br>
python shinken-poller.py<br>
python shinken-reactionner.py<br>
python shinken-broker.py<br>
python shinken-arbiter -c etc/nagios.cfg<br>
<br>
== And now ?==<br>
The proof of concept became a new implementation : it's now easier to<br>
add missing features of Nagios into shinken than port features of<br>
Shinken into the current Nagios.<br>
<br>
I try to speak about this new implementation to some of this list<br>
directly but they do not seem to be very kind of it. I understand<br>
easily: just the processes pool is a hard work in C (and we cannot<br>
take Apache code for it, not the good licence :( ) and it will change<br>
a lot of Nagios internals. Change the reaping process by a socket is<br>
quite hard too.<br>
<br>
Yes, it breaks nearly everything, I know. It's not binary compatible<br>
with event broker modules (merlin, ndo, live status) but I think<br>
Nagios must evolve quicker that it does currently. Zenoss's evolution<br>
is very impressive. Current Nagios implementation in C is good (it<br>
does the work from the last 10 years!!). But like the drop of the old<br>
CGI interface with PHP (Ninja in fact, because the new Nagios XI<br>
interface is just not open source at all), we must keep all ideas of<br>
what Nagios is (hosts, services, configuration with inheritances,<br>
timeperiods) and put them in a new tool with a high level language.<br>
<br>
I think C is not always the good language for tools. If we are afraid<br>
of making a new architecture just because managing sockets/IPC is too<br>
hard : we must change the language.<br>
If the idea of dropping the old fork/fork/reaper way by a new one<br>
based on processes pool and direct return in memory make you do<br>
nightmares, we must change the language.<br>
If the idea of a Zenoss began the new reference in OSS monitoring tool<br>
just make you even worse nightmares : we must evolve quicker, so we<br>
must change the language.<br>
<br>
An example : for adding a new property in a Nagios object in the<br>
current C code, we must add it in numerous files (config file reading,<br>
object creation and so on). With a higher language like Python, it<br>
just need ONE line and everything is managed after (inheritance,<br>
object creation, default value, transformation from string to real<br>
value like int or list of values).<br>
<br>
== What I propose ? ==<br>
It's just a Big Bang proposal : I propose Shinken to be the<br>
development branch for Nagios core 4.<br>
<br>
I think with help and tests, we can put all that Shinken do not do<br>
that Nagios do and even more : we have an high availability<br>
distributed and flexible Architecture. We can think of a new way of<br>
getting information : the daemons have a HTTP server include (thanks<br>
Python) and we put a REST interface for getting informations and<br>
Setting orders (easier than nagios.cmd, especially in OS where there<br>
are no named pipes :)).<br>
<br>
I know some people will not be happy with it, and I don't ask to<br>
forgot the current C implementation and put in production the new one<br>
in one week. I do not want to fork Nagios. But I will make Shinken a<br>
reality. I prefer it's name to be Nagios4. I will not allow this<br>
freaking goods ideas of hosts, services, timeperiods, checks and<br>
configuration inheritance became history just because we cannot evolve<br>
like the others.<br>
<br>
Darwin law is against us, make it be in our side.<br>
<br>
== One last killing feature ==<br>
One other good things about this implementation : it just run<br>
everywhere Python runs, this including Windows!! I run Shinken in a<br>
Seven VM with no problem. It can be very usefull for SMEs : they are<br>
afraid about installing a Linux because they do not have an IT<br>
administrator that know it. With a Windows support, it will allow<br>
Nagios to enter in such enterprises.<br>
<br>
Nagios usually do middle range monitoring : it manage IT from 20 to<br>
300 hosts. With this new implementation, it will also easily manage<br>
very small one to trully huge one (10000+ hosts in one node).<br>
<br>
So, what now?<br>
<br>
<br>
Gabès Jean<br>
<br>------------------------------------------------------------------------------<br>
Join us December 9, 2009 for the Red Hat Virtual Experience,<br>
a free event focused on virtualization and cloud computing.<br>
Attend in-depth sessions from your desk. Your couch. Anywhere.<br>
<a href="http://p.sf.net/sfu/redhat-sfdev2dev" target="_blank">http://p.sf.net/sfu/redhat-sfdev2dev</a><br>_______________________________________________<br>
Nagios-devel mailing list<br>
<a href="mailto:Nagios-devel@lists.sourceforge.net">Nagios-devel@lists.sourceforge.net</a><br>
<a href="https://lists.sourceforge.net/lists/listinfo/nagios-devel" target="_blank">https://lists.sourceforge.net/lists/listinfo/nagios-devel</a><br>
<br></blockquote></div><br>