事件

为了可以更灵活地记录大量的事件,OpenResty Edge 中提供了不同于“告警”的事件记录。事件存储于 Log Server DB 而不是 Admin DB,并且页面上也提供了更加细化的过滤规则。不过暂未提供发送邮件通知等功能。

  • 来自(From):事件来源。
  • 日志级别:当前支持 4 个级别:INFO、WARNING、ERROR、CRITICAL。
  • 信息:详细的事件信息。
  • 类型:事件类型,通常使用下划线进行连接。这是实时获取的,因此没有事件时,过滤选项也会为空。
  • 类型描述:用于描述事件类型。
  • 关键字:基于事件信息和事件类型描述进行过滤。

除了提供展示功能,OpenResty Edge 还开放了自定义事件的功能,这也是事件类型需要实时获取的原因。

发送自定义事件

想要发送自定义事件,需要进行以下几个步骤:

  • 定义全局 Lua 模块,在此模块中进行事件定义及发送。
  • 在应用中引用全局 Lua 模块
  • 发送请求触发事件

接下来我们使用一个实例来演示以上步骤。

定义全局 Lua 模块

代码如下:

local ev = require("events")
local isempty = require "table.isempty"

local _M = {}

local function aggr(a, b)
    if isempty(a) then
        return b
    end

    if isempty(b) then
        return a
    end

    a_count = a[3] or 0
    b_count = b[3] or 0
    a[3] = a_count + b_count

    return a
end

function _M.go()
    local typ = "edge_custom_event"
    local desc = "Custom Event"
    local level = "ERROR"
    local key = "custom_event_key_1"
    local interval = 3
    local msg_fmt = "custom event, host: %s(rule id: %s), count: %s"
    local msg_args = {
        "test.com", -- host
        1,          -- rule id
        1,
    }

    local res, err = ev.send_event(typ, desc, level, key, msg_fmt, msg_args, aggr, interval)
    if not res then
        ngx.log(ngx.ERR, "failed to send event, error: ", err)
    end

    return ngx.say("hello world")
end

return _M

send_event 方法的参数:

  • typ:事件类型,命名以下划线(_)连接。
  • desc:事件类型描述,可以为空(nil 或 “")。
  • level:事件级别,取值:INFO、WARNING、ERROR、CRITICAL。
  • key:关键字,相同的关键字表示同一类事件,可以被聚合。
  • msg_fmt:事件信息的格式,当 msg_args 为空时,msg_fmt 将会直接作为事件信息。
  • msg_args:信息参数,用于最终渲染出事件信息。
  • aggr:聚合函数,可以把相同 key 的事件进行聚合。
  • interval:消息上报间隔,应为正整数。

引用全局 Lua 模块

发送请求触发事件

$ curl test.com
hello world

查看事件