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

Fuentes de Despliegue

La sub-tabla system.source lee la línea base de despliegue normalizada: el conjunto de entradas producido por las fuentes con las que se ensambló la aplicación, antes de aplicar cualquier historial del registro.

local loaded, err = system.source.load()

Devuelve: table, error

Campo Tipo Descripción
owners string[] Propietarios de fuente con autoridad sobre las entradas de la línea base
entries table[] Entradas de la línea base con id, kind, meta, data

owners viene ordenado con el propietario de la aplicación primero y luego el resto alfabéticamente. El propietario de la aplicación es la cadena "application".

local loaded, err = system.source.load()
if err then return nil, err end

for _, owner in ipairs(loaded.owners) do
    print(owner)
end

for _, entry in ipairs(loaded.entries) do
    print(entry.id, entry.kind)
end

La carga se toma de una única generación estable de fuentes, de modo que las entradas y los propietarios siempre describen la misma línea base. Las rutas del sistema de archivos detrás de cada fuente son privadas del runtime y no se exponen; una carga fallida reporta un error interno genérico en vez de filtrar la ruta subyacente.

Permiso: system.read sobre sources

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 almacén KV respaldado por Raft 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 almacén KV del sistema replicado por Raft, 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 sources Cargar la línea base de fuentes de despliegue
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 (system.source.load, system.lock.*) errors.PERMISSION_DENIED no
Permiso denegado (todas las demás llamadas) 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
Servicio de bloqueos no disponible (sin Raft en este nodo) errors.INTERNAL no

Consulte Manejo de Errores para trabajar con errores.