![]() |
This is a machine translation based on the English version of the article. It might or might not have already been subject to text preparation. If you find errors, please file a GitHub issue that states the paragraph that has to be improved. |
1. Introducción
El Livestatus es la interfaz más importante de Checkmk. Es la forma más rápida de obtener todos los datos del host y del servicio monitorizados, incluidos los datos en directo. Así, por ejemplo, los datos de la Vista general se obtienen directamente a través de esta interfaz. Como se leen directamente de la RAM, se evita el lento acceso al disco duro, lo que proporciona un acceso rápido a la monitorización sin sobrecargar demasiado el sistema.
Para estructurar los datos, éstos se organizan en tablas y columnas. La tabla hosts
incluye, por ejemplo, las columnas name
,state
y muchas otras. Cada línea de la tabla hosts
representa un host, la tabla services
un servicio, etc. De este modo, los datos pueden buscarse y recuperarse de forma sencilla.
Este artículo debería ayudarte a utilizar esta interfaz para tus propias consultas, extensiones y personalizaciones. Como usuario de la instancia puedes -mediante copiar y pegar- probar directamente todas las consultas y comandos de este artículo.
2. El Lenguaje de Consulta Livestatus (LQL)
2.1. Uso del LQL en el shell
El acceso al Livestatus se realiza a través de un socket Unix utilizando elLenguaje de Consulta del Livestatus (LQL). Su sintaxis está basada en HTTP.
A través de la línea de comandos hay varias formas de acceder a la interfaz. Una posibilidad es utilizar los comandos printf
y unixcat
para enviar una instrucción al socket. La herramienta unixcat
ya está incluida en Checkmk para el usuario de instancia. Importante: todas las entradas al socket distinguen entre mayúsculas y minúsculas, por lo que siempre hay que tenerlo en cuenta:
OMD[mysite]:~$ printf "GET hosts\nColumns: name\n" | unixcat ~/tmp/run/live
La interfaz espera todos los comandos y cabeceras en una línea separada. Puedes marcar dicho salto de línea con \n
. Como alternativa al comando anterior, también puedes utilizar el comando script lq
, que te ahorra un poco de trabajo al autocompletar algunos campos al entrar:
OMD[mysite]:~$ lq "GET hosts\nColumns: name"
O puedes iniciar el flujo de entrada interactivo e introducir el comando seguido de la cabecera. Con una línea en blanco ejecutas el comando con su cabecera, y con otra línea se finaliza el acceso al socket. Observa que en el ejemplo, todo lo que hay antes de la línea en blanco pertenece al comando, y todo lo que hay entre la primera y la segunda línea en blanco es la respuesta:
OMD[mysite]:~$ lq
GET hosts
Columns: name
myserver123
myserver124
myserver125
OMD[mysite]:~$
Los siguientes ejemplos se ejecutan siempre con el comando lq
: de forma directa cuando la consulta es breve, y como flujo de entrada para consultas más largas.
Comandos LQL
En los primeros ejemplos ya has visto el primero de los dos comandos: con GET
puedes llamar a todas las tablas disponibles. En la referencia del comando puedes encontrar una lista completa, con una descripción, de todas lastablas disponibles, y este artículo también contiene una explicación general sobre el uso del Livestatus.
Cabeceras LQL
En cada comando GET puedes insertar varias cabeceras para restringir los resultados de una consulta, para mostrar sólo determinadas columnas de una tabla, etc. A continuación se indican las dos cabeceras más importantes:
Encabezado | Descripción |
---|---|
Columnas |
Sólo las columnas especificadas serán producidas por una consulta. |
Filtro |
Sólo se producirán las entradas que cumplan una condición específica. |
Aquí encontrarás una lista de todas las cabeceras, cada una con una breve descripción.
Mostrar columnas y tablas disponibles
No podrás recordar todas las tablas y sus columnas, y el acceso a este manual (con las referencias de la versión online) no siempre será posible. Sin embargo, es posible crear rápidamente una consulta que proporcione la información deseada. Para recibir una lista de todas las tablas disponibles, envía la siguiente consulta, y borra las líneas duplicadas en la salida consort
. En la salida se pueden ver las cuatro primeras líneas a modo de ejemplo:
OMD[mysite]:~$ lq "GET columns\nColumns: table" | sort -u
columns
commands
comments
contactgroups
Para una consulta de todas las columnas de una tabla debes especificarlas, por supuesto. Sustituye hosts
por la tabla deseada. Aquí también se pueden ver las cuatro primeras líneas de la salida como ejemplo:
OMD[mysite]:~$ lq "GET columns\nFilter: table = hosts\nColumns: name"
accept_passive_checks
acknowledged
acknowledgement_type
action_url
2.2. Utilizar LQL en Python
Dado que Checkmk se basa en gran medida en Python, resulta práctico utilizar scripts en este lenguaje. El siguiente script puede utilizarse como base para un acceso al socket de Livestatus:
#!/usr/bin/env python
# Sample program for accessing Livestatus from Python
import json, os, socket
# for local site only: file path to socket
address = "%s/tmp/run/live" % os.getenv("OMD_ROOT")
# for local/remote sites: TCP address/port for Livestatus socket
# address = ("localhost", 6557)
# connect to Livestatus
family = socket.AF_INET if type(address) == tuple else socket.AF_UNIX
sock = socket.socket(family, socket.SOCK_STREAM)
sock.connect(address)
# send our request and let Livestatus know we're done
sock.sendall(str.encode("GET status\nOutputFormat: json\n"))
sock.shutdown(socket.SHUT_WR)
# receive the reply as a JSON string
chunks = []
while len(chunks) == 0 or chunks[-1] != "":
data = sock.recv(4096)
chunks.append(str(data.decode("utf-8")))
sock.close()
reply = "".join(chunks)
# print the parsed reply
print(json.loads(reply))
2.3. Utilizar la API de Livestatus
Checkmk proporciona una API para los lenguajes de programación Python, Perl y C++, que simplifica el acceso a Livestatus. Hay disponible un código de ejemplo para cada lenguaje que explica su uso. Las rutas a estos ejemplos se encuentran en el capítulo Archivos y directorios.
3. Consultas sencillas
3.1. Consultas por columnas (Columnas)
En los ejemplos que hemos visto hasta ahora, se ha consultado TODA la información de TODOS los host. En la práctica, sin embargo, es probable que sólo se necesiten columnas concretas. Con la cabecera Columns
que ya se ha mencionado, la salida puede limitarse a esta columna. Los nombres de las columnas individuales estarán separados por un simple espacio en blanco.
OMD[mysite]:~$ lq "GET hosts\nColumns: name address"
myserver123;192.168.0.42
myserver234;192.168.0.73
Como puedes ver, en una línea los valores individuales están separados por punto y coma.
Importante: Si utilizas estas cabeceras, se suprimirá la cabecera en la salida. Ésta se puede volver a insertar en la salida con la cabecera ColumnHeaders.
3.2. Establecer un filtro simple
Para limitar la consulta a líneas concretas, se pueden filtrar las columnas por contenidos específicos. Si sólo se quieren buscar servicios con un estado concreto, se puede conseguir con un filtro:
OMD[mysite]:~$ lq "GET services\nColumns: host_name description state\nFilter: state = 2"
myserver123;Filesystem /;2
myserver234;ORA MYINST Processes;2
En el ejemplo, se buscarán todos los servicios con estado CRIT, y se mostrarán el nombre del host, la descripción del servicio y su estado. Por supuesto, estos filtros pueden combinarse y limitarse a los servicios con estadoCRIT que aún no hayan sido reconocidos:
OMD[mysite]:~$ lq "GET services\nColumns: host_name description state\nFilter: state = 2\nFilter: acknowledged = 0"
myserver234;Filesystem /;2
Como se puede ver, también se puede filtrar por columnas que no aparecen en Columns
.
Operadores y expresiones regulares
Hasta ahora sólo se han filtrado los números coincidentes. El resultado provisional de una consulta también se puede buscar por "menos que" con números, o por cadenas de caracteres. Los operadores disponibles se encuentran en el capítulo Operadoresde la referencia del comando. Así puedes, por ejemplo, filtrar por expresiones regulares en las columnas:
OMD[mysite]:~$ lq "GET services\nColumns: host_name description state\nFilter: description ~~ exchange database|availability"
myserver123;Exchange Database myinst1;1
myserver123;Exchange Availability Service;0
myserver234;Exchange Database myinst3;0
Con el operador adecuado puedes buscar en las columnas de varias formas. El Livestatus siempre interpretará una expresión de este tipo como "puede aparecer en cualquier lugar de la columna", siempre que no se haya definido de otra forma. Indica el inicio de una línea con, por ejemplo, el carácter ^
, y el final de una línea con el carácter $
. Puedes encontrar una lista completa de todos los caracteres especiales de las expresiones regulares de Checkmk en el artículo sobre Expresiones regulares.
3.3. Ordenar la salida (OrderBy)
Puedes utilizar la cabecera OrderBy
para ordenar la salida según el contenido de cualquier columna o incluso según los valores de cualquier clave del diccionario. Esto te permite crear una lista alfabética de todos los host, por ejemplo:
OMD[mysite]:~$ lq "GET hosts\nColumns: name\nOrderBy: name"
ahost
anotherhost
yetanotherhost
Implícitamente, la salida se ordena en orden ascendente (asc
) como era de esperar. Sin embargo, también puedes especificar explícitamente la ordenación deseada e invertirla especificando desc`
:
OMD[mysite]:~$ lq "GET hosts\nColumns: name\nOrderBy: name desc"
yetanotherhost
anotherhost
ahost
Con consultas algo más largas y ordenación por, por ejemplo, datos de rendimiento, se pueden crear listas de clasificación interesantes. En el siguiente ejemplo, los host se muestran en orden descendente según su tiempo de actividad:
OMD[mysite]:~$ lq "GET services\nColumns: host_name performance_data\nFilter: description = Uptime\nOrderBy: performance_data.uptime desc"
anotherhost;uptime|249531.1
yetanotherhost;uptime|149142.3
ahost;uptime|48959
4. Consultas complejas
4.1. Filtros para listas
Algunas columnas de una tabla no devuelven un único valor, sino toda una lista de ellos. Para que esa lista pueda buscarse eficazmente, en estos casos los operadores tienen otra función. Puedes encontrar una lista completa de los operadores en Operadores para listas. Así, por ejemplo, el operador >=
tiene la función "contiene". Con él podrías, por ejemplo, buscar contactos concretos:
OMD[mysite]:~$ lq "GET hosts\nColumns: name address contacts\nFilter: contacts >= hhirsch"
myserver123;192.168.0.42;hhirsch,hhirsch,mfrisch
myserver234;192.168.0.73;hhirsch,wherrndorf
Como puede verse en el ejemplo anterior, los contactos se enumerarán, separados por comas, en la columna contacts
. Esto permite distinguirlos claramente por no ser el inicio de otra columna. Una característica especial del operador de igualdad es que comprueba si una lista está vacía:
OMD[mysite]:~$ lq "GET hosts\nColumns: name contacts\nFilter: contacts ="
myserver345;
myserver456;
4.2. Combinar filtros
Anteriormente ya se han combinado varios filtros. Parece intuitivo que los datos deban pasar por todos los filtros para poder mostrarse. Así, los filtros se enlazarán mediante la operación lógica y. Para enlazar filtros concretos con un operador lógico y, al final de la cadena de filtros codifica un o: seguido de un número entero. El contador especifica cuántas de las últimas líneas pueden combinarse con una o. De esta forma, se pueden formar grupos y combinarlos como se desee. A continuación se muestra un ejemplo sencillo. Aquí se combinan dos filtros para que se muestren todos los servicios que tengan el estadoWARN o UNKNOWN:
OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: state = 1
Filter: state = 3
Or: 2
myserver123;Log /var/log/messages;1
myserver123;Interface 3;1
myserver234;Bonding Interface SAN;3
OMD[mysite]:~$
El resultado de una combinación también se puede negar, o los grupos se pueden combinar a su vez en otros grupos. En el ejemplo, se muestran todos los servicios cuyo estado no sea OK y cuya descripción empiece por Filesystem
, o que tengan un estado distinto de UNKNOWN:
OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: state = 3
Filter: description ~ Filesystem
And: 2
Filter: state = 0
Or: 2
Negate:
myserver123;Log /var/log/messages;1
myserver123;Interface 3;1
myserver234;Filesystem /media;2
myserver234;Filesystem /home;2
4.3. Especificar un formato de salida
El formato de salida puede especificarse de dos formas. Un método consiste en redefinir los separadores utilizados en la salida estándar. El otro método consiste en obtener una salida conforme a los formatos Python o JSON.
Personalizar csv
Como ya se ha descrito, puedes personalizar con precisión el formato de salida estándar csv
(¡en minúsculas!) y definir cómo deben separarse los distintos elementos entre sí. Checkmk reconoce cuatro separadores distintos para estructurar los datos. Después de dos puntos, codifica un valor ASCII estándar adecuado para que el filtro se estructure como sigue:
Separators: 10 59 44 124
Estos separadores tienen las siguientes funciones:
Separador para los conjuntos de datos:
10
(salto de línea)Separador para las columnas de un conjunto de datos:
59
(punto y coma)Separador para los elementos de una lista:
44
(coma)Separador para los elementos de una lista de servicios:
124
(barra vertical)
Cada uno de estos valores puede seleccionarse para estructurar la salida como se desee. En el ejemplo siguiente, las columnas individuales de un conjunto de datos se han separado con un tabulador (9) en lugar de con un punto y coma (59):
OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: description ~ Filesystem
Separators: 10 9 44 124
myserver123 Filesystem /opt 0
myserver123 Filesystem /var/some/path 1
myserver123 Filesystem /home 0
Importante: El orden de los separadores es fijo y no puede alterarse.
Cambiar los formatos de salida
Además de producir salidas en csv
, Livestatus también puede producir salidas en otros formatos. Éstos tienen la ventaja de ser más fáciles y limpios de analizar en lenguajes de programación superiores. En consecuencia, las salidas pueden codificarse en los siguientes formatos:
Formato | Descripción |
---|---|
Python |
Genera una salida en forma de lista compatible con 2.x. El texto se formatea en Unicode. |
python3 |
Genera igualmente la salida como una lista, y al hacerlo tiene en cuenta los cambios en el tipo de datos, por ejemplo, la conversión automática del texto a Unicode. |
json |
La salida se generará como una lista, pero sólo se utilizará un formato compatible con json. |
CSV |
Formatea la salida conforme a RFC-4180. |
csv |
Ver personalización de |
Por favor, no confundas el CSV Format
con el csv
-salida de Livestatus que se utiliza si no se ha especificado ningún formato de salida. Por tanto, es absolutamente esencial una codificación correcta de mayúsculas/minúsculas. Para la personalización, especifica al final OutputFormat
en lugar de Separator
:
OMD[mysite]:~$ lq
GET services
Columns: host_name description state
Filter: description ~ Filesystem
OutputFormat: json
[["myserver123","Filesystem /opt",0]
["myserver123","Filesystem /var/some/path",1]
["myserver123","Filesystem /home",0]]
5. Recuperar estadísticas (Estadísticas)
5.1. Introducción
Habrá situaciones en las que no te interese el estado de un único servicio o grupo de servicios. Mucho más importante es el número de servicios con un estado WARN actual, o el número de bases de datos monitorizadas. Livestatus puede generar y dar salida a estadísticas con Stats
.
5.2. Números
Overview recibe sus datos recuperando estadísticas de host, servicios y eventos a través de Livestatus y mostrándolas en la interfaz de Checkmk. Con el acceso directo a Livestatus puedes elaborar tu propio resumen:
OMD[mysite]:~$ lq
GET services
Stats: state = 0
Stats: state = 1
Stats: state = 2
Stats: state = 3
34506;124;54;20
Por cierto, estas estadísticas se pueden combinar con todos los filtros.
5.3. Agrupación
Las estadísticas también se pueden combinar con and/or
. Las cabeceras se llaman entonces StatsAnd
o StatsOr
. Utiliza StatsNegate
si la salida debe ser inversa. En el ejemplo se mostrará el número total de hosts (el Stats
inicial), y además se incluirá el recuento de hosts marcados como stale
y que tampoco aparecen en una lista de tiempo de mantenimiento (las estadísticas 2 y 3 están enlazadas con un "Y" lógico):
OMD[mysite]:~$ lq
GET hosts
Stats: state >= 0
Stats: staleness >= 3
Stats: scheduled_downtime_depth = 0
StatsAnd: 2
734;23
No te confundas con las distintas opciones para combinar los resultados de los filtros y las estadísticas. Mientras que todos los host que cumplan las condiciones se mostrarán utilizando la cabeceraFilter
la salida será la suma de las veces que se aplique el filtro Stats
.
5.4. Mínimo, máximo, media, etc.
También es posible realizar cálculos sobre valores y, por ejemplo, mostrar un valor medio o un valor máximo. Aquí encontrarás una lista completa de todos los operadores posibles.
En el siguiente ejemplo, la salida listará los tiempos medio, mínimo y máximo que requieren los plugins de check plugin de un host para calcular un estado:
OMD[mysite]:~$ lq
GET services
Filter: host_name = myserver123
Stats: avg execution_time
Stats: max execution_time
Stats: min execution_time
0.0107628;0.452087;0.008593
Los cálculos con métricas se gestionan de una forma un tanto especial. Aquí también se pueden utilizar todas las funciones de encabezado Stats
. Sin embargo, se aplican individualmente a todas las métricas de un servicio. Por ejemplo, en el siguiente ejemplo se sumarán las métricas de la carga de CPU de un grupo del host:
OMD[mysite]:~$ lq
GET services
Filter: description ~ CPU utilization
Filter: host_groups >= cluster_a
Stats: sum perf_data
guest=0.000000 steal=0.000000 system=34.515000 user=98.209000 wait=23.008000
6. Limitar una salida (Límite)
Se puede limitar intencionadamente el número de líneas de una salida. Esto puede ser útil si, por ejemplo, sólo deseas ver si puedes obtener algún tipo de respuesta a una consulta de Livestatus, pero quieres evitar obtener una salida de varias páginas:
OMD[mysite]:~$ lq "GET hosts\nColumns: name\nLimit: 3"
myserver123
myserver234
myserver345
Ten en cuenta que este límite también funciona cuando se combina con otras cabeceras. Si, por ejemplo, con Stat
cuentas cuántos host tienen un estado UP, y limitas la salida a 10, sólo se tendrán en cuenta los 10 primeros host.
7. Límites de tiempo (Límite de tiempo)
No sólo se puede restringir el recuento de líneas que se van a mostrar: también se puede limitar el tiempo máximo que se permite que se ejecute una consulta. Esta opción puede evitar que una consulta Livestatus bloquee una conexión para siempre si se cuelga por algún motivo. La restricción de tiempo especifica un tiempo máximo en segundos que se permite procesar a una consulta:
OMD[mysite]:~$ lq "GET hosts\nTimelimit: 1"
8. Activar cabeceras de columna (ColumnHeaders)
Con ColumnHeaders
se pueden añadir a la salida los nombres de las columnas, que normalmente se suprimen para facilitar el proceso posterior:
OMD[mysite]:~$ lq "GET hosts\nColumns name address groups\nColumnHeaders: on"
name;address;groups
myserver123;192.168.0.42;cluster_a,headnode
myserver234;192.168.0.43;cluster_a
myserver345;192.168.0.44;cluster_a
9. Autorizaciones (AuthUser)
Si quieres que los scripts estén disponibles en función del Livestatus, probablemente el usuario sólo debería ver los datos para los que está autorizado. Checkmk proporciona la cabecera AuthUser
para esta función, con la restricción de que no puede utilizarse en las siguientes tablas:
columns
commands
contacts
contactgroups
eventconsolerules
eventconsolestatus
status
timeperiods
Por el contrario, esta cabecera puede utilizarse en todas las tablas que accedan a las tablas hosts
o services
. Para cuál de ellas está autorizado un usuario depende de los grupos de contacto del usuario.
De este modo, una consulta sólo mostrará los datos que el contacto también está autorizado a ver. Ten en cuenta aquí la diferencia entre las configuraciones de permisos de strict
y loose
:
OMD[mysite]:~$ lq "GET services\nColumns: host_name description contacts\nAuthUser: hhirsch"
myserver123;Uptime;hhirsch
myserver123;TCP Connections;hhirsch
myserver123;CPU utilization;hhrisch,kkleber
myserver123;File /etc/resolv.conf;hhirsch
myserver123;Kernel Context Switches;hhrisch,kkleber
myserver123;File /etc/passwd;hhirsch
myserver123;Filesystem /home;hhirsch
myserver123;Kernel Major Page Faults;hhrisch
myserver123;Kernel Process Creations;hhirsch
myserver123;CPU load;hhrisch,kkleber
10. Retrasos temporales (Espera)
Con la cabecera Espera puedes crear consultas para conjuntos de datos concretos sin necesidad de saber si se han cumplido los requisitos previos para los datos. Esto puede ser útil cuando, por ejemplo, necesites datos de comparación para una situación de error concreta, pero no quieras someter al sistema a una carga continua e innecesaria. Así, la información sólo se recuperará cuando sea realmente necesaria.
Puedes encontrar una lista completa de las cabeceras de espera aquí.
En el siguiente ejemplo se mostrará el servicio Disk IO SUMMARY de un servidor ESXi, tan pronto como el estado del servicio CPU load cambie a CRIT de una determinada máquina virtual. Con la cabecera WaitTimeout
, la consulta se ejecutará si la condición no se ha cumplido al cabo de 10000 milisegundos, lo que evita que la conexión Livestatus se bloquee durante mucho tiempo:
OMD[mysite]:~$ lq
GET services
WaitObject: myvmserver CPU load
WaitCondition: state = 2
WaitTrigger: state
WaitTimeout: 10000
Filter: host_name = myesxserver
Filter: description = Disk IO SUMMARY
Columns: host_name description plugin_output
myesxserver;Disk IO SUMMARY;OK - Read: 48.00 kB/s, Write: 454.54 MB/s, Latency: 1.00 ms
Otra aplicación es combinar esto con un comando. Puedes emitir un comando y recuperar los resultados en cuanto estén disponibles. En el siguiente ejemplo queremos consultar y mostrar los datos actuales de un servicio. Para ello, primero se enviará el comando y, a continuación, se emitirá una consulta. Esto comprueba si los datos del servicio Check_MK son más recientes que los de un momento determinado. En cuanto se cumpla la condición previa, se mostrará el estado del servicio Memory.
OMD[mysite]:~$ lq "COMMAND [$(date +%s)] SCHEDULE_FORCED_SVC_CHECK;myserver;Check_MK;$(date
+%s)"
OMD[mysite]:~$ lq
GET services
WaitObject: myserver Check_MK
WaitCondition: last_check >= 1517914646
WaitTrigger: check
Filter: host_name = myserver
Filter: description = Memory
Columns: host_name description state
myserver;Memory;0
Importante: Ten en cuenta que la marca de tiempo utilizada en last_check
en el ejemplo DEBE sustituirse por otra adecuada; de lo contrario, la condición se cumplirá siempre y la salida se producirá inmediatamente.
11. Zonas horarias (Localtime)
Muchos entornos de monitorización consultan host y servicios a nivel global. En estos casos, puede darse rápidamente una situación de instancias de monitorización distribuidas que trabajen en diferentes zonas horarias. Como Checkmk utiliza la Hora Unix -que es independiente de las zonas horarias- esto no debería ser un problema.
Si, a pesar de todo, se asigna a un servidor una zona horaria incorrecta, esta diferencia puede compensarse con la cabecera Localtime
. Proporciona también la hora actual a la consulta. Checkmk redondeará de forma autónoma a la siguiente media hora y ajustará la diferencia. Puedes proporcionar la hora automáticamente si invocas la consulta directamente:
OMD[mysite]:~$ lq "GET hosts\nColumns: name last_check\nFilter: name = myserver123\nLocaltime: $(date +%s)"
myserver123;1511173526
De lo contrario, proporciona el resultado de date +%s
si quieres utilizar el flujo de entrada:
OMD[mysite]:~$ lq
GET hosts
Columns: name last_check
Filter: name = myserver123
Localtime: 1511173390
myserver123;Memory;1511173526
12. Códigos de estado (ResponseHeader)
Si escribes una API, probablemente querrás recibir un código de estado como respuesta, para poder procesar mejor la salida. La cabecera ResponseHeader
admite los valores off
(Estándar) y fixed16
, y con ellos proporciona un mensaje de estado de exactamente 16 bytes de longitud en la primera línea de la respuesta. En caso de error, las líneas siguientes contendrán una descripción completa del código de error. Por tanto, también son muy útiles para buscar el error en los resultados de la consulta.
El informe de estado de la primera línea combina lo siguiente:
Bytes 1-3: El código de estado. La tabla completa de códigos posibles se encuentra aquí.
Byte 4: Un simple espacio en blanco (carácter ASCII: 32)
Bytes 5-15: La longitud de la respuesta real como número entero. Los bytes innecesarios se rellenan con caracteres en blanco.
Byte 16: Un salto de línea (carácter ASCII: 10)
En el siguiente ejemplo ejecutaremos una consulta defectuosa en la que, de hecho, se codifica erróneamente un filtro con un nombre de columna.
OMD[mysite]:~$ lq "GET hosts\nName: myserver123\nResponseHeader: fixed16"
400 33
Columns: undefined request header
Importante: En una situación de error, el formato de salidaes siempre un mensaje de error en forma de texto, independientemente de las adaptaciones que hayas realizado.
13. Mantener viva una conexión (KeepAlive)
Especialmente con los scripts que establecen una conexión Livestatus a través de lared, es posible que quieras mantener abierto el canal para ahorrarte la sobrecarga generada al establecer repetidamente la conexión. Puedes conseguirlo con la cabecera KeepAlive
, y de este modo podrás reservar un canal. Por cierto: tras un comando, una conexión Livestatus siempre permanece abierta. No es necesario introducir ninguna cabecera adicional para ello.
Importante: Dado que el canal está bloqueado para otros procesos mientras dura la conexión, puede convertirse en un problema si no hay otras conexiones disponibles para su uso. Por lo tanto, otros procesos deben esperar hasta que haya una conexión libre. En la configuración estándar, Checkmk mantiene 20 conexiones preparadas - aumenta el número máximo de estas conexiones según sea necesario conSetup > General > Global Settings > Monitoring Core > Maximum concurrent Livestatus connections.
Combina siempre KeepAlive
con Response header
para poder distinguir correctamente las respuestas individuales entre sí:
OMD[mysite]:~$ lq
GET hosts
ResponseHeader: fixed16
Columns: name
KeepAlive: on
200 33
myserver123
myserver234
myserver345
GET services
ResponseHeader: fixed16
Columns: host_name description last_check
Filter: description = Memory
200 58
myserver123;Memory;1511261122
myserver234;Memory;1511261183
Asegúrate de que no haya una línea vacía entre la primera respuesta y la segunda solicitud. En cuanto se omita una cabecera de una consulta, tras la siguiente salida la conexión se cerrará como de costumbre por la línea en blanco.
14. Recuperación de registros
14.1. Vista general
Con la tabla log
de Livestatus tienes un acceso directo al historial de monitorización del núcleo, de modo que utilizando el LQL puedes filtrar convenientemente por eventos concretos. Las tablas de disponibilidad, por ejemplo, se generarán con la ayuda de estas tablas. Para mejorar la visión general y restringir una consulta temáticamente, tienes acceso a las siguientes clases de registro:
Clase | Descripción |
---|---|
0 |
Todos los mensajes no cubiertos por otras clases |
1 |
Alertas de host y servicio |
2 |
Eventos importantes del programa |
3 |
Notificaciones |
4 |
Chequeos pasivos |
5 |
Comandos externos |
6 |
Entradas de estado inicial o actual (por ejemplo, después de una rotación del registro) |
7 |
Cambios en el estado del programa |
Con sólo utilizar estas clases de registro ya puedes restringir muy bien qué tipo de entrada debe mostrarse. Además, se restringirá el intervalo de tiempo que se tiene en cuenta en la consulta, lo cual es importante porque, de lo contrario, se buscará en todo el historial de la instancia, lo que lógicamente podría suponer un fuerte freno para el sistema debido a la avalancha de información.
Otra restricción sensata de la salida son los (Columns
) que se mostrarán para una entrada. En el ejemplo siguiente buscaremos todas las notificaciones que se hayan registrado en la última hora:
OMD[mysite]:~$ lq "GET log\nFilter: class = 3\nFilter: time >= $$(date +%s)-3600\nColumns: host_name service_description time state"
myserver123;Memory;1511343365;0
myserver234;CPU load;1511343360;3
myserver123;Memory;1511343338;2
myserver234;CPU load;1511342512;0
Importante: Asegúrate de que en el modo interactivo del flujo de entrada no se puede utilizar ninguna de las variables utilizadas en el ejemplo, y restringe siempre las consultas a un intervalo de tiempo.
14.2. Configurar el historial de monitorización
Es posible influir en la rotación de los archivos y en sus tamaños máximos. Además, puedes especificar cuántas líneas de un archivo deben leerse antes de que Checkmk interrumpa. Todo esto puede afectar al rendimiento de tus consultas, dependiendo de la construcción de la instancia. Dispones de los tres parámetros siguientes, que puedes encontrar y personalizar en Setup > General > Global Settings > Monitoring Core:
Nombre | Descripción |
---|---|
History log rotation: Regular interval of rotations |
Aquí se puede definir dentro de qué intervalo de tiempo debe continuar el historial en un nuevo archivo. |
History log rotation: Rotate by size (Limit of the size) |
Independientemente del intervalo de tiempo, aquí se define el tamaño máximo de un fichero. El tamaño representa un compromiso entre la velocidad de lectura posible y las IOs posibles. |
Maximum number of parsed lines per log file |
Cuando se haya leído el número de líneas especificado, se detendrá la lectura del fichero. De este modo se evitan los tiempos muertos si, por cualquier motivo, el archivo se hace muy grande. |
15. Comprobar la disponibilidad
Con la tabla statehist
puedes consultar los datos brutos sobre la disponibilidad de host y servicios, y por tanto tener acceso a toda la información que utiliza la pantalla de disponibilidad de la interfaz. Introduce siempre un intervalo de tiempo, de lo contrario se buscará en todos los registros disponibles, lo que puede suponer una gran carga para el sistema. También se aplican las siguientes especificaciones adicionales:
El intervalo de tiempo en el que un host/servicio tuvo un estado determinado puede indicarse como valor absoluto y como hora Unix, y también como valor relativo y como porcentaje del intervalo de tiempo consultado.
Cuando no se haya monitorizado un host/servicio, el estado será
-1
.
Checkmk permite comprobar si un host/servicio ha sido monitorizado, cuándo y durante cuánto tiempo, mediante el registro del estado inicial. Así, no sólo puedes ver qué estado existía en un momento determinado, sino que también puedes comprobar si realmente estaba siendo monitorizado en ese momento. Importante: Este registro también está activo con un Nagios-Core. Sin embargo, aquí se puede desactivar:
log_initial_states=0
En el ejemplo siguiente se puede ver cómo queda la consulta de un porcentaje de asignación, y los tiempos absolutos para un estado concreto. Se han especificado las últimas 24 horas como intervalo de tiempo, y la consulta restringida a la disponibilidad de un servicio en un host concreto:
OMD[mysite]:~$ lq
GET statehist
Columns: host_name service_description
Filter: time >= 1511421739
Filter: time < 1511436139
Filter: host_name = myserver123
Filter: service_description = Memory
Stats: sum duration_ok
Stats: sum duration_warning
Stats: sum duration_critical
Stats: sum duration_part_ok
Stats: sum duration_part_warning
Stats: sum duration_part_critical
myserver123;Memory;893;0;9299;0.0620139;0;0.645764
En la Referencia de comandos se explica con más detalle cómo se puede obtener una lista completa de las columnas disponibles.
16. Variables en Livestatus
En varios lugares de la interfaz Checkmk puedes utilizar variables para hacer asignaciones basadas en el contexto. Algunos de estos datos también se pueden recuperar a través del Livestatus. Como estas variables también deben resolverse, las disponibilidades de estas columnas se duplican en una tabla: una como entrada literal y otra en la que se ha sustituido la variable por el valor apropiado. Un ejemplo de ello es la columna notes_url
, que muestra una URL con la variable:
OMD[mysite]:~$ lq "GET hosts\nColumns: name notes_url"
myserver123;https://mymonitoring/heute/wiki/doku.php?id=hosts:$HOSTNAME$
Sin embargo, si en lugar de esto consultas la columna note_url_expanded
, recibirás el valor real de la macro:
OMD[mysite]:~$ lq "GET hosts\nColumns: name notes_url_expanded"
myserver123;https://mymonitoring/heute/wiki/doku.php?id=hosts:myserver123
17. Usar Livestatus a través de una red
17.1. Conexiones a través de TCP/IP
Para acceder a Livestatus a través de la red, puedes conectar el socket Unix del proceso de estado en vivo a un puerto TCP. De esta forma puedes ejecutar scripts en máquinas remotas y recoger los datos directamente desde donde deben ser procesados.
Cuando un site está apagado, se puede habilitar el acceso vía TCP con el comandoomd
:
OMD[mysite]:~$ omd config set LIVESTATUS_TCP on
Una vez iniciado el site, Livestatus vía TCP suele estar activo en el puerto por defecto 6557. Para servidores Checkmk con múltiples sites que utilicen Livestatus vía TCP, se elige el siguiente puerto superior no utilizado.
Todos los ajustes, como el puerto y las direcciones IP autorizadas, pueden configurarse a través de omd config
. Alternativamente, estos ajustes pueden hacerse en la configuración. En Checkmk, la encriptación SSL de la comunicación Livestatus está activada por defecto:

Prueba de conexión SSL local
Livestatus utiliza un certificado que se genera automáticamente al crear el site. Este certificado se encuentra en el archivo var/ssl/ca-certificates.crt
junto con todos los demás certificados de CA en los que confía el site. Para que la herramienta de línea de comandos openssl s_client
pueda validar el certificado utilizado por el servidor de Livestatus, este archivo debe designarse como Archivo de Autoridad de Certificación.
Aquí hemos acortado enormemente la salida de la llamada al comando, […]
muestra las omisiones:
OMD[mysite]:~$ openssl s_client -CAfile var/ssl/ca-certificates.crt -connect localhost:6557
CONNECTED(00000003)
Can't use SSL_get_servername
depth=1 CN = Site 'mysite' local CA
verify return:1
depth=0 CN = mysite
verify return:1
---
Certificate chain
0 s:CN = mysite
i:CN = Site 'mysite' local CA
1 s:CN = Site 'mysite' local CA
i:CN = Site 'mysite' local CA
---
Server certificate
[...]
Start Time: 1664965470
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
Max Early Data: 0
---
read R BLOCK
En cuanto no haya más salida, puedes emitir comandos LQL de forma interactiva, y terminar la interacción con una línea vacía (pulsa dos veces la tecla Intro). Si esto funciona, también puedes canalizar las consultas Livestatus, y utilizar el parámetro adicional -quiet
para suprimir la salida de depuración:
OMD[mysite]:~$ echo -e "GET hosts\nColumns: name\n\n" | \
openssl s_client -quiet -CAfile var/ssl/ca-certificates.crt -connect localhost:6557
Can't use SSL_get_servername
depth=1 CN = Site 'mysite' local CA
verify return:1
depth=0 CN = mysite
verify return:1
myserver23
myserver42
myserver123
myserver124
La salida que precede a los cuatro nombres del host se escribe en STDERR mediante el comando openssl
. Puede suprimirse añadiendo 2>/dev/null
.
Acceso remoto a Livestatus
Si accedes a Livestatus desde máquinas remotas, no debes utilizar toda la lista de certificados en los que confía el site Checkmk de esas máquinas. En su lugar, lee el certificado de la CA del site sólo desde la configuración.
Para ello, ve a Global Settings > Site management > Trusted certificate authorities for SSL. Aquí puedes copiar y pegar el certificado utilizado por la CA del sitio. Copia el texto completo del primer certificado en Content of CRT/PEM file en un archivo - en nuestro ejemplo utilizamos /tmp/mysite_ca.pem
.

Si el host remoto ha sido habilitado para el acceso a Livestatus, las consultas a Livestatus mediante script serán posibles con este archivo de certificado:
user@host:~$ echo -e "GET hosts\nColumns: name\n\n" | \
openssl s_client -quiet -CAfile /tmp/mysite_ca.pem -connect cmkserver:6557
Nota: El archivo de certificado no proporciona autenticación, ¡sólo garantiza la encriptación del transporte! La protección del acceso se regula exclusivamente a través de las direcciones IP autorizadas para acceder al puerto de Livestatus.
Livestatus con stunnel
Si quieres que el puerto remoto encriptado de Livestatus esté disponible como puerto local no encriptado, puedes utilizar el programa stunnel.
[pinning client]
client = yes
accept = 0.0.0.0:6557
connect = <myremotesiteip>:6557
verifyPeer = yes
CAfile = /etc/stunnel/myremotesite.pem
Tras reiniciar stunnel, el acceso no cifrado al puerto local es posible.
user@host:~$ echo -e "GET hosts\nColumns: name\n\n" | nc localhost 6557
SSL en scripts
Si quieres utilizar scripts para acceder a Livestatus a través de SSL, evita utilizar openssl s_client
. El objetivo principal de esta herramienta es probar el establecimiento de la conexión y depurar las cadenas de certificados. Para ver si la salida esperada está completa en caso de fallo de la conexión, te recomendamos que evalúes la cabecera de respuesta. Una API bien mantenida que admite SSL y la evaluación de cabeceras es la de Python, que puedes encontrar en share/doc/check_mk/livestatus/api/python
. En el capítulo Archivos y directorios se enumeran otras API adecuadas.
17.2. Conexiones vía SSH
Si es necesario acceder a Livestatus desde fuera de tu red local, la protección de acceso basada sólo en direcciones IP puede no ser práctica. La forma más sencilla de obtener acceso autentificado en este caso es utilizar el Secure Shell.
Con SSH, tienes la posibilidad de pasar un comando que se ejecutará en el servidor remoto:
user@host:~$ ssh mysite@myserver 'lq "GET hosts\nColumns: name"'
myserver123
myserver234
Alternativamente, puedes reenviar el puerto de Livestatus al host en el que estés trabajando a través de un túnel SSH:
user@host:~$ ssh -L 6557:localhost:6557 mysite@myserver
Si se ha establecido la conexión, en una segunda sesión de consola puedes probar si es posible el acceso con openssl s_client
:
user@host:~$ openssl s_client -CAfile /tmp/mysite_ca.pem -connect localhost:6557
Si esta prueba tiene éxito, cualquier script que hayas escrito para el acceso directo a la red Livestatus puede utilizarse en localhost
.
18. Comandos de ajuste
18.1. Vista general
Livestatus no sólo se puede utilizar para consultar datos, sino también para emitir comandos directamente al núcleo (CMC o Nagios). Un comando correcto siempre incluye una marca de tiempo, que puede ser cualquier cosa que se desee. Sin embargo, como se utilizará también en los Registros para hacer un seguimiento de la hora del proceso, es conveniente introducir la hora con la mayor precisión posible. Los comandos a los que les falte una marca de tiempo se descartarán, sin emitir un mensaje de error y con una simple entrada en el campo cmc.log
¡!
Para que la marca de tiempo sea lo más precisa posible, se recomienda no establecer el comando en el flujo de entrada, sino emitirlo directamente. En tal situación también se tiene acceso a variables y se puede proporcionar la hora actual real:
OMD[mysite]:~$ lq "COMMAND [$(date +%s)] DISABLE_NOTIFICATIONS"
Este formato funciona tanto con el Nagios-Core en Checkmk edición Raw como con la CMC en las ediciones comerciales. Sin embargo, en los dos núcleos los comandos sólo se solapan parcialmente. Puedes encontrar una lista completa de los comandos para el Nagios-Core directamente en el sitio webde Nagios. Los comandos disponibles para la CMC se encuentran en laReferencia de comandos.
18.2. Características especiales de Nagios
En la lista de comandos, la sintaxis es la siguiente:
#!/bin/sh
# This is a sample shell script showing how you can submit the CHANGE_CUSTOM_HOST_VAR command
# to Nagios. Adjust variables to fit your environment as necessary.
now=`date +%s`
commandfile='/usr/local/nagios/var/rw/nagios.cmd'
/bin/printf "[%lu] CHANGE_CUSTOM_HOST_VAR;host1;_SOMEVAR;SOMEVALUE\n" $now > $commandfile
Como has aprendido, Checkmk utiliza un formato mucho más sencillo para emitir comandos. Para que el formato de Nagios sea compatible con Checkmk, sólo necesitas el comando, la marca de tiempo y, si procede, las variables:
OMD[mysite]:~$ lq "COMMAND [$(date +%s)] CHANGE_CUSTOM_HOST_VAR;host1;_SOMEVAR;SOMEVALUE"
19. Archivos y directorios
Ruta | Función |
---|---|
|
El socket Unix a través del cual se envían las consultas y los comandos. |
|
El comando script para simplificar la emisión de consultas y comandos al socket Unix en el Livestatus. |
|
El archivo de registro de la CMC, en el que, junto con otros datos, se documentan las consultas/comandos. |
|
El archivo de registro de la CMC, en el que se introducen todos los cambios que se producen durante el tiempo de ejecución del núcleo - por ejemplo, cambios en el estado de un host/servicio. |
|
Los archivos de registro de |
|
El archivo de registro de Nagios-Core, en el que junto con otros datos se documentan las consultas/comandos. |
|
Los archivos de registro de |
|
En este directorio puedes encontrar una serie de ejemplos de consultas Livestatus que puedes probar. Los ejemplos se basan en el comando script |
|
la API para Python está en este directorio, así como una serie de ejemplos. Lee también |
|
La API para Perl se encuentra aquí. Aquí también hay un |
|
También hay códigos de ejemplo para el lenguaje de programación C++. El código de la propia API también se encuentra sin compilar aquí, para que tengas la mejor visión de la funcionalidad de la API. |