Módulo Registry
O módulo registry fornece um sistema de armazenamento de dados persistente e compartilhado entre execuções de scripts Lua. Este módulo é útil para manter estado entre diferentes execuções, compartilhar dados entre scripts e implementar mecanismos de cache e configuração persistente.
- Armazenamento chave-valor persistente
- Timestamp automático para cada entrada
- Thread-safe (seguro para uso concorrente)
- Dados compartilhados entre todos os scripts Lua
- Persistência entre reinícios do agente
Funções Disponíveis
1. registry.put(chave, valor)
Armazena um valor no registry com a chave especificada.
Parâmetros:
- chave (string): Identificador único para o valor
- valor (qualquer tipo Lua): Valor a ser armazenado (string, número, booleano, tabela, nil)
Retorno:
- nil: A função não retorna valor
Comportamento:
- Armazena o valor associado à chave
- Registra automaticamente o timestamp atual (UTC)
- Sobrescreve qualquer valor existente com a mesma chave
- Aceita qualquer tipo de dado Lua suportado pelo sistema de valores do Monagent
Exemplo de Uso:
-- Armazenar valores básicos
registry.put("ultima_execucao", os.time())
registry.put("hostname", "servidor-producao")
registry.put("ativo", true)
registry.put("versao", 2.5)
-- Armazenar tabelas complexas
local config = {
timeout = 30,
retries = 3,
servidores = {"srv1", "srv2", "srv3"},
limites = {cpu = 80, memoria = 90, disco = 95}
}
registry.put("configuracao_monitoramento", config)
-- Armazenar resultados de processamento
local metricas = {
cpu_usage = 45.6,
memory_usage = 78.3,
disk_usage = 62.1,
timestamp = os.time()
}
registry.put("metricas_recentes", metricas)
-- Sobrescrever valor existente
registry.put("contador", 1)
-- ... mais tarde ...
local valor, timestamp = registry.get("contador")
registry.put("contador", (valor or 0) + 1)
2. registry.get(chave)
Recupera um valor do registry pela chave especificada.
Parâmetros:
- chave (string): Chave do valor a ser recuperado
Retorno:
-
tuple:
(valor, timestamp)onde:-
valor (qualquer tipo ou nil): Valor armazenado, ou
nilse a chave não existir -
timestamp (número ou nil): Timestamp Unix (segundos) da última atualização, ou
nilse a chave não existir
-
valor (qualquer tipo ou nil): Valor armazenado, ou
Comportamento:
- Retorna o valor e timestamp se a chave existir
- Retorna
(nil, nil)se a chave não existir - Preserva o tipo original do valor armazenado
- O timestamp é em segundos desde a epoch Unix (UTC)
Exemplo de Uso:
-- Recuperar valor simples
local valor, timestamp = registry.get("config_timeout")
if valor then
print("Timeout configurado:", valor, "desde", os.date("%H:%M:%S", timestamp))
else
print("Configuração não encontrada")
end
-- Recuperar tabela
local config, ts = registry.get("configuracao_sistema")
if config then
print("Configuração carregada:")
for chave, valor in pairs(config) do
print(" ", chave, "=", valor)
end
print("Última atualização:", os.date("%Y-%m-%d %H:%M:%S", ts))
end
-- Verificar existência antes de usar
local dados, timestamp = registry.get("dados_processamento")
if dados then
-- Processar dados existentes
processar_dados(dados)
else
-- Inicializar novos dados
dados = inicializar_dados()
registry.put("dados_processamento", dados)
end
-- Usar valor padrão se não existir
local limite, _ = registry.get("limite_cpu")
limite = limite or 80 -- Valor padrão 80% se não configurado
3. registry.delete(chave)
Remove uma entrada do registry pela chave especificada.
Parâmetros:
- chave (string): Chave da entrada a ser removida
Retorno:
- nil: A função não retorna valor
Comportamento:
- Remove completamente a entrada do registry
- Não faz nada se a chave não existir
- Libera a memória associada à chave
- Operação atômica e thread-safe
Exemplo de Uso:
-- Remover entrada específica
registry.delete("cache_temporario")
print("Cache temporário removido")
-- Limpar todas as entradas de um prefixo
local function limpar_prefixo(prefixo)
-- Nota: O registry não suporta listagem direta
-- Em um caso real, você precisaria manter uma lista de chaves
log.info("Limpando entradas com prefixo:", prefixo)
-- Exemplo com chaves conhecidas
local chaves_conhecidas = {
prefixo .. "_cache_dns",
prefixo .. "_cache_http",
prefixo .. "_metricas",
prefixo .. "_config"
}
for _, chave in ipairs(chaves_conhecidas) do
registry.delete(chave)
log.debug("Removido:", chave)
end
end
-- Limpar entradas expiradas
local function limpar_expirados(ttl_segundos)
local agora = os.time()
-- Nota: Novamente, sem listagem direta, precisamos de estratégia
log.info("Limpeza de expirados não suportada diretamente")
log.info("Use timestamps nas chaves ou mantenha lista de chaves")
end
-- Remover após uso
local function processar_e_limpar(chave)
local dados, timestamp = registry.get(chave)
if dados then
-- Processar dados
local resultado = processar(dados)
-- Remover após processamento
registry.delete(chave)
log.info("Dados processados e removidos:", chave)
return resultado
else
log.warn("Chave não encontrada:", chave)
return nil
end
end