Skip to content

Commit f3e7a37

Browse files
authored
Merge pull request #56 from mathworks/metrics_view
Adding View Class in metrics sdk and add view method to meter provider
2 parents 6d492c9 + 0e46adf commit f3e7a37

File tree

9 files changed

+300
-0
lines changed

9 files changed

+300
-0
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ set(OPENTELEMETRY_PROXY_SOURCES
231231
${TRACE_SDK_SOURCE_DIR}/BatchSpanProcessorProxy.cpp
232232
${TRACE_SDK_SOURCE_DIR}/ParentBasedSamplerProxy.cpp
233233
${METRICS_SDK_SOURCE_DIR}/MeterProviderProxy.cpp
234+
${METRICS_SDK_SOURCE_DIR}/ViewProxy.cpp
234235
${METRICS_SDK_SOURCE_DIR}/PeriodicExportingMetricReaderProxy.cpp
235236
${COMMON_SDK_SOURCE_DIR}/resource.cpp)
236237
if(WITH_OTLP_HTTP)

OtelMatlabProxyFactory.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "opentelemetry-matlab/sdk/trace/TraceIdRatioBasedSamplerProxy.h"
2424
#include "opentelemetry-matlab/sdk/trace/ParentBasedSamplerProxy.h"
2525
#include "opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h"
26+
#include "opentelemetry-matlab/sdk/metrics/ViewProxy.h"
2627
#include "opentelemetry-matlab/sdk/metrics/PeriodicExportingMetricReaderProxy.h"
2728
#ifdef WITH_OTLP_HTTP
2829
#include "opentelemetry-matlab/exporters/otlp/OtlpHttpSpanExporterProxy.h"
@@ -61,6 +62,7 @@ OtelMatlabProxyFactory::make_proxy(const libmexclass::proxy::ClassName& class_na
6162
REGISTER_PROXY(libmexclass.opentelemetry.sdk.ParentBasedSamplerProxy, libmexclass::opentelemetry::sdk::ParentBasedSamplerProxy);
6263

6364
REGISTER_PROXY(libmexclass.opentelemetry.sdk.MeterProviderProxy, libmexclass::opentelemetry::sdk::MeterProviderProxy);
65+
REGISTER_PROXY(libmexclass.opentelemetry.sdk.ViewProxy, libmexclass::opentelemetry::sdk::ViewProxy);
6466
REGISTER_PROXY(libmexclass.opentelemetry.sdk.PeriodicExportingMetricReaderProxy, libmexclass::opentelemetry::sdk::PeriodicExportingMetricReaderProxy);
6567

6668
#ifdef WITH_OTLP_HTTP

sdk/metrics/+opentelemetry/+sdk/+metrics/MeterProvider.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
properties (Access=public)
1212
MetricReader
13+
View
1314
Resource
1415
end
1516

@@ -98,6 +99,15 @@ function addMetricReader(obj, reader)
9899
obj.MetricReader = [obj.MetricReader, reader];
99100
end
100101

102+
function addView(obj, view)
103+
arguments
104+
obj
105+
view (1,1) {mustBeA(view, "opentelemetry.sdk.metrics.View")}
106+
end
107+
obj.Proxy.addView(view.Proxy.ID);
108+
obj.View = [obj.View, view];
109+
end
110+
101111
function success = shutdown(obj)
102112
% SHUTDOWN Shutdown
103113
% SUCCESS = SHUTDOWN(MP) shuts down all metric readers associated with meter provider MP
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
classdef View
2+
3+
% Copyright 2023 The MathWorks, Inc.
4+
5+
properties (GetAccess={?opentelemetry.sdk.metrics.MeterProvider})
6+
Proxy % Proxy object to interface C++ code
7+
end
8+
9+
properties (SetAccess=immutable)
10+
Name
11+
Description
12+
Unit
13+
InstrumentName
14+
InstrumentType
15+
MeterName
16+
MeterVersion
17+
MeterSchemaURL
18+
AttributeKeys
19+
Aggregation
20+
HistogramBinEdges
21+
end
22+
23+
methods
24+
function obj = View(name, description, unit, instrumentName, instrumentType, ...
25+
meterName, meterVersion, meterSchemaURL, attributeKeys, ...
26+
aggregation, histogramBinEdges, varargin)
27+
28+
instrumentTypeCategory = int32(find(instrumentType==["kCounter", "kHistogram", "kUpDownCounter", "kObservableCounter", "kObservableGauge", "kObservableUpDownCounter"])-1);
29+
30+
aggregationCategory = int32(find(instrumentType==["kDrop", "kHistogram", "kLastValue", "kSum", "kDefault"])-1);
31+
32+
obj.Proxy = libmexclass.proxy.Proxy("Name", "libmexclass.opentelemetry.sdk.ViewProxy", ...
33+
"ConstructorArguments", {name, description, unit, instrumentName, ...
34+
instrumentTypeCategory, meterName, meterVersion, meterSchemaURL, ...
35+
attributeKeys, aggregationCategory, histogramBinEdges, varargin});
36+
obj.Description = description;
37+
obj.Unit = unit;
38+
obj.InstrumentName = instrumentName;
39+
obj.InstrumentType = instrumentType;
40+
obj.MeterName = meterName;
41+
obj.MeterVersion = meterVersion;
42+
obj.MeterSchemaURL = meterSchemaURL;
43+
obj.AttributeKeys = attributeKeys;
44+
obj.Aggregation = aggregation;
45+
obj.HistogramBinEdges = histogramBinEdges;
46+
end
47+
end
48+
end

sdk/metrics/include/opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class MeterProviderProxy : public libmexclass::opentelemetry::MeterProviderProxy
4242
public:
4343
MeterProviderProxy(nostd::shared_ptr<metrics_api::MeterProvider> mp) : libmexclass::opentelemetry::MeterProviderProxy(mp) {
4444
REGISTER_METHOD(MeterProviderProxy, addMetricReader);
45+
REGISTER_METHOD(MeterProviderProxy, addView);
4546
REGISTER_METHOD(MeterProviderProxy, shutdown);
4647
REGISTER_METHOD(MeterProviderProxy, forceFlush);
4748
}
@@ -50,6 +51,8 @@ class MeterProviderProxy : public libmexclass::opentelemetry::MeterProviderProxy
5051

5152
void addMetricReader(libmexclass::proxy::method::Context& context);
5253

54+
void addView(libmexclass::proxy::method::Context& context);
55+
5356
void shutdown(libmexclass::proxy::method::Context& context);
5457

5558
void forceFlush(libmexclass::proxy::method::Context& context);
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Copyright 2023 The MathWorks, Inc.
2+
3+
#pragma once
4+
5+
#include "libmexclass/proxy/Proxy.h"
6+
#include "libmexclass/proxy/method/Context.h"
7+
8+
#include "libmexclass/proxy/ProxyManager.h"
9+
10+
#include "opentelemetry/sdk/metrics/view/view.h"
11+
#include "opentelemetry/sdk/metrics/view/view_factory.h"
12+
#include "opentelemetry/sdk/metrics/instruments.h"
13+
#include "opentelemetry/sdk/metrics/aggregation/aggregation.h"
14+
#include "opentelemetry/sdk/metrics/aggregation/aggregation_config.h"
15+
#include "opentelemetry/sdk/metrics/view/attributes_processor.h"
16+
#include "opentelemetry/sdk/metrics/view/instrument_selector.h"
17+
#include "opentelemetry/sdk/metrics/view/instrument_selector_factory.h"
18+
#include "opentelemetry/nostd/string_view.h"
19+
#include "opentelemetry/sdk/metrics/view/meter_selector.h"
20+
#include "opentelemetry/sdk/metrics/view/meter_selector_factory.h"
21+
22+
23+
#include "opentelemetry-matlab/sdk/metrics/ViewProxy.h"
24+
25+
namespace metrics_sdk = opentelemetry::sdk::metrics;
26+
namespace nostd = opentelemetry::nostd;
27+
28+
namespace libmexclass::opentelemetry::sdk {
29+
class ViewProxy : public libmexclass::proxy::Proxy {
30+
public:
31+
ViewProxy(std::unique_ptr<metrics_sdk::View> view, std::unique_ptr<metrics_sdk::InstrumentSelector> instrumentSelector, std::unique_ptr<metrics_sdk::MeterSelector> meterSelector);
32+
33+
static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments);
34+
35+
// void processView(libmexclass::proxy::method::Context& context);
36+
37+
std::unique_ptr<metrics_sdk::View> getView(libmexclass::proxy::method::Context& context);
38+
39+
std::unique_ptr<metrics_sdk::InstrumentSelector> getInstrumentSelector(libmexclass::proxy::method::Context& context);
40+
41+
std::unique_ptr<metrics_sdk::MeterSelector> getMeterSelector(libmexclass::proxy::method::Context& context);
42+
43+
private:
44+
std::unique_ptr<metrics_sdk::View> View;
45+
46+
std::unique_ptr<metrics_sdk::InstrumentSelector> InstrumentSelector;
47+
48+
std::unique_ptr<metrics_sdk::MeterSelector> MeterSelector;
49+
};
50+
}

sdk/metrics/src/MeterProviderProxy.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "opentelemetry-matlab/sdk/metrics/MeterProviderProxy.h"
44
#include "opentelemetry-matlab/sdk/metrics/PeriodicExportingMetricReaderProxy.h"
5+
#include "opentelemetry-matlab/sdk/metrics/ViewProxy.h"
56

67
#include "libmexclass/proxy/ProxyManager.h"
78

@@ -58,6 +59,17 @@ void MeterProviderProxy::addMetricReader(libmexclass::proxy::method::Context& co
5859
return;
5960
}
6061

62+
void MeterProviderProxy::addView(libmexclass::proxy::method::Context& context) {
63+
matlab::data::TypedArray<uint64_t> viewid_mda = context.inputs[0];
64+
libmexclass::proxy::ID viewid = viewid_mda[0];
65+
66+
static_cast<metrics_sdk::MeterProvider&>(*CppMeterProvider).AddView(
67+
std::static_pointer_cast<ViewProxy>(libmexclass::proxy::ProxyManager::getProxy(viewid))->getInstrumentSelector(context),
68+
std::static_pointer_cast<ViewProxy>(libmexclass::proxy::ProxyManager::getProxy(viewid))->getMeterSelector(context),
69+
std::static_pointer_cast<ViewProxy>(libmexclass::proxy::ProxyManager::getProxy(viewid))->getView(context));
70+
return;
71+
}
72+
6173
void MeterProviderProxy::shutdown(libmexclass::proxy::method::Context& context) {
6274
matlab::data::ArrayFactory factory;
6375
auto result_mda = factory.createScalar(static_cast<metrics_sdk::MeterProvider&>(*CppMeterProvider).Shutdown());

sdk/metrics/src/ViewProxy.cpp

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// Copyright 2023 The MathWorks, Inc.
2+
3+
#include "opentelemetry-matlab/sdk/metrics/ViewProxy.h"
4+
5+
#include "libmexclass/proxy/ProxyManager.h"
6+
7+
#include <chrono>
8+
9+
namespace libmexclass::opentelemetry::sdk {
10+
ViewProxy::ViewProxy(std::unique_ptr<metrics_sdk::View> view, std::unique_ptr<metrics_sdk::InstrumentSelector> instrumentSelector, std::unique_ptr<metrics_sdk::MeterSelector> meterSelector){
11+
View = std::move(view);
12+
InstrumentSelector = std::move(instrumentSelector);
13+
MeterSelector = std::move(meterSelector);
14+
REGISTER_METHOD(ViewProxy, getView);
15+
REGISTER_METHOD(ViewProxy, getInstrumentSelector);
16+
REGISTER_METHOD(ViewProxy, getMeterSelector);
17+
}
18+
19+
libmexclass::proxy::MakeResult ViewProxy::make(const libmexclass::proxy::FunctionArguments& constructor_arguments) {
20+
libmexclass::proxy::MakeResult out;
21+
22+
//Create View
23+
matlab::data::StringArray name_mda = constructor_arguments[0];
24+
auto name = name_mda[0];
25+
26+
matlab::data::StringArray description_mda = constructor_arguments[1];
27+
auto description = description_mda[0];
28+
29+
matlab::data::StringArray unit_mda = constructor_arguments[2];
30+
auto unit = unit_mda[0];
31+
32+
matlab::data::TypedArray<int> aggregation_type_mda = constructor_arguments[9];
33+
auto aggregation_type = static_cast<metrics_sdk::AggregationType>(static_cast<int>(aggregation_type_mda[0]));
34+
35+
std::shared_ptr<metrics_sdk::HistogramAggregationConfig> aggregation_config = std::shared_ptr<metrics_sdk::HistogramAggregationConfig>(new metrics_sdk::HistogramAggregationConfig());
36+
if(aggregation_type == metrics_sdk::AggregationType::kHistogram){
37+
matlab::data::TypedArray<double> histogramBinEdges_mda = constructor_arguments[10];
38+
std::vector<double> histogramBinEdges;
39+
for (auto h : histogramBinEdges_mda) {
40+
histogramBinEdges.push_back(h);
41+
}
42+
aggregation_config->boundaries_ = histogramBinEdges;
43+
}
44+
45+
std::unique_ptr<metrics_sdk::AttributesProcessor> attributes_processor;
46+
matlab::data::StringArray attributes_mda = constructor_arguments[8];
47+
if(attributes_mda.getNumberOfElements()==0){
48+
attributes_processor = std::unique_ptr<metrics_sdk::AttributesProcessor>(new metrics_sdk::DefaultAttributesProcessor());
49+
}else{
50+
std::unordered_map<std::string, bool> allowed_attribute_keys;
51+
for (auto a : attributes_mda) {
52+
allowed_attribute_keys[a] = true;
53+
}
54+
attributes_processor = std::unique_ptr<metrics_sdk::AttributesProcessor>(new metrics_sdk::FilteringAttributesProcessor(allowed_attribute_keys));
55+
}
56+
57+
auto view = metrics_sdk::ViewFactory::Create(name, description,
58+
unit, aggregation_type, std::move(aggregation_config), std::move(attributes_processor));
59+
60+
// Create Instrument Selector
61+
matlab::data::TypedArray<int> instrument_type_mda = constructor_arguments[4];
62+
auto instrument_type = static_cast<metrics_sdk::InstrumentType>(static_cast<int>(instrument_type_mda[0]));
63+
64+
matlab::data::StringArray instrument_name_mda = constructor_arguments[3];
65+
auto instrument_name = static_cast<std::string>(instrument_name_mda[0]);
66+
auto instrument_name_view = nostd::string_view(instrument_name);
67+
68+
auto unit_view = nostd::string_view(static_cast<std::string>(unit));
69+
70+
auto instrumentSelector = metrics_sdk::InstrumentSelectorFactory::Create(instrument_type,
71+
instrument_name, unit_view);
72+
73+
74+
// Create Meter Selector
75+
matlab::data::StringArray meter_name_mda = constructor_arguments[5];
76+
auto meter_name = static_cast<std::string>(meter_name_mda[0]);
77+
auto meter_name_view = nostd::string_view(meter_name);
78+
79+
matlab::data::StringArray meter_version_mda = constructor_arguments[6];
80+
auto meter_version = static_cast<std::string>(meter_version_mda[0]);
81+
auto meter_version_view = nostd::string_view(meter_version);
82+
83+
matlab::data::StringArray meter_schema_mda = constructor_arguments[7];
84+
auto meter_schema = static_cast<std::string>(meter_schema_mda[0]);
85+
auto meter_schema_view = nostd::string_view(meter_schema);
86+
87+
auto meterSelector = metrics_sdk::MeterSelectorFactory::Create(meter_name_view,
88+
meter_version_view, meter_schema_view);
89+
90+
91+
92+
// out = std::make_shared<ViewProxy>(nostd::shared_ptr<metrics_sdk::View>(
93+
// std::move(metrics_sdk::ViewFactory::Create(name, description,
94+
// unit, aggregation_type, std::move(aggregation_config), std::move(attributes_processor)))));
95+
96+
97+
// return out;
98+
99+
return std::make_shared<ViewProxy>(std::move(view), std::move(instrumentSelector), std::move(meterSelector));
100+
}
101+
102+
std::unique_ptr<metrics_sdk::View> ViewProxy::getView(libmexclass::proxy::method::Context& context){
103+
return std::move(View);
104+
}
105+
106+
std::unique_ptr<metrics_sdk::InstrumentSelector> ViewProxy::getInstrumentSelector(libmexclass::proxy::method::Context& context){
107+
return std::move(InstrumentSelector);
108+
}
109+
110+
std::unique_ptr<metrics_sdk::MeterSelector> ViewProxy::getMeterSelector(libmexclass::proxy::method::Context& context){
111+
return std::move(MeterSelector);
112+
}
113+
114+
}

test/tmetrics_sdk.m

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,66 @@ function testCustomResource(testCase)
146146
end
147147
end
148148

149+
% function testViewCounter(testCase)
150+
% % testCustomResource: check custom resources are included in
151+
% % emitted metrics
152+
% commonSetup(testCase)
153+
%
154+
% exporter = opentelemetry.exporters.otlp.OtlpHttpMetricExporter();
155+
% reader = opentelemetry.sdk.metrics.PeriodicExportingMetricReader(exporter, ...
156+
% "Interval", seconds(2), "Timeout", seconds(1));
157+
% mp = opentelemetry.sdk.metrics.MeterProvider(reader);
158+
%
159+
% m = getMeter(mp, "mymeter");
160+
% c = createCounter(m, "mycounter");
161+
%
162+
% % create testing value
163+
% val = 10;
164+
%
165+
% % add value and attributes
166+
% c.add(val);
167+
%
168+
% pause(2.5);
169+
%
170+
% view = opentelemetry.sdk.metrics.View("View", "my View", "Unit", "Instrument", "kCounter", "mymeter", "", "", ["One" "Two" "Three"], "kDrop", [0 100 200 300 400 500]);
171+
%
172+
% addView(mp, view);
173+
%
174+
% clear mp;
175+
%
176+
% % % TODO: add test comparisons
177+
% end
178+
179+
% function testViewHistogram(testCase)
180+
% % testCustomResource: check custom resources are included in
181+
% % emitted metrics
182+
% commonSetup(testCase)
183+
%
184+
% exporter = opentelemetry.exporters.otlp.OtlpHttpMetricExporter();
185+
% reader = opentelemetry.sdk.metrics.PeriodicExportingMetricReader(exporter, ...
186+
% "Interval", seconds(2), "Timeout", seconds(1));
187+
% mp = opentelemetry.sdk.metrics.MeterProvider(reader);
188+
% m = mp.getMeter("mymeter");
189+
% hist = m.createHistogram("histogram");
190+
%
191+
% % create value for histogram
192+
% val = 1;
193+
%
194+
% % record value
195+
% hist.record(val);
196+
%
197+
% % wait for collector response
198+
% pause(2.5);
199+
%
200+
% view = opentelemetry.sdk.metrics.View("View", "my View", "Unit", "Instrument", "kHistogram", "mymeter", "", "", ["One" "Two" "Three"], "kHistogram", [0 100 200 300 400 500]);
201+
%
202+
% addView(mp, view);
203+
%
204+
% clear mp;
205+
%
206+
% % % TODO: add test comparisons
207+
% end
208+
149209
function testShutdown(testCase)
150210
% testShutdown: shutdown method should stop exporting
151211
% of metrics

0 commit comments

Comments
 (0)