541 lines
21 KiB
Lua
541 lines
21 KiB
Lua
local ngx = ngx
|
|
local kong = kong
|
|
local type = type
|
|
local assert = assert
|
|
local subsystem = ngx.config.subsystem
|
|
local math = math
|
|
local get_phase = ngx.get_phase
|
|
|
|
|
|
local function is_nil(ctx, name)
|
|
if ctx[name] ~= nil then
|
|
return false, "[ctx-tests] " .. name .. " is not a nil"
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
local function is_true(ctx, name)
|
|
if ctx[name] ~= true then
|
|
return false, "[ctx-tests] " .. name .. " is not true"
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
local function is_positive_integer(ctx, name)
|
|
local value = ctx[name]
|
|
if type(value) ~= "number" then
|
|
return false, "[ctx-tests] " .. name .. " is not a number"
|
|
end
|
|
|
|
if math.floor(value) ~= value then
|
|
return false, "[ctx-tests] " .. name .. " is not an integer"
|
|
end
|
|
|
|
if value <= 0 then
|
|
return false, "[ctx-tests] " .. name .. " is not a positive integer"
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
local function is_non_negative_integer(ctx, name)
|
|
local value = ctx[name]
|
|
if value == 0 then
|
|
return true
|
|
end
|
|
|
|
return is_positive_integer(ctx, name)
|
|
end
|
|
|
|
|
|
local function is_equal_to_start_time(ctx, name)
|
|
local ok, err = is_positive_integer(ctx, name)
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
if ctx[name] < ctx.KONG_PROCESSING_START then
|
|
return false, "[ctx-tests] " .. name .. " is less than the processing start"
|
|
end
|
|
|
|
if subsystem ~= "stream" then
|
|
if ctx[name] ~= (ngx.req.start_time() * 1000) then
|
|
return false, "[ctx-tests] " .. name .. " is less than the request start time"
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
local function is_greater_or_equal_to_start_time(ctx, name)
|
|
local ok, err = is_positive_integer(ctx, name)
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
if ctx[name] < ctx.KONG_PROCESSING_START then
|
|
return false, "[ctx-tests] " .. name .. " is less than the processing start"
|
|
end
|
|
|
|
if subsystem ~= "stream" then
|
|
if ctx[name] < (ngx.req.start_time() * 1000) then
|
|
return false, "[ctx-tests] " .. name .. " is less than the request start time"
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
local function is_greater_or_equal_to_ctx_value(ctx, name, greater_name)
|
|
local ok, err = is_positive_integer(ctx, name)
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
ok, err = is_positive_integer(ctx, greater_name)
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
if ctx[greater_name] < ctx[name] then
|
|
return false, "[ctx-tests] " .. name .. " is greater than " .. greater_name
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
local function has_correct_proxy_latency(ctx)
|
|
local ok, err = is_positive_integer(ctx, "KONG_BALANCER_ENDED_AT")
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
ok, err = is_non_negative_integer(ctx, "KONG_PROXY_LATENCY")
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
if ctx.KONG_BALANCER_ENDED_AT < ctx.KONG_PROCESSING_START then
|
|
return false, "[ctx-tests] KONG_BALANCER_ENDED_AT is less than the processing start"
|
|
end
|
|
|
|
local latency = ctx.KONG_BALANCER_ENDED_AT - ctx.KONG_PROCESSING_START
|
|
if ctx.KONG_PROXY_LATENCY ~= latency then
|
|
return false, "[ctx-tests] KONG_PROXY_LATENCY is not calculated correctly"
|
|
end
|
|
|
|
if subsystem ~= "stream" then
|
|
latency = ctx.KONG_BALANCER_ENDED_AT - ngx.req.start_time() * 1000
|
|
if ctx.KONG_PROXY_LATENCY ~= latency then
|
|
return false, "[ctx-tests] KONG_PROXY_LATENCY is not calculated correctly (request start time)"
|
|
end
|
|
end
|
|
|
|
if get_phase() == "log" then
|
|
local log = kong.log.serialize()
|
|
if ctx.KONG_PROXY_LATENCY > log.latencies.kong then
|
|
return false, "[ctx-tests] kong.log.serialize() latency is less than KONG_PROXY_LATENCY"
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
local function has_correct_waiting_time(ctx)
|
|
local err
|
|
local ok = is_positive_integer(ctx, "KONG_RESPONSE_START")
|
|
if not ok then
|
|
ok, err = is_positive_integer(ctx, "KONG_HEADER_FILTER_START")
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
end
|
|
|
|
ok, err = is_positive_integer(ctx, "KONG_BALANCER_ENDED_AT")
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
local waiting_time = (ctx.KONG_RESPONSE_START or ctx.KONG_HEADER_FILTER_START) -
|
|
ctx.KONG_BALANCER_ENDED_AT
|
|
|
|
if ctx.KONG_WAITING_TIME ~= waiting_time then
|
|
return false, "[ctx-tests] KONG_WAITING_TIME is not calculated correctly"
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
local function has_correct_receive_time(ctx)
|
|
local ok, err = is_positive_integer(ctx, "KONG_BODY_FILTER_ENDED_AT")
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
ok, err = is_positive_integer(ctx, "KONG_HEADER_FILTER_START")
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
local receive_time = ctx.KONG_BODY_FILTER_ENDED_AT -
|
|
(ctx.KONG_RESPONSE_START or ctx.KONG_HEADER_FILTER_START)
|
|
|
|
if ctx.KONG_RECEIVE_TIME ~= receive_time then
|
|
return false, "[ctx-tests] KONG_RECEIVE_TIME is not calculated correctly"
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
local CtxTests = {
|
|
PRIORITY = -1000000,
|
|
VERSION = "1.0",
|
|
}
|
|
|
|
|
|
local function has_correct_upstream_dns_time(ctx)
|
|
local ok, err = is_positive_integer(ctx, "KONG_UPSTREAM_DNS_END_AT")
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
ok, err = is_positive_integer(ctx, "KONG_UPSTREAM_DNS_START")
|
|
if not ok then
|
|
return ok, err
|
|
end
|
|
|
|
local upstream_dns_time = ctx.KONG_UPSTREAM_DNS_END_AT - ctx.KONG_UPSTREAM_DNS_START
|
|
|
|
if ctx.KONG_UPSTREAM_DNS_TIME ~= upstream_dns_time then
|
|
return false, "[ctx-tests] KONG_UPSTREAM_DNS_TIME is not calculated correctly"
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
function CtxTests:preread()
|
|
local ctx = ngx.ctx
|
|
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_PREREAD_START"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
|
|
assert(is_nil(ctx, "KONG_REWRITE_START"))
|
|
assert(is_nil(ctx, "KONG_REWRITE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_REWRITE_TIME"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_START"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_TIME"))
|
|
assert(is_nil(ctx, "KONG_BALANCER_START"))
|
|
assert(is_nil(ctx, "KONG_BALANCER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_BALANCER_TIME"))
|
|
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_START"))
|
|
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_END_AT"))
|
|
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_TIME"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_START"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_START"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_START"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_LOG_START"))
|
|
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_LOG_TIME"))
|
|
assert(is_nil(ctx, "KONG_PROXIED"))
|
|
assert(is_nil(ctx, "KONG_PROXY_LATENCY"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
|
|
assert(is_nil(ctx, "KONG_WAITING_TIME"))
|
|
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
|
|
assert(is_positive_integer(ctx, "host_port"))
|
|
end
|
|
|
|
|
|
function CtxTests:rewrite()
|
|
local ctx = ngx.ctx
|
|
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_REWRITE_START"))
|
|
assert(is_greater_or_equal_to_start_time(ctx, "KONG_REWRITE_START", "KONG_REWRITE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_START"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
|
|
assert(is_nil(ctx, "KONG_REWRITE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_REWRITE_TIME"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_START"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_TIME"))
|
|
assert(is_nil(ctx, "KONG_BALANCER_START"))
|
|
assert(is_nil(ctx, "KONG_BALANCER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_BALANCER_TIME"))
|
|
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_START"))
|
|
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_END_AT"))
|
|
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_TIME"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_START"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_START"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_START"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_LOG_START"))
|
|
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_LOG_TIME"))
|
|
assert(is_nil(ctx, "KONG_PROXIED"))
|
|
assert(is_nil(ctx, "KONG_PROXY_LATENCY"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
|
|
assert(is_nil(ctx, "KONG_WAITING_TIME"))
|
|
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
|
|
assert(is_positive_integer(ctx, "host_port"))
|
|
end
|
|
|
|
|
|
function CtxTests:access(config)
|
|
if config.buffered then
|
|
kong.service.request.enable_buffering()
|
|
end
|
|
|
|
local ctx = ngx.ctx
|
|
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_REWRITE_START"))
|
|
assert(is_greater_or_equal_to_start_time(ctx, "KONG_REWRITE_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_START", "KONG_REWRITE_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_REWRITE_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_ENDED_AT", "KONG_ACCESS_START"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_START"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_TIME"))
|
|
assert(is_nil(ctx, "KONG_BALANCER_START"))
|
|
assert(is_nil(ctx, "KONG_BALANCER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_BALANCER_TIME"))
|
|
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_START"))
|
|
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_END_AT"))
|
|
assert(is_nil(ctx, "KONG_UPSTREAM_DNS_TIME"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_START"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_START"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_START"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_LOG_START"))
|
|
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_LOG_TIME"))
|
|
assert(is_nil(ctx, "KONG_PROXIED"))
|
|
assert(is_nil(ctx, "KONG_PROXY_LATENCY"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
|
|
assert(is_nil(ctx, "KONG_WAITING_TIME"))
|
|
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
|
|
assert(is_positive_integer(ctx, "host_port"))
|
|
end
|
|
|
|
|
|
function CtxTests:header_filter(config)
|
|
local ctx = ngx.ctx
|
|
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_REWRITE_START"))
|
|
assert(is_greater_or_equal_to_start_time(ctx, "KONG_REWRITE_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_START", "KONG_REWRITE_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_REWRITE_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_ENDED_AT", "KONG_ACCESS_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_START", "KONG_ACCESS_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_ACCESS_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_ENDED_AT", "KONG_BALANCER_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_START", "KONG_BALANCER_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_BALANCER_TIME"))
|
|
if config.buffered then
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_RESPONSE_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_START", "KONG_RESPONSE_ENDED_AT"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_ENDED_AT", "KONG_HEADER_FILTER_START"))
|
|
assert(is_non_negative_integer(ctx, "KONG_RESPONSE_TIME"))
|
|
else
|
|
assert(is_nil(ctx, "KONG_RESPONSE_START"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_HEADER_FILTER_START"))
|
|
end
|
|
assert(is_true(ctx, "KONG_PROXIED"))
|
|
assert(has_correct_proxy_latency(ctx))
|
|
assert(has_correct_waiting_time(ctx))
|
|
assert(is_nil(ctx, "KONG_PREREAD_START"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_START"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_LOG_START"))
|
|
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_LOG_TIME"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
|
|
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
|
|
assert(is_positive_integer(ctx, "host_port"))
|
|
end
|
|
|
|
|
|
function CtxTests:body_filter(config)
|
|
if not ngx.arg[2] then
|
|
return
|
|
end
|
|
|
|
local ctx = ngx.ctx
|
|
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_REWRITE_START"))
|
|
assert(is_greater_or_equal_to_start_time(ctx, "KONG_REWRITE_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_START", "KONG_REWRITE_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_REWRITE_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_ENDED_AT", "KONG_ACCESS_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_START", "KONG_ACCESS_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_ACCESS_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_ENDED_AT", "KONG_BALANCER_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_START", "KONG_BALANCER_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_BALANCER_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_HEADER_FILTER_START"))
|
|
if config.buffered then
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_RESPONSE_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_START", "KONG_RESPONSE_ENDED_AT"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_ENDED_AT", "KONG_HEADER_FILTER_START"))
|
|
assert(is_non_negative_integer(ctx, "KONG_RESPONSE_TIME"))
|
|
else
|
|
assert(is_nil(ctx, "KONG_RESPONSE_START"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_HEADER_FILTER_START"))
|
|
end
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_HEADER_FILTER_START", "KONG_HEADER_FILTER_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_HEADER_FILTER_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_HEADER_FILTER_ENDED_AT", "KONG_BODY_FILTER_START"))
|
|
assert(is_true(ctx, "KONG_PROXIED"))
|
|
assert(has_correct_proxy_latency(ctx))
|
|
assert(has_correct_waiting_time(ctx))
|
|
assert(is_nil(ctx, "KONG_PREREAD_START"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_LOG_START"))
|
|
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_LOG_TIME"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
|
|
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
|
|
assert(is_positive_integer(ctx, "host_port"))
|
|
end
|
|
|
|
|
|
function CtxTests:log(config)
|
|
local ctx = ngx.ctx
|
|
if subsystem == "stream" then
|
|
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_PREREAD_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PREREAD_START", "KONG_PREREAD_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_PREREAD_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PREREAD_ENDED_AT", "KONG_BALANCER_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_START", "KONG_BALANCER_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_BALANCER_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_LOG_START"))
|
|
if (not is_nil(ctx, "KONG_UPSTREAM_DNS_START") and not is_nil(ctx, "KONG_BALANCER_ENDED_AT")) then
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_UPSTREAM_DNS_START", "KONG_UPSTREAM_DNS_END_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_UPSTREAM_DNS_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_UPSTREAM_DNS_END_AT", "KONG_LOG_START"))
|
|
assert(has_correct_upstream_dns_time(ctx))
|
|
end
|
|
assert(is_true(ctx, "KONG_PROXIED"))
|
|
assert(has_correct_proxy_latency(ctx))
|
|
assert(is_nil(ctx, "KONG_REWRITE_START"))
|
|
assert(is_nil(ctx, "KONG_REWRITE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_REWRITE_TIME"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_START"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_ACCESS_TIME"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_START"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_START"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_HEADER_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_START"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_BODY_FILTER_TIME"))
|
|
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_LOG_TIME"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_LATENCY"))
|
|
|
|
-- TODO: ngx.var.upstream_first_byte_time?
|
|
assert(is_nil(ctx, "KONG_WAITING_TIME"))
|
|
|
|
|
|
-- TODO: ngx.ctx.KONG_LOG_START - (ngx.ctx.BALANCER_ENDED_AT + ngx.var.upstream_first_byte_time)?
|
|
assert(is_nil(ctx, "KONG_RECEIVE_TIME"))
|
|
|
|
else
|
|
assert(is_equal_to_start_time(ctx, "KONG_PROCESSING_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_PROCESSING_START", "KONG_REWRITE_START"))
|
|
assert(is_greater_or_equal_to_start_time(ctx, "KONG_REWRITE_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_START", "KONG_REWRITE_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_REWRITE_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_REWRITE_ENDED_AT", "KONG_ACCESS_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_START", "KONG_ACCESS_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_ACCESS_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_ACCESS_ENDED_AT", "KONG_BALANCER_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_START", "KONG_BALANCER_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_BALANCER_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_HEADER_FILTER_START"))
|
|
if config.buffered then
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_RESPONSE_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_START", "KONG_RESPONSE_ENDED_AT"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_RESPONSE_ENDED_AT", "KONG_HEADER_FILTER_START"))
|
|
assert(is_non_negative_integer(ctx, "KONG_RESPONSE_TIME"))
|
|
else
|
|
assert(is_nil(ctx, "KONG_RESPONSE_START"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_RESPONSE_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BALANCER_ENDED_AT", "KONG_HEADER_FILTER_START"))
|
|
end
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_HEADER_FILTER_START", "KONG_HEADER_FILTER_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_HEADER_FILTER_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_HEADER_FILTER_ENDED_AT", "KONG_BODY_FILTER_START"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BODY_FILTER_START", "KONG_BODY_FILTER_ENDED_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_BODY_FILTER_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_BODY_FILTER_ENDED_AT", "KONG_LOG_START"))
|
|
if (not is_nil(ctx, "KONG_UPSTREAM_DNS_START") and not is_nil(ctx, "KONG_BALANCER_ENDED_AT")) then
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_UPSTREAM_DNS_START", "KONG_UPSTREAM_DNS_END_AT"))
|
|
assert(is_non_negative_integer(ctx, "KONG_UPSTREAM_DNS_TIME"))
|
|
assert(is_greater_or_equal_to_ctx_value(ctx, "KONG_UPSTREAM_DNS_END_AT", "KONG_LOG_START"))
|
|
assert(has_correct_upstream_dns_time(ctx))
|
|
end
|
|
assert(is_true(ctx, "KONG_PROXIED"))
|
|
assert(has_correct_proxy_latency(ctx))
|
|
assert(has_correct_waiting_time(ctx))
|
|
assert(has_correct_receive_time(ctx))
|
|
assert(is_nil(ctx, "KONG_PREREAD_START"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_PREREAD_TIME"))
|
|
assert(is_nil(ctx, "KONG_LOG_ENDED_AT"))
|
|
assert(is_nil(ctx, "KONG_LOG_TIME"))
|
|
end
|
|
|
|
assert(is_positive_integer(ctx, "host_port"))
|
|
end
|
|
|
|
|
|
return CtxTests
|