mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-28 05:46:36 +08:00
46 lines
1.5 KiB
Lua
46 lines
1.5 KiB
Lua
local cjson = require "cjson.safe"
|
|
|
|
local dict = ngx.shared.openflare_observability
|
|
if not dict then
|
|
ngx.status = ngx.HTTP_SERVICE_UNAVAILABLE
|
|
ngx.say(cjson.encode({ message = "shared dict unavailable" }))
|
|
return
|
|
end
|
|
|
|
local now = ngx.time()
|
|
local window_size = 60
|
|
local window_start = now - (now % window_size)
|
|
local current_window = tostring(window_start)
|
|
|
|
local function read_counter(key)
|
|
return tonumber(dict:get(key) or 0) or 0
|
|
end
|
|
|
|
local function read_map(window_id, prefix, list_key)
|
|
local result = {}
|
|
local raw = dict:get(list_key .. ":" .. window_id)
|
|
if not raw or raw == "" then
|
|
return result
|
|
end
|
|
for value in string.gmatch(raw, "[^\n]+") do
|
|
result[value] = read_counter(prefix .. ":" .. window_id .. ":" .. value)
|
|
end
|
|
return result
|
|
end
|
|
|
|
local payload = {
|
|
window_started_at_unix = window_start,
|
|
window_ended_at_unix = now,
|
|
request_count = read_counter("request_count:" .. current_window),
|
|
error_count = read_counter("error_count:" .. current_window),
|
|
unique_visitor_count = read_counter("unique_visitor_count:" .. current_window),
|
|
status_codes = read_map(current_window, "status", "status_keys"),
|
|
top_domains = read_map(current_window, "domain", "domain_keys"),
|
|
source_countries = {},
|
|
openresty_rx_bytes = read_counter("openresty_rx_bytes:" .. current_window),
|
|
openresty_tx_bytes = read_counter("openresty_tx_bytes:" .. current_window)
|
|
}
|
|
|
|
ngx.header.content_type = "application/json"
|
|
ngx.say(cjson.encode(payload))
|