manuales:nagios:capacitacion:ndo2utils
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previa | |||
manuales:nagios:capacitacion:ndo2utils [2015/10/22 17:17] – cayu | manuales:nagios:capacitacion:ndo2utils [2015/10/22 17:37] (actual) – cayu | ||
---|---|---|---|
Línea 287: | Línea 287: | ||
+ | |||
+ | === Ejemplo de consultas MySQL === | ||
+ | |||
+ | Podemos realizar plugins que dependan de la salida de otros plugins sin necesidad de consultar o ejecutar nuevamente estos, uilizando los datos contenidos en la base de datos MySQL | ||
+ | |||
+ | Por ejemplo si queremos consultar la lista de miembros de un grupo de hosts | ||
+ | |||
+ | <code sql> | ||
+ | SELECT nagios_hosts.display_name | ||
+ | FROM | ||
+ | nagios_hostgroups, | ||
+ | nagios_hosts, | ||
+ | nagios_objects | ||
+ | WHERE | ||
+ | nagios_hostgroups.hostgroup_id=nagios_hostgroup_members.hostgroup_id | ||
+ | AND | ||
+ | nagios_hostgroup_members.host_object_id=nagios_hosts.host_object_id | ||
+ | AND | ||
+ | nagios_hostgroups.hostgroup_object_id=nagios_objects.object_id | ||
+ | AND | ||
+ | nagios_objects.name1 = ' | ||
+ | ORDER BY nagios_hosts.display_name ASC | ||
+ | </ | ||
+ | |||
+ | Para conocer el estado de un servicio de un determinado host | ||
+ | |||
+ | <code sql> | ||
+ | SELECT | ||
+ | nagios_servicestatus.perfdata, | ||
+ | FROM | ||
+ | nagios_services, | ||
+ | nagios_objects, | ||
+ | WHERE | ||
+ | nagios_services.instance_id=nagios_instances.instance_id | ||
+ | AND | ||
+ | nagios_servicestatus.service_object_id=nagios_services.service_object_id | ||
+ | AND | ||
+ | nagios_servicestatus.service_object_id=nagios_objects.object_id | ||
+ | AND | ||
+ | nagios_objects.name2 = ' | ||
+ | AND | ||
+ | nagios_services.config_type=' | ||
+ | AND | ||
+ | nagios_objects.name1 = ' | ||
+ | </ | ||
+ | |||
+ | Para conocer el estado de un host | ||
+ | |||
+ | <code sql> | ||
+ | SELECT | ||
+ | nagios_hosts.display_name, | ||
+ | nagios_hosts.alias, | ||
+ | nagios_hoststatus.current_state, | ||
+ | nagios_hoststatus.output | ||
+ | FROM | ||
+ | nagios_hoststatus, | ||
+ | nagios_instances, | ||
+ | nagios_hosts, | ||
+ | nagios_objects | ||
+ | WHERE | ||
+ | nagios_hoststatus.host_object_id=nagios_objects.object_id | ||
+ | AND | ||
+ | nagios_hoststatus.host_object_id=nagios_hosts.host_object_id | ||
+ | AND | ||
+ | nagios_hosts.instance_id=nagios_instances.instance_id | ||
+ | AND | ||
+ | nagios_hosts.config_type=' | ||
+ | AND | ||
+ | nagios_hosts.display_name = ' | ||
+ | </ | ||
+ | |||
+ | Para consultar los servicios pertenecientes a un determinado grupo de servicios | ||
+ | |||
+ | <code sql> | ||
+ | SELECT | ||
+ | obj2.name1 AS host_name, | ||
+ | obj2.name2 AS service_description | ||
+ | FROM nagios_servicegroups | ||
+ | INNER JOIN nagios_servicegroup_members ON | ||
+ | nagios_servicegroups.servicegroup_id=nagios_servicegroup_members.servicegroup_id | ||
+ | INNER JOIN nagios_services ON | ||
+ | nagios_servicegroup_members.service_object_id=nagios_services.service_object_id | ||
+ | INNER JOIN nagios_objects as obj1 ON | ||
+ | nagios_servicegroups.servicegroup_object_id=obj1.object_id | ||
+ | INNER JOIN nagios_objects as obj2 ON | ||
+ | nagios_servicegroup_members.service_object_id=obj2.object_id | ||
+ | INNER JOIN nagios_instances ON | ||
+ | nagios_servicegroups.instance_id=nagios_instances.instance_id | ||
+ | WHERE nagios_servicegroups.alias =' | ||
+ | AND nagios_services.display_name =' | ||
+ | </ | ||
+ | |||
+ | Para conocer los estados de los hosts | ||
+ | |||
+ | <code sql> | ||
+ | SELECT nagios_hosts.display_name, | ||
+ | FROM | ||
+ | WHERE nagios_hoststatus.host_object_id = nagios_hosts.host_object_id; | ||
+ | </ | ||
+ | |||
+ | Resultando en una tabla como esta | ||
+ | |||
+ | ^display_name^current_state^ | ||
+ | |firewall|0| | ||
+ | |apache|1| | ||
+ | |servidor-sql|0| | ||
+ | |sap-db|0| | ||
+ | |||
+ | |||
+ | Para conocer el estado de un servicio, independientemente de los hosts en los que se encuentre disponible | ||
+ | |||
+ | En este caso el servicio **HTTP** | ||
+ | |||
+ | <code sql> | ||
+ | SELECT obj1.name1 AS host_name, | ||
+ | nagios_services.service_object_id, | ||
+ | obj1.name2 AS service_description, | ||
+ | nagios_servicestatus.current_state | ||
+ | FROM `nagios_servicestatus` | ||
+ | LEFT JOIN nagios_objects AS obj1 ON nagios_servicestatus.service_object_id = obj1.object_id | ||
+ | LEFT JOIN nagios_services ON nagios_servicestatus.service_object_id = nagios_services.service_object_id | ||
+ | LEFT JOIN nagios_instances ON nagios_services.instance_id = nagios_instances.instance_id | ||
+ | WHERE nagios_services.config_type = ' | ||
+ | AND obj1.name2 = ' | ||
+ | </ | ||
+ | |||
+ | Resultando en una tabla como esta | ||
+ | |||
+ | ^host_name^service_object_id^service_description^current_state^ | ||
+ | | concentrador_mpls | 18 | HTTP | 0 | | ||
+ | | router-vpn | 23| HTTP | 1| | ||
+ | | central | 28 | HTTP | 2 | | ||
+ | | router-45 | 33 | HTTP | 0 | | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Consulta simple para obtener un pantallazo general del estado de servicios de un hostgroup | ||
+ | |||
+ | <code sql> | ||
+ | SELECT | ||
+ | CASE st.current_state | ||
+ | WHEN 0 THEN ' | ||
+ | WHEN 1 THEN ' | ||
+ | WHEN 2 THEN ' | ||
+ | WHEN 3 THEN ' | ||
+ | END AS states, | ||
+ | COUNT(st.current_state) AS number | ||
+ | FROM nagios_hostgroup_members m, nagios_services s, | ||
+ | nagios_servicestatus st | ||
+ | WHERE m.host_object_id = s.host_object_id | ||
+ | AND s.service_object_id = st.service_object_id | ||
+ | AND hostgroup_id IN | ||
+ | ( | ||
+ | SELECT hostgroup_id | ||
+ | FROM nagios_hostgroups hg, nagios_objects o | ||
+ | WHERE hg.hostgroup_object_id = o.object_id | ||
+ | AND o.name1 = ' | ||
+ | ) | ||
+ | GROUP BY st.current_state; | ||
+ | </ | ||
+ | |||
+ | Resultando en una tabla como esta | ||
+ | |||
+ | ^states^number^ | ||
+ | |OK|1754| | ||
+ | |WARNING|13| | ||
+ | |CRITICAL|84| | ||
+ | |UNKNOWN|20| | ||
+ | |||
+ | Consulta simple para obtener un conteo general de los estados generales ordenados por meses de un año determinado. | ||
+ | |||
+ | <code sql> | ||
+ | SELECT | ||
+ | CONCAT('', | ||
+ | ELT(nagios_statehistory.state+1,' | ||
+ | CONCAT('', | ||
+ | FROM | ||
+ | `nagios_statehistory` | ||
+ | LEFT JOIN nagios_objects AS obj1 ON nagios_statehistory.object_id=obj1.object_id | ||
+ | LEFT JOIN nagios_instances ON nagios_statehistory.instance_id=nagios_instances.instance_id | ||
+ | WHERE | ||
+ | obj1.objecttype_id=' | ||
+ | AND nagios_statehistory.state_type = 1 | ||
+ | AND DATE_FORMAT(nagios_statehistory.state_time,' | ||
+ | GROUP BY | ||
+ | TEMPS, ETAT | ||
+ | ORDER BY | ||
+ | DATE_FORMAT(nagios_statehistory.state_time,' | ||
+ | </ | ||
+ | |||
+ | Resultando en una tabla como esta | ||
+ | |||
+ | ^TEMPS^ETAT^QUANTITE^ | ||
+ | |November|OK|1754| | ||
+ | |November|WARNING|13| | ||
+ | |November|CRITICAL|84| | ||
+ | |November|UNKNOWN|20| | ||
+ | |||
+ | Trigger para guardar el último estado de los objetos | ||
+ | |||
+ | Nagios no guarda en ninguna tabla de MySQL el último estado de los objetos, pero guarda los cambios de estado en la tabla nagios_statehistory. Para mantener el último estado se puede usar un trigger: | ||
+ | |||
+ | <code sql> | ||
+ | create table last_state (object_id int(11), state int(6)); | ||
+ | |||
+ | create trigger last_state after insert on nagios_statehistory | ||
+ | for each row | ||
+ | begin | ||
+ | if new.state_change = 1 then | ||
+ | update last_state set state = new.state where object_id new.object_id; | ||
+ | end if; | ||
+ | end;// | ||
+ | </ | ||
+ | |||
+ | Ese trigger hace un update así que hay que cronear esto para mantener al día con los objetos la tabla. | ||
+ | |||
+ | <code sql> | ||
+ | insert into last_state | ||
+ | select obj.object_id, | ||
+ | from nagios.nagios_objects as obj | ||
+ | where obj.object_id not in | ||
+ | (select object_id from last_state); | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | Luego estas consultas podemos integrarlas en PHP o Perl, y obtener resultados que necesitemos para reflejarlos en un visor web, o en los resultados de un plugin. | ||
+ | |||
+ | |||
+ | |||
+ | **NOTA:** Importante el modulo mysql de PHP no soporta la consulta a los PROCEDURE de MySQL, para ello deberemos utilizar el modulo mysqli de PHP, otra cosa tambien importante es que mysqli soporta conecciones persistentes, |
manuales/nagios/capacitacion/ndo2utils.txt · Última modificación: 2015/10/22 17:37 por cayu