Skip to content

Commit 3f40dc7

Browse files
committed
add shutdown and forceflush to sdk TracerProvider
1 parent 1fe42f6 commit 3f40dc7

File tree

3 files changed

+70
-5
lines changed

3 files changed

+70
-5
lines changed

sdk/trace/+opentelemetry/+sdk/+trace/TracerProvider.m

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
properties (Access=private)
88
Proxy % Proxy object to interface C++ code
9+
isShutdown (1,1) logical = false
910
end
1011

1112
properties (SetAccess=private)
@@ -101,8 +102,10 @@ function addSpanProcessor(obj, processor)
101102
obj
102103
processor (1,1) {mustBeA(processor, "opentelemetry.sdk.trace.SpanProcessor")}
103104
end
104-
obj.Proxy.addSpanProcessor(processor.Proxy.ID);
105-
obj.SpanProcessor(end+1) = processor; % append
105+
if ~obj.isShutdown
106+
obj.Proxy.addSpanProcessor(processor.Proxy.ID);
107+
obj.SpanProcessor(end+1) = processor; % append
108+
end
106109
end
107110

108111
function tracer = getTracer(obj, trname, trversion, trschema)
@@ -125,13 +128,14 @@ function addSpanProcessor(obj, processor)
125128
% name, version, schema accepts any types that can convert to a
126129
% string
127130
import opentelemetry.utils.mustBeScalarString
128-
trname = mustBeScalarString(trname);
131+
trname = mustBeScalarString(trname);
129132
trversion = mustBeScalarString(trversion);
130133
trschema = mustBeScalarString(trschema);
131134
id = obj.Proxy.getTracer(trname, trversion, trschema);
132-
tracerproxy = libmexclass.proxy.Proxy("Name", ...
135+
136+
tracerproxy = libmexclass.proxy.Proxy("Name", ...
133137
"libmexclass.opentelemetry.TracerProxy", "ID", id);
134-
tracer = opentelemetry.trace.Tracer(tracerproxy, trname, trversion, trschema);
138+
tracer = opentelemetry.trace.Tracer(tracerproxy, trname, trversion, trschema);
135139
end
136140

137141
function setTracerProvider(obj)
@@ -142,5 +146,39 @@ function setTracerProvider(obj)
142146
% See also OPENTELEMETRY.TRACE.PROVIDER.GETTRACERPROVIDER
143147
obj.Proxy.setTracerProvider();
144148
end
149+
150+
function success = shutdown(obj)
151+
% SHUTDOWN Shutdown
152+
% SUCCESS = SHUTDOWN(TP) shuts down all span processors associated with tracer provider TP
153+
% and return a logical that indicates whether shutdown was successful.
154+
%
155+
% See also FORCEFLUSH
156+
if ~obj.isShutdown
157+
success = obj.Proxy.shutdown();
158+
obj.isShutdown = success;
159+
else
160+
success = true;
161+
end
162+
end
163+
164+
function success = forceFlush(obj, timeout)
165+
% FORCEFLUSH Force flush
166+
% SUCCESS = FORCEFLUSH(TP) immediately exports all spans
167+
% that have not yet been exported. Returns a logical that
168+
% indicates whether force flush was successful.
169+
%
170+
% SUCCESS = FORCEFLUSH(TP, TIMEOUT) specifies a TIMEOUT
171+
% duration. Force flush must be completed within this time,
172+
% or else it will fail.
173+
%
174+
% See also SHUTDOWN
175+
if obj.isShutdown
176+
success = false;
177+
elseif nargin < 2 || ~isa(timeout, "duration") % ignore timeout if not a duration
178+
success = obj.Proxy.forceFlush();
179+
else
180+
success = obj.Proxy.forceFlush(milliseconds(timeout)*1000); % convert to microseconds
181+
end
182+
end
145183
end
146184
end

sdk/trace/include/opentelemetry-matlab/sdk/trace/TracerProviderProxy.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,16 @@ class TracerProviderProxy : public libmexclass::opentelemetry::TracerProviderPro
1212
public:
1313
TracerProviderProxy(nostd::shared_ptr<trace_api::TracerProvider> tp) : libmexclass::opentelemetry::TracerProviderProxy(tp) {
1414
REGISTER_METHOD(TracerProviderProxy, addSpanProcessor);
15+
REGISTER_METHOD(TracerProviderProxy, shutdown);
16+
REGISTER_METHOD(TracerProviderProxy, forceFlush);
1517
}
1618

1719
static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments);
1820

1921
void addSpanProcessor(libmexclass::proxy::method::Context& context);
22+
23+
void shutdown(libmexclass::proxy::method::Context& context);
24+
25+
void forceFlush(libmexclass::proxy::method::Context& context);
2026
};
2127
} // namespace libmexclass::opentelemetry

sdk/trace/src/TracerProviderProxy.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
#include "opentelemetry/sdk/trace/tracer_provider.h"
1212
#include "opentelemetry/sdk/resource/resource.h"
1313
#include "opentelemetry/trace/tracer_provider.h"
14+
#include "opentelemetry/trace/noop.h"
1415
#include "opentelemetry/common/key_value_iterable_view.h"
1516

1617
namespace trace_api = opentelemetry::trace;
1718
namespace trace_sdk = opentelemetry::sdk::trace;
1819
namespace resource = opentelemetry::sdk::resource;
1920
namespace common_sdk = opentelemetry::sdk::common;
21+
namespace nostd = opentelemetry::nostd;
2022

2123
namespace libmexclass::opentelemetry::sdk {
2224
libmexclass::proxy::MakeResult TracerProviderProxy::make(const libmexclass::proxy::FunctionArguments& constructor_arguments) {
@@ -64,4 +66,23 @@ void TracerProviderProxy::addSpanProcessor(libmexclass::proxy::method::Context&
6466
libmexclass::proxy::ProxyManager::getProxy(processorid))->getInstance());
6567
}
6668

69+
void TracerProviderProxy::shutdown(libmexclass::proxy::method::Context& context) {
70+
matlab::data::ArrayFactory factory;
71+
auto result_mda = factory.createScalar(static_cast<trace_sdk::TracerProvider&>(*CppTracerProvider).Shutdown());
72+
context.outputs[0] = result_mda;
73+
CppTracerProvider.swap(nostd::shared_ptr<trace_api::TracerProvider>(new trace_api::NoopTracerProvider));
74+
}
75+
76+
void TracerProviderProxy::forceFlush(libmexclass::proxy::method::Context& context) {
77+
matlab::data::ArrayFactory factory;
78+
79+
if (context.inputs.getNumberOfElements() == 0) {
80+
context.outputs[0] = factory.createScalar(static_cast<trace_sdk::TracerProvider&>(*CppTracerProvider).ForceFlush());
81+
} else { // number of inputs > 0
82+
matlab::data::TypedArray<double> timeout_mda = context.inputs[0];
83+
auto timeout = std::chrono::microseconds(timeout_mda[0]);
84+
context.outputs[0] = factory.createScalar(static_cast<trace_sdk::TracerProvider&>(*CppTracerProvider).ForceFlush(timeout));
85+
}
86+
}
87+
6788
} // namespace libmexclass::opentelemetry

0 commit comments

Comments
 (0)