From 8c3a10cc61e11119ebc3bc0136e4eb698e8593b9 Mon Sep 17 00:00:00 2001 From: Devin Narula Date: Thu, 12 Oct 2023 08:47:39 -0400 Subject: [PATCH 1/4] Add resource property --- .../+sdk/+metrics/MeterProvider.m | 37 ++++++++++++++++++- .../sdk/metrics/MeterProviderProxy.h | 4 ++ sdk/metrics/src/MeterProviderProxy.cpp | 13 +++++-- test/myoutput.json | 0 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 test/myoutput.json diff --git a/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m b/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m index 58a5c72..70612af 100644 --- a/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m +++ b/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m @@ -13,8 +13,12 @@ MetricReader end + properties (Access=public) + Resource + end + methods - function obj = MeterProvider(reader) + function obj = MeterProvider(reader, optionnames, optionvalues) % SDK implementation of tracer provider % MP = OPENTELEMETRY.SDK.METRICS.METERPROVIDER creates a meter % provider that uses a periodic exporting metric reader and default configurations. @@ -38,11 +42,40 @@ "libmexclass.proxy.Proxy"])} = ... opentelemetry.sdk.metrics.PeriodicExportingMetricReader() end + + arguments (Repeating) + optionnames (1,:) {mustBeTextScalar} + optionvalues + end + + validnames = ["Resource"]; + resourcekeys = string.empty(); + resourcevalues = {}; + resource = dictionary(resourcekeys, resourcevalues); + for i = 1:length(optionnames) + namei = validatestring(optionnames{i}, validnames); + valuei = optionvalues{i}; + if strcmp(namei, "Resource") + if ~isa(valuei, "dictionary") + error("opentelemetry:sdk:metrics:MeterProvider:InvalidResourceType", ... + "Attibutes input must be a dictionary."); + end + resource = valuei; + resourcekeys = keys(valuei); + resourcevalues = values(valuei,"cell"); + % collapse one level of cells, as this may be due to + % a behavior of dictionary.values + if all(cellfun(@iscell, resourcevalues)) + resourcevalues = [resourcevalues{:}]; + end + end + end obj.Proxy = libmexclass.proxy.Proxy("Name", ... "libmexclass.opentelemetry.sdk.MeterProviderProxy", ... - "ConstructorArguments", {reader.Proxy.ID}); + "ConstructorArguments", {reader.Proxy.ID, resourcekeys, resourcevalues}); obj.MetricReader = reader; + obj.Resource = resource; end function addMetricReader(obj, reader) diff --git a/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h b/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h index 37a8d57..d4882b6 100644 --- a/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h +++ b/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h @@ -21,15 +21,19 @@ #include "opentelemetry/sdk/metrics/meter_provider.h" #include "opentelemetry/sdk/metrics/meter_provider_factory.h" #include "opentelemetry/sdk/metrics/push_metric_exporter.h" +#include "opentelemetry/sdk/resource/resource.h" + #include "opentelemetry-matlab/metrics/MeterProxy.h" #include "opentelemetry-matlab/metrics/MeterProviderProxy.h" +#include "opentelemetry-matlab/sdk/common/resource.h" namespace metrics_api = opentelemetry::metrics; namespace nostd = opentelemetry::nostd; namespace metrics_sdk = opentelemetry::sdk::metrics; namespace common = opentelemetry::common; namespace otlpexporter = opentelemetry::exporter::otlp; +namespace resource = opentelemetry::sdk::resource; namespace libmexclass::opentelemetry::sdk { diff --git a/sdk/metrics/src/MeterProviderProxy.cpp b/sdk/metrics/src/MeterProviderProxy.cpp index 7b57f09..f73778f 100644 --- a/sdk/metrics/src/MeterProviderProxy.cpp +++ b/sdk/metrics/src/MeterProviderProxy.cpp @@ -15,15 +15,22 @@ libmexclass::proxy::MakeResult MeterProviderProxy::make(const libmexclass::proxy matlab::data::TypedArray readerid_mda = constructor_arguments[0]; libmexclass::proxy::ID readerid = readerid_mda[0]; + matlab::data::StringArray resourcenames_mda = constructor_arguments[1]; + size_t nresourceattrs = resourcenames_mda.getNumberOfElements(); + matlab::data::CellArray resourcevalues_mda = constructor_arguments[2]; + + auto resource_custom = createResource(resourcenames_mda, resourcevalues_mda); + auto reader = std::static_pointer_cast( libmexclass::proxy::ProxyManager::getProxy(readerid))->getInstance(); - auto p = metrics_sdk::MeterProviderFactory::Create(); + auto p = metrics_sdk::MeterProviderFactory::Create(NULL, std::move(resource_custom)); auto *p_sdk = static_cast(p.get()); p_sdk->AddMetricReader(std::move(reader)); - + auto p_out = nostd::shared_ptr(std::move(p)); + out = std::make_shared(p_out); - + return out; } diff --git a/test/myoutput.json b/test/myoutput.json new file mode 100644 index 0000000..e69de29 From 58392caa736468df834fe112cf68f3b9f3283096 Mon Sep 17 00:00:00 2001 From: Devin Narula Date: Thu, 2 Nov 2023 13:13:55 -0400 Subject: [PATCH 2/4] Finishing add resource property to metrics --- .../+sdk/+metrics/MeterProvider.m | 3 - .../sdk/metrics/MeterProviderProxy.h | 2 + sdk/metrics/src/MeterProviderProxy.cpp | 6 +- test/myoutput.json | 0 test/tmetrics_sdk.m | 69 +++++++++++++++++++ 5 files changed, 75 insertions(+), 5 deletions(-) delete mode 100644 test/myoutput.json create mode 100644 test/tmetrics_sdk.m diff --git a/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m b/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m index 934cbc1..6749285 100644 --- a/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m +++ b/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m @@ -10,9 +10,6 @@ properties (Access=public) MetricReader - end - - properties (Access=public) Resource end diff --git a/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h b/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h index f0611f3..6d6ce13 100644 --- a/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h +++ b/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h @@ -22,6 +22,8 @@ #include "opentelemetry/sdk/metrics/meter_provider_factory.h" #include "opentelemetry/sdk/metrics/push_metric_exporter.h" #include "opentelemetry/sdk/resource/resource.h" +#include "opentelemetry/sdk/metrics/view/view_registry.h" +#include "opentelemetry/sdk/metrics/view/view_registry_factory.h" #include "opentelemetry-matlab/metrics/MeterProxy.h" diff --git a/sdk/metrics/src/MeterProviderProxy.cpp b/sdk/metrics/src/MeterProviderProxy.cpp index df8ef53..a94ee29 100644 --- a/sdk/metrics/src/MeterProviderProxy.cpp +++ b/sdk/metrics/src/MeterProviderProxy.cpp @@ -36,10 +36,12 @@ libmexclass::proxy::MakeResult MeterProviderProxy::make(const libmexclass::proxy auto reader = std::static_pointer_cast( libmexclass::proxy::ProxyManager::getProxy(readerid))->getInstance(); - auto p = metrics_sdk::MeterProviderFactory::Create(); + + auto view = metrics_sdk::ViewRegistryFactory::Create(); + auto p = metrics_sdk::MeterProviderFactory::Create(std::move(view), resource_custom); auto *p_sdk = static_cast(p.get()); p_sdk->AddMetricReader(std::move(reader)); - + auto p_out = nostd::shared_ptr(std::move(p)); out = std::make_shared(p_out); } diff --git a/test/myoutput.json b/test/myoutput.json deleted file mode 100644 index e69de29..0000000 diff --git a/test/tmetrics_sdk.m b/test/tmetrics_sdk.m new file mode 100644 index 0000000..528e7ec --- /dev/null +++ b/test/tmetrics_sdk.m @@ -0,0 +1,69 @@ +classdef tmetrics_sdk < matlab.unittest.TestCase + % tests for metrics SDK + + % Copyright 2023 The MathWorks, Inc. + + properties + OtelConfigFile + JsonFile + PidFile + OtelcolName + Otelcol + ListPid + ReadPidList + ExtractPid + Sigint + Sigterm + end + + methods (TestClassSetup) + function setupOnce(testCase) + commonSetupOnce(testCase); + end + end + + methods (TestMethodTeardown) + function teardown(testCase) + commonTeardown(testCase); + end + end + + methods (Test) + function testCustomResource(testCase) + % testCustomResource: check custom resources are included in + % emitted metrics + commonSetup(testCase) + + customkeys = ["foo" "bar"]; + customvalues = [1 5]; + exporter = opentelemetry.exporters.otlp.OtlpHttpMetricExporter(); + reader = opentelemetry.sdk.metrics.PeriodicExportingMetricReader(exporter, ... + "Interval", seconds(2), "Timeout", seconds(1)); + mp = opentelemetry.sdk.metrics.MeterProvider(reader, ... + "Resource", dictionary(customkeys, customvalues)); + + m = getMeter(mp, "mymeter"); + c = createCounter(m, "mycounter"); + + % create testing value + val = 10; + + % add value and attributes + c.add(val); + + pause(2.5); + + % perform test comparisons + results = readJsonResults(testCase); + results = results{1}; + + resourcekeys = string({results.resourceMetrics.resource.attributes.key}); + for i = length(customkeys) + idx = find(resourcekeys == customkeys(i)); + verifyNotEmpty(testCase, idx); + verifyEqual(testCase, results.resourceMetrics.resource.attributes(idx).value.doubleValue, customvalues(i)); + end + end + + end +end \ No newline at end of file From ee27f2ba94e88cad440167176321d0ea292bff5c Mon Sep 17 00:00:00 2001 From: Devin Narula Date: Thu, 2 Nov 2023 13:36:38 -0400 Subject: [PATCH 3/4] Cleaning up code --- sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m | 2 +- .../opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h | 1 - sdk/metrics/src/MeterProviderProxy.cpp | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m b/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m index 6749285..98b816a 100644 --- a/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m +++ b/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m @@ -15,7 +15,7 @@ methods function obj = MeterProvider(reader, optionnames, optionvalues) - % SDK implementation of tracer provider + % SDK implementation of meter provider % MP = OPENTELEMETRY.SDK.METRICS.METERPROVIDER creates a meter % provider that uses a periodic exporting metric reader and default configurations. % diff --git a/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h b/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h index 6d6ce13..8d6d144 100644 --- a/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h +++ b/sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h @@ -35,7 +35,6 @@ namespace nostd = opentelemetry::nostd; namespace metrics_sdk = opentelemetry::sdk::metrics; namespace common = opentelemetry::common; namespace otlpexporter = opentelemetry::exporter::otlp; -namespace resource = opentelemetry::sdk::resource; namespace libmexclass::opentelemetry::sdk { diff --git a/sdk/metrics/src/MeterProviderProxy.cpp b/sdk/metrics/src/MeterProviderProxy.cpp index a94ee29..b70706d 100644 --- a/sdk/metrics/src/MeterProviderProxy.cpp +++ b/sdk/metrics/src/MeterProviderProxy.cpp @@ -12,7 +12,7 @@ libmexclass::proxy::MakeResult MeterProviderProxy::make(const libmexclass::proxy libmexclass::proxy::MakeResult out; if (constructor_arguments.getNumberOfElements() == 1) { - // if only one input, assume it is an API Tracer Provider to support type conversion + // if only one input, assume it is an API Meter Provider to support type conversion matlab::data::TypedArray mpid_mda = constructor_arguments[0]; libmexclass::proxy::ID mpid = mpid_mda[0]; auto mp = std::static_pointer_cast( From ac97746f17ce314719e2d08a52325966e8417787 Mon Sep 17 00:00:00 2001 From: Devin Narula Date: Thu, 2 Nov 2023 14:27:49 -0400 Subject: [PATCH 4/4] Change error message --- sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m b/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m index 98b816a..7c5ce87 100644 --- a/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m +++ b/sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m @@ -68,7 +68,7 @@ if strcmp(namei, "Resource") if ~isa(valuei, "dictionary") error("opentelemetry:sdk:metrics:MeterProvider:InvalidResourceType", ... - "Attibutes input must be a dictionary."); + "Resource input must be a dictionary."); end resource = valuei; resourcekeys = keys(valuei);