Click here to load reader
Click here to load reader
Percona Live | Amsterdam | 04.10.2016
Monitoring Open Source Databases with Icinga
04.10.2016
• Bernd Erk
• Icinga Co-founder
• Working @netways
• @gethash
Introduction to Icinga
Quick Poll
Icinga is a scalable and extensible monitoring system which checks the availability of your resources, notifies users of outages and provides extensive metrics.
availability notifiesmetrics
Icinga Web 2
Icinga 2Icinga
Icinga Quality, Testing and Community Support
Icinga.org, dev.icinga.org, social media channels
Icinga Reports Icinga Doc
3rd Party Tools
Icinga Web
Icinga Classic (CGI)
Icinga2 - Architecture
Introduction to Icinga2
Checker
Notify
Gelf
Perfdata Graphite
IDO
Compat
Livestatus
• Multithreaded
• Modular Features
• Zone support
• Secure Agent
• No Nagios®
• Availability and scaling zones
• Automatic redistribution of checks
• Zones for multitenancy environments
zones
redistribution
multitenancy
Open Source Databases
• MySQL | MariaDB | Percona Server
• PostgreSQL
• MongoDB
• Firebird
• SQLite
MongoDB
PostgreSQL
MySQLish
• Availability
• Troubleshooting
• Replication-Status
• Capacity
• Metrics and performance data
• check_mongodb_py
• connect• connections• replicaton_lag• memory• memory_mapped• lock• flushing
https://github.com/mzupan/nagios-plugin-mongodb
• last_flush_time• replset_state• index_miss_ratio• collections • database_size • database_indexes • replica_primary
• check_postgres.pl
• archive_ready• autovac_freeze• backends• bloat• checkpoint• cluster_id• commitratio• connection• custom_query
https://bucardo.org/check_postgres/check_postgres.pl.html
• disabled_triggers• disk_space• fsm_pages• prepared_txns• query_runtime• query_time• replicate_row• same_schema• sequence• settings_checksum
• check_mysql_health
• connection-time• uptime• threads-connected• threadcache-hitrate• qcache-hitrate• qcache-lowmem-prunes• bufferpool-hitrate
https://labs.consol.de/de/nagios/check_mysql_health/
• bufferpool-wait-free• log-waits • tablecache-hitrate • table-lock-contention • index-usage • tmp-disk-tables • slow-queries
const MySQLIcingaUsername = "root“
const MySQLIcingaPassword = “root“
template Host "base-host-mysql" {
vars.mysql_health_username = MySQLIcingaUsername
vars.mysql_health_password = MySQLIcingaPassword
vars.os = "Linux“
}
object Host "live-mysql-1" {
import "base-host-mysql"
check_command = "hostalive"
address = "127.0.0.1"
vars.dbtype = "mysql“
}
mysql
Linux
• /*
• * Apply for MySQLish basic connection
• */
• apply Service "mysql_connection" {
• import "generic-service"
• check_interval = 10s
• retry_interval = 30s
• check_command = "mysql_health"
• vars.mysql_health_username = host.vars.mysql_health_username
vars.mysql_health_password = host.vars.mysql_health_password
• vars.mysql_health_mode = "connection-time"
• assign where (host.address || host.address6) && host.vars.dbtype == "mysql“
• }
mysql
Demo
Is this all?
Old Fart
object CheckCommand "mysql_health" {
import "ipv4-or-ipv6"
command = [ PluginContribDir + "/check_mysql_health" ]
arguments = {
"--hostname" = {
value = "$mysql_health_hostname$"
description = "the database server's hostname"
}
"--port" = {
value = "$mysql_health_port$"
description = "the database's port“
...
mysql_health
• ITL (Icinga Template Library)• mysql_health• postgres• mongodb• mssql_health• db2_health• oracle_health• elasticsearch• redis
/usr/share/icinga2/include/plugins-contrib.d/databases.conf
object Host "live-mysql-1" {
import "base-host-mysql"
check_command = "hostalive"
address = "127.0.0.1"
vars.dbtype = "mysql"
/* database checks */
vars.databases["icinga"] = {
mysql_health_warning = 2048//MB
mysql_health_critical = 4096//MB
}
vars.databases["icingaweb2"] = {
mysql_health_warning = 4096 //MB
mysql_health_critical = 8192 //MB
}
}
vars.databases
/*
* Apply for MySQLish database size
*/
apply Service "mysql_size_" for (db_name => config in host.vars.databases) {
import "generic-service"
check_interval = 10s
retry_interval = 30s
check_command = "mysql_health"
vars.mysql_health_username = host.vars.mysql_health_username
vars.mysql_health_password = host.vars.mysql_health_password
vars.mysql_health_mode = "sql"
vars.mysql_health_name = "select sum(data_length + index_length) / 1024 / 1024 from
information_schema.tables where table_schema = '" + db_name + "';"
vars.mysql_health_name2 = "db_size"
vars.mysql_health_units = "MB"
assign where (host.address || host.address6) && host.vars.dbtype == "mysql”
}
vars.databases
Icinga2 - Metrics
New Graphite Schema
icinga2.$host.name$.host.$host.check_command$icinga2.$host.name$.services.$service.name$.$service.check_command$
Threshold metricsenable_send_thresholds
Metadata metricsenable_send_metadata
Demo
Icinga2 - API
• HTTP with RESTful Url Schema
• X.509 and/or Basic Auth
• Create, Modify and Delete objects
• Event Stream based on Types and Filters
RESTful
Demo
Conclusion
• Download Icinga 2 and Icinga Web 2
• Play with the Vagrant boxes
• Rethink your configuration
• Give us feedback
Vagrant boxes
Enjoy your day
www.icinga.org
dev.icinga.org
git.icinga.org
Thank You!@icinga
/icinga
+icinga
36
Rate My Session!