Skip to content

Commit 6684a7d

Browse files
committed
Refactor view class
1 parent 97754c9 commit 6684a7d

File tree

7 files changed

+234
-110
lines changed

7 files changed

+234
-110
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
MATLAB® interface to [OpenTelemetry™](https://opentelemetry.io/), based on the [OpenTelemetry Specification](https://opentelemetry.io/docs/reference/specification/). OpenTelemetry is an observability framework for creating and managing telemetry data, such as traces, metrics, and logs. This data can then be sent to an observability back-end for monitoring, alerts, and analysis.
55

66
### Status
7-
- Currently only tracing and metrics are supported. Logs will be in the future.
7+
- Currently only tracing and metrics (synchronous instruments) are supported. Asynchronous metrics instruments and logs will be in the future.
8+
- View class in metrics is only partially supported. The properties **Aggregation** and **AllowedAttributes** are not yet supported.
89
- This package is supported and has been tested on Windows®, Linux®, and macOS.
910

1011
### MathWorks Products (https://www.mathworks.com)

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,12 @@
5959
"ConstructorArguments", {mpproxy.ID});
6060
% leave other properties unassigned, they won't be used
6161
else
62-
validnames = "Resource";
62+
validnames = ["Resource", "View"];
6363
resourcekeys = string.empty();
6464
resourcevalues = {};
6565
resource = dictionary(resourcekeys, resourcevalues);
66+
suppliedview = false;
67+
viewid = 0;
6668
for i = 1:length(optionnames)
6769
namei = validatestring(optionnames{i}, validnames);
6870
valuei = optionvalues{i};
@@ -79,14 +81,26 @@
7981
if all(cellfun(@iscell, resourcevalues))
8082
resourcevalues = [resourcevalues{:}];
8183
end
84+
elseif strcmp(namei, "View")
85+
suppliedview = true;
86+
view = valuei;
87+
if ~isa(view, "opentelemetry.sdk.metrics.View")
88+
error("opentelemetry:sdk:metrics:MeterProvider:InvalidViewType", ...
89+
"View input must be a opentelemetry.sdk.metrics.View object.");
90+
end
91+
viewid = view.Proxy.ID;
8292
end
8393
end
8494

8595
obj.Proxy = libmexclass.proxy.Proxy("Name", ...
8696
"libmexclass.opentelemetry.sdk.MeterProviderProxy", ...
87-
"ConstructorArguments", {reader.Proxy.ID, resourcekeys, resourcevalues});
97+
"ConstructorArguments", {reader.Proxy.ID, resourcekeys, ...
98+
resourcevalues, suppliedview, viewid});
8899
obj.MetricReader = reader;
89100
obj.Resource = resource;
101+
if suppliedview
102+
obj.View = view;
103+
end
90104
end
91105
end
92106

sdk/metrics/+opentelemetry/+sdk/+metrics/View.m

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,28 +85,38 @@
8585
arguments
8686
options.Name {mustBeTextScalar} = ""
8787
options.Description {mustBeTextScalar} = ""
88-
options.InstrumentName {mustBeTextScalar} = ""
89-
options.InstrumentType {mustBeTextScalar} = ""
88+
options.InstrumentName {mustBeTextScalar} = "*"
89+
options.InstrumentType {mustBeTextScalar} = "counter"
9090
options.InstrumentUnit {mustBeTextScalar} = ""
9191
options.MeterName {mustBeTextScalar} = ""
9292
options.MeterVersion {mustBeTextScalar} = ""
9393
options.MeterSchema {mustBeTextScalar} = ""
94-
options.AllowedAttributes {mustBeText, mustBeVector} = ""
95-
options.Aggregation {mustBeTextScalar} = ""
94+
%options.AllowedAttributes {mustBeText, mustBeVector} % no default here
95+
%options.Aggregation {mustBeTextScalar} = "default"
9696
options.HistogramBinEdges {mustBeNumeric, mustBeVector} = zeros(1,0)
9797
end
9898

99-
instrument_types = ["Counter", "Histogram", "UpDownCounter"];
99+
% Aggregation and AllowedAttributes are not yet supported
100+
options.Aggregation = "default";
101+
102+
instrument_types = ["counter", "histogram", "updowncounter"];
100103
instrument_type = validatestring(options.InstrumentType, instrument_types);
101104

102-
aggregation_types = ["Drop", "Histogram", "LastValue", "Sum", "Default"];
105+
aggregation_types = ["drop", "histogram", "lastvalue", "sum", "default"];
103106
aggregation_type = validatestring(options.Aggregation, aggregation_types);
104107

108+
% check whether AllowedAttributes is defined
109+
filter_attributes = isfield(options, "AllowedAttributes");
110+
if ~filter_attributes
111+
% put some defaults here, which will be ignored since filter_attributes is false
112+
options.AllowedAttributes = strings(1,0);
113+
end
114+
105115
obj.Proxy = libmexclass.proxy.Proxy("Name", "libmexclass.opentelemetry.sdk.ViewProxy", ...
106116
"ConstructorArguments", {options.Name, options.Description, options.InstrumentName, ...
107117
instrument_type, options.InstrumentUnit, options.MeterName, ...
108-
options.MeterVersion, options.MeterSchema, options.AllowedAttributes, ...
109-
aggregation_type, options.HistogramBinEdges});
118+
options.MeterVersion, options.MeterSchema, filter_attributes,...
119+
options.AllowedAttributes, aggregation_type, options.HistogramBinEdges});
110120

111121
obj.Name = string(options.Name);
112122
obj.Description = string(options.Description);

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

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,40 @@ namespace nostd = opentelemetry::nostd;
2828
namespace libmexclass::opentelemetry::sdk {
2929
class ViewProxy : public libmexclass::proxy::Proxy {
3030
public:
31-
ViewProxy(std::unique_ptr<metrics_sdk::View> view, std::unique_ptr<metrics_sdk::InstrumentSelector> instrumentSelector, std::unique_ptr<metrics_sdk::MeterSelector> meterSelector);
31+
ViewProxy(std::string name, std::string description, std::string instrumentName,
32+
metrics_sdk::InstrumentType instrumentType, std::string instrumentUnit, std::string meterName,
33+
std::string meterVersion, std::string meterSchema, std::unordered_map<std::string, bool> allowedAttributes,
34+
bool filterAttributes, metrics_sdk::AggregationType aggregationType, std::vector<double> histogramBinEdges)
35+
: Name(std::move(name)), Description(std::move(description)), InstrumentName(std::move(instrumentName)), InstrumentType(instrumentType),
36+
InstrumentUnit(std::move(instrumentUnit)), MeterName(std::move(meterName)), MeterVersion(std::move(meterVersion)), MeterSchema(std::move(meterSchema)),
37+
AllowedAttributes(std::move(allowedAttributes)), FilterAttributes(filterAttributes), Aggregation(aggregationType), HistogramBinEdges(std::move(histogramBinEdges)) {}
3238

3339
static libmexclass::proxy::MakeResult make(const libmexclass::proxy::FunctionArguments& constructor_arguments);
3440

35-
std::unique_ptr<metrics_sdk::View> getView(libmexclass::proxy::method::Context& context);
41+
std::unique_ptr<metrics_sdk::View> getView();
3642

37-
std::unique_ptr<metrics_sdk::InstrumentSelector> getInstrumentSelector(libmexclass::proxy::method::Context& context);
43+
std::unique_ptr<metrics_sdk::InstrumentSelector> getInstrumentSelector();
3844

39-
std::unique_ptr<metrics_sdk::MeterSelector> getMeterSelector(libmexclass::proxy::method::Context& context);
45+
std::unique_ptr<metrics_sdk::MeterSelector> getMeterSelector();
4046

4147
private:
4248
std::unique_ptr<metrics_sdk::View> View;
4349

4450
std::unique_ptr<metrics_sdk::InstrumentSelector> InstrumentSelector;
4551

46-
std::unique_ptr<metrics_sdk::MeterSelector> MeterSelector;
52+
std::string InstrumentName;
53+
metrics_sdk::InstrumentType InstrumentType;
54+
std::string InstrumentUnit;
55+
56+
std::string MeterName;
57+
std::string MeterVersion;
58+
std::string MeterSchema;
59+
60+
std::string Name;
61+
std::string Description;
62+
metrics_sdk::AggregationType Aggregation;
63+
std::vector<double> HistogramBinEdges;
64+
std::unordered_map<std::string, bool> AllowedAttributes;
65+
bool FilterAttributes;
4766
};
4867
}

sdk/metrics/src/MeterProviderProxy.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,20 @@ libmexclass::proxy::MakeResult MeterProviderProxy::make(const libmexclass::proxy
3838
auto reader = std::static_pointer_cast<PeriodicExportingMetricReaderProxy>(
3939
libmexclass::proxy::ProxyManager::getProxy(readerid))->getInstance();
4040

41-
auto view = metrics_sdk::ViewRegistryFactory::Create();
42-
auto p = metrics_sdk::MeterProviderFactory::Create(std::move(view), resource_custom);
41+
auto view_registry = metrics_sdk::ViewRegistryFactory::Create();
42+
auto p = metrics_sdk::MeterProviderFactory::Create(std::move(view_registry), resource_custom);
4343
auto *p_sdk = static_cast<metrics_sdk::MeterProvider *>(p.get());
4444
p_sdk->AddMetricReader(std::move(reader));
4545

46+
// View
47+
matlab::data::TypedArray<bool> supplied_view_mda = constructor_arguments[3];
48+
if (supplied_view_mda[0]) { // process the supplied View
49+
matlab::data::TypedArray<uint64_t> viewid_mda = constructor_arguments[4];
50+
libmexclass::proxy::ID viewid = viewid_mda[0];
51+
auto view = std::static_pointer_cast<ViewProxy>(libmexclass::proxy::ProxyManager::getProxy(viewid));
52+
p_sdk->AddView(view->getInstrumentSelector(), view->getMeterSelector(), view->getView());
53+
}
54+
4655
auto p_out = nostd::shared_ptr<metrics_api::MeterProvider>(std::move(p));
4756
out = std::make_shared<MeterProviderProxy>(p_out);
4857
}
@@ -61,12 +70,9 @@ void MeterProviderProxy::addMetricReader(libmexclass::proxy::method::Context& co
6170

6271
void MeterProviderProxy::addView(libmexclass::proxy::method::Context& context) {
6372
matlab::data::TypedArray<uint64_t> viewid_mda = context.inputs[0];
64-
libmexclass::proxy::ID viewid = viewid_mda[0];
65-
73+
std::shared_ptr<ViewProxy> view = std::static_pointer_cast<ViewProxy>(libmexclass::proxy::ProxyManager::getProxy(viewid_mda[0]));
6674
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));
75+
view->getInstrumentSelector(), view->getMeterSelector(), view->getView());
7076
return;
7177
}
7278

0 commit comments

Comments
 (0)