¿Para que son interesantes las métricas de monitorización personalizadas? En este artículo, continuaremos sobre la base que se configuró en el artículo anterior.

La configuración previa realizada,  se nos facilitó el uso de los Performance Metric Domain Agents (PMDAs), agentes que han sido específicamente creados para usarse con PCP. Estos agentes están disponibles en los repositorios de RHEL:

[root@rhel7u5a ~]# yum search pcp-pmda
Loaded plugins: product-id, search-disabled-repos, subscription-manager
======================== N/S matched: pcp-pmda ===========================
pcp-pmda-activemq.x86_64 : Performance Co-Pilot (PCP) metrics for ActiveMQ
pcp-pmda-apache.x86_64 : Performance Co-Pilot (PCP) metrics for the Apache webserver
pcp-pmda-bash.x86_64 : Performance Co-Pilot (PCP) metrics for the Bash shell
pcp-pmda-bind2.x86_64 : Performance Co-Pilot (PCP) metrics for BIND servers
pcp-pmda-bonding.x86_64 : Performance Co-Pilot (PCP) metrics for Bonded network interfaces
pcp-pmda-cifs.x86_64 : Performance Co-Pilot (PCP) metrics for the CIFS protocol
[..]

Cuando un agente PMDA no satisface los requisitos, se pueden crear monitorizaciones personalizadas.

Configurando el PMDA ‘trivial’

Cuando se instalan los paquetes pcp-pmda, estos se instalan en la ruta /var/lib/pcp/pmdas. Para obtener código de ejemplo de como programar métricas personalizadas, podemos usar ‘yum install pcp-devel’. El código en ‘/var/lib/pcp/trivial’ es un PMDA mínimo, analicémoslo:

[root@rhel7u5a ~]# yum -y install pcp-devel
[..]
[root@rhel7u5a ~]# cd /var/lib/pcp/pmdas/trivial
[root@rhel7u5a trivial]# ./Install
You will need to choose an appropriate configuration for installation of
the "trivial" Performance Metrics Domain Agent (PMDA).

  collector 	collect performance statistics on this system
  monitor   	allow this system to monitor local and/or remote systems
  both      	collector and monitor configuration for this system

Please enter c(ollector) or m(onitor) or b(oth) [b] c
Installing files ...
gcc -fPIC -fno-strict-aliasing -D_GNU_SOURCE -Wall -O2 -g -DPCP_VERSION=\"3.12.2\"   -c -o trivial.o trivial.c
[..]
Updating the Performance Metrics Name Space (PMNS) ...
Terminate PMDA if already installed ...
Updating the PMCD control file, and notifying PMCD ...
Check trivial metrics have appeared ... 1 metrics and 1 values
[root@rhel7u5a trivial]#

Tras esto, podemos acceder a esta nueva métrica:

[root@rhel7u5a trivial]# pmrep trivial
  t.time
 	s/s
 	N/A
   0.997
   0.997

Personalizando el PMDA ‘trivial’

Utilizo las métricas personalizadas con distintos fines, como por ejemplo, monitorizar desde que países acceden a mi web. En este artículo, modificaremos el PMDA ‘trivial’ para monitorizar los valores de temperatura de nuestro sistema.

Tras instalar el paquete ‘lm_sensors’, la información de los sensores está disponible vía ‘sensors -u’. La disponibilidad de información de los sensores vía ‘sensors -u’ no se prueba como parte de la certificación de hardware de Red Hat, por lo que hay sistemas donde lm_sensors no puede acceder a esos datos.

En esa  casuística, puedes probar por ejemplo acceder a la temperatura del sensor de un disco, utilizando ‘smartctl -a /dev/sda’.

RHEL7.5 tiene la versión 3.12 de PCP, donde el PMDA ‘trivial’ está escrito en C. La versión upstream de PCP incluye adicionalmente versiones en Python y Perl, y en este artículo usaremos la versión Perl para nuestra métrica personalizada. En mi sistema, hay disponibles distintas métricas con los valores del sensor, pero para nuestro ejemplo usaremos una única métrica: el primer valor de temperatura de la salida del comando ‘sensors -u’.

#!/usr/bin/perl
#
# Copyright (c) 2012,2018 Red Hat.
# Copyright (c) 2008,2012 Aconex.  All Rights Reserved.
# Copyright (c) 2004 Silicon Graphics, Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#

use strict;
use warnings;
use PCP::PMDA;
use vars qw( $pmda );

sub trivial_fetch_callback  	# must return array of value,status
{
    	my ($cluster, $item, $inst) = @_;
    	my $temperature;
    	foreach ( qx( /usr/bin/sensors -u ) ) {
            	next unless m/: ([0-9.]+)/;
            	next unless $1 > 0;
            	$temperature=$1;
    	}

    	if ($cluster == 0 && $item == 0) { return ($temperature, 1); }
    	return (PM_ERR_PMID, 0);
}


$pmda = PCP::PMDA->new('trivial', 250); # domain name and number
$pmda->connect_pmcd;

$pmda->add_metric(pmda_pmid(0,0), PM_TYPE_U32, PM_INDOM_NULL,
            	PM_SEM_INSTANT, pmda_units(0,0,0,0,0,0),
            	'trivial.temp1', 'temperature',
            	'temperature from first sensor in deg Celsius');

$pmda->set_fetch_callback( \&trivial_fetch_callback );
$pmda->set_user('pcp');
$pmda->run;

Te preguntas qué significa el número ‘250’, el cual hemos usamos en este ejemplo. Estos números se utilizan para diferenciar PMDAs, como si fuera una especie de OID en SNMP. ‘pminfo -m’ lista los números utilizados en nuestro sistema.

Necesitamos actualizar el fichero ‘Install’ en el mismo directorio donde hemos creado el fichero perl, actualizando la parte final para que se asemeje a esto:

[..]
. $PCP_DIR/etc/pcp.env
. $PCP_SHARE_DIR/lib/pmdaproc.sh

iam=trivial
dso_opt=true
perl_opt=true
python_opt=true

pmdaSetup
pmdaInstall
exit

Ahora vamos a borrar el PMDA ‘trivial’ actualmente instalado, instalar nuestra nueva versión, y verificar que podemos acceder al valor personalizado:

[root@rhel7u5a trivial]# ./Remove
[..]
[root@rhel7u5a trivial]# ./Install
You will need to choose an appropriate configuration for installation of
the "trivial" Performance Metrics Domain Agent (PMDA).

  collector 	collect performance statistics on this system
  monitor   	allow this system to monitor local and/or remote systems
  both      	collector and monitor configuration for this system

Please enter c(ollector) or m(onitor) or b(oth) [b] c
Install trivial as a daemon or python or perl or dso agent? [daemon] perl
Updating the Performance Metrics Name Space (PMNS) ...
Terminate PMDA if already installed ...
Updating the PMCD control file, and notifying PMCD ...
Check trivial metrics have appeared ... 1 metrics and 1 values
[root@rhel7u5a trivial]# pminfo trivial
trivial.temp1
[root@rhel7u5a trivial]# pmrep trivial
  t.temp1
   	42
   	42

¡Felicidades, tu valor de temperatura está disponible!

En este ejemplo, hemos utilizado el PMDA ‘trivial’, pero si quieres monitorizar múltiples valores personalizados, el PMDA ‘simple’ es un buen comienzo para empezar la personalización.

Archivando métricas personalizadas

Por ahora somos capaz de acceder a las métricas personalizadas utilizando el demonio pmcd. Investigando los ficheros de archivo en /var/log/pcp/pmlogger/<hostname> con ‘pminfo -a’, podemos ver que la métrica personalizada no se está guardando:

[root@rhel7u5a trivial]# pminfo \
     -a /var/log/pcp/pmlogger/rhel7u5a/20180823.05.58.0 trivial
Error: trivial: Unknown metric name

Esto es porque pmlogger no está todavía configurado para la nueva métrica.

Abramos el fichero /var/lib/pcp/config/pmlogger/config.default en un editor y saltemos al final del fichero. Justo después de la sección [access], insertamos una sección con nuestra métrica:

[..]
log mandatory on every 60 seconds {
    	trivial.temp1
}

[access]
disallow .* : all;
disallow :* : all;
allow local:* : enquire;

Podemos validar la sintaxis del fichero con ‘pmlogger -C -c /var/lib/pcp/config/pmlogger/config.default string’ y después reiniciar pmlogger con ‘systemctl restart pmlogger’. Un nuevo archivo aparecerá en el directorio /var/log/pcp/pmlogger/<hostname>, que además incluye nuestra métrica:

[root@rhel7u5a rhel7u5a]# pminfo -a 20180827.07.44.0 trivial
trivial.temp1
[root@rhel7u5a rhel7u5a]# pmrep -a 20180827.07.44.0 trivial
  t.temp1
  	N/A
   	42
   	42
   	42
[...]

Con esto podemos ver que nuestra métrica personalizada se guarda para futuras investigaciones.

Si hubiera algún problema con la configuración de pmlogger, el fichero /var/log/pcp/pmlogger/<hostname>/pmlogger.log es un buen lugar para comenzar a analizar el problema.

Representación gráfica

¡Convirtamos nuestros números en gráficas!

RHEL dispone de los paquetes necesarios para ello que podemos instalar con:

[root@rhel7u5a ~]# yum install -y pcp-webapp\* pcp-webapi pcp-webjs
[..]

Tras instalarlos, podemos activar y arrancar el demonio pmwebd:

[root@rhel7u5a ~]# systemctl start pmwebd
[root@rhel7u5a ~]# systemctl enable pmwebd

En este punto, múltiples frameworks para generar gráficas de nuestras métricas de PCP están disponibles accediendo a la URL http://<ip>:44323/ desde un navegador.

Graphite es especialmente interesante, se puede acceder vía http://<ip>:44323/graphite . Cuando utilicemos la función de buscar en la interfaz de graphite, nos daremos cuenta que que las métricas anteponen nuestro hostname, por ejemplo rhel7u5a.trivial.temp1.

Ahora podríamos instalar grafana. Las nuevas versiones proveen de funcionalidades adicionales, pero al no ser parte de RHEL, no están cubiertas por el Soporte de Red Hat. En grafana, ‘graphite’ se puede seleccionar como ‘data source’ ya que la URL http://<ip>:44323/graphite puede ser utilizada para acceder a nuestras métricas PCP. La siguiente gráfica se creó utilizando esta combinación:

Visualizing system monitoring

Conclusiones finales

Como has podido ver, la monitorización de métricas personalizadas con PCP es fácil de configurar: ¿Cómo varían las estadísticas E/S o la temperatura de los sistemas durante el día? ¿Cómo varían activando distintos perfiles de tuned? En un portátil, ¿son las temperaturas diferentes tras ejecutar ‘powertop --auto-tune’? Si tienes distintas web tras un balanceador de carga, puedes configurar las estadísticas de acceso y verificar que reciben el mismo número de peticiones por segundo, etc.


Sobre el autor

Christian Horn is a Senior Technical Account Manager at Red Hat. After working with customers and partners since 2011 at Red Hat Germany, he moved to Japan, focusing on mission critical environments.  Virtualization, debugging, performance monitoring and tuning are among the returning topics of his
daily work.  He also enjoys diving into new technical topics, and sharing the findings via documentation, presentations or articles.

Read full bio