Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -546,3 +546,4 @@ install(FILES ${OPENTELEMETRY_PROXY_RUNTIME_LIBRARIES} DESTINATION ${LIBMEXCLASS
if(WITH_EXAMPLES)
add_subdirectory(examples)
endif()

9 changes: 9 additions & 0 deletions test/callbacks/callbackWithAttributes3.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
function result = callbackWithAttributes3()
% Test callback function for asynchronous instruments that uses attributes
% in a dictionary
%
% Copyright 2025 The MathWorks, Inc.

value = 30;
result = opentelemetry.metrics.ObservableResult;
result = result.observe(value, dictionary("Level1", "D","Level2","E"));
146 changes: 146 additions & 0 deletions test/tformat.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
classdef tformat < matlab.unittest.TestCase
% Tests for setting format in the exporter

% Copyright 2025 The MathWorks, Inc.

properties
OtelConfigFile
JsonFile
PidFile
OtelcolName
Otelcol
ListPid
ReadPidList
ExtractPid
Sigint
Sigterm
end

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));
commonSetupOnce(testCase);
end
end

methods (TestMethodSetup)
function setup(testCase)
commonSetup(testCase);
end
end

methods (TestMethodTeardown)
function teardown(testCase)
commonTeardown(testCase);
end
end

methods (Test)
function testNondefaultFormat(testCase)
% testNondefaultFormat: using an alternative format

testCase.assumeTrue(logical(exist("opentelemetry.exporters.otlp.OtlpHttpSpanExporter", "class")), ...
"Otlp HTTP exporter must be installed.");

tracername = "foo";
spanname = "bar";

exp = opentelemetry.exporters.otlp.OtlpHttpSpanExporter(...
"Format", "binary");
processor = opentelemetry.sdk.trace.SimpleSpanProcessor(exp);
tp = opentelemetry.sdk.trace.TracerProvider(processor);
tr = getTracer(tp, tracername);
sp = startSpan(tr, spanname);
pause(1);
endSpan(sp);

% perform test comparisons
results = readJsonResults(testCase);
results = results{1};

% check span and tracer names
verifyEqual(testCase, string(results.resourceSpans.scopeSpans.spans.name), spanname);
verifyEqual(testCase, string(results.resourceSpans.scopeSpans.scope.name), tracername);
end

function testNondefaultGrpcFormat(testCase)
% testNondefaultGrpcFormat: using an alternative format

testCase.assumeTrue(logical(exist("opentelemetry.exporters.otlp.OtlpGrpcSpanExporter", "class")), ...
"Otlp gRPC exporter must be installed.");

tracername = "foo";
spanname = "bar";

exp = opentelemetry.exporters.otlp.OtlpGrpcSpanExporter(...
"Format", "binary");
processor = opentelemetry.sdk.trace.SimpleSpanProcessor(exp);
tp = opentelemetry.sdk.trace.TracerProvider(processor);
tr = getTracer(tp, tracername);
sp = startSpan(tr, spanname);
pause(1);
endSpan(sp);

% perform test comparisons
results = readJsonResults(testCase);
results = results{1};

% check span and tracer names
verifyEqual(testCase, string(results.resourceSpans.scopeSpans.spans.name), spanname);
verifyEqual(testCase, string(results.resourceSpans.scopeSpans.scope.name), tracername);
end

function NondefaultMetricsFormat(testCase)
% testNondefaultMetricsFormat: using an alternative format
testCase.assumeTrue(logical(exist("opentelemetry.exporters.otlp.OtlpHttpMetricExporter", "class")), ...
"Otlp HTTP exporter must be installed.");

exp = opentelemetry.exporters.otlp.OtlpHttpMetricExporter(...
"Format", "binary");
reader = opentelemetry.sdk.metrics.PeriodicExportingMetricReader(...
exp, "Interval", seconds(2), "Timeout", seconds(1));
p = opentelemetry.sdk.metrics.MeterProvider(reader);
mt = p.getMeter("foo");
ct = mt.createCounter("bar");

val = 4;
ct.add(val);
pause(2.5);

% fetch result
clear p;
results = readJsonResults(testCase);

% verify counter value
verifyEqual(testCase, results{end}.resourceMetrics.scopeMetrics.metrics.sum.dataPoints.asDouble, val);
end

function NondefaultGrpcMetricsFormat(testCase)
% testNondefaultGrpcMetricsFormat: using an alternative format
testCase.assumeTrue(logical(exist("opentelemetry.exporters.otlp.OtlpGrpcMetricExporter", "class")), ...
"Otlp gRPC exporter must be installed.");

exp = opentelemetry.exporters.otlp.OtlpGrpcMetricExporter(...
"Format", "binary");
reader = opentelemetry.sdk.metrics.PeriodicExportingMetricReader(...
exp, "Interval", seconds(2), "Timeout", seconds(1));
p = opentelemetry.sdk.metrics.MeterProvider(reader);
mt = p.getMeter("foo");
ct = mt.createCounter("bar");

val = 8;
ct.add(val);
pause(2.5);

% fetch result
clear p;
results = readJsonResults(testCase);

% verify counter value
verifyEqual(testCase, results{end}.resourceMetrics.scopeMetrics.metrics.sum.dataPoints.asDouble, val);
end

end
end
146 changes: 146 additions & 0 deletions test/thttpheaders.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
classdef thttpheaders < matlab.unittest.TestCase
% tests for setting HTTPHeaders in the exporter

% Copyright 2025 The MathWorks, Inc.

properties
OtelConfigFile
JsonFile
PidFile
OtelcolName
Otelcol
ListPid
ReadPidList
ExtractPid
Sigint
Sigterm
end

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));
commonSetupOnce(testCase);
end
end

methods (TestMethodSetup)
function setup(testCase)
commonSetup(testCase);
end
end

methods (TestMethodTeardown)
function teardown(testCase)
commonTeardown(testCase);
end
end

methods (Test)
function testNondefaultHTTPHeaders(testCase)
% testNondefaultHTTPHeaders: using an alternative HTTPHeaders

testCase.assumeTrue(logical(exist("opentelemetry.exporters.otlp.OtlpHttpSpanExporter", "class")), ...
"Otlp HTTP exporter must be installed.");

tracername = "foo";
spanname = "bar";

exp = opentelemetry.exporters.otlp.OtlpHttpSpanExporter(...
"HTTPHeaders", dictionary("new","header"));
processor = opentelemetry.sdk.trace.SimpleSpanProcessor(exp);
tp = opentelemetry.sdk.trace.TracerProvider(processor);
tr = getTracer(tp, tracername);
sp = startSpan(tr, spanname);
pause(1);
endSpan(sp);

% perform test comparisons
results = readJsonResults(testCase);
results = results{1};

% check span and tracer names
verifyEqual(testCase, string(results.resourceSpans.scopeSpans.spans.name), spanname);
verifyEqual(testCase, string(results.resourceSpans.scopeSpans.scope.name), tracername);
end

function testNondefaultGrpcHTTPHeaders(testCase)
% testNondefaultGrpcHTTPHeaders: using an alternative HTTPHeaders

testCase.assumeTrue(logical(exist("opentelemetry.exporters.otlp.OtlpGrpcSpanExporter", "class")), ...
"Otlp gRPC exporter must be installed.");

tracername = "foo";
spanname = "bar";

exp = opentelemetry.exporters.otlp.OtlpGrpcSpanExporter(...
"HTTPHeaders", dictionary("new","header"));
processor = opentelemetry.sdk.trace.SimpleSpanProcessor(exp);
tp = opentelemetry.sdk.trace.TracerProvider(processor);
tr = getTracer(tp, tracername);
sp = startSpan(tr, spanname);
pause(1);
endSpan(sp);

% perform test comparisons
results = readJsonResults(testCase);
results = results{1};

% check span and tracer names
verifyEqual(testCase, string(results.resourceSpans.scopeSpans.spans.name), spanname);
verifyEqual(testCase, string(results.resourceSpans.scopeSpans.scope.name), tracername);
end

function NondefaultMetricsHTTPHeaders(testCase)
% testNondefaultMetricsHTTPHeaders: using an alternative HTTPHeaders
testCase.assumeTrue(logical(exist("opentelemetry.exporters.otlp.OtlpHttpMetricExporter", "class")), ...
"Otlp HTTP exporter must be installed.");

exp = opentelemetry.exporters.otlp.OtlpHttpMetricExporter(...
"HTTPHeaders", dictionary("new","header"));
reader = opentelemetry.sdk.metrics.PeriodicExportingMetricReader(...
exp, "Interval", seconds(2), "Timeout", seconds(1));
p = opentelemetry.sdk.metrics.MeterProvider(reader);
mt = p.getMeter("foo");
ct = mt.createCounter("bar");

val = 4;
ct.add(val);
pause(2.5);

% fetch result
clear p;
results = readJsonResults(testCase);

% verify counter value
verifyEqual(testCase, results{end}.resourceMetrics.scopeMetrics.metrics.sum.dataPoints.asDouble, val);
end

function NondefaultGrpcMetricsHTTPHeaders(testCase)
% testNondefaultGrpcMetricsHTTPHeaders: using an alternative HTTPHeaders
testCase.assumeTrue(logical(exist("opentelemetry.exporters.otlp.OtlpGrpcMetricExporter", "class")), ...
"Otlp gRPC exporter must be installed.");

exp = opentelemetry.exporters.otlp.OtlpGrpcMetricExporter(...
"HTTPHeaders", dictionary("new","header"));
reader = opentelemetry.sdk.metrics.PeriodicExportingMetricReader(...
exp, "Interval", seconds(2), "Timeout", seconds(1));
p = opentelemetry.sdk.metrics.MeterProvider(reader);
mt = p.getMeter("foo");
ct = mt.createCounter("bar");

val = 8;
ct.add(val);
pause(2.5);

% fetch result
clear p;
results = readJsonResults(testCase);

% verify counter value
verifyEqual(testCase, results{end}.resourceMetrics.scopeMetrics.metrics.sum.dataPoints.asDouble, val);
end

end
end
Loading
Loading