influx: Cliente de Nginx-module-lua para InfluxDB
Instalación
Si no has configurado la suscripción al repositorio RPM, regístrate. Luego, puedes proceder con los siguientes pasos.
CentOS/RHEL 7 o 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 con NGINX, asegúrate de que nginx-module-lua esté instalado.
Este documento describe lua-resty-influx v0.2.1 lanzado el 27 de diciembre de 2017.
Esta biblioteca proporciona una interfaz de OpenResty para escribir puntos de datos en un servidor InfluxDB a través de interfaces UDP y HTTP. Se proporcionan interfaces basadas en objetos y de almacenamiento por trabajador.
Sinopsis
Interfaz 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()
-- agregar y almacenar puntos de datos adicionales
local ok, err = influx:flush()
if (not ok) then
ngx.say(err)
end
}
}
}
Interfaz de almacenamiento:
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
Opciones
lua-resty-influx proporciona una interfaz puramente basada en objetos, así como una interfaz de almacenamiento que almacena puntos de datos por trabajador y luego los almacena de manera asíncrona a través de ngx.timer.at. La creación de la interfaz de almacenamiento debe manejarse en la fase init_worker_by_lua a través de la función resty.influx.buffer.init; la creación de la interfaz orientada a objetos debe manejarse en tu controlador de fase apropiado a través de resty.influx.object:new. En ambos casos, las siguientes opciones están disponibles:
host
Predeterminado: 127.0.0.1
Establece el host al que ngx.socket.udp y resty.http intentarán conectarse.
port
Predeterminado: 8086
Establece el puerto al que ngx.socket.udp y resty.http intentarán conectarse. Por defecto es 8086 ya que el protocolo predeterminado es HTTP.
db
Predeterminado: 'lua-resty-influx'
Establece la base de datos a la que resty.http intentará conectarse. Esta opción se ignora cuando udp es el protocolo configurado.
hostname
Predeterminado: host
Establece el nombre de host que resty.http definirá en el encabezado Host para las solicitudes HTTP. Por defecto, esto es igual a la opción host configurada. Esta opción se ignora cuando udp es el protocolo configurado.
proto
Predeterminado: http
Establece el protocolo por el cual resty.influx se conectará al servidor remoto. Ten en cuenta que UDP puede presentar una mejora significativa en el rendimiento, particularmente al enviar muchos conjuntos pequeños de puntos de datos, a costa del manejo de errores y la autenticación.
precision
Predeterminado: ms
Establece la precisión de la marca de tiempo que resty.influx definirá para las marcas de tiempo. Actualmente, se admiten ms, s y none; cuando se configura none, no se enviará ninguna marca como parte del mensaje del protocolo de línea, y el servidor Influx remoto utilizará precisión de nanosegundos basada en el reloj local del servidor.
ssl
Predeterminado: false
Configura las solicitudes HTTP para realizar un apretón de manos TLS antes de enviar datos. Esta opción se ignora cuando udp es el protocolo configurado.
auth
Predeterminado: ''
Establece el nombre de usuario y la contraseña presentados al HTTP(S) remoto. Este valor debe proporcionarse como una sola cadena en el formato user:password. Esta opción se ignora cuando udp es el protocolo configurado.
Interfaz Orientada a Objetos
Los siguientes métodos están disponibles a través de la interfaz de objeto:
influx:set_measurement
Sintaxis: influx:set_measurement(string)
Establece la medición para el punto de datos asociado con el objeto actual.
influx:add_tag
Sintaxis: influx:add_tag(key, value)
Agrega una etiqueta de punto de datos como un par clave-valor. Las claves y valores se escapan de acuerdo con (https://docs.influxdata.com/influxdb/v1.0/write_protocols/line_protocol_reference/).
influx:add_field
Sintaxis: influx:add_field(key, value)
Agrega un campo de punto de datos como un par clave-valor. Los campos y valores se escapan de acuerdo con (https://docs.influxdata.com/influxdb/v1.0/write_protocols/line_protocol_reference/). Los valores enteros (valores numéricos seguidos de un i) se interpolan correctamente.
influx:stamp
Sintaxis: influx:stamp(time?)
Marca el punto de datos asociado con el objeto actual, con un valor arbitrario opcional (debe proporcionarse como un número); de lo contrario, esto marca el objeto con el valor apropiado basado en la precisión especificada a través de las opciones dadas a new para la interfaz de objeto.
influx:clear
Sintaxis: influx:clear()
Limpia la medición, etiquetas y campos en el punto de datos asociado con el objeto actual. Ten en cuenta que esto se llama internamente cuando se llaman buffer o write.
influx:buffer
Sintaxis: local ok, err = influx:buffer()
Almacena el contenido del punto de datos asociado con el objeto actual para su posterior vaciado. Devuelve verdadero en caso de éxito; de lo contrario, devuelve falso y una cadena que describe el error (como condiciones inválidas bajo las cuales almacenar).
influx:flush
Sintaxis: local ok, err = influx:flush()
Vacia todos los puntos de datos almacenados asociados con el objeto actual. Devuelve verdadero en caso de éxito; de lo contrario, devuelve falso y una cadena que describe el error (como datos restantes esperando ser almacenados, o no hay puntos de datos almacenados disponibles).
influx:write
Sintaxis: local ok, err = inflush:write()
Escribe el punto de datos asociado con el objeto actual, sin limpiar el búfer del objeto existente. Esto es esencialmente una forma abreviada de llamar a buffer y flush en un solo punto de datos. Ten en cuenta que los puntos de datos previamente almacenados aún permanecen en el búfer y deben enviarse a través de flush si se desea.
Interfaz de Almacenamiento
Las siguientes funciones están disponibles a través de la interfaz de almacenamiento:
influx.buffer
Sintaxis: influx.buffer(data_table)
Almacena un nuevo punto de datos en el búfer del proceso por trabajador. data_table debe ser una tabla que contenga las siguientes claves:
measurement: Cadena que denota la medición del punto de datostags: Tabla indexada por enteros que contiene tablas de pares clave-valor que denotan los elementos de etiqueta. Consulta la sinopsis para ejemplos.fields: Tabla indexada por enteros que contiene tablas de pares clave-valor que denotan los elementos de campo. Consulta la sinopsis para ejemplos.
Ten en cuenta que actualmente la marca de tiempo se establece automáticamente con precisión de ms.
influx.flush
Sintaxis: influx.flush()
Escribe todos los puntos de datos almacenados en el proceso de trabajador actual al host de influx configurado. Devuelve verdadero en caso de éxito; de lo contrario, devuelve falso y una cadena que describe el error de ngx.timer.at.
Esta operación devuelve inmediatamente y se ejecuta de manera asíncrona.
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-influx.