Funciones Globales
Esta sección describe las funciones globales disponibles en el entorno Lua de Monsta. Estas son funciones que no pertenecen a módulos específicos, pero están disponibles directamente en el ámbito global de Lua. Existen funcionalidades para control de flujo, manipulación de tiempo, entre otras.
Funciones Disponibles
Sección titulada «Funciones Disponibles»sleep(seconds)
Sección titulada «sleep(seconds)»Descripción: Pausa la ejecución del script durante un número especificado de segundos.
Parámetros:
seconds(número): Número de segundos para pausar la ejecución
Retorno: nil (no devuelve valor)
Ejemplo:
-- Pausar por 5 segundossleep(5)print("Execução retomada após 5 segundos")signal(signal_name)
Sección titulada «signal(signal_name)»Descripción: Señala la finalización de la ejecución del script con un nombre de señal específico.
Parámetros:
signal_name(string): Nombre de la señal a emitir
Retorno: Aborta la ejecución del script con el nombre de la señal
Características:
-
Llama a la función
_execution_donesi está disponible en el entorno global -
Siempre lanza un error, interrumpiendo la ejecución normal
-
Útil para control de flujo y señalización de estados
Nota: Actualmente, esta función tiene un único caso de uso específico: señalizar con el nombre "RepeatPrevValue". Cuando un script emite esta señal, el sistema interpreta que la recolección actual debe repetir el último valor válido de la métrica, en lugar de generar un nuevo punto de datos. Esto es útil en situaciones donde la fuente de datos está temporalmente indisponible o la recolección falló, pero no se desea interrumpir la serie temporal.
Ejemplo de uso específico:
-- Intentar recolectar un valorlocal value, err = collect_metric()if err then -- En caso de fallo, repetir el valor anterior signal("RepeatPrevValue")endwith_timeout(timeout_ms, func, ...)
Sección titulada «with_timeout(timeout_ms, func, ...)»Descripción: Ejecuta una función con un límite de tiempo (timeout).
Parámetros:
-
timeout_ms(número): Tiempo límite en milisegundos -
func(función): Función Lua a ejecutar -
...(opcional): Argumentos para pasar a la función
Retorno: Devuelve el resultado de la función ejecutada
Ejemplo:
-- Ejecutar una función con timeout de 2 segundoslocal result = with_timeout(2000, function() -- Operación que puede tardar return some_long_running_operation()end)
-- Ejecutar con argumentoslocal data = with_timeout(1000, http.get, "https://api.example.com/data")
-- Manejo de timeoutlocal success, result = pcall(function() return with_timeout(500, function() -- Operación que debe completarse rápidamente return critical_operation() end)end)
if not success then print("Operação excedeu o timeout de 500ms")endCaracterísticas:
-
Lanza un error si se excede el timeout
-
Conserva los argumentos pasados a la función
-
Útil para operaciones de red o I/O que pueden bloquearse
Descripción: Devuelve el número de segundos no bisiestos desde el 1 de enero de 1970 00:00:00 UTC (también conocido como “timestamp UNIX”).
Parámetros: Ninguno
Retorno: Número que representa segundos desde la época Unix
Ejemplo:
-- Obtener timestamp actuallocal current_time = now()print("Timestamp atual:", current_time)
-- Calcular duración de operaciónlocal start_time = now()
-- Ejecutar alguna operaciónlocal end_time = now()local duration = end_time - start_timeprint("Operação levou", duration, "segundos")Características:
-
Misma función disponible en
time.now() -
Útil para medición de rendimiento
print(...)
Sección titulada «print(...)»Descripción: Función de impresión que formatea múltiples argumentos.
Parámetros:
...(múltiples valores): Valores a imprimir
Retorno: nil (no devuelve valor)
Ejemplo:
print("Valor:", 42, "Status:", true, "Lista:", {1, 2, 3})Características:
-
Separa múltiples argumentos con tabulación
-
Útil para depuración
diff(lhs, rhs)
Sección titulada «diff(lhs, rhs)»Descripción: Calcula la diferencia entre dos valores numéricos, con tratamiento especial para contadores que pueden sufrir rollover.
Parámetros:
-
lhs(número): Valor actual (left-hand side) -
rhs(número): Valor anterior (right-hand side)
Retorno: Número que representa la diferencia entre los valores
Comportamiento:
-
Calcula
lhs - rhs -
Si el resultado es negativo, emite la señal
"RepeatPrevValue" -
Usado internamente por
snmp.diffywmi.diffpara cálculo de diferencias en contadores -
Útil para métricas de contador que pueden sufrir rollover (como contadores de 32 o 64 bits)
Ejemplo:
-- Calcular la diferencia entre lecturas de contadorlocal current_value = 4294967290 -- Valor actual (cercano al desbordamiento de 32 bits)local previous_value = 4294967280 -- Valor anterior
local difference = diff(current_value, previous_value)-- difference = 10 (4294967290 - 4294967280)
-- Caso con rollover (valor disminuyó)local current_with_rollover = 10 -- Después del rolloverlocal previous_before_rollover = 4294967295 -- Antes del rollover
local rollover_diff = diff(current_with_rollover, previous_before_rollover)-- Emite la señal "RepeatPrevValue" pues 10 - 4294967295 es negativoVariables Globales
Sección titulada «Variables Globales»EXEC_IDENT
Sección titulada «EXEC_IDENT»Descripción: Identificador único de la ejecución actual del script.
Tipo: String
Ejemplo:
-- Usar el identificador en los logsprint("Execução ID:", EXEC_IDENT)
-- Incluir en datos de monitorizaciónlocal metrics = { ident = EXEC_IDENT, timestamp = now(), value = collected_data}
-- Usar como clave para almacenamientostore.put("results_" .. EXEC_IDENT, processing_result)Características:
-
Definida automáticamente por el entorno
-
Única para cada ejecución de script
-
Útil para rastreo y correlación de logs
Limitaciones
Sección titulada «Limitaciones»-
sleepNo es Preciso: Debido a la naturaleza asíncrona del sistema,sleeppuede tener pequeñas variaciones. -
signalInterrumpe Ejecución: Una vez llamada, la ejecución normal se interrumpe.
Ejemplo
Sección titulada «Ejemplo»-- Monitorizar servicio con backoff en caso de fallolocal function monitor_with_backoff(service_url, max_attempts) local attempt = 1 local backoff = 1 -- segundos
while attempt <= max_attempts do log.info("Tentativa", attempt, "de", max_attempts) local success, status = pcall(function() return with_timeout(5000, function() return check_service(service_url) end) end)
if success and status == "healthy" then log.info("Serviço saudável") return true end
-- Incrementar backoff exponencial sleep(backoff) backoff = math.min(backoff * 2, 60) -- Máximo 60 segundos attempt = attempt + 1 end
-- Todos los intentos fallaron return falseend
-- Ejecutar monitorizaciónmonitor_with_backoff("https://api.example.com", 5)