Skip to content

Commit 3f7ee56

Browse files
committed
Refactor MeterProxy to use a factory class and reduce code duplication
1 parent 489c56e commit 3f7ee56

File tree

5 files changed

+78
-49
lines changed

5 files changed

+78
-49
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ set(OPENTELEMETRY_PROXY_SOURCES
221221
${METRICS_API_SOURCE_DIR}/CounterProxy.cpp
222222
${METRICS_API_SOURCE_DIR}/UpDownCounterProxy.cpp
223223
${METRICS_API_SOURCE_DIR}/HistogramProxy.cpp
224+
${METRICS_API_SOURCE_DIR}/SynchronousInstrumentProxyFactory.cpp
224225
${CONTEXT_API_SOURCE_DIR}/TextMapPropagatorProxy.cpp
225226
${CONTEXT_API_SOURCE_DIR}/CompositePropagatorProxy.cpp
226227
${CONTEXT_API_SOURCE_DIR}/TextMapCarrierProxy.cpp

api/metrics/include/opentelemetry-matlab/metrics/MeterProxy.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "opentelemetry-matlab/metrics/CounterProxy.h"
99
#include "opentelemetry-matlab/metrics/HistogramProxy.h"
1010
#include "opentelemetry-matlab/metrics/UpDownCounterProxy.h"
11+
#include "opentelemetry-matlab/metrics/SynchronousInstrumentProxyFactory.h"
1112

1213
#include "opentelemetry/metrics/meter.h"
1314

@@ -31,6 +32,8 @@ class MeterProxy : public libmexclass::proxy::Proxy {
3132

3233
private:
3334

35+
void createSynchronous(libmexclass::proxy::method::Context& context, SynchronousInstrumentType type);
36+
3437
nostd::shared_ptr<metrics_api::Meter> CppMeter;
3538
};
3639
} // namespace libmexclass::opentelemetry
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright 2023 The MathWorks, Inc.
2+
3+
#pragma once
4+
5+
#include "libmexclass/proxy/Proxy.h"
6+
7+
#include "opentelemetry/metrics/meter.h"
8+
9+
namespace metrics_api = opentelemetry::metrics;
10+
namespace nostd = opentelemetry::nostd;
11+
12+
namespace libmexclass::opentelemetry {
13+
14+
enum class SynchronousInstrumentType {Counter, UpDownCounter, Histogram};
15+
16+
class SynchronousInstrumentProxyFactory {
17+
public:
18+
SynchronousInstrumentProxyFactory(nostd::shared_ptr<metrics_api::Meter> mt) : CppMeter(mt) {}
19+
20+
std::shared_ptr<libmexclass::proxy::Proxy> create(SynchronousInstrumentType type,
21+
const std::string& name, const std::string& description, const std::string& unit);
22+
23+
private:
24+
25+
nostd::shared_ptr<metrics_api::Meter> CppMeter;
26+
};
27+
} // namespace libmexclass::opentelemetry

api/metrics/src/MeterProxy.cpp

Lines changed: 10 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
#include <chrono>
1010

1111
namespace libmexclass::opentelemetry {
12-
void MeterProxy::createCounter(libmexclass::proxy::method::Context& context) {
12+
13+
void MeterProxy::createSynchronous(libmexclass::proxy::method::Context& context, SynchronousInstrumentType type) {
1314
// Always assumes 3 inputs
1415
matlab::data::StringArray name_mda = context.inputs[0];
1516
std::string name = static_cast<std::string>(name_mda[0]);
@@ -18,11 +19,8 @@ void MeterProxy::createCounter(libmexclass::proxy::method::Context& context) {
1819
matlab::data::StringArray unit_mda = context.inputs[2];
1920
std::string unit = static_cast<std::string>(unit_mda[0]);
2021

21-
nostd::shared_ptr<metrics_api::Counter<double> > ct = std::move(CppMeter->CreateDoubleCounter(name, description, unit));
22-
23-
// instantiate a CounterProxy instance
24-
CounterProxy* newproxy = new CounterProxy(ct);
25-
auto proxy = std::shared_ptr<libmexclass::proxy::Proxy>(newproxy);
22+
SynchronousInstrumentProxyFactory proxyfactory(CppMeter);
23+
auto proxy = proxyfactory.create(type, name, description, unit);
2624

2725
// obtain a proxy ID
2826
libmexclass::proxy::ID proxyid = libmexclass::proxy::ProxyManager::manageProxy(proxy);
@@ -33,55 +31,18 @@ void MeterProxy::createCounter(libmexclass::proxy::method::Context& context) {
3331
context.outputs[0] = proxyid_mda;
3432
}
3533

34+
void MeterProxy::createCounter(libmexclass::proxy::method::Context& context) {
35+
createSynchronous(context, SynchronousInstrumentType::Counter);
36+
}
3637

37-
void MeterProxy::createUpDownCounter(libmexclass::proxy::method::Context& context) {
38-
// Always assumes 3 inputs
39-
matlab::data::StringArray name_mda = context.inputs[0];
40-
std::string name = static_cast<std::string>(name_mda[0]);
41-
matlab::data::StringArray description_mda = context.inputs[1];
42-
std::string description= static_cast<std::string>(description_mda[0]);
43-
matlab::data::StringArray unit_mda = context.inputs[2];
44-
std::string unit = static_cast<std::string>(unit_mda[0]);
45-
46-
nostd::shared_ptr<metrics_api::UpDownCounter<double> > ct = std::move(CppMeter->CreateDoubleUpDownCounter
47-
(name, description, unit));
48-
49-
// instantiate a UpDownCounterProxy instance
50-
UpDownCounterProxy* newproxy = new UpDownCounterProxy(ct);
51-
auto proxy = std::shared_ptr<libmexclass::proxy::Proxy>(newproxy);
52-
53-
// obtain a proxy ID
54-
libmexclass::proxy::ID proxyid = libmexclass::proxy::ProxyManager::manageProxy(proxy);
5538

56-
// return the ID
57-
matlab::data::ArrayFactory factory;
58-
auto proxyid_mda = factory.createScalar<libmexclass::proxy::ID>(proxyid);
59-
context.outputs[0] = proxyid_mda;
39+
void MeterProxy::createUpDownCounter(libmexclass::proxy::method::Context& context) {
40+
createSynchronous(context, SynchronousInstrumentType::UpDownCounter);
6041
}
6142

6243

6344
void MeterProxy::createHistogram(libmexclass::proxy::method::Context& context) {
64-
// Always assumes 3 inputs
65-
matlab::data::StringArray name_mda = context.inputs[0];
66-
std::string name = static_cast<std::string>(name_mda[0]);
67-
matlab::data::StringArray description_mda = context.inputs[1];
68-
std::string description= static_cast<std::string>(description_mda[0]);
69-
matlab::data::StringArray unit_mda = context.inputs[2];
70-
std::string unit = static_cast<std::string>(unit_mda[0]);
71-
72-
nostd::shared_ptr<metrics_api::Histogram<double> > hist = std::move(CppMeter->CreateDoubleHistogram(name, description, unit));
73-
74-
// instantiate a HistogramProxy instance
75-
HistogramProxy* newproxy = new HistogramProxy(hist);
76-
auto proxy = std::shared_ptr<libmexclass::proxy::Proxy>(newproxy);
77-
78-
// obtain a proxy ID
79-
libmexclass::proxy::ID proxyid = libmexclass::proxy::ProxyManager::manageProxy(proxy);
80-
81-
// return the ID
82-
matlab::data::ArrayFactory factory;
83-
auto proxyid_mda = factory.createScalar<libmexclass::proxy::ID>(proxyid);
84-
context.outputs[0] = proxyid_mda;
45+
createSynchronous(context, SynchronousInstrumentType::Histogram);
8546
}
8647

8748

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright 2023 The MathWorks, Inc.
2+
3+
#include "opentelemetry-matlab/metrics/SynchronousInstrumentProxyFactory.h"
4+
#include "opentelemetry-matlab/metrics/CounterProxy.h"
5+
#include "opentelemetry-matlab/metrics/HistogramProxy.h"
6+
#include "opentelemetry-matlab/metrics/UpDownCounterProxy.h"
7+
8+
9+
namespace libmexclass::opentelemetry {
10+
std::shared_ptr<libmexclass::proxy::Proxy> SynchronousInstrumentProxyFactory::create(SynchronousInstrumentType type,
11+
const std::string& name, const std::string& description, const std::string& unit) {
12+
std::shared_ptr<libmexclass::proxy::Proxy> proxy;
13+
switch(type) {
14+
case SynchronousInstrumentType::Counter:
15+
{
16+
nostd::shared_ptr<metrics_api::Counter<double> > ct = std::move(CppMeter->CreateDoubleCounter(name, description, unit));
17+
proxy = std::shared_ptr<libmexclass::proxy::Proxy>(new CounterProxy(ct));
18+
}
19+
break;
20+
case SynchronousInstrumentType::UpDownCounter:
21+
{
22+
nostd::shared_ptr<metrics_api::UpDownCounter<double> > udct = std::move(CppMeter->CreateDoubleUpDownCounter(name, description, unit));
23+
proxy = std::shared_ptr<libmexclass::proxy::Proxy>(new UpDownCounterProxy(udct));
24+
}
25+
break;
26+
case SynchronousInstrumentType::Histogram:
27+
{
28+
nostd::shared_ptr<metrics_api::Histogram<double> > hist = std::move(CppMeter->CreateDoubleHistogram(name, description, unit));
29+
proxy = std::shared_ptr<libmexclass::proxy::Proxy>(new HistogramProxy(hist));
30+
}
31+
break;
32+
}
33+
return proxy;
34+
}
35+
36+
37+
} // namespace libmexclass::opentelemetry

0 commit comments

Comments
 (0)