Saltar a contenido

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 datos
  • tags: 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.