Herramientas de usuario

Herramientas del sitio


manuales:nagios:capacitacion:ndo2utils

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
manuales:nagios:capacitacion:ndo2utils [2015/10/22 17:17] cayumanuales: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_instances,
 +    nagios_hosts,nagios_hostgroup_members,
 +    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 = '{grupo_de_host_a_consultar}'
 +    ORDER BY nagios_hosts.display_name ASC
 +</code>
 +
 +Para conocer el estado de un servicio de un determinado host
 +
 +<code sql>
 +    SELECT
 +    nagios_servicestatus.perfdata,nagios_servicestatus.output
 +    FROM
 +    nagios_services,nagios_servicestatus,
 +    nagios_objects,nagios_instances
 +    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 = '{servicio_a_consultar}'
 +    AND
 +    nagios_services.config_type='1'
 +    AND
 +    nagios_objects.name1 = '{host_que_lo_contiene}'
 +</code>
 +
 +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='1'
 +    AND
 +    nagios_hosts.display_name = '{host_a_consultar}'
 +</code>
 +
 +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 ='{alias_service_group}'
 +    AND nagios_services.display_name ='{alias_de_servicio}'
 +</code>
 +
 +Para conocer los estados de los hosts
 +
 +<code sql>
 +SELECT nagios_hosts.display_name,nagios_hoststatus.current_state  
 +FROM   nagios_hoststatus,nagios_hosts 
 +WHERE  nagios_hoststatus.host_object_id = nagios_hosts.host_object_id;
 +</code>
 +
 +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 = '1'
 +AND obj1.name2 = 'HTTP'
 +</code>
 +
 +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 'OK' 
 +       WHEN 1 THEN 'WARNING' 
 +       WHEN 2 THEN 'CRITICAL' 
 +       WHEN 3 THEN 'UNKNOWN' 
 +    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 = '{nombre_hostgroup}'
 +        )
 +GROUP BY st.current_state;
 +</code>
 +
 +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('',DATE_FORMAT(nagios_statehistory.state_time,'%M')) AS TEMPS,
 + ELT(nagios_statehistory.state+1,'OK','WARNING','CRITICAL','UNKNOWN') AS ETAT,
 + CONCAT('',COUNT(nagios_statehistory.state)) AS QUANTITE
 +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='2'
 + AND nagios_statehistory.state_type = 1
 + AND DATE_FORMAT(nagios_statehistory.state_time,'%Y') = 2010
 +GROUP BY
 + TEMPS, ETAT
 +ORDER BY
 + DATE_FORMAT(nagios_statehistory.state_time,'%m'),nagios_statehistory.state
 +</code>
 +
 +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;// 
 +</code>
 +
 +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, 0
 +        from nagios.nagios_objects as obj
 +        where obj.object_id not in
 +                (select object_id from last_state);
 +</code>
 +
 +
 +
 +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, asi que para evitarse tiempo de implementacion a veces es necesario o implementar un script en Perl, o hacer que el resultado del PROCEDURE se almacene en una tabla temporal y realizar una consulta simple desde ahi.
manuales/nagios/capacitacion/ndo2utils.1445534256.txt.gz · Última modificación: 2015/10/22 17:17 por cayu