Sistema
El módulo system informa del estado del runtime, memoria, proceso, host, supervisor y clúster. También expone controles seleccionados del runtime.
Esta es una referencia de API. La mayoría de fragmentos muestran una operación aislada; controles como el apagado, los ajustes del runtime y los locks distribuidos requieren autorización explícita de políticas y un tratamiento de errores específico de la aplicación.
Carga
local system = require("system")
Apagado
Solicita el apagado del sistema con un código de salida. Llamar a esta función desde cualquier proceso o actor termina 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
Lista los módulos Lua cargados y sus 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 mediante el selector gomaxprocs:
-- Get current value
local current, err = system.runtime.max_procs()
-- Set new value
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 clúster
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.
Las llamadas de lectura informan de la vista local del estado confirmado de este nodo y no bloquean en la red.
Identidad del nodo
system.node reporta la propia identidad de este nodo en el cluster.
local id, err = system.node.id() -- this node's ID
local addr, err = system.node.addr() -- advertised network address
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 informa de los miembros del clúster y del líder actual.
local members, err = system.cluster.members() -- array of node tables
local leader, err = system.cluster.leader() -- leader node ID, or "" if unknown
local n, err = system.cluster.size() -- count of visible members
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 or standby
local role, err = system.raft.role() -- same values as system.node.role()
local term, err = system.raft.term() -- current Raft term
local idx, err = system.raft.commit_index() -- highest committed log index
local stats, err = system.raft.stats() -- raw stats map (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 not ok then
-- err has kind errors.ALREADY_EXISTS when another process holds the lock.
-- Apply the caller's retry and backoff policy for that case if needed.
return nil, err
end
-- critical section: only one holder cluster-wide
local released, release_err = system.lock.release("orders.migration")
if release_err then
return nil, release_err
end
return released
La adquisición es fail-fast: cuando el lock ya está tomado, la llamada devuelve false inmediatamente en lugar de bloquear. Los callers proporcionan las políticas de retry y backoff necesarias. Solo el holder actual puede liberar un lock; un intento de liberación por otro proceso es un no-op.
| 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 |
<lock name> |
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.