From 2794c0f06b664b5f21f374e239c0a79138e26550 Mon Sep 17 00:00:00 2001 From: Sam Handler Date: Wed, 17 Aug 2022 15:25:43 -0600 Subject: [PATCH 1/4] wrap context_storage in getter --- lib/opentelemetry/context.lua | 18 +++++++++--------- lib/opentelemetry/global.lua | 6 +++++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/opentelemetry/context.lua b/lib/opentelemetry/context.lua index e43281d..254c828 100644 --- a/lib/opentelemetry/context.lua +++ b/lib/opentelemetry/context.lua @@ -29,14 +29,14 @@ end -- @return token to be used for detaching -------------------------------------------------------------------------------- function _M.attach(self) - if otel_global.context_storage[context_key] then - table.insert(otel_global.context_storage[context_key], self) + if otel_global.get_context_storage()[context_key] then + table.insert(otel_global.get_context_storage()[context_key], self) else - otel_global.context_storage[context_key] = { self } + otel_global.get_context_storage()[context_key] = { self } end -- the length of the stack is token used to detach context - return #otel_global.context_storage[context_key] + return #otel_global.get_context_storage()[context_key] end -------------------------------------------------------------------------------- @@ -47,12 +47,12 @@ end -- @return boolean, string -------------------------------------------------------------------------------- function _M.detach(self, token) - if #otel_global.context_storage[context_key] == token then - table.remove(otel_global.context_storage[context_key]) + if #otel_global.get_context_storage()[context_key] == token then + table.remove(otel_global.get_context_storage()[context_key]) return true, nil else local error_message = "Token does not match (" .. - #otel_global.context_storage[context_key] .. + #otel_global.get_context_storage()[context_key] .. " context entries in stack, token provided was " .. token .. ")." ngx.log(ngx.WARN, error_message) return false, error_message @@ -66,8 +66,8 @@ end -- @return boolean, string -------------------------------------------------------------------------------- function _M.current() - return otel_global.context_storage[context_key] and - otel_global.context_storage[context_key][#otel_global.context_storage[context_key]] + return otel_global.get_context_storage()[context_key] and + otel_global.get_context_storage()[context_key][#otel_global.get_context_storage()[context_key]] end -------------------------------------------------------------------------------- diff --git a/lib/opentelemetry/global.lua b/lib/opentelemetry/global.lua index 3f058c8..d054956 100644 --- a/lib/opentelemetry/global.lua +++ b/lib/opentelemetry/global.lua @@ -1,4 +1,4 @@ -_M = { context_storage = ngx.ctx } +_M = { context_storage = nil } function _M.set_tracer_provider(tp) _M.tracer_provider = tp @@ -12,6 +12,10 @@ function _M.tracer(name, opts) return _M.tracer_provider:tracer(name, opts) end +function _M.get_context_storage() + return _M.context_storage or ngx.ctx +end + function _M.set_context_storage(context_storage) _M.context_storage = context_storage end From 618acea97b627710f7b498193147e74573ca98f1 Mon Sep 17 00:00:00 2001 From: Sam Handler Date: Wed, 17 Aug 2022 15:57:23 -0600 Subject: [PATCH 2/4] return empty context if non exists in storage --- lib/opentelemetry/context.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/opentelemetry/context.lua b/lib/opentelemetry/context.lua index 254c828..7851db1 100644 --- a/lib/opentelemetry/context.lua +++ b/lib/opentelemetry/context.lua @@ -66,8 +66,11 @@ end -- @return boolean, string -------------------------------------------------------------------------------- function _M.current() - return otel_global.get_context_storage()[context_key] and - otel_global.get_context_storage()[context_key][#otel_global.get_context_storage()[context_key]] + if otel_global.get_context_storage()[context_key] then + return otel_global.get_context_storage()[context_key][#otel_global.get_context_storage()[context_key]] + else + return _M.new() + end end -------------------------------------------------------------------------------- From b2874c5e5a98a768b966a78291b7d756fefb945d Mon Sep 17 00:00:00 2001 From: Sam Handler Date: Mon, 22 Aug 2022 11:59:37 -0600 Subject: [PATCH 3/4] make sure context doesn't have span attached --- t/context.t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/context.t b/t/context.t index 202c886..3f4baa5 100644 --- a/t/context.t +++ b/t/context.t @@ -31,7 +31,7 @@ location = /t { local tracer_provider = require("opentelemetry.trace.tracer_provider").new() local tracer = tracer_provider:tracer("unit_test") local context, recording_span = tracer:start(context, "recording") - if context.current() ~= nil then + if context.current().sp ~= nil then ngx.say("unexpected context.current()") end context:attach() From b1ca37328dae9a9490a349fe305c0901ff67149f Mon Sep 17 00:00:00 2001 From: Sam Handler Date: Mon, 22 Aug 2022 14:55:29 -0600 Subject: [PATCH 4/4] fixup test --- t/context.t | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/t/context.t b/t/context.t index 3f4baa5..543d7cc 100644 --- a/t/context.t +++ b/t/context.t @@ -31,8 +31,8 @@ location = /t { local tracer_provider = require("opentelemetry.trace.tracer_provider").new() local tracer = tracer_provider:tracer("unit_test") local context, recording_span = tracer:start(context, "recording") - if context.current().sp ~= nil then - ngx.say("unexpected context.current()") + if context.current().sp:is_recording() ~= false then + ngx.say("expected context.current() span to be non-recording") end context:attach() if context.current():span().name ~= "recording" then