Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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"}));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you really need cell arrays of strings in the dictionary? Can you avoid using cell arrays:
dictionary("Level1", "D", "Level2", "E")

147 changes: 147 additions & 0 deletions test/tformat.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
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)
config = fullfile(fileparts(mfilename("fullpath")), "config", "otelcol_config.yml");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the default configuration file. You don't need to specify it here. Simply call commonSetup without passing in the configuration and you will get the default.

commonSetup(testCase, config);
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
147 changes: 147 additions & 0 deletions test/thttpheaders.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
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)
config = fullfile(fileparts(mfilename("fullpath")), "config", "otelcol_config.yml");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to supply the default configuration.

commonSetup(testCase, config);
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