Finish the service and instance register.
diff --git a/examples/nginx.conf b/examples/nginx.conf
index 4368ca4..7473e5d 100644
--- a/examples/nginx.conf
+++ b/examples/nginx.conf
@@ -34,6 +34,7 @@
init_worker_by_lua_block {
local metadata_buffer = ngx.shared.tracing_buffer
metadata_buffer['serviceName'] = 'Service Name'
+ metadata_buffer['serviceInstanceName'] = 'Service Instance Name'
require("client"):startTimer(metadata_buffer, "http://127.0.0.1:8080/skywalking")
}
@@ -70,7 +71,7 @@
local contextCarrier = {}
contextCarrier["sw6"] = ngx.req.get_headers()["sw6"]
local entrySpan = tracingContext:createEntrySpan(ngx.var.uri, nil, contextCarrier)
- entrySpan:start(ngx.now())
+ entrySpan:start(ngx.now() * 1000)
entrySpan:setComponentId(nginxComponentId)
entrySpan:setLayer(Layer.HTTP)
@@ -89,7 +90,7 @@
local upstreamServerName = "upstream_ip:port"
------------------------------------------------------
local exitSpan = tracingContext:createExitSpan(upstreamUri, entrySpan, upstreamServerName, contextCarrier)
- exitSpan:start(ngx.now())
+ exitSpan:start(ngx.now() * 1000)
exitSpan:setComponentId(nginxComponentId)
exitSpan:setLayer(Layer.HTTP)
@@ -108,14 +109,14 @@
body_filter_by_lua_block {
-- Finish the exit span when received the first response package from upstream
if ngx.ctx.exitSpan ~= nil then
- ngx.ctx.exitSpan:finish()
+ ngx.ctx.exitSpan:finish(ngx.now() * 1000)
ngx.ctx.exitSpan = nil
end
}
log_by_lua_block {
if ngx.ctx.entrySpan ~= nil then
- ngx.ctx.entrySpan:finish()
+ ngx.ctx.entrySpan:finish(ngx.now() * 1000)
local status, segment = ngx.ctx.tracingContext:drainAfterFinished()
if status then
local segmentJson = require('cjson').encode(segment:transform())
@@ -129,6 +130,9 @@
}
}
+ # ------------------------------------------------------
+ # -- Mock backend business service as the upsteeam
+ # ------------------------------------------------------
location /backend {
default_type text/html;
content_by_lua_block {
@@ -137,12 +141,39 @@
}
}
+
+ # ------------------------------------------------------
+ # -- Mock OAP server to provide register and trace collection
+ # ------------------------------------------------------
location /skywalking/register/service {
default_type text/html;
+ lua_need_request_body on;
+
content_by_lua_block {
+ local cjson = require('cjson')
+
+ ngx.log(ngx.DEBUG, 'Service register request = ', ngx.req.get_body_data())
+ local param = cjson.decode(ngx.req.get_body_data())
+
local registeredInfo = {}
- registeredInfo[1] = {key="Service Name", value=1}
- ngx.say(require('cjson').encode(registeredInfo))
+ registeredInfo[1] = {key=param.services[1].serviceName, value=1}
+ ngx.say(cjson.encode(registeredInfo))
+ }
+ }
+
+ location /skywalking/register/serviceInstance {
+ default_type text/html;
+ lua_need_request_body on;
+
+ content_by_lua_block {
+ local cjson = require('cjson')
+ ngx.log(ngx.DEBUG, 'Service instance register request = ', ngx.req.get_body_data())
+ local param = cjson.decode(ngx.req.get_body_data())
+
+ local registeredInfo = {}
+
+ registeredInfo[1] = {key=param.instances[1].instanceUUID, value=1}
+ ngx.say(cjson.encode(registeredInfo))
}
}
}
diff --git a/lib/skywalking/client.lua b/lib/skywalking/client.lua
index 48bba96..cc91c60 100644
--- a/lib/skywalking/client.lua
+++ b/lib/skywalking/client.lua
@@ -37,10 +37,14 @@
-- Register is in the async way, if register successfully, go for instance register
if metadata_buffer['serviceId'] ~= nil then
if metadata_buffer['serviceInstId'] == nil then
-
+ self:registerServiceInstance(metadata_buffer, backend_http_uri)
end
end
+ -- After all register successfully, begin to send trace segments
+ if metadata_buffer['serviceInstId'] ~= nil then
+ end
+
-- do the health check
local ok, err = new_timer(delay, check)
if not ok then
@@ -65,8 +69,9 @@
local DEBUG = ngx.DEBUG
local serviceName = metadata_buffer['serviceName']
+
local cjson = require('cjson')
- local serviceRegister = require("register").newServiceRegister(serviceName)
+ local serviceRegister = require("register"):newServiceRegister(serviceName)
local serviceRegisterParam = cjson.encode(serviceRegister)
local http = require('resty.http')
@@ -80,6 +85,7 @@
})
if #res.body > 0 then
+ log(DEBUG, "Service register response = " .. res.body)
local registerResults = cjson.decode(res.body)
for i, result in ipairs(registerResults)
@@ -93,4 +99,43 @@
end
end
+-- Register service instance
+function Client:registerServiceInstance(metadata_buffer, backend_http_uri)
+ local log = ngx.log
+ local DEBUG = ngx.DEBUG
+
+ local serviceInstName = 'name:' .. metadata_buffer['serviceInstanceName']
+
+ local cjson = require('cjson')
+ local serviceInstanceRegister = require("register"):newServiceInstanceRegister(
+ metadata_buffer['serviceId'],
+ serviceInstName,
+ ngx.now() * 1000)
+ local serviceInstanceRegisterParam = cjson.encode(serviceInstanceRegister)
+
+ local http = require('resty.http')
+ local httpc = http.new()
+ local res, err = httpc:request_uri(backend_http_uri .. '/register/serviceInstance', {
+ method = "POST",
+ body = serviceInstanceRegisterParam,
+ headers = {
+ ["Content-Type"] = "application/json",
+ },
+ })
+
+ if #res.body > 0 then
+ log(DEBUG, "Service Instance register response = " .. res.body)
+ local registerResults = cjson.decode(res.body)
+
+ for i, result in ipairs(registerResults)
+ do
+ if result.key == serviceInstName then
+ local serviceId = result.value
+ log(DEBUG, "Service Instance registered, service instance id = " .. serviceId)
+ metadata_buffer['serviceInstId'] = serviceId
+ end
+ end
+ end
+end
+
return Client
\ No newline at end of file
diff --git a/lib/skywalking/register.lua b/lib/skywalking/register.lua
index 727b487..b6645bf 100644
--- a/lib/skywalking/register.lua
+++ b/lib/skywalking/register.lua
@@ -15,39 +15,42 @@
-- limitations under the License.
--
-local Services = {
- services
-}
-
-local Service = {
- serviceName,
- -- Field type is optional, default value is `normal`
- type = 'normal'
-}
-
-local ServiceInstances = {
- instances
-}
-
-local ServiceInstance = {
- serviceId,
- instanceUUID,
- time,
- tags,
- properties
-}
-
local Register = {}
-- Return Services as service register parameter
-function Register:newServiceRegister(serviceName)
- local o = {}
- setmetatable(o, Service)
- Service.__index = Service
+function Register:newServiceRegister(unRegisterServiceName)
+ local serv = {
+ services = {}
+ }
+
+ local service = {
+ serviceName = unRegisterServiceName,
+ -- Field type is optional, default value is `normal`
+ type = 'normal'
+ }
- o.serviceName = serviceName
+ serv.services[#serv.services + 1] = service
- return o
+ return serv
+end
+
+function Register:newServiceInstanceRegister(registeredServiceId, serviceInstUUID, registerTime)
+ local serviceInstances = {
+ instances = {}
+ }
+
+ local serviceInstance = {
+ serviceId = registeredServiceId,
+ instanceUUID = serviceInstUUID,
+ time = registerTime,
+ properties = {}
+ }
+
+ serviceInstance.properties[#serviceInstance.properties + 1] = {key = "language", value = "Lua"}
+
+ serviceInstances.instances[#serviceInstances.instances + 1] = serviceInstance
+
+ return serviceInstances
end
return Register
\ No newline at end of file
diff --git a/lib/skywalking/span.lua b/lib/skywalking/span.lua
index c02bdb6..6f8f3e1 100644
--- a/lib/skywalking/span.lua
+++ b/lib/skywalking/span.lua
@@ -168,7 +168,7 @@
end
context.internal:addActive(o)
- o.start_time = Util.timestamp()
+ -- o.start_time = Util.timestamp()
o.refs = {}
o.owner = context
o.tags = {}