El monitoreo de nuestros servidores es una tarea importante para los devops, supongamos que se tiene un clúster de servidores de bases de datos PostgreSQL y se desea de una manera facil administrar el uso de recursos de la memoria y CPU.
Se puede implementar un sistema de monitoreo como Nagios, Collectd, Munin, zabbix, etc., pero eso significaría abrir otro puerto en su firewall y mantener otro proceso en ejecución. Si lo único que se busca es información básica como CPU y uso de memoria, con los siguientes pasos se podrá realizar.
Crearemos dos tablas de base de datos que le permitirán consultar el uso de CPU y memoria desde la conexión de la base de datos. De esta manera, sus aplicaciones podrán controlar el estado de los servidores sin necesidad de preocuparse por otra conexión u otro protocolo.
Puede ejecutar estos comandos en la base de datos maestra y también se propagarán a todas las bases de datos esclavas.
Creación del servidor de datos externo
Primero, cargue el contenedor externo de datos del archivo y cree el servidor de datos externo:
CREATE EXTENSION file_fdw; CREATE SERVER fileserver FOREIGN DATA WRAPPER file_fdw;
A continuación, crearemos la tabla que carga loadavg de CPU desde el archivo /proc/loadavg:
CREATE FOREIGN TABLE loadavg (one text, five text, fifteen text, scheduled text, pid text) SERVER fileserver OPTIONS (filename '/proc/loadavg', format 'text', delimiter ' ');
Creación de Tabla:
La creación de la tabla que le permitirá consultar información de memoria, desde el archivo /proc/meminfo, es similar:
CREATE FOREIGN TABLE meminfo (stat text, value text) SERVER fileserver OPTIONS (filename '/proc/meminfo', format 'csv', delimiter ':');
Ahora puede ejecutar consultas SELECT para ver la información.
postgres=# SELECT * FROM loadavg; one | five | fifteen | scheduled | pid ------+------+---------+-----------+------- 0.00 | 0.01 | 0.05 | 1/124 | 27961 (1 fila)
postgres=# SELECT * FROM meminfo; stat | value -------------------+------------------------ MemTotal | 1883660 kB MemFree | 765008 kB MemAvailable | 1543596 kB Buffers | 0 kB Cached | 921048 kB SwapCached | 10492 kB Active | 681904 kB Inactive | 289636 kB Active(anon) | 41520 kB Inactive(anon) | 54328 kB Active(file) | 640384 kB Inactive(file) | 235308 kB Unevictable | 0 kB Mlocked | 0 kB SwapTotal | 3145724 kB SwapFree | 3088712 kB Dirty | 96 kB Writeback | 0 kB AnonPages | 42400 kB Mapped | 55696 kB Shmem | 45356 kB Slab | 99112 kB SReclaimable | 68144 kB SUnreclaim | 30968 kB KernelStack | 2000 kB PageTables | 7168 kB NFS_Unstable | 0 kB Bounce | 0 kB WritebackTmp | 0 kB CommitLimit | 4087552 kB Committed_AS | 478740 kB VmallocTotal | 34359738367 kB VmallocUsed | 9016 kB VmallocChunk | 34359726680 kB HardwareCorrupted | 0 kB AnonHugePages | 16384 kB HugePages_Total | 0 HugePages_Free | 0 HugePages_Rsvd | 0 HugePages_Surp | 0 Hugepagesize | 2048 kB
Consultar datos
Por supuesto, siempre puedes consultar partes específicas de meminfo de esta manera:
postgres=# SELECT * FROM meminfo WHERE stat IN ('MemTotal','MemFree'); stat | value ----------+--------------------- MemTotal | 1883660 kB MemFree | 764884 kB (2 filas)
Como se puede observar, los datos de meminfo están un poco desordenados debido a los espacios en blanco en /proc/meminfo, por lo que esto requerirá cierta limpieza al momento de hacer la consulta.
Para tener nuestros datos un poco mas ordenados, crearemos una tabla donde se almacenará esta información.
CREATE TABLE public.memory ( id integer NOT NULL DEFAULT nextval('memory_seq'::regclass), stat text, value text, datetime timestamp with time zone, CONSTRAINT memory_pkey PRIMARY KEY (id) ) WITH (OIDS=FALSE);
Inserción de datos
Luego se puede crear una tarea que se ejecute cada cierta cantidad de minutos, horas, o de acuerdo a demanda y que inserte los valores en la tabla creada.
INSERT INTO memory (stat, value, datetime) SELECT stat, LTRIM(replace(value, ' kB', '')), now() FROM meminfo WHERE stat IN ('MemTotal','MemFree', 'MemAvailable');
postgres=# SELECT id, stat, value, datetime FROM public.memory; id | stat | value | datetime ------+--------------+---------+------------------------------- 1 | MemTotal | 2915984 | 2018-02-19 12:41:35.815396-05 2 | MemFree | 2095552 | 2018-02-19 12:41:35.815396-05 3 | MemAvailable | 2522564 | 2018-02-19 12:41:35.815396-05 4 | MemTotal | 2915984 | 2018-02-19 12:42:47.506419-05 5 | MemFree | 2093708 | 2018-02-19 12:42:47.506419-05 6 | MemAvailable | 2520736 | 2018-02-19 12:42:47.506419-05 7 | MemTotal | 2915984 | 2018-02-19 12:43:47.579134-05 8 | MemFree | 2093552 | 2018-02-19 12:43:47.579134-05 9 | MemAvailable | 2520580 | 2018-02-19 12:43:47.579134-05
Del mismo se podría crear una tabla e ir registrando periódicamente los valores del archivo /proc/loadavg