Sistema

Consultar información del sistema en tiempo de ejecución incluyendo uso de memoria, estadísticas de recolección de basura, detalles de CPU y metadatos de proceso.

Carga

local system = require("system")

Apagado

Desencadenar el apagado del sistema con código de salida. Útil para aplicaciones de terminal; llamar desde actores en ejecución terminará todo el sistema:

local ok, err = system.exit(0)
Parámetro Tipo Descripción
code integer Código de salida (0 = éxito), por defecto 0

Devuelve: boolean, error

Listar Módulos

Obtener todos los módulos Lua cargados con metadatos:

local mods, err = system.modules()

Devuelve: table[], error

Cada tabla de módulo contiene:

Campo Tipo Descripción
name string Nombre del módulo
description string Descripción del módulo
class string[] Etiquetas de clasificación del módulo

Estadísticas de Memoria

Obtener estadísticas detalladas de memoria:

local stats, err = system.memory.stats()

Devuelve: table, error

La tabla de estadísticas contiene:

Campo Tipo Descripción
alloc number Bytes asignados y en uso
total_alloc number Bytes asignados acumulativos
sys number Bytes obtenidos del sistema
heap_alloc number Bytes asignados en el heap
heap_sys number Bytes obtenidos para el heap del sistema
heap_idle number Bytes en spans inactivos
heap_in_use number Bytes en spans no inactivos
heap_released number Bytes liberados al SO
heap_objects number Número de objetos de heap asignados
stack_in_use number Bytes usados por el asignador de pila
stack_sys number Bytes obtenidos para la pila del sistema
mspan_in_use number Bytes de estructuras mspan en uso
mspan_sys number Bytes obtenidos para mspan del sistema
num_gc number Número de ciclos GC completados
next_gc number Tamaño objetivo del heap para el próximo GC

Asignación Actual

Obtener los bytes actualmente asignados:

local bytes, err = system.memory.allocated()

Devuelve: number, error

Objetos del Heap

Obtener el número de objetos de heap asignados:

local count, err = system.memory.heap_objects()

Devuelve: number, error

Límite de Memoria

Establecer el límite de memoria (devuelve el valor anterior):

local prev, err = system.memory.set_limit(1024 * 1024 * 100)
Parámetro Tipo Descripción
limit integer Límite de memoria en bytes, -1 para ilimitado

Devuelve: number, error

Obtener el límite de memoria actual:

local limit, err = system.memory.get_limit()

Devuelve: number, error

Forzar GC

Forzar la recolección de basura:

local ok, err = system.gc.collect()

Devuelve: boolean, error

Porcentaje Objetivo del GC

Establecer el porcentaje objetivo del GC (devuelve el valor anterior). Un valor de 100 significa que el GC se activa cuando el heap se duplica:

local prev, err = system.gc.set_percent(200)
Parámetro Tipo Descripción
percent integer Porcentaje objetivo del GC

Devuelve: number, error

Obtener el porcentaje objetivo del GC actual:

local percent, err = system.gc.get_percent()

Devuelve: number, error

Recuento de Goroutines

Obtener el número de goroutines activas:

local count, err = system.runtime.goroutines()

Devuelve: number, error

GOMAXPROCS

Obtener o establecer el valor de GOMAXPROCS:

-- Obtener valor actual
local current, err = system.runtime.max_procs()

-- Establecer nuevo valor
local prev, err = system.runtime.max_procs(4)
Parámetro Tipo Descripción
n integer Si se proporciona, establece GOMAXPROCS (debe ser > 0)

Devuelve: number, error

Recuento de CPUs

Obtener el número de CPUs lógicas:

local cpus, err = system.runtime.cpu_count()

Devuelve: number, error

ID de Proceso

Obtener el ID del proceso actual:

local pid, err = system.process.pid()

Devuelve: number, error

Hostname

Obtener el hostname del sistema:

local hostname, err = system.process.hostname()

Devuelve: string, error

Directorio de Trabajo

Obtener el directorio de trabajo actual del runtime:

local dir, err = system.process.cwd()

Devuelve: string, error

Hosts de Proceso

Listar todos los hosts de proceso con estadísticas de workers y colas:

local hosts, err = system.hosts.list()

Devuelve: table[], error

Cada tabla de host contiene:

Campo Tipo Descripción
id string ID de registro del host
workers number Tamaño del pool de workers
processes number Procesos activos en este host
executed number Total de pasos ejecutados
stolen number Pasos robados de otros hosts
queue_depth number Elementos pendientes en la cola del host

Listar procesos ejecutándose en un host específico:

local procs, err = system.hosts.processes("app:host")
Parámetro Tipo Descripción
host_id string ID de registro del host

Devuelve: table[], error

Cada tabla de proceso contiene:

Campo Tipo Descripción
pid string ID del proceso
host string ID del host
source string ID de entrada de origen
state string Estado del proceso
steps number Pasos ejecutados
started_at number Timestamp de inicio (nanosegundos)
parent string PID padre (omitido si no hay)
actor_id string ID del actor (omitido si no hay)
stats table Estadísticas específicas del proceso (opcional)

Estado del Servicio

Obtener el estado de un servicio supervisado específico:

local state, err = system.supervisor.state("namespace:service")
Parámetro Tipo Descripción
service_id string ID del servicio (ej., "namespace:service")

Devuelve: table, error

La tabla de estado contiene:

Campo Tipo Descripción
id string ID del servicio
status string Estado actual
desired string Estado deseado
retry_count number Número de reintentos
last_update number Timestamp de última actualización (nanosegundos)
started_at number Timestamp de inicio (nanosegundos)
details string Detalles opcionales (formateados)

Todos los Estados de Servicios

Obtener los estados de todos los servicios supervisados:

local states, err = system.supervisor.states()

Devuelve: table[], error

Cada tabla de estado tiene el mismo formato que system.supervisor.state().

Primitivas del Cluster

Las sub-tablas system.node, system.cluster, system.raft y system.lock exponen la capa de clustering. Son más útiles cuando el clustering está habilitado; en un nodo independiente degradan de forma predecible — system.raft.* reporta "raft not available", system.cluster reporta solo el nodo local, y system.lock requiere el registro global que proporciona el clustering.

Todas las llamadas de lectura son locales y baratas: reportan la vista de este nodo del estado confirmado, sin bloquear nunca en la red.

Identidad del nodo

system.node reporta la propia identidad de este nodo en el cluster.

local id, err = system.node.id()      -- ID de este nodo
local addr, err = system.node.addr()  -- dirección de red anunciada
local role, err = system.node.role()  -- "leader" | "voter" | "standby" | "non-member"
Función Devuelve Notas
system.node.id() string, error ID del nodo desde el contexto de relay
system.node.addr() string, error Dirección anunciada (ej. 10.0.0.1:7946); error si la membresía no está disponible
system.node.role() string, error Rol Raft de este nodo; devuelve "non-member" (sin error) cuando Raft no está ejecutándose

Permiso: system.read sobre node.

Membresía del cluster

system.cluster reporta la vista a nivel de cluster: quiénes son los miembros y quién lidera.

local members, err = system.cluster.members()  -- array de tablas de nodo
local leader, err = system.cluster.leader()    -- ID del nodo líder, o "" si desconocido
local n, err = system.cluster.size()           -- recuento de miembros visibles

system.cluster.members() devuelve un array de tablas de nodo. El nodo local se incluye una vez y aparece primero.

Campo Tipo Descripción
id string ID del nodo
is_local boolean True para el nodo que llama
addr string Dirección anunciada (omitida cuando se desconoce)
meta table Metadatos de gossip string-a-string (omitidos cuando no hay)
Función Devuelve Notas
system.cluster.members() table[], error Error si no se puede alcanzar información de membresía
system.cluster.leader() string, error ID del líder Raft actual; "" (sin error) cuando el líder es desconocido o Raft está ausente
system.cluster.size() number, error Recuento de miembros visibles; 0 cuando no hay info de membresía disponible

Permiso: system.read sobre cluster.

Estado de Raft

system.raft lee la vista local de este nodo del núcleo de consenso Raft. Cada función devuelve nil, error ("raft not available") cuando Raft no está ejecutándose en este nodo.

local leader, err = system.raft.is_leader()      -- boolean
local member, err = system.raft.is_member()      -- boolean: voter o standby
local role, err = system.raft.role()             -- mismos valores que system.node.role()
local term, err = system.raft.term()             -- término Raft actual
local idx, err = system.raft.commit_index()      -- índice de log confirmado más alto
local stats, err = system.raft.stats()           -- mapa de estadísticas raw (string -> string)
Función Devuelve Notas
system.raft.is_leader() boolean, error True si y solo si este nodo es el líder actual
system.raft.is_member() boolean, error True si este nodo es un voter o standby en la configuración confirmada
system.raft.role() string, error "leader" / "voter" / "standby" / "non-member"
system.raft.term() number, error Término actual; 0 si no disponible desde las estadísticas
system.raft.commit_index() number, error Índice de log confirmado más alto en este nodo
system.raft.stats() table, error Mapa de estadísticas raw completo; claves y valores son strings

Permiso: system.read sobre raft, excepto system.raft.stats() que requiere system.read sobre raft_stats.

Bloqueos distribuidos

system.lock proporciona exclusión mutua a nivel de cluster. Un bloqueo es un nombre globalmente único propiedad del proceso que llama. Está construido sobre el ámbito de nombre Strong, por lo que puede existir como máximo un titular en todo el cluster, y el bloqueo se libera automáticamente cuando el proceso titular sale o su nodo se va — no hay bloqueo atascado que limpiar.

local ok, err = system.lock.acquire("orders.migration")
if ok then
  -- sección crítica: solo un titular en todo el cluster
  system.lock.release("orders.migration")
end

Acquire es fail-fast: si el bloqueo ya está tomado devuelve false inmediatamente en lugar de bloquear, por lo que los callers implementan su propio retry y backoff. Solo el titular actual puede liberar; liberar un bloqueo que no se posee es un no-op seguro.

Función Devuelve Resultados
system.lock.acquire(name) boolean, error true, nil adquirido; false, error ya tomado (tipo errors.ALREADY_EXISTS); nil, error en fallo
system.lock.release(name) boolean, error true, nil liberado; false, nil no poseído o poseído por otro proceso; nil, error en fallo
Parámetro Tipo Descripción
name string Nombre del bloqueo a nivel de cluster

Permiso: system.lock sobre el name del bloqueo (de modo que la política puede restringir qué nombres puede bloquear un caller).

Permisos

Las operaciones del sistema están sujetas a evaluación de política de seguridad.

Acción Recurso Descripción
system.read memory Leer estadísticas de memoria
system.read memory_limit Leer límite de memoria
system.control memory_limit Establecer límite de memoria
system.read gc_percent Leer porcentaje del GC
system.gc gc Forzar recolección de basura
system.gc gc_percent Establecer porcentaje del GC
system.read goroutines Leer recuento de goroutines
system.read gomaxprocs Leer GOMAXPROCS
system.control gomaxprocs Establecer GOMAXPROCS
system.read cpu Leer recuento de CPUs
system.read pid Leer ID del proceso
system.read hostname Leer hostname
system.read cwd Leer directorio de trabajo
system.read hosts Listar hosts / procesos del host
system.read modules Listar módulos cargados
system.read supervisor Leer estado del supervisor
system.read node Leer identidad de este nodo
system.read cluster Leer membresía del cluster y líder
system.read raft Leer estado de Raft
system.read raft_stats Leer el mapa de estadísticas raw de Raft
system.lock <nombre del bloqueo> Adquirir o liberar un bloqueo distribuido
system.exit - Desencadenar apagado del sistema

Errores

Condición Tipo Reintentable
Permiso denegado errors.INVALID no
Argumento inválido errors.INVALID no
Argumento requerido faltante errors.INVALID no
Gestor de código no disponible errors.INTERNAL no
Info de servicio no disponible errors.INTERNAL no
Error del SO (hostname, cwd) errors.INTERNAL no
Raft no ejecutándose en este nodo errors.INTERNAL no
Membresía no disponible errors.INTERNAL no
Bloqueo ya tomado errors.ALREADY_EXISTS no

Consulte Manejo de Errores para trabajar con errores.