diff --git a/OtelMatlabProxyFactory.cpp b/OtelMatlabProxyFactory.cpp index 3a9cd55..1ceb3f3 100644 --- a/OtelMatlabProxyFactory.cpp +++ b/OtelMatlabProxyFactory.cpp @@ -1,4 +1,4 @@ -// Copyright 2023-2024 The MathWorks, Inc. +// Copyright 2023-2025 The MathWorks, Inc. #include "OtelMatlabProxyFactory.h" @@ -8,7 +8,10 @@ //#include "opentelemetry-matlab/trace/ScopeProxy.h" #include "opentelemetry-matlab/trace/SpanContextProxy.h" #include "opentelemetry-matlab/trace/TraceContextPropagatorProxy.h" +#include "opentelemetry-matlab/trace/NoOpTracerProviderProxy.h" +#include "opentelemetry-matlab/metrics/NoOpMeterProviderProxy.h" #include "opentelemetry-matlab/logs/LoggerProviderProxy.h" +#include "opentelemetry-matlab/logs/NoOpLoggerProviderProxy.h" #include "opentelemetry-matlab/context/propagation/TextMapCarrierProxy.h" #include "opentelemetry-matlab/context/propagation/TextMapPropagatorProxy.h" #include "opentelemetry-matlab/context/propagation/CompositePropagatorProxy.h" @@ -57,6 +60,9 @@ OtelMatlabProxyFactory::make_proxy(const libmexclass::proxy::ClassName& class_na REGISTER_PROXY(libmexclass.opentelemetry.SpanProxy, libmexclass::opentelemetry::SpanProxy); //REGISTER_PROXY(libmexclass.opentelemetry.ScopeProxy, libmexclass::opentelemetry::ScopeProxy); REGISTER_PROXY(libmexclass.opentelemetry.SpanContextProxy, libmexclass::opentelemetry::SpanContextProxy); + REGISTER_PROXY(libmexclass.opentelemetry.NoOpTracerProviderProxy, libmexclass::opentelemetry::NoOpTracerProviderProxy); + REGISTER_PROXY(libmexclass.opentelemetry.NoOpMeterProviderProxy, libmexclass::opentelemetry::NoOpMeterProviderProxy); + REGISTER_PROXY(libmexclass.opentelemetry.NoOpLoggerProviderProxy, libmexclass::opentelemetry::NoOpLoggerProviderProxy); REGISTER_PROXY(libmexclass.opentelemetry.TextMapCarrierProxy, libmexclass::opentelemetry::TextMapCarrierProxy); REGISTER_PROXY(libmexclass.opentelemetry.ContextProxy, libmexclass::opentelemetry::ContextProxy); REGISTER_PROXY(libmexclass.opentelemetry.TokenProxy, libmexclass::opentelemetry::TokenProxy); diff --git a/api/logs/+opentelemetry/+logs/+internal/NoOpLoggerProvider.m b/api/logs/+opentelemetry/+logs/+internal/NoOpLoggerProvider.m new file mode 100644 index 0000000..39697bd --- /dev/null +++ b/api/logs/+opentelemetry/+logs/+internal/NoOpLoggerProvider.m @@ -0,0 +1,20 @@ +classdef NoOpLoggerProvider < handle + % A no-op logger provider does nothing and is used to disable logging. + % For internal use only. + + % Copyright 2025 The MathWorks, Inc. + + properties (Access=private) + Proxy % Proxy object to interface C++ code + end + + methods (Access=?opentelemetry.logs.Provider) + function obj = NoOpLoggerProvider() + % constructs a no-op LoggerProvider and sets it as the global + % instance + obj.Proxy = libmexclass.proxy.Proxy("Name", ... + "libmexclass.opentelemetry.NoOpLoggerProviderProxy", ... + "ConstructorArguments", {}); + end + end +end diff --git a/api/logs/+opentelemetry/+logs/Provider.m b/api/logs/+opentelemetry/+logs/Provider.m index 6a54653..1e669d4 100644 --- a/api/logs/+opentelemetry/+logs/Provider.m +++ b/api/logs/+opentelemetry/+logs/Provider.m @@ -1,7 +1,7 @@ classdef Provider % Get and set the global instance of logger provider -% Copyright 2024 The MathWorks, Inc. +% Copyright 2024-2025 The MathWorks, Inc. methods (Static) function p = getLoggerProvider() @@ -19,10 +19,22 @@ function setLoggerProvider(p) % OPENTELEMETRY.LOGS.PROVIDER.SETLOGGERPROVIDER(LP) sets % LP as the global instance of logger provider. % - % See also OPENTELEMETRY.LOGS.PROVIDER.GETTRACERPROVIDER + % See also OPENTELEMETRY.LOGS.PROVIDER.GETLOGGERPROVIDER, + % OPENTELEMETRY.LOGS.PROVIDER.UNSETLOGGERPROVIDER p.setLoggerProvider(); end + + function unsetLoggerProvider() + % Unset the global instance of logger provider, which disables + % logging + % OPENTELEMETRY.LOGS.PROVIDER.UNSETLOGGERPROVIDER() unsets + % the global instance of logger provider. + % + % See also OPENTELEMETRY.LOGS.PROVIDER.SETLOGGERPROVIDER + + opentelemetry.logs.internal.NoOpLoggerProvider; + end end end diff --git a/api/logs/include/opentelemetry-matlab/logs/NoOpLoggerProviderProxy.h b/api/logs/include/opentelemetry-matlab/logs/NoOpLoggerProviderProxy.h new file mode 100644 index 0000000..8d7bb00 --- /dev/null +++ b/api/logs/include/opentelemetry-matlab/logs/NoOpLoggerProviderProxy.h @@ -0,0 +1,29 @@ +// Copyright 2025 The MathWorks, Inc. + +#pragma once + +#include "libmexclass/proxy/Proxy.h" + +#include "opentelemetry/logs/logger_provider.h" +#include "opentelemetry/logs/provider.h" +#include "opentelemetry/logs/noop.h" + +namespace logs_api = opentelemetry::logs; +namespace nostd = opentelemetry::nostd; + +namespace libmexclass::opentelemetry { +class NoOpLoggerProviderProxy : public libmexclass::proxy::Proxy { + public: + NoOpLoggerProviderProxy(nostd::shared_ptr lp) : CppLoggerProvider(lp) { + // set as global LoggerProvider instance + logs_api::Provider::SetLoggerProvider(CppLoggerProvider); + } + + static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments) { + return std::make_shared(nostd::shared_ptr(new logs_api::NoopLoggerProvider())); + } + + protected: + nostd::shared_ptr CppLoggerProvider; +}; +} // namespace libmexclass::opentelemetry diff --git a/api/metrics/+opentelemetry/+metrics/+internal/NoOpMeterProvider.m b/api/metrics/+opentelemetry/+metrics/+internal/NoOpMeterProvider.m new file mode 100644 index 0000000..e129449 --- /dev/null +++ b/api/metrics/+opentelemetry/+metrics/+internal/NoOpMeterProvider.m @@ -0,0 +1,20 @@ +classdef NoOpMeterProvider < handle + % A no-op meter provider does nothing and is used to disable metrics. + % For internal use only. + + % Copyright 2025 The MathWorks, Inc. + + properties (Access=private) + Proxy % Proxy object to interface C++ code + end + + methods (Access=?opentelemetry.metrics.Provider) + function obj = NoOpMeterProvider() + % constructs a no-op MeterProvider and sets it as the global + % instance + obj.Proxy = libmexclass.proxy.Proxy("Name", ... + "libmexclass.opentelemetry.NoOpMeterProviderProxy", ... + "ConstructorArguments", {}); + end + end +end diff --git a/api/metrics/+opentelemetry/+metrics/Provider.m b/api/metrics/+opentelemetry/+metrics/Provider.m index beca183..39d54d2 100644 --- a/api/metrics/+opentelemetry/+metrics/Provider.m +++ b/api/metrics/+opentelemetry/+metrics/Provider.m @@ -1,7 +1,7 @@ classdef Provider % Get and set the global instance of meter provider -% Copyright 2023 The MathWorks, Inc. +% Copyright 2023-2025 The MathWorks, Inc. methods (Static) function p = getMeterProvider() @@ -19,9 +19,21 @@ function setMeterProvider(p) % OPENTELEMETRY.METRICS.PROVIDER.GETMETERPROVIDER(MP) sets % MP as the global instance of meter provider. % - % See also OPENTELEMETRY.METRICS.PROVIDER.GETMETERPROVIDER + % See also OPENTELEMETRY.METRICS.PROVIDER.GETMETERPROVIDER, + % OPENTELEMETRY.METRICS.PROVIDER.UNSETMETERPROVIDER p.setMeterProvider(); end + + function unsetMeterProvider() + % Unset the global instance of meter provider, which disables + % metrics + % OPENTELEMETRY.METRICS.PROVIDER.UNSETMETERPROVIDER() unsets + % the global instance of meter provider. + % + % See also OPENTELEMETRY.METRICS.PROVIDER.SETMETERPROVIDER + + opentelemetry.metrics.internal.NoOpMeterProvider; + end end end diff --git a/api/metrics/include/opentelemetry-matlab/metrics/NoOpMeterProviderProxy.h b/api/metrics/include/opentelemetry-matlab/metrics/NoOpMeterProviderProxy.h new file mode 100644 index 0000000..d08515c --- /dev/null +++ b/api/metrics/include/opentelemetry-matlab/metrics/NoOpMeterProviderProxy.h @@ -0,0 +1,29 @@ +// Copyright 2025 The MathWorks, Inc. + +#pragma once + +#include "libmexclass/proxy/Proxy.h" + +#include "opentelemetry/metrics/meter_provider.h" +#include "opentelemetry/metrics/provider.h" +#include "opentelemetry/metrics/noop.h" + +namespace metrics_api = opentelemetry::metrics; +namespace nostd = opentelemetry::nostd; + +namespace libmexclass::opentelemetry { +class NoOpMeterProviderProxy : public libmexclass::proxy::Proxy { + public: + NoOpMeterProviderProxy(nostd::shared_ptr mp) : CppMeterProvider(mp) { + // set as global MeterProvider instance + metrics_api::Provider::SetMeterProvider(CppMeterProvider); + } + + static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments) { + return std::make_shared(nostd::shared_ptr(new metrics_api::NoopMeterProvider())); + } + + protected: + nostd::shared_ptr CppMeterProvider; +}; +} // namespace libmexclass::opentelemetry diff --git a/api/trace/+opentelemetry/+trace/+internal/NoOpTracerProvider.m b/api/trace/+opentelemetry/+trace/+internal/NoOpTracerProvider.m new file mode 100644 index 0000000..da4417d --- /dev/null +++ b/api/trace/+opentelemetry/+trace/+internal/NoOpTracerProvider.m @@ -0,0 +1,20 @@ +classdef NoOpTracerProvider < handle + % A no-op tracer provider does nothing and is used to disable tracing. + % For internal use only. + + % Copyright 2025 The MathWorks, Inc. + + properties (Access=private) + Proxy % Proxy object to interface C++ code + end + + methods (Access=?opentelemetry.trace.Provider) + function obj = NoOpTracerProvider() + % constructs a no-op TracerProvider and sets it as the global + % instance + obj.Proxy = libmexclass.proxy.Proxy("Name", ... + "libmexclass.opentelemetry.NoOpTracerProviderProxy", ... + "ConstructorArguments", {}); + end + end +end diff --git a/api/trace/+opentelemetry/+trace/Provider.m b/api/trace/+opentelemetry/+trace/Provider.m index f595a1a..f585583 100644 --- a/api/trace/+opentelemetry/+trace/Provider.m +++ b/api/trace/+opentelemetry/+trace/Provider.m @@ -1,7 +1,7 @@ classdef Provider % Get and set the global instance of tracer provider -% Copyright 2023 The MathWorks, Inc. +% Copyright 2023-2025 The MathWorks, Inc. methods (Static) function p = getTracerProvider() @@ -16,13 +16,25 @@ function setTracerProvider(p) % Set the global instance of tracer provider - % OPENTELEMETRY.TRACE.PROVIDER.GETTRACERPROVIDER(TP) sets + % OPENTELEMETRY.TRACE.PROVIDER.SETTRACERPROVIDER(TP) sets % TP as the global instance of tracer provider. % - % See also OPENTELEMETRY.TRACE.PROVIDER.GETTRACERPROVIDER + % See also OPENTELEMETRY.TRACE.PROVIDER.GETTRACERPROVIDER, + % OPENTELEMETRY.TRACE.PROVIDER.UNSETTRACERPROVIDER p.setTracerProvider(); end + + function unsetTracerProvider() + % Unset the global instance of tracer provider, which disables + % tracing + % OPENTELEMETRY.TRACE.PROVIDER.UNSETTRACERPROVIDER() unsets + % the global instance of tracer provider. + % + % See also OPENTELEMETRY.TRACE.PROVIDER.SETTRACERPROVIDER + + opentelemetry.trace.internal.NoOpTracerProvider; + end end end diff --git a/api/trace/include/opentelemetry-matlab/trace/NoOpTracerProviderProxy.h b/api/trace/include/opentelemetry-matlab/trace/NoOpTracerProviderProxy.h new file mode 100644 index 0000000..fcb4820 --- /dev/null +++ b/api/trace/include/opentelemetry-matlab/trace/NoOpTracerProviderProxy.h @@ -0,0 +1,29 @@ +// Copyright 2025 The MathWorks, Inc. + +#pragma once + +#include "libmexclass/proxy/Proxy.h" + +#include "opentelemetry/trace/tracer_provider.h" +#include "opentelemetry/trace/provider.h" +#include "opentelemetry/trace/noop.h" + +namespace trace_api = opentelemetry::trace; +namespace nostd = opentelemetry::nostd; + +namespace libmexclass::opentelemetry { +class NoOpTracerProviderProxy : public libmexclass::proxy::Proxy { + public: + NoOpTracerProviderProxy(nostd::shared_ptr tp) : CppTracerProvider(tp) { + // set as global TracerProvider instance + trace_api::Provider::SetTracerProvider(CppTracerProvider); + } + + static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments) { + return std::make_shared(nostd::shared_ptr(new trace_api::NoopTracerProvider())); + } + + protected: + nostd::shared_ptr CppTracerProvider; +}; +} // namespace libmexclass::opentelemetry diff --git a/test/fixtures/LoggerProviderFixture.m b/test/fixtures/LoggerProviderFixture.m new file mode 100644 index 0000000..29695f6 --- /dev/null +++ b/test/fixtures/LoggerProviderFixture.m @@ -0,0 +1,26 @@ +classdef LoggerProviderFixture < matlab.unittest.fixtures.Fixture + % tests fixture for setting the global LoggerProvider instance. + + % Copyright 2025 The MathWorks, Inc. + + properties (SetAccess=immutable) + LoggerProvider (1,1) + end + + methods + function fixture = LoggerProviderFixture(lp) + fixture.LoggerProvider = lp; + end + + function setup(fixture) + setLoggerProvider(fixture.LoggerProvider); + fixture.addTeardown(@opentelemetry.logs.Provider.unsetLoggerProvider); + end + end + + methods (Access=protected) + function tf = isCompatible(fixture1,fixture2) + tf = fixture1.LoggerProvider == fixture2.LoggerProvider; + end + end +end \ No newline at end of file diff --git a/test/fixtures/MeterProviderFixture.m b/test/fixtures/MeterProviderFixture.m new file mode 100644 index 0000000..1edcf88 --- /dev/null +++ b/test/fixtures/MeterProviderFixture.m @@ -0,0 +1,26 @@ +classdef MeterProviderFixture < matlab.unittest.fixtures.Fixture + % tests fixture for setting the global MeterProvider instance. + + % Copyright 2025 The MathWorks, Inc. + + properties (SetAccess=immutable) + MeterProvider (1,1) + end + + methods + function fixture = MeterProviderFixture(mp) + fixture.MeterProvider = mp; + end + + function setup(fixture) + setMeterProvider(fixture.MeterProvider); + fixture.addTeardown(@opentelemetry.metrics.Provider.unsetMeterProvider); + end + end + + methods (Access=protected) + function tf = isCompatible(fixture1,fixture2) + tf = fixture1.MeterProvider == fixture2.MeterProvider; + end + end +end \ No newline at end of file diff --git a/test/fixtures/TracerProviderFixture.m b/test/fixtures/TracerProviderFixture.m new file mode 100644 index 0000000..e62df76 --- /dev/null +++ b/test/fixtures/TracerProviderFixture.m @@ -0,0 +1,26 @@ +classdef TracerProviderFixture < matlab.unittest.fixtures.Fixture + % tests fixture for setting the global TracerProvider instance. + + % Copyright 2025 The MathWorks, Inc. + + properties (SetAccess=immutable) + TracerProvider (1,1) + end + + methods + function fixture = TracerProviderFixture(tp) + fixture.TracerProvider = tp; + end + + function setup(fixture) + setTracerProvider(fixture.TracerProvider); + fixture.addTeardown(@opentelemetry.trace.Provider.unsetTracerProvider); + end + end + + methods (Access=protected) + function tf = isCompatible(fixture1,fixture2) + tf = fixture1.TracerProvider == fixture2.TracerProvider; + end + end +end \ No newline at end of file diff --git a/test/performance/logsTest.m b/test/performance/logsTest.m index 7c2b979..2a4379f 100644 --- a/test/performance/logsTest.m +++ b/test/performance/logsTest.m @@ -1,7 +1,7 @@ classdef logsTest < matlab.perftest.TestCase % performance tests for logs -% Copyright 2024 The MathWorks, Inc. +% Copyright 2024-2025 The MathWorks, Inc. properties OtelConfigFile @@ -18,16 +18,16 @@ methods (TestClassSetup) function setupOnce(testCase) - % add directory where common setup and teardown code lives - utilsfolder = fullfile(fileparts(mfilename('fullpath')), "..", "utils"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(utilsfolder)); + % add utils and fixtures folder to the path + folders = fullfile(fileparts(mfilename('fullpath')), "..", ["utils" "fixtures"]); + testCase.applyFixture(matlab.unittest.fixtures.PathFixture(folders)); commonSetupOnce(testCase); % create a global logger provider import opentelemetry.sdk.logs.* lp = LoggerProvider(BatchLogRecordProcessor()); - setLoggerProvider(lp); + testCase.applyFixture(LoggerProviderFixture(lp)); end end diff --git a/test/performance/metricsTest.m b/test/performance/metricsTest.m index 56a1e43..807c063 100644 --- a/test/performance/metricsTest.m +++ b/test/performance/metricsTest.m @@ -18,19 +18,15 @@ methods (TestClassSetup) function setupOnce(testCase) - % add directory where common setup and teardown code lives - utilsfolder = fullfile(fileparts(mfilename('fullpath')), "..", "utils"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(utilsfolder)); - - % add the callbacks folder to the path - callbackfolder = fullfile(fileparts(mfilename('fullpath')), "..", "callbacks"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(callbackfolder)); + % add utils, callbacks, and fixtures folders to the path + folders = fullfile(fileparts(mfilename('fullpath')), "..", ["utils" "callbacks" "fixtures"]); + testCase.applyFixture(matlab.unittest.fixtures.PathFixture(folders)); commonSetupOnce(testCase); % create a global meter provider mp = opentelemetry.sdk.metrics.MeterProvider(); - setMeterProvider(mp); + testCase.applyFixture(MeterProviderFixture(mp)); end end diff --git a/test/performance/traceTest.m b/test/performance/traceTest.m index a38308a..aae72a4 100644 --- a/test/performance/traceTest.m +++ b/test/performance/traceTest.m @@ -1,7 +1,7 @@ classdef traceTest < matlab.perftest.TestCase % performance tests for tracing -% Copyright 2023-2024 The MathWorks, Inc. +% Copyright 2023-2025 The MathWorks, Inc. properties OtelConfigFile @@ -18,16 +18,16 @@ methods (TestClassSetup) function setupOnce(testCase) - % add directory where common setup and teardown code lives - utilsfolder = fullfile(fileparts(mfilename('fullpath')), "..", "utils"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(utilsfolder)); + % add utils and fixtures folders to the path + folders = fullfile(fileparts(mfilename('fullpath')), "..", ["utils" "fixtures"]); + testCase.applyFixture(matlab.unittest.fixtures.PathFixture(folders)); commonSetupOnce(testCase); % create a global tracer provider import opentelemetry.sdk.trace.* tp = TracerProvider(BatchSpanProcessor()); - setTracerProvider(tp); + testCase.applyFixture(TracerProviderFixture(tp)); end end diff --git a/test/tautotrace.m b/test/tautotrace.m index b1ecd0d..c898efc 100644 --- a/test/tautotrace.m +++ b/test/tautotrace.m @@ -18,15 +18,15 @@ methods (TestClassSetup) function setupOnce(testCase) - % add the utils folder to the path - utilsfolder = fullfile(fileparts(mfilename('fullpath')), "utils"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(utilsfolder)); + % add the utils and fixtures folders to the path + folders = fullfile(fileparts(mfilename('fullpath')), ["utils" "fixtures"]); + testCase.applyFixture(matlab.unittest.fixtures.PathFixture(folders)); commonSetupOnce(testCase); % configure the global tracer provider tp = opentelemetry.sdk.trace.TracerProvider(); - setTracerProvider(tp); + testCase.applyFixture(TracerProviderFixture(tp)); end end diff --git a/test/tlogs.m b/test/tlogs.m index 2f117f5..45cee8e 100644 --- a/test/tlogs.m +++ b/test/tlogs.m @@ -19,9 +19,9 @@ methods (TestClassSetup) function setupOnce(testCase) - % add the utils folder to the path - utilsfolder = fullfile(fileparts(mfilename('fullpath')), "utils"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(utilsfolder)); + % add the utils and fixtures folders to the path + folders = fullfile(fileparts(mfilename('fullpath')), ["utils" "fixtures"]); + testCase.applyFixture(matlab.unittest.fixtures.PathFixture(folders)); commonSetupOnce(testCase); testCase.ForceFlushTimeout = seconds(2); end @@ -444,14 +444,13 @@ function testSeverityFunctions(testCase) end function testGetSetLoggerProvider(testCase) - % testGetSetLoggerProvider: setting and getting global instance of LoggerProvider + % testGetSetLoggerProvider: setting, getting, and unsetting global instance of LoggerProvider customkey = "quux"; customvalue = 1; proc = opentelemetry.sdk.logs.SimpleLogRecordProcessor; lp = opentelemetry.sdk.logs.LoggerProvider(proc, ... "Resource", dictionary(customkey, customvalue)); % specify an arbitrary resource as an identifier - setLoggerProvider(lp); - clear("lp"); + testCase.applyFixture(LoggerProviderFixture(lp)); % set global instance of logger provider loggername = "foo"; logseverity = "warn"; @@ -459,14 +458,21 @@ function testGetSetLoggerProvider(testCase) lg = opentelemetry.logs.getLogger(loggername); emitLogRecord(lg, logseverity, logmessage); + % unset logger provider and emit more logs + opentelemetry.logs.Provider.unsetLoggerProvider; + logmessage2 = "quux"; + lg = opentelemetry.logs.getLogger(loggername); + emitLogRecord(lg, logseverity, logmessage2); + % perform test comparisons opentelemetry.sdk.common.Cleanup.forceFlush(... opentelemetry.logs.Provider.getLoggerProvider, testCase.ForceFlushTimeout); results = readJsonResults(testCase); % check log record, and check its resource to identify the - % correct LoggerProvider has been used - verifyNotEmpty(testCase, results); + % correct LoggerProvider has been used. Only one log record + % should have been generated + verifyNumElements(testCase, results, 1); verifyEqual(testCase, string(results{1}.resourceLogs.scopeLogs.logRecords.severityText), upper(logseverity)); verifyEqual(testCase, string(results{1}.resourceLogs.scopeLogs.logRecords.body.stringValue), logmessage); diff --git a/test/tlogs_sdk.m b/test/tlogs_sdk.m index 1a5a5a9..eabe95e 100644 --- a/test/tlogs_sdk.m +++ b/test/tlogs_sdk.m @@ -1,7 +1,7 @@ classdef tlogs_sdk < matlab.unittest.TestCase % tests for logging SDK (log record processors, exporters, resource) - % Copyright 2024 The MathWorks, Inc. + % Copyright 2024-2025 The MathWorks, Inc. properties OtelConfigFile @@ -19,9 +19,9 @@ methods (TestClassSetup) function setupOnce(testCase) - % add the utils folder to the path - utilsfolder = fullfile(fileparts(mfilename('fullpath')), "utils"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(utilsfolder)); + % add the utils and fixtures folder to the path + folders = fullfile(fileparts(mfilename('fullpath')), ["utils" "fixtures"]); + testCase.applyFixture(matlab.unittest.fixtures.PathFixture(folders)); commonSetupOnce(testCase); testCase.ForceFlushTimeout = seconds(2); end @@ -210,8 +210,7 @@ function testCleanupSdk(testCase) function testCleanupApi(testCase) % testCleanupApi: shutdown an API logger provider through the Cleanup class lp = opentelemetry.sdk.logs.LoggerProvider(); - setLoggerProvider(lp); - clear("lp"); + testCase.applyFixture(LoggerProviderFixture(lp)); % set global instance of logger provider lp_api = opentelemetry.logs.Provider.getLoggerProvider(); lg = getLogger(lp_api, "foo"); diff --git a/test/tmetrics.m b/test/tmetrics.m index c608809..0b11a93 100644 --- a/test/tmetrics.m +++ b/test/tmetrics.m @@ -23,14 +23,10 @@ methods (TestClassSetup) function setupOnce(testCase) - % add the utils folder to the path - utilsfolder = fullfile(fileparts(mfilename('fullpath')), "utils"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(utilsfolder)); + % add the utils, callbacks, and fixtures folders to the path + folders = fullfile(fileparts(mfilename('fullpath')), ["utils" "callbacks" "fixtures"]); + testCase.applyFixture(matlab.unittest.fixtures.PathFixture(folders)); commonSetupOnce(testCase); - - % add the callbacks folder to the path - callbackfolder = fullfile(fileparts(mfilename('fullpath')), "callbacks"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(callbackfolder)); interval = seconds(2); timeout = seconds(1); @@ -571,13 +567,13 @@ function testGaugeAddAttributes(testCase) end function testGetSetMeterProvider(testCase) - % testGetSetMeterProvider: setting and getting global instance of MeterProvider - + % testGetSetMeterProvider: setting, getting, and unsetting global instance of MeterProvider + % suppress internal warning logs about repeated shutdown nologs = SuppressInternalLogs; %#ok mp = opentelemetry.sdk.metrics.MeterProvider(testCase.ShortIntervalReader); - setMeterProvider(mp); + testCase.applyFixture(MeterProviderFixture(mp)); % set MeterProvider global instance metername = "foo"; countername = "bar"; @@ -594,6 +590,13 @@ function testGetSetMeterProvider(testCase) %Shutdown the Meter Provider verifyTrue(testCase, mp.shutdown()); + + %Unset the global meter provider and generate more metrics + opentelemetry.metrics.Provider.unsetMeterProvider; + m = opentelemetry.metrics.getMeter(metername); + countername2 = "quux"; + c2 = createCounter(m, countername2); + c2.add(val); % perform test comparisons results = readJsonResults(testCase); @@ -601,6 +604,9 @@ function testGetSetMeterProvider(testCase) % check a counter has been created, and check its resource to identify the % correct MeterProvider has been used verifyNotEmpty(testCase, results); + + % check that only one metric is generated + verifyNumElements(testCase, results.resourceMetrics.scopeMetrics.metrics, 1); verifyEqual(testCase, string(results.resourceMetrics.scopeMetrics.metrics.name), countername); verifyEqual(testCase, string(results.resourceMetrics.scopeMetrics.scope.name), metername); diff --git a/test/tmetrics_sdk.m b/test/tmetrics_sdk.m index a3791e2..57901c5 100644 --- a/test/tmetrics_sdk.m +++ b/test/tmetrics_sdk.m @@ -1,7 +1,7 @@ classdef tmetrics_sdk < matlab.unittest.TestCase % tests for metrics SDK - % Copyright 2023-2024 The MathWorks, Inc. + % Copyright 2023-2025 The MathWorks, Inc. properties OtelConfigFile @@ -20,9 +20,9 @@ methods (TestClassSetup) function setupOnce(testCase) - % add the utils folder to the path - utilsfolder = fullfile(fileparts(mfilename('fullpath')), "utils"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(utilsfolder)); + % add the utils and fixtures folders to the path + folders = fullfile(fileparts(mfilename('fullpath')), ["utils" "fixtures"]); + testCase.applyFixture(matlab.unittest.fixtures.PathFixture(folders)); commonSetupOnce(testCase); interval = seconds(2); timeout = seconds(1); @@ -521,7 +521,7 @@ function testCleanupApi(testCase) % Shut down an API meter provider instance mp = opentelemetry.sdk.metrics.MeterProvider(testCase.ShortIntervalReader); - setMeterProvider(mp); + testCase.applyFixture(MeterProviderFixture(mp)); % set MeterProvider global instance clear("mp"); mp_api = opentelemetry.metrics.Provider.getMeterProvider(); diff --git a/test/ttrace.m b/test/ttrace.m index bc06423..5f722f5 100644 --- a/test/ttrace.m +++ b/test/ttrace.m @@ -18,9 +18,9 @@ methods (TestClassSetup) function setupOnce(testCase) - % add the utils folder to the path - utilsfolder = fullfile(fileparts(mfilename('fullpath')), "utils"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(utilsfolder)); + % add the utils and fixtures folders to the path + folders = fullfile(fileparts(mfilename('fullpath')), ["utils" "fixtures"]); + testCase.applyFixture(matlab.unittest.fixtures.PathFixture(folders)); commonSetupOnce(testCase); end end @@ -113,13 +113,12 @@ function testBasic(testCase) end function testGetSetTracerProvider(testCase) - % testGetSetTracerProvider: setting and getting global instance of TracerProvider + % testGetSetTracerProvider: setting, getting, and unsetting global instance of TracerProvider customkey = "quux"; customvalue = 1; tp = opentelemetry.sdk.trace.TracerProvider(opentelemetry.sdk.trace.SimpleSpanProcessor, ... "Resource", dictionary(customkey, customvalue)); % specify an arbitrary resource as an identifier - setTracerProvider(tp); - clear("tp"); + testCase.applyFixture(TracerProviderFixture(tp)); % set TracerProvider global instance tracername = "foo"; spanname = "bar"; @@ -127,12 +126,19 @@ function testGetSetTracerProvider(testCase) sp = startSpan(tr, spanname); endSpan(sp); + % unset the global tracer provider and start another span + opentelemetry.trace.Provider.unsetTracerProvider; + spanname2 = "quux"; + tr = opentelemetry.trace.getTracer(tracername); + sp = startSpan(tr, spanname2); + endSpan(sp); + % perform test comparisons results = readJsonResults(testCase); - % check a span has been created, and check its resource to identify the + % check only one span has been created, and check its resource to identify the % correct TracerProvider has been used - verifyNotEmpty(testCase, results); + verifyNumElements(testCase, results, 1); verifyEqual(testCase, string(results{1}.resourceSpans.scopeSpans.spans.name), spanname); verifyEqual(testCase, string(results{1}.resourceSpans.scopeSpans.scope.name), tracername); diff --git a/test/ttrace_sdk.m b/test/ttrace_sdk.m index ff8671b..2634a62 100644 --- a/test/ttrace_sdk.m +++ b/test/ttrace_sdk.m @@ -1,7 +1,7 @@ classdef ttrace_sdk < matlab.unittest.TestCase % tests for tracing SDK (span processors, exporters, samplers, resource) - % Copyright 2023-2024 The MathWorks, Inc. + % Copyright 2023-2025 The MathWorks, Inc. properties OtelConfigFile @@ -19,9 +19,9 @@ methods (TestClassSetup) function setupOnce(testCase) - % add the utils folder to the path - utilsfolder = fullfile(fileparts(mfilename('fullpath')), "utils"); - testCase.applyFixture(matlab.unittest.fixtures.PathFixture(utilsfolder)); + % add the utils and fixtures folders to the path + folders = fullfile(fileparts(mfilename('fullpath')), ["utils" "fixtures"]); + testCase.applyFixture(matlab.unittest.fixtures.PathFixture(folders)); commonSetupOnce(testCase); testCase.ForceFlushTimeout = seconds(2); end @@ -276,8 +276,7 @@ function testCleanupSdk(testCase) function testCleanupApi(testCase) % testCleanupApi: shutdown an API tracer provider through the Cleanup class tp = opentelemetry.sdk.trace.TracerProvider(); - setTracerProvider(tp); - clear("tp"); + testCase.applyFixture(TracerProviderFixture(tp)); % set TracerProvider global instance tp_api = opentelemetry.trace.Provider.getTracerProvider(); tr = getTracer(tp_api, "foo");