Pular para conteúdo

consul-event: Wrapper da API HTTP de Eventos do Consul

Instalação

Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.

CentOS/RHEL 7 ou Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-consul-event

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-consul-event

Para usar esta biblioteca Lua com NGINX, certifique-se de que o nginx-module-lua esteja instalado.

Este documento descreve lua-resty-consul-event v0.3.0 lançado em 17 de junho de 2019.


Wrapper da API HTTP de Eventos do Consul

Visão Geral

Este módulo fornece um wrapper de cliente OpenResty para a API de Eventos do Consul. Isso permite a integração do OpenResty com o mecanismo de eventos de usuário personalizado do Consul, que pode ser usado para construir uma infraestrutura de script para realizar implantações automatizadas, reiniciar serviços ou executar qualquer outra ação de orquestração.

Este módulo aproveita o conceito de consultas bloqueantes do Consul para monitorar eventos transmitidos em um determinado nome de evento.

Sinopse

local event = require "resty.consul.event"

local e, err = event.new({
  host = "127.0.0.1",
  port = 8500,
})

if err then
  ngx.log(ngx.ERR, err)
end

e:watch("foo", function(event)
  ngx.log(ngx.INFO, "eu recebi ", ngx.decode_base64(event.payload))
end)

Uso

new

syntax: e, err = event.new(opts?)

Instancia um novo objeto de monitoramento. opts pode ser uma tabela com as seguintes opções:

  • host: String definindo o host do Consul
  • port: Número definindo a porta do Consul
  • timeout: Número, em segundos, a ser passado para a API de consulta bloqueante do Consul via o parâmetro wait. Este valor também é usado para definir timeouts na camada TCP, que são configurados para serem maiores que o timeout da camada de aplicação.
  • ssl_verify: Booleano definindo se deve validar o certificado TLS apresentado pelo servidor remoto do Consul.
  • token: String definindo o token ACL do Consul a ser enviado via o cabeçalho de requisição X-Consul-Token.

watch

syntax: e:watch(name, callback, initial_index, seen_ids)

Monitora a API de eventos do Consul em busca de eventos transmitidos sob um determinado name, e executa a função callback. callback recebe um único parâmetro event, que contém o corpo de um único evento conforme definido pela API de Eventos do Consul. As funções de callback são envolvidas em pcall, portanto, é seguro lançar um erro de dentro desta função. As funções de callback podem retornar um único valor, mas este valor é em grande parte irrelevante; atualmente, este único valor é registrado como uma entrada de depuração.

Os valores initial_index e seen_ids são opcionais e podem ser usados para inicializar o monitoramento em um determinado estado no anel de eventos do Consul. initial_index deve ser uma string gerada por um cabeçalho anterior X-Consul-Index. seen_ids deve ser uma lista de valores de ID de Evento do Consul para os quais os eventos de callback não devem ser executados. Por exemplo, o estado atual do buffer de eventos pode ser usado para inicializar um determinado monitoramento:

local h = require("resty.http").new()

-- obter os eventos atuais
local res, err = h:request_uri("http://127.0.0.1:8500/v1/event/list?name=foo")
if err then
  ngx.log(ngx.ERR, err)
end

local event = require "resty.consul.event"

local e, err = event.new({
  host = "127.0.0.1",
  port = 8500,
})
if err then
  ngx.log(ngx.ERR, err)
end

local l = {}

for _, e in ipairs(require("cjson").decode(res.body)) do
  table.insert(l, e.ID)
end

ngx.timer.at(0, function()
  e:watch(
    "foo",
    function(p) ngx.log(ngx.DEBUG, p.payload) end,
    res.headers["X-Consul-Index"],
    l
  )
end)

Nota: O corpo desta função é executado em um loop infinito para monitorar a API de eventos do Consul indefinidamente. Como resultado, é fortemente recomendado chamar esta função dentro de um temporizador em segundo plano gerado via ngx.timer.at

Testes

Uma suíte de testes para este repositório é fornecida. Os testes são escritos usando Test::Nginx e executados com prove.

Para testar o comportamento da biblioteca da melhor forma, a suíte espera que um servidor Consul esteja em execução e acessível. Por padrão, o Consul é acessado em 127.0.0.1:8500; o host e a porta do Consul podem ser substituídos definindo as variáveis de ambiente TEST_NGINX_CONSUL_ADDR e TEST_NGINX_CONSUL_PORT, respectivamente.

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-consul-event.