105 lines
2.5 KiB
Lua
105 lines
2.5 KiB
Lua
local _M = {}
|
|
|
|
local timing
|
|
|
|
|
|
local function before_connect_new(self, options)
|
|
local destination
|
|
local scheme = options.scheme
|
|
if scheme == nil then
|
|
destination = "unix://" .. options.path
|
|
|
|
else
|
|
local port = options.port or (scheme == "http" and 80 or 443)
|
|
destination = scheme .. "://" .. options.host .. ":" .. port
|
|
end
|
|
|
|
self.__kong_timing_destination__ = destination
|
|
|
|
timing.enter_context("external_http")
|
|
timing.enter_context(destination)
|
|
end
|
|
|
|
|
|
-- https://github.com/ledgetech/lua-resty-http#TCP-only-connect
|
|
local function before_connect_deprecated(self, host, port, _options)
|
|
local destination
|
|
if type(port) == "number" then
|
|
destination = "http(s)://" .. host .. ":" .. port
|
|
|
|
else
|
|
destination = "unix://" .. host
|
|
end
|
|
|
|
self.__kong_timing_destination__ = destination
|
|
|
|
timing.enter_context("external_http")
|
|
timing.enter_context(destination)
|
|
end
|
|
|
|
|
|
local function before_connect(self, arg0, ...)
|
|
if type(arg0) == "table" then
|
|
before_connect_new(self, arg0)
|
|
return
|
|
end
|
|
|
|
before_connect_deprecated(self, arg0, ...)
|
|
end
|
|
|
|
|
|
local function after_connect()
|
|
timing.leave_context() -- leave destination
|
|
timing.leave_context() -- leave external_http
|
|
end
|
|
|
|
|
|
local function before_request(self, _params)
|
|
timing.enter_context("external_http")
|
|
timing.enter_context(self.__kong_timing_destination__ or "unknown")
|
|
timing.enter_context("http_request")
|
|
end
|
|
|
|
|
|
local function after_request()
|
|
timing.leave_context() -- leave http_request
|
|
timing.leave_context() -- leave destination
|
|
timing.leave_context() -- leave external_http
|
|
end
|
|
|
|
|
|
function _M.register_hooks(timing_module)
|
|
local http = require("resty.http")
|
|
local req_dyn_hook = require("kong.dynamic_hook")
|
|
|
|
--[[
|
|
The `connect()` function can receive <= 4 arguments (including `self`).
|
|
|
|
The `before_connect_deprecated()` is the deprecated version of `connect()`,
|
|
it can receive 4 arguments (including `self`).
|
|
|
|
The `connect()` function can receive 2 arguments (including `self`).
|
|
|
|
So the max_args is 4.
|
|
--]]
|
|
req_dyn_hook.hook_function("timing", http, "connect", 4, {
|
|
befores = { before_connect },
|
|
afters = { after_connect },
|
|
})
|
|
|
|
--[[
|
|
The `request()` function can receive <= 2 arguments (including `self`).
|
|
Here is the signature of the `request()` function:
|
|
function request(self, params)
|
|
--]]
|
|
req_dyn_hook.hook_function("timing", http, "request", 2, {
|
|
befores = { before_request },
|
|
afters = { after_request },
|
|
})
|
|
|
|
timing = timing_module
|
|
end
|
|
|
|
|
|
return _M
|