You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.4 KiB
Lua

local floor = math.floor
local assert = assert
local type = type
local util = require("tracing.util")
-- local skynet = require("skynet")
local setmetatable = setmetatable
-------------------------------------------------
local span_methods = {}
local span_mt = {
__index = span_methods,
}
-- local messageColloctorAddr
local function new(operat_name, trace_id, parent_id, kind)
kind = kind or "SERVER"
local nowTime = util.get_timestamp()
local span_id = util.generate_span_id(nowTime)
if not trace_id then
trace_id = span_id
end
assert(kind == "SERVER" or kind == "CLIENT", "invalid span kind")
assert(type(operat_name) == "string" and operat_name ~= "", "invalid span name") -- 方法名
assert(type(trace_id) == "string", "invalid trace id")
assert(type(span_id) == "string", "invalid span id")
if parent_id then
assert(type(parent_id) == "string", "invalid parent id")
end
return setmetatable({
kind = kind,
traceId = trace_id,
id = span_id,
parentId = parent_id,
name = operat_name,
timestamp = nowTime,
localEndpoint = {
serviceName = SERVICE_NAME,
},
}, span_mt)
end
function span_methods:finish()
assert(self.duration == nil, "span already finished")
local duration = util.get_timestamp() - self.timestamp
assert(duration >= 0, "invalid span duration")
self.duration = floor(duration)
-- TODO: xiaojin 增加 前缀
-- self:set_tag("k", gKingdomID and tostring(gKingdomID))
-- self:set_tag("m", gMapID and tostring(gMapID))
-- self:set_tag("u", gUid and tostring(gUid))
-- self:set_tag("p", tostring(skynet.self()))
-- if not messageColloctorAddr then
-- messageColloctorAddr = svrAddressMgr.getSvr(svrAddressMgr.messageCollectorService)
-- end
-- skynet.send(messageColloctorAddr, "lua", "sendMessage", TableUtil.cloneWithoutMeta(self))
return true
end
function span_methods:set_tag(key, value)
if not value then
return false
end
assert(type(key) == "string", "invalid tag key must string")
assert(type(value) == "string", "invalid tag value must string")
local tags = self.tags
if tags then
tags[key] = value
else
tags = {
[key] = value,
}
self.tags = tags
end
return true
end
return {
new = new,
}