Ir al contenido

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.

local system = require("system")

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ámetroTipoDescripción
codeintegerCódigo de salida (0 = éxito), por defecto 0

Devuelve: boolean, error

Obtener todos los módulos Lua cargados con metadatos:

local mods, err = system.modules()

Devuelve: table[], error

Cada tabla de módulo contiene:

CampoTipoDescripción
namestringNombre del módulo
descriptionstringDescripción del módulo
classstring[]Etiquetas de clasificación del módulo

Obtener estadísticas detalladas de memoria:

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

Devuelve: table, error

La tabla de estadísticas contiene:

CampoTipoDescripción
allocnumberBytes asignados y en uso
total_allocnumberBytes asignados acumulativos
sysnumberBytes obtenidos del sistema
heap_allocnumberBytes asignados en el heap
heap_sysnumberBytes obtenidos para el heap del sistema
heap_idlenumberBytes en spans inactivos
heap_in_usenumberBytes en spans no inactivos
heap_releasednumberBytes liberados al SO
heap_objectsnumberNúmero de objetos de heap asignados
stack_in_usenumberBytes usados por el asignador de pila
stack_sysnumberBytes obtenidos para la pila del sistema
mspan_in_usenumberBytes de estructuras mspan en uso
mspan_sysnumberBytes obtenidos para mspan del sistema
num_gcnumberNúmero de ciclos GC completados
next_gcnumberTamaño objetivo del heap para el próximo GC

Obtener los bytes actualmente asignados:

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

Devuelve: number, error

Obtener el número de objetos de heap asignados:

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

Devuelve: number, error

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

local prev, err = system.memory.set_limit(1024 * 1024 * 100)
ParámetroTipoDescripción
limitintegerLí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 la recolección de basura:

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

Devuelve: boolean, error

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ámetroTipoDescripción
percentintegerPorcentaje objetivo del GC

Devuelve: number, error

Obtener el porcentaje objetivo del GC actual:

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

Devuelve: number, error

Obtener el número de goroutines activas:

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

Devuelve: number, error

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ámetroTipoDescripción
nintegerSi se proporciona, establece GOMAXPROCS (debe ser > 0)

Devuelve: number, error

Obtener el número de CPUs lógicas:

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

Devuelve: number, error

Obtener el ID del proceso actual:

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

Devuelve: number, error

Obtener el hostname del sistema:

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

Devuelve: string, error

Obtener el directorio de trabajo actual del runtime:

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

Devuelve: string, error

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:

CampoTipoDescripción
idstringID de registro del host
workersnumberTamaño del pool de workers
processesnumberProcesos activos en este host
executednumberTotal de pasos ejecutados
stolennumberPasos robados de otros hosts
queue_depthnumberElementos pendientes en la cola del host

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

local procs, err = system.hosts.processes("app:host")
ParámetroTipoDescripción
host_idstringID de registro del host

Devuelve: table[], error

Cada tabla de proceso contiene:

CampoTipoDescripción
pidstringID del proceso
hoststringID del host
sourcestringID de entrada de origen
statestringEstado del proceso
stepsnumberPasos ejecutados
started_atnumberTimestamp de inicio (nanosegundos)
parentstringPID padre (omitido si no hay)
actor_idstringID del actor (omitido si no hay)
statstableEstadísticas específicas del proceso (opcional)

Obtener el estado de un servicio supervisado específico:

local state, err = system.supervisor.state("namespace:service")
ParámetroTipoDescripción
service_idstringID del servicio (ej., “namespace:service”)

Devuelve: table, error

La tabla de estado contiene:

CampoTipoDescripción
idstringID del servicio
statusstringEstado actual
desiredstringEstado deseado
retry_countnumberNúmero de reintentos
last_updatenumberTimestamp de última actualización (nanosegundos)
started_atnumberTimestamp de inicio (nanosegundos)
detailsstringDetalles opcionales (formateados)

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().

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.

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ónDevuelveNotas
system.node.id()string, errorID del nodo desde el contexto de relay
system.node.addr()string, errorDirección anunciada (ej. 10.0.0.1:7946); error si la membresía no está disponible
system.node.role()string, errorRol Raft de este nodo; devuelve "non-member" (sin error) cuando Raft no está ejecutándose

Permiso: system.read sobre node.

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.

CampoTipoDescripción
idstringID del nodo
is_localbooleanTrue para el nodo que llama
addrstringDirección anunciada (omitida cuando se desconoce)
metatableMetadatos de gossip string-a-string (omitidos cuando no hay)
FunciónDevuelveNotas
system.cluster.members()table[], errorError si no se puede alcanzar información de membresía
system.cluster.leader()string, errorID del líder Raft actual; "" (sin error) cuando el líder es desconocido o Raft está ausente
system.cluster.size()number, errorRecuento de miembros visibles; 0 cuando no hay info de membresía disponible

Permiso: system.read sobre cluster.

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ónDevuelveNotas
system.raft.is_leader()boolean, errorTrue si y solo si este nodo es el líder actual
system.raft.is_member()boolean, errorTrue 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, errorTé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, errorMapa 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.

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ónDevuelveResultados
system.lock.acquire(name)boolean, errortrue, nil adquirido; false, error ya tomado (tipo errors.ALREADY_EXISTS); nil, error en fallo
system.lock.release(name)boolean, errortrue, nil liberado; false, nil no poseído o poseído por otro proceso; nil, error en fallo
ParámetroTipoDescripción
namestringNombre 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).

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

AcciónRecursoDescripción
system.readmemoryLeer estadísticas de memoria
system.readmemory_limitLeer límite de memoria
system.controlmemory_limitEstablecer límite de memoria
system.readgc_percentLeer porcentaje del GC
system.gcgcForzar recolección de basura
system.gcgc_percentEstablecer porcentaje del GC
system.readgoroutinesLeer recuento de goroutines
system.readgomaxprocsLeer GOMAXPROCS
system.controlgomaxprocsEstablecer GOMAXPROCS
system.readcpuLeer recuento de CPUs
system.readpidLeer ID del proceso
system.readhostnameLeer hostname
system.readcwdLeer directorio de trabajo
system.readhostsListar hosts / procesos del host
system.readmodulesListar módulos cargados
system.readsupervisorLeer estado del supervisor
system.readnodeLeer identidad de este nodo
system.readclusterLeer membresía del cluster y líder
system.readraftLeer estado de Raft
system.readraft_statsLeer 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
CondiciónTipoReintentable
Permiso denegadoerrors.INVALIDno
Argumento inválidoerrors.INVALIDno
Argumento requerido faltanteerrors.INVALIDno
Gestor de código no disponibleerrors.INTERNALno
Info de servicio no disponibleerrors.INTERNALno
Error del SO (hostname, cwd)errors.INTERNALno
Raft no ejecutándose en este nodoerrors.INTERNALno
Membresía no disponibleerrors.INTERNALno
Bloqueo ya tomadoerrors.ALREADY_EXISTSno

Consulte Manejo de Errores para trabajar con errores.