lua-telegraf

Telegraf 的 Lua/OpenResty 客户端编写器

$ opm get lblasc/lua-telegraf

名称

lua-telegraf - 用于 Telegraf/InfluxDB 或任何与 InfluxDB 行协议 兼容的监听器的 Lua/LuaJIT/OpenResty 客户端编写器。

状态

此库被认为已准备好投入生产。

描述

此库实现了 InfluxDB 行协议的编写器接口。重点在于简单性和效率。根据运行时,它将找到最合适的后端/库来构建和写入指标。

在 OpenResty 的上下文中运行时,它将使用 cosocket API,这确保了 100% 的非阻塞行为,以及 nginx 时间原语来获取缓存时间(不涉及系统调用)。对 Lua、LuaJIT 和纳秒精度的支持由 ljsyscall 库提供。

安装

克隆到你的 Lua 模块路径或使用 opm

      $ opm get lblasc/lua-telegraf

摘要

OpenResty

简单(无批量处理)

    # 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
        }
      }
    }

批量处理

创建一个简单的模块(例如 stats.lua),它将使用 lua 模块缓存来保留 lua-telegraf 实例并使其在所有阶段都可用。

    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'})
        }
      }
    }

Lua

    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

方法

new

语法:t, err = telegraf.new(options?)

使用可选的 options 表创建 telegraf 实例。

选项

host

默认值127.0.0.1

设置主机地址。

port

默认值8094

设置主机端口。

proto

默认值udp

设置协议,目前仅支持 udp。

precision

默认值nil

设置时间戳精度。目前,支持 smsuns,当 precision 为 nil(默认值)时,不会将时间戳作为行协议消息的一部分发送,远程服务器将根据服务器本地时钟设置时间戳。

global_tags

默认值{}

将添加到每个指标的标签。字段需要在标签/值对集中定义。

batch_size

默认值nil

预分配指定大小的批处理缓冲区并启用批处理。批处理缓冲区是 table,如果未及时刷新,则会超出缓冲区大小,刷新是手动操作。默认情况下(nil)禁用批处理,所有指标都会立即发送。

set

语法:ok, err = t:set(measurement, fields, tags?, timestamp?)

生成新的数据点,根据选项,数据点被推送到缓冲区或立即发送。

  • measurement:表示数据点测量的 字符串

  • fields:表示字段元素的键值对

  • tags(可选):表示标签元素的键值对

  • timestamp(可选):数字,覆盖生成的或使用 UNIX 时间 格式提供的时间设置时间戳

flush

语法:t:flush()

刷新批处理缓冲区。如果缓冲区为空或未启用,则方法仅返回。

待办事项

  • http 支持

作者

Luka Blašković <lblasc@znode.net>

版权和许可证

LICENSE

作者

Luka Blaskovic (lblasc)

许可证

mit

版本