lua-telegraf - Lua/LuaJIT/OpenResty client writer for Telegraf/InfluxDB or any listener compatible with InfluxDB Line Protocol.
This library is considered production ready.
This library implements writer interface for InfluxDB line protocol. Focus is on simplicity and efficiency. Depending on runtime it will find most suitable backend/library for constructing and writing metrics.
When run in context of OpenResty it will use cosocket API, which ensures 100% nonblocking behavior, and nginx time primitives for fetching cached time (no syscall involved). Support for Lua, LuaJIT and nanosecond precision is covered by ljsyscall library.
Clone into your Lua module path or use opm:
$ opm get lblasc/lua-telegraf
# you do not need the following line if you installed
# module with `opm`
lua_package_path "/path/to/lua-telegraf/?.lua;;";
http {
server {
access_by_lua_block {
local telegraf = require "telegraf"
local t = telegraf.new({
host = "127.0.0.1",
port = 8094,
global_tags = {
gtag = 1,
},
})
local ok, err = t:set('test', {field = 123}, {tag = 'tagged'})
if not ok then
ngx.say(err)
end
}
}
}
Create simple module (E.g. stats.lua) witch will use lua module caching
to preserve lua-telegraf
instance and make it available in all phases.
local telegraf = require 'telegraf'
local t
local _M = {}
function _M.init(conf)
t = telegraf.new(conf)
return t
end
function _M.get()
assert(t)
return t
end
return _M
lua_package_path "/path/to/stats/module/?.lua;;";
http {
init_worker_by_lua_block {
local function flush_stats(premature)
if premature then
return
end
local t = require('stats').get()
t:flush()
end
local flush_every = 1 -- adjust flush interval (in seconds)
require("stats").init({
host = "127.0.0.1",
port = 8094,
batch_size = 20,
global_tags = {
gtag = 1,
},
})
local ok, err = ngx.timer.every(flush_every, flush_stats)
if not ok then
ngx.log(ngx.ERR, err)
return
end
}
server {
access_by_lua_block {
local t = require("stats").get()
t:set('test', {field = 123}, {tag = 'tagged'})
}
log_by_lua_block {
local t = require("stats").get()
t:set('nginx_stats', {
request_time = ngx.now() - ngx.req.start_time()
}, {tag = 'mytag'})
}
}
}
local telegraf = require "telegraf"
local t = telegraf.new({
host = "127.0.0.1",
port = 8094,
global_tags = {
gtag = 1,
},
})
local ok, err = t:set('test', {field = 123}, {tag = 'tagged'})
if not ok then
error(err)
end
syntax: t, err = telegraf.new(options?)
Creates telegraf instance with optional options table.
Default: 127.0.0.1
Sets the host address.
Default: 8094
Sets the host port.
Default: udp
Sets the protocol, for now only supported is udp.
Default: nil
Sets the timestamp precision. Currently, s
, ms
, u
, and ns
are supported, when precision is nil
(default) no timestamp
will be sent as part of the line protocol message, and the
remote server will set timestamp based on the server-local clock.
Default: {}
Tags that will be added to every metric. Field needs to be defined in set of tag/value pairs.
Default: nil
Preallocates batch buffer by specified size and enables batching.
Batch buffer is table
which will exceed buffer size if not
flushed in time, flushing is manual operation. By default (nil
)
batching is disabled and all metrics will be sent immediately.
syntax: ok, err = t:set(measurement, fields, tags?, timestamp?)
Generates new data point, depending on options, data point is pushed to a buffer or sent immediately.
measurement
:string
denoting the measurement of the data pointfields
:table
of key-value pairs denoting the field elementstags
(optional):table
of key-value pairs denoting the tag elementstimestamp
(optional):number
which overrides generated or sets timestamp with time provided inUNIX time
format
syntax: t:flush()
Flushes batch buffer. If buffer is empty or not enabled method just returns.
- http support
Luka Blašković lblasc@znode.net
See LICENSE