事件

為了可以更靈活地記錄大量的事件,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

檢視事件