diff --git a/CMakeLists.txt b/CMakeLists.txt index d8633f0..2c68d4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -221,6 +221,7 @@ set(OPENTELEMETRY_PROXY_SOURCES ${METRICS_API_SOURCE_DIR}/CounterProxy.cpp ${METRICS_API_SOURCE_DIR}/UpDownCounterProxy.cpp ${METRICS_API_SOURCE_DIR}/HistogramProxy.cpp + ${METRICS_API_SOURCE_DIR}/SynchronousInstrumentProxyFactory.cpp ${CONTEXT_API_SOURCE_DIR}/TextMapPropagatorProxy.cpp ${CONTEXT_API_SOURCE_DIR}/CompositePropagatorProxy.cpp ${CONTEXT_API_SOURCE_DIR}/TextMapCarrierProxy.cpp diff --git a/api/metrics/include/opentelemetry-matlab/metrics/MeterProxy.h b/api/metrics/include/opentelemetry-matlab/metrics/MeterProxy.h index ab45e48..a3d4c32 100644 --- a/api/metrics/include/opentelemetry-matlab/metrics/MeterProxy.h +++ b/api/metrics/include/opentelemetry-matlab/metrics/MeterProxy.h @@ -8,6 +8,7 @@ #include "opentelemetry-matlab/metrics/CounterProxy.h" #include "opentelemetry-matlab/metrics/HistogramProxy.h" #include "opentelemetry-matlab/metrics/UpDownCounterProxy.h" +#include "opentelemetry-matlab/metrics/SynchronousInstrumentProxyFactory.h" #include "opentelemetry/metrics/meter.h" @@ -31,6 +32,8 @@ class MeterProxy : public libmexclass::proxy::Proxy { private: + void createSynchronous(libmexclass::proxy::method::Context& context, SynchronousInstrumentType type); + nostd::shared_ptr CppMeter; }; } // namespace libmexclass::opentelemetry diff --git a/api/metrics/include/opentelemetry-matlab/metrics/SynchronousInstrumentProxyFactory.h b/api/metrics/include/opentelemetry-matlab/metrics/SynchronousInstrumentProxyFactory.h new file mode 100644 index 0000000..bdce076 --- /dev/null +++ b/api/metrics/include/opentelemetry-matlab/metrics/SynchronousInstrumentProxyFactory.h @@ -0,0 +1,27 @@ +// Copyright 2023 The MathWorks, Inc. + +#pragma once + +#include "libmexclass/proxy/Proxy.h" + +#include "opentelemetry/metrics/meter.h" + +namespace metrics_api = opentelemetry::metrics; +namespace nostd = opentelemetry::nostd; + +namespace libmexclass::opentelemetry { + +enum class SynchronousInstrumentType {Counter, UpDownCounter, Histogram}; + +class SynchronousInstrumentProxyFactory { + public: + SynchronousInstrumentProxyFactory(nostd::shared_ptr mt) : CppMeter(mt) {} + + std::shared_ptr create(SynchronousInstrumentType type, + const std::string& name, const std::string& description, const std::string& unit); + + private: + + nostd::shared_ptr CppMeter; +}; +} // namespace libmexclass::opentelemetry diff --git a/api/metrics/src/MeterProxy.cpp b/api/metrics/src/MeterProxy.cpp index 3d0d399..68fbaea 100644 --- a/api/metrics/src/MeterProxy.cpp +++ b/api/metrics/src/MeterProxy.cpp @@ -9,7 +9,8 @@ #include namespace libmexclass::opentelemetry { -void MeterProxy::createCounter(libmexclass::proxy::method::Context& context) { + +void MeterProxy::createSynchronous(libmexclass::proxy::method::Context& context, SynchronousInstrumentType type) { // Always assumes 3 inputs matlab::data::StringArray name_mda = context.inputs[0]; std::string name = static_cast(name_mda[0]); @@ -18,11 +19,8 @@ void MeterProxy::createCounter(libmexclass::proxy::method::Context& context) { matlab::data::StringArray unit_mda = context.inputs[2]; std::string unit = static_cast(unit_mda[0]); - nostd::shared_ptr > ct = std::move(CppMeter->CreateDoubleCounter(name, description, unit)); - - // instantiate a CounterProxy instance - CounterProxy* newproxy = new CounterProxy(ct); - auto proxy = std::shared_ptr(newproxy); + SynchronousInstrumentProxyFactory proxyfactory(CppMeter); + auto proxy = proxyfactory.create(type, name, description, unit); // obtain a proxy ID libmexclass::proxy::ID proxyid = libmexclass::proxy::ProxyManager::manageProxy(proxy); @@ -33,55 +31,18 @@ void MeterProxy::createCounter(libmexclass::proxy::method::Context& context) { context.outputs[0] = proxyid_mda; } +void MeterProxy::createCounter(libmexclass::proxy::method::Context& context) { + createSynchronous(context, SynchronousInstrumentType::Counter); +} -void MeterProxy::createUpDownCounter(libmexclass::proxy::method::Context& context) { - // Always assumes 3 inputs - matlab::data::StringArray name_mda = context.inputs[0]; - std::string name = static_cast(name_mda[0]); - matlab::data::StringArray description_mda = context.inputs[1]; - std::string description= static_cast(description_mda[0]); - matlab::data::StringArray unit_mda = context.inputs[2]; - std::string unit = static_cast(unit_mda[0]); - - nostd::shared_ptr > ct = std::move(CppMeter->CreateDoubleUpDownCounter -(name, description, unit)); - - // instantiate a UpDownCounterProxy instance - UpDownCounterProxy* newproxy = new UpDownCounterProxy(ct); - auto proxy = std::shared_ptr(newproxy); - - // obtain a proxy ID - libmexclass::proxy::ID proxyid = libmexclass::proxy::ProxyManager::manageProxy(proxy); - // return the ID - matlab::data::ArrayFactory factory; - auto proxyid_mda = factory.createScalar(proxyid); - context.outputs[0] = proxyid_mda; +void MeterProxy::createUpDownCounter(libmexclass::proxy::method::Context& context) { + createSynchronous(context, SynchronousInstrumentType::UpDownCounter); } void MeterProxy::createHistogram(libmexclass::proxy::method::Context& context) { - // Always assumes 3 inputs - matlab::data::StringArray name_mda = context.inputs[0]; - std::string name = static_cast(name_mda[0]); - matlab::data::StringArray description_mda = context.inputs[1]; - std::string description= static_cast(description_mda[0]); - matlab::data::StringArray unit_mda = context.inputs[2]; - std::string unit = static_cast(unit_mda[0]); - - nostd::shared_ptr > hist = std::move(CppMeter->CreateDoubleHistogram(name, description, unit)); - - // instantiate a HistogramProxy instance - HistogramProxy* newproxy = new HistogramProxy(hist); - auto proxy = std::shared_ptr(newproxy); - - // obtain a proxy ID - libmexclass::proxy::ID proxyid = libmexclass::proxy::ProxyManager::manageProxy(proxy); - - // return the ID - matlab::data::ArrayFactory factory; - auto proxyid_mda = factory.createScalar(proxyid); - context.outputs[0] = proxyid_mda; + createSynchronous(context, SynchronousInstrumentType::Histogram); } diff --git a/api/metrics/src/SynchronousInstrumentProxyFactory.cpp b/api/metrics/src/SynchronousInstrumentProxyFactory.cpp new file mode 100644 index 0000000..d3d34e9 --- /dev/null +++ b/api/metrics/src/SynchronousInstrumentProxyFactory.cpp @@ -0,0 +1,37 @@ +// Copyright 2023 The MathWorks, Inc. + +#include "opentelemetry-matlab/metrics/SynchronousInstrumentProxyFactory.h" +#include "opentelemetry-matlab/metrics/CounterProxy.h" +#include "opentelemetry-matlab/metrics/HistogramProxy.h" +#include "opentelemetry-matlab/metrics/UpDownCounterProxy.h" + + +namespace libmexclass::opentelemetry { +std::shared_ptr SynchronousInstrumentProxyFactory::create(SynchronousInstrumentType type, + const std::string& name, const std::string& description, const std::string& unit) { + std::shared_ptr proxy; + switch(type) { + case SynchronousInstrumentType::Counter: + { + nostd::shared_ptr > ct = std::move(CppMeter->CreateDoubleCounter(name, description, unit)); + proxy = std::shared_ptr(new CounterProxy(ct)); + } + break; + case SynchronousInstrumentType::UpDownCounter: + { + nostd::shared_ptr > udct = std::move(CppMeter->CreateDoubleUpDownCounter(name, description, unit)); + proxy = std::shared_ptr(new UpDownCounterProxy(udct)); + } + break; + case SynchronousInstrumentType::Histogram: + { + nostd::shared_ptr > hist = std::move(CppMeter->CreateDoubleHistogram(name, description, unit)); + proxy = std::shared_ptr(new HistogramProxy(hist)); + } + break; + } + return proxy; +} + + +} // namespace libmexclass::opentelemetry