www.icinga.org
Why favour Icinga over Nagios
OSDC Berlin - 23th April 2015
•  Bernd Erk
•  Working @NETWAYS
•  Icinga Co-Founder
•  @gethash
THE ICINGA PROJECT
Open Source Enterprise Monitoring
Icinga is a scalable and extensible monitoring system
which checks the availability of your resources, notifies
users of outages and provides extensive BI data.
•  Originally forked from Nagios in 2009
•  Independent version Icinga 2 since 2014
You?
Icinga Core
C-based source
MySQL, PostgreSQL, Oracle
Icinga Quality, Testing and Community Support
Website and Open Source Ticketing System
Icinga Reports
based on Jasper
Reports
Icinga Doc
based on
Markdown
3rd Party Tools
Icinga Web
based on PHP using ExtJS, Agavi MVC
IDOUTILS
Icinga Web 2
Based on PHP / responsive design
Icinga 2
C++-based source with
multiple components
IDO Livestatus Cluster …
ICINGA 2 - INTRODUCTION
•  Monitors everything
•  In a regular interval
•  Gathering status
•  Collect performance data
•  Notifies using any channel
•  Detects dependencies
•  Handles events in configured way
•  Forwards logs to Logstash and Graylog
•  Passes performance data to Graphite,
OpenTSDB or InfluxDB
•  Based on C++ and Boost
•  Supports MySQL and PostgreSQL
•  Includes a extensive template library
•  Version 2.3.4 is out since a couple of days
•  Puppet, Chef and Ansible support
•  Packages and Vagrant Box available
WHY NAGIOS™ IS GOOD?
•  Monitoring things is very easy
•  Very simple software stack
•  No complex external dependencies
•  Active checks are powerful
•  Gathering performance data
•  Huge community
•  Thousands of Plugins
OK, BUT WHY ICINGA THEN?
NAGIOS DOES NOT SCALE
•  It is just a single loop
•  Limitations using external interfaces
•  Icinga 2 is a multithreaded C++ Core
•  Load is distributed automatically
•  Ability to monitor thousands of devices in
second interval
ADDING MODULES IS HARD
#	
  tar	
  xzvf	
  mk-­‐livestatus-­‐1.2.4.tar.gz	
  
#	
  cd	
  mk-­‐livestatus-­‐1.2.4	
  	
  
#	
  ./configure	
  -­‐-­‐prefix=/usr/local/icinga	
  	
  
	
  -­‐-­‐exec-­‐prefix=/usr/local/icinga	
  
#	
  make	
  
#	
  cp	
  src/livestatus.o	
  /usr/local/icinga/bin	
  
 
	
  define	
  module	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  module_name	
  	
  	
  	
  	
  mklivestatus	
  
	
  	
  	
  	
  	
  	
  	
  	
  path	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  /usr/local/icinga/bin/livestatus.o	
  
	
  	
  	
  	
  	
  	
  	
  	
  module_type	
  	
  	
  	
  	
  neb	
  
	
  	
  	
  	
  	
  	
  	
  	
  args	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  /usr/local/icinga/var/rw/live	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  
Checker
Notify
Gelf
Perfdata Graphite
IDO
Compat
Livestatus
•  We have a powerful CLI
•  Adding new features is easy
•  You can really really do sophisticated setups
… but you don’t have too
# icinga2 feature enable livestatus
# icinga2 feature enable ido-mysql
DEMO
NO CLUSTERING AND DISTRIBUTION
•  There is no integrated failover mechanism
•  Configuration is not distributed
•  No shared monitoring information
•  Zones for multitenancy environments
•  Support for logic splits in the config
•  Availability and scaling zones
•  Automatic redistribution of checks
IDO
Config
Checker
Livestatus Checker
IDO
Checker
Perfdata GELF
SECURITY IS A MESS
•  NSCA works, but not in a good way
•  NRPE has a couple of security issues
•  You can make it secure … by hand
•  Bidirectional communication using SSL
•  “binlog” like retention for events
•  Distributed features throughout the cluster
CONFIGURATION LIMITS
define	
  service{	
  
	
  host_name	
   	
   	
   	
  linux1,linux2,linux3,...,linux9	
  
	
  service_description	
   	
  ssh-­‐check	
  
	
  other	
  service	
  directives	
  ...	
  
	
  }	
  
apply	
  Service	
  "ssh"	
  {	
  
	
  import	
  "generic-­‐service”	
  
check_command	
  =	
  "ssh”	
  
assign	
  where	
  host.address	
  &&	
  host.vars.os	
  ==	
  "Linux”	
  
}	
  
apply	
  Service	
  "ssh"	
  {	
  
	
  import	
  "generic-­‐service”	
  
check_command	
  =	
  "ssh”	
  
assign	
  where	
  host.address	
  &&	
  host.vars.os	
  ==	
  "Linux”	
  
ignore	
  where	
  host.vars.test	
  ==	
  true	
  
}	
  
define	
  hostgroup{	
  
	
  hostgroup_name	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  linux-­‐servers	
  
	
  alias	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Linux	
  Servers	
  
	
  members	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  linux1,linux2,linux3	
  
	
  }	
  
object	
  Host	
  “mysql-­‐server1"	
  {	
  
	
  address	
  =	
  "10.0.0.1“	
  
	
  check_command	
  =	
  "hostalive“	
  
}	
  
	
  
object	
  HostGroup	
  "mysql-­‐server"	
  {	
  
	
  display_name	
  =	
  "MySQL	
  Server“	
  
	
  assign	
  where	
  match("*mysql*",	
  host.name)	
  
}	
  
ONE MORE THING …
object	
  Service	
  ”webservice"	
  {	
  
	
  	
  import	
  "generic-­‐service”	
  
	
  	
  check_command	
  =	
  ”load”	
  
	
  	
  host_name	
  =	
  “a	
  really	
  great	
  server”	
  
	
  	
  vars.load_wload1	
  =	
  {{	
  
	
  	
  	
  	
  if	
  (get_time_period(“9to5”).is_inside)	
  {	
  
	
  	
  	
  	
  	
  	
  return	
  40	
  
	
  	
  	
  	
  }	
  else	
  {	
  
	
  	
  	
  	
  	
  	
  return	
  60	
  
	
  	
  	
  	
  }	
  
	
  	
  }}	
  
	
  }	
  
•  Different config format
•  Won’t miss the old config!
•  It is really time for change
•  You will love it!
WHAT YOU SEE IS WHAT YOU
GET
HOPEFULLY NOT!
•  Parsing status.dat is not really cool
•  Executing commands is hard
•  Very inflexible architecture
•  Limitations in current Icinga interfaces
•  Really hard to extend and integrate
•  No unified interface so far
•  Easy to extend and embed
•  Multiple authentication providers
•  Support for db and livestatus
•  Responsive
Web 2
Monitoring Docs
BP Graphite PNP
Demo
THE COMMUNITY
You?
Portland 2015
October 10th
Kuala Lumpur 2015
June 9th
CONCLUSION
•  Download Icinga 2
•  Rethink you configuration
•  Install Icinga Web 2 and play with it
•  Give us feedback
#icinga	
  
THANK YOU!
www.icinga.org
dev.icinga.org
git.icinga.org
@icinga
/icinga
+icinga

Why favour Icinga over Nagios @ OSDC 2015

  • 1.
    www.icinga.org Why favour Icingaover Nagios OSDC Berlin - 23th April 2015
  • 2.
    •  Bernd Erk • Working @NETWAYS •  Icinga Co-Founder •  @gethash
  • 3.
  • 4.
    Open Source EnterpriseMonitoring Icinga is a scalable and extensible monitoring system which checks the availability of your resources, notifies users of outages and provides extensive BI data.
  • 5.
    •  Originally forkedfrom Nagios in 2009 •  Independent version Icinga 2 since 2014
  • 6.
  • 9.
    Icinga Core C-based source MySQL,PostgreSQL, Oracle Icinga Quality, Testing and Community Support Website and Open Source Ticketing System Icinga Reports based on Jasper Reports Icinga Doc based on Markdown 3rd Party Tools Icinga Web based on PHP using ExtJS, Agavi MVC IDOUTILS Icinga Web 2 Based on PHP / responsive design Icinga 2 C++-based source with multiple components IDO Livestatus Cluster …
  • 10.
    ICINGA 2 -INTRODUCTION
  • 11.
    •  Monitors everything • In a regular interval •  Gathering status •  Collect performance data
  • 12.
    •  Notifies usingany channel •  Detects dependencies •  Handles events in configured way
  • 13.
    •  Forwards logsto Logstash and Graylog •  Passes performance data to Graphite, OpenTSDB or InfluxDB
  • 14.
    •  Based onC++ and Boost •  Supports MySQL and PostgreSQL •  Includes a extensive template library
  • 15.
    •  Version 2.3.4is out since a couple of days •  Puppet, Chef and Ansible support •  Packages and Vagrant Box available
  • 16.
  • 17.
    •  Monitoring thingsis very easy •  Very simple software stack •  No complex external dependencies
  • 18.
    •  Active checksare powerful •  Gathering performance data •  Huge community •  Thousands of Plugins
  • 19.
    OK, BUT WHYICINGA THEN?
  • 20.
  • 21.
    •  It isjust a single loop •  Limitations using external interfaces
  • 22.
    •  Icinga 2is a multithreaded C++ Core •  Load is distributed automatically •  Ability to monitor thousands of devices in second interval
  • 24.
  • 25.
    #  tar  xzvf  mk-­‐livestatus-­‐1.2.4.tar.gz   #  cd  mk-­‐livestatus-­‐1.2.4     #  ./configure  -­‐-­‐prefix=/usr/local/icinga      -­‐-­‐exec-­‐prefix=/usr/local/icinga   #  make   #  cp  src/livestatus.o  /usr/local/icinga/bin  
  • 26.
       define  module  {                  module_name          mklivestatus                  path                        /usr/local/icinga/bin/livestatus.o                  module_type          neb                  args                        /usr/local/icinga/var/rw/live                  }    
  • 27.
  • 28.
    •  We havea powerful CLI •  Adding new features is easy •  You can really really do sophisticated setups … but you don’t have too
  • 29.
    # icinga2 featureenable livestatus # icinga2 feature enable ido-mysql
  • 30.
  • 31.
    NO CLUSTERING ANDDISTRIBUTION
  • 32.
    •  There isno integrated failover mechanism •  Configuration is not distributed •  No shared monitoring information
  • 33.
    •  Zones formultitenancy environments •  Support for logic splits in the config •  Availability and scaling zones •  Automatic redistribution of checks
  • 34.
  • 35.
  • 36.
    •  NSCA works,but not in a good way •  NRPE has a couple of security issues •  You can make it secure … by hand
  • 37.
    •  Bidirectional communicationusing SSL •  “binlog” like retention for events •  Distributed features throughout the cluster
  • 38.
  • 39.
    define  service{    host_name        linux1,linux2,linux3,...,linux9    service_description    ssh-­‐check    other  service  directives  ...    }  
  • 40.
    apply  Service  "ssh"  {    import  "generic-­‐service”   check_command  =  "ssh”   assign  where  host.address  &&  host.vars.os  ==  "Linux”   }  
  • 41.
    apply  Service  "ssh"  {    import  "generic-­‐service”   check_command  =  "ssh”   assign  where  host.address  &&  host.vars.os  ==  "Linux”   ignore  where  host.vars.test  ==  true   }  
  • 42.
    define  hostgroup{    hostgroup_name                    linux-­‐servers    alias                                      Linux  Servers    members                                  linux1,linux2,linux3    }  
  • 43.
    object  Host  “mysql-­‐server1"  {    address  =  "10.0.0.1“    check_command  =  "hostalive“   }     object  HostGroup  "mysql-­‐server"  {    display_name  =  "MySQL  Server“    assign  where  match("*mysql*",  host.name)   }  
  • 44.
  • 45.
    object  Service  ”webservice"  {      import  "generic-­‐service”      check_command  =  ”load”      host_name  =  “a  really  great  server”      vars.load_wload1  =  {{          if  (get_time_period(“9to5”).is_inside)  {              return  40          }  else  {              return  60          }      }}    }  
  • 46.
    •  Different configformat •  Won’t miss the old config! •  It is really time for change •  You will love it!
  • 47.
    WHAT YOU SEEIS WHAT YOU GET
  • 48.
  • 51.
    •  Parsing status.datis not really cool •  Executing commands is hard •  Very inflexible architecture
  • 52.
    •  Limitations incurrent Icinga interfaces •  Really hard to extend and integrate •  No unified interface so far
  • 53.
    •  Easy toextend and embed •  Multiple authentication providers •  Support for db and livestatus •  Responsive
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 61.
    •  Download Icinga2 •  Rethink you configuration •  Install Icinga Web 2 and play with it •  Give us feedback #icinga  
  • 62.