influx: cliente Nginx-module-lua para InfluxDB
Instalação
Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Depois, 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-influx
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-influx
Para usar esta biblioteca Lua com NGINX, certifique-se de que o nginx-module-lua está instalado.
Este documento descreve lua-resty-influx v0.2.1 lançado em 27 de dezembro de 2017.
Esta biblioteca fornece uma interface OpenResty para escrever pontos de dados em um servidor InfluxDB via interfaces UDP e HTTP. Interfaces baseadas em objetos e de buffer por trabalhador são fornecidas.
Sinopse
Interface de objeto:
http {
server {
access_by_lua_block {
local i = require "resty.influx.object"
local influx, err = i:new({
host = "127.0.0.1",
port = 8086,
proto = "http",
db = "db",
hostname = "localhost",
auth = "user:password",
})
if (not influx) then
ngx.say(err)
return
end
influx:set_measurement("foo")
influx:add_tag("foo", "bar")
influx:add_field("value", 1)
influx:buffer()
-- adicionar e bufferizar pontos de dados adicionais
local ok, err = influx:flush()
if (not ok) then
ngx.say(err)
end
}
}
}
Interface de buffering:
http {
init_worker_by_lua_block {
local ibuf = require "resty.influx.buffer"
local ok, err = ibuf.init({
host = "127.0.0.1",
port = 8089,
proto = "udp",
})
if (not ok) then
ngx.log(ngx.ERR, err)
end
}
server {
access_by_lua_block {
local ibuf = require "resty.influx.buffer"
ibuf.buffer({
measurement = "foo",
tags = {
{ foo = "bar" }
},
fields = {
{ value = 1 }
}
})
}
log_by_lua_block {
local ibuf = require "resty.influx.buffer"
ibuf.flush()
}
}
}
Uso
Opções
lua-resty-influx fornece uma interface puramente baseada em objetos, bem como uma interface de buffering que armazena pontos de dados por trabalhador e, em seguida, bufferiza de forma assíncrona via ngx.timer.at. A criação da interface de buffering deve ser tratada na fase init_worker_by_lua via a função resty.influx.buffer.init; a criação da interface orientada a objetos deve ser tratada no seu manipulador de fase apropriado via resty.influx.object:new. Em ambos os casos, as seguintes opções estão disponíveis:
host
Padrão: 127.0.0.1
Define o host ao qual ngx.socket.udp e resty.http tentarão se conectar.
port
Padrão: 8086
Define a porta à qual ngx.socket.udp e resty.http tentarão se conectar. O padrão é 8086, pois o protocolo padrão é HTTP.
db
Padrão: 'lua-resty-influx'
Define o db ao qual resty.http tentará se conectar. Esta opção é ignorada quando udp é o protocolo configurado.
hostname
Padrão: host
Define o hostname que resty.http usará para definir o cabeçalho Host para requisições HTTP. Por padrão, isso é igual à opção host configurada. Esta opção é ignorada quando udp é o protocolo configurado.
proto
Padrão: http
Define o protocolo pelo qual resty.influx se conectará ao servidor remoto. Note que o UDP pode apresentar uma melhoria significativa de desempenho, particularmente ao enviar muitos pequenos conjuntos de pontos de dados, à custa de tratamento de erros e autenticação.
precision
Padrão: ms
Define a precisão do timestamp pela qual resty.influx definirá timestamps. Atualmente, ms, s e none são suportados; quando none é configurado, nenhum timestamp será enviado como parte da mensagem do protocolo de linha, e o servidor Influx remoto usará precisão em nanossegundos com base no relógio local do servidor.
ssl
Padrão: false
Configura requisições HTTP para realizar um handshake TLS antes de enviar dados. Esta opção é ignorada quando udp é o protocolo configurado.
auth
Padrão: ''
Define o nome de usuário e a senha apresentados ao HTTP(S) remoto. Este valor deve ser fornecido como uma única string no formato user:password. Esta opção é ignorada quando udp é o protocolo configurado.
Interface Orientada a Objetos
Os seguintes métodos estão disponíveis via a interface de objeto:
influx:set_measurement
Sintaxe: influx:set_measurement(string)
Define a medição para o ponto de dados associado ao objeto atual.
influx:add_tag
Sintaxe: influx:add_tag(key, value)
Adiciona uma tag de ponto de dados como um par chave-valor. Chaves e valores são escapados de acordo com (https://docs.influxdata.com/influxdb/v1.0/write_protocols/line_protocol_reference/).
influx:add_field
Sintaxe: influx:add_field(key, value)
Adiciona um campo de ponto de dados como um par chave-valor. Campos e valores são escapados de acordo com (https://docs.influxdata.com/influxdb/v1.0/write_protocols/line_protocol_reference/). Valores inteiros (valores numéricos seguidos de um i) são interpolados corretamente.
influx:stamp
Sintaxe: influx:stamp(time?)
Marca o ponto de dados associado ao objeto atual, com um valor arbitrário opcional (deve ser fornecido como um número); caso contrário, isso marca o objeto com o valor apropriado com base na precisão especificada via as opções dadas a new para a interface de objeto.
influx:clear
Sintaxe: influx:clear()
Limpa a medição, tags e campos no ponto de dados associado ao objeto atual. Note que isso é chamado internamente quando buffer ou write são chamados.
influx:buffer
Sintaxe: local ok, err = influx:buffer()
Bufferiza o conteúdo do ponto de dados associado ao objeto atual para posterior descarte. Retorna true em caso de sucesso; caso contrário, retorna false e uma string descrevendo o erro (como condições inválidas sob as quais bufferizar).
influx:flush
Sintaxe: local ok, err = influx:flush()
Descarrega todos os pontos de dados bufferizados associados ao objeto atual. Retorna true em caso de sucesso; caso contrário, retorna false e uma string descrevendo o erro (como dados restantes esperando para serem bufferizados, ou nenhum ponto de dados bufferizado disponível).
influx:write
Sintaxe: local ok, err = influx:write()
Escreve o ponto de dados associado ao objeto atual, sem limpar o buffer do objeto existente. Isso é essencialmente uma forma abreviada de chamar buffer e flush em um único ponto de dados. Note que pontos de dados previamente bufferizados ainda permanecem no buffer e devem ser enviados via flush se desejado.
Interface de Buffering
As seguintes funções estão disponíveis via a interface de buffering:
influx.buffer
Sintaxe: influx.buffer(data_table)
Bufferiza um novo ponto de dados no buffer do processo por trabalhador. data_table deve ser uma tabela que contém as seguintes chaves:
measurement: String que denota a medição do ponto de dadostags: Tabela indexada por inteiros contendo tabelas de pares chave-valor que denotam os elementos de tag. Veja a sinopse para exemplos.fields: Tabela indexada por inteiros contendo tabelas de pares chave-valor que denotam os elementos de campo. Veja a sinopse para exemplos.
Note que atualmente o timestamp é automaticamente definido com precisão de ms.
influx.flush
Sintaxe: influx.flush()
Escreve todos os pontos de dados bufferizados no processo trabalhador atual para o host influx configurado. Retorna true em caso de sucesso; caso contrário, retorna false e uma string descrevendo o erro de ngx.timer.at.
Esta operação retorna imediatamente e é executada de forma assíncrona.
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-influx.