in kong/kong/plugins/zipkin/handler.lua [288:390]
function ZipkinLogHandler:log(conf)
local now_mu = ngx_now_mu()
local zipkin = get_context(conf, kong.ctx.plugin)
local ngx_ctx = ngx.ctx
local request_span = zipkin.request_span
local proxy_span = get_or_add_proxy_span(zipkin, now_mu)
local reporter = get_reporter(conf)
local proxy_finish_mu =
ngx_ctx.KONG_BODY_FILTER_ENDED_AT and ngx_ctx.KONG_BODY_FILTER_ENDED_AT * 1000
or now_mu
if ngx_ctx.KONG_REWRITE_START and ngx_ctx.KONG_REWRITE_TIME then
local rewrite_finish_mu = (ngx_ctx.KONG_REWRITE_START + ngx_ctx.KONG_REWRITE_TIME) * 1000
zipkin.request_span:annotate("krf", rewrite_finish_mu)
end
if subsystem == "http" then
local access_start_mu =
ngx_ctx.KONG_ACCESS_START and ngx_ctx.KONG_ACCESS_START * 1000
or proxy_span.timestamp
proxy_span:annotate("kas", access_start_mu)
local access_finish_mu =
ngx_ctx.KONG_ACCESS_ENDED_AT and ngx_ctx.KONG_ACCESS_ENDED_AT * 1000
or proxy_finish_mu
proxy_span:annotate("kaf", access_finish_mu)
if not zipkin.header_filter_finished then
proxy_span:annotate("khf", now_mu)
zipkin.header_filter_finished = true
end
proxy_span:annotate("kbf", now_mu)
else
local preread_finish_mu =
ngx_ctx.KONG_PREREAD_ENDED_AT and ngx_ctx.KONG_PREREAD_ENDED_AT * 1000
or proxy_finish_mu
proxy_span:annotate("kpf", preread_finish_mu)
end
local balancer_data = ngx_ctx.balancer_data
if balancer_data then
local balancer_tries = balancer_data.tries
local upstream_connect_time = split(ngx_var.upstream_connect_time, ", ", "jo")
for i = 1, balancer_data.try_count do
local try = balancer_tries[i]
local name = fmt("%s (balancer try %d)", request_span.name, i)
local span = request_span:new_child("CLIENT", name, try.balancer_start * 1000)
span.ip = try.ip
span.port = try.port
span:set_tag("kong.balancer.try", i)
if i < balancer_data.try_count then
span:set_tag("error", true)
span:set_tag("kong.balancer.state", try.state)
span:set_tag("http.status_code", try.code)
end
tag_with_service_and_route(span)
if try.balancer_latency ~= nil then
local try_connect_time = (tonumber(upstream_connect_time[i]) or 0) * 1000
span:finish((try.balancer_start + try.balancer_latency + try_connect_time) * 1000)
else
span:finish(now_mu)
end
reporter:report(span)
end
proxy_span:set_tag("peer.hostname", balancer_data.hostname)
proxy_span.ip = balancer_data.ip
proxy_span.port = balancer_data.port
end
if subsystem == "http" then
request_span:set_tag("http.status_code", kong.response.get_status())
end
if ngx_ctx.authenticated_consumer then
request_span:set_tag("kong.consumer", ngx_ctx.authenticated_consumer.id)
end
if conf.include_credential and ngx_ctx.authenticated_credential then
request_span:set_tag("kong.credential", ngx_ctx.authenticated_credential.id)
end
request_span:set_tag("kong.node.id", kong.node.get_id())
tag_with_service_and_route(proxy_span)
proxy_span:finish(proxy_finish_mu)
reporter:report(proxy_span)
request_span:finish(now_mu)
reporter:report(request_span)
local ok, err = ngx.timer.at(0, timer_log, reporter)
if not ok then
kong.log.err("failed to create timer: ", err)
end
end