From c08cf3844549eb9a3ff5d1b40d795ef89f670ea3 Mon Sep 17 00:00:00 2001 From: Lalit Date: Tue, 1 Mar 2022 23:53:40 -0800 Subject: [PATCH 01/14] collector and reader --- .../sdk/metrics/async_instruments.h | 55 ++----------- .../sdk/metrics/export/metric_producer.h | 36 +++++++++ .../opentelemetry/sdk/metrics/instruments.h | 7 -- sdk/include/opentelemetry/sdk/metrics/meter.h | 8 +- .../opentelemetry/sdk/metrics/meter_context.h | 50 ++++++++---- .../sdk/metrics/meter_provider.h | 18 ++--- .../sdk/metrics/metric_exporter.h | 8 +- .../opentelemetry/sdk/metrics/metric_reader.h | 53 +++++-------- .../sdk/metrics/state/metric_collector.h | 48 ++++++++++++ .../sdk/metrics/state/metric_storage.h | 1 + .../sdk/metrics/sync_instruments.h | 5 +- sdk/src/metrics/CMakeLists.txt | 2 + sdk/src/metrics/meter.cc | 28 +++---- sdk/src/metrics/meter_context.cc | 43 ++++++---- sdk/src/metrics/meter_provider.cc | 24 +++--- sdk/src/metrics/metric_reader.cc | 78 +++++++++++++++++++ sdk/src/metrics/state/metric_collector.cc | 44 +++++++++++ sdk/src/metrics/sync_instruments.cc | 1 + sdk/test/metrics/async_instruments_test.cc | 21 ++--- sdk/test/metrics/meter_provider_sdk_test.cc | 12 ++- 20 files changed, 352 insertions(+), 190 deletions(-) create mode 100644 sdk/include/opentelemetry/sdk/metrics/export/metric_producer.h create mode 100644 sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h create mode 100644 sdk/src/metrics/metric_reader.cc create mode 100644 sdk/src/metrics/state/metric_collector.cc diff --git a/sdk/include/opentelemetry/sdk/metrics/async_instruments.h b/sdk/include/opentelemetry/sdk/metrics/async_instruments.h index d66bb69890..f38ad6a3b4 100644 --- a/sdk/include/opentelemetry/sdk/metrics/async_instruments.h +++ b/sdk/include/opentelemetry/sdk/metrics/async_instruments.h @@ -5,10 +5,8 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/metrics/async_instruments.h" # include "opentelemetry/metrics/observer_result.h" -# include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" -# include "opentelemetry/sdk/metrics/measurement_processor.h" - # include "opentelemetry/nostd/string_view.h" +# include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" # include "opentelemetry/sdk/metrics/instruments.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk @@ -23,13 +21,11 @@ class Asynchronous Asynchronous(nostd::string_view name, const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library, - MeasurementProcessor *measurement_processor, void (*callback)(opentelemetry::metrics::ObserverResult &), nostd::string_view description = "", nostd::string_view unit = "") : name_(name), instrumentation_library_{instrumentation_library}, - measurement_processor_{measurement_processor}, callback_(callback), description_(description), unit_(unit) @@ -39,7 +35,6 @@ class Asynchronous std::string name_; const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library_; - const MeasurementProcessor *measurement_processor_; void (*callback_)(opentelemetry::metrics::ObserverResult &); std::string description_; std::string unit_; @@ -52,16 +47,10 @@ class LongObservableCounter : public opentelemetry::metrics::ObservableCounter &), nostd::string_view description = "", nostd::string_view unit = "") - : Asynchronous(name, - instrumentation_library, - measurement_processor, - callback, - description, - unit) + : Asynchronous(name, instrumentation_library, callback, description, unit) {} }; @@ -73,16 +62,10 @@ class DoubleObservableCounter : public opentelemetry::metrics::ObservableCounter DoubleObservableCounter(nostd::string_view name, const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library, - MeasurementProcessor *measurement_processor, void (*callback)(opentelemetry::metrics::ObserverResult &), nostd::string_view description = "", nostd::string_view unit = "") - : Asynchronous(name, - instrumentation_library, - measurement_processor, - callback, - description, - unit) + : Asynchronous(name, instrumentation_library, callback, description, unit) {} }; @@ -94,16 +77,10 @@ class LongObservableGauge : public opentelemetry::metrics::ObservableGauge LongObservableGauge(nostd::string_view name, const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library, - MeasurementProcessor *measurement_processor, void (*callback)(opentelemetry::metrics::ObserverResult &), nostd::string_view description = "", nostd::string_view unit = "") - : Asynchronous(name, - instrumentation_library, - measurement_processor, - callback, - description, - unit) + : Asynchronous(name, instrumentation_library, callback, description, unit) {} }; @@ -115,16 +92,10 @@ class DoubleObservableGauge : public opentelemetry::metrics::ObservableGauge &), nostd::string_view description = "", nostd::string_view unit = "") - : Asynchronous(name, - instrumentation_library, - measurement_processor, - callback, - description, - unit) + : Asynchronous(name, instrumentation_library, callback, description, unit) {} }; @@ -137,16 +108,10 @@ class LongObservableUpDownCounter : public opentelemetry::metrics::ObservableUpD nostd::string_view name, const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library, - MeasurementProcessor *measurement_processor, void (*callback)(opentelemetry::metrics::ObserverResult &), nostd::string_view description = "", nostd::string_view unit = "") - : Asynchronous(name, - instrumentation_library, - measurement_processor, - callback, - description, - unit) + : Asynchronous(name, instrumentation_library, callback, description, unit) {} }; @@ -160,16 +125,10 @@ class DoubleObservableUpDownCounter nostd::string_view name, const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library, - MeasurementProcessor *measurement_processor, void (*callback)(opentelemetry::metrics::ObserverResult &), nostd::string_view description = "", nostd::string_view unit = "") - : Asynchronous(name, - instrumentation_library, - measurement_processor, - callback, - description, - unit) + : Asynchronous(name, instrumentation_library, callback, description, unit) {} }; diff --git a/sdk/include/opentelemetry/sdk/metrics/export/metric_producer.h b/sdk/include/opentelemetry/sdk/metrics/export/metric_producer.h new file mode 100644 index 0000000000..7c9ee57755 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/export/metric_producer.h @@ -0,0 +1,36 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/data/metric_data.h" +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ + +/** + * MetricProducer is the interface that is used to make metric data available to the + * OpenTelemetry exporters. Implementations should be stateful, in that each call to + * `Collect` will return any metric generated since the last call was made. + * + *

Implementations must be thread-safe. + */ + +class MetricProducer +{ +public: + /** + * The callback to be called for each metric exporter. This will only be those + * metrics that have been produced since the last time this method was called. + * + * @return a status of completion of method. + */ + virtual bool Collect(nostd::function_ref callback) noexcept = 0; +}; + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif diff --git a/sdk/include/opentelemetry/sdk/metrics/instruments.h b/sdk/include/opentelemetry/sdk/metrics/instruments.h index ff8ed297fc..ad64ce718b 100644 --- a/sdk/include/opentelemetry/sdk/metrics/instruments.h +++ b/sdk/include/opentelemetry/sdk/metrics/instruments.h @@ -54,13 +54,6 @@ struct InstrumentDescriptor using MetricAttributes = opentelemetry::sdk::common::OrderedAttributeMap; -// TBD -> Remove once MetricCollector is imoplemeted -class MetricCollector -{ -public: - AggregationTemporarily aggregation_temporarily_; -}; - /*class InstrumentSelector { public: InstrumentSelector(opentelemetry::nostd::string_view name, diff --git a/sdk/include/opentelemetry/sdk/metrics/meter.h b/sdk/include/opentelemetry/sdk/metrics/meter.h index 24c60b454a..43e979c955 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter.h @@ -7,7 +7,6 @@ # include "opentelemetry/metrics/meter.h" # include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" # include "opentelemetry/sdk/metrics/instruments.h" -# include "opentelemetry/sdk/metrics/measurement_processor.h" # include "opentelemetry/sdk/metrics/meter_context.h" # include "opentelemetry/sdk/resource/resource.h" # include "opentelemetry/version.h" @@ -17,6 +16,10 @@ namespace sdk { namespace metrics { + +class MetricStorage; +class WritableMetricStorage; + class Meter final : public opentelemetry::metrics::Meter { public: @@ -99,9 +102,6 @@ class Meter final : public opentelemetry::metrics::Meter const sdk::instrumentationlibrary::InstrumentationLibrary *GetInstrumentationLibrary() const noexcept; - /** Returns the associated measurement processor */ - MeasurementProcessor *GetMeasurementProcessor() const noexcept; - private: // order of declaration is important here - instrumentation library should destroy after // meter-context. diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_context.h b/sdk/include/opentelemetry/sdk/metrics/meter_context.h index f0fdc6d946..c1063427cc 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_context.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_context.h @@ -3,27 +3,34 @@ #pragma once #ifndef ENABLE_METRICS_PREVIEW -# include -# include -# include -# include "opentelemetry/sdk/metrics/metric_exporter.h" -# include "opentelemetry/sdk/metrics/metric_reader.h" + # include "opentelemetry/sdk/metrics/view/instrument_selector.h" # include "opentelemetry/sdk/metrics/view/meter_selector.h" # include "opentelemetry/sdk/metrics/view/view_registry.h" # include "opentelemetry/sdk/resource/resource.h" # include "opentelemetry/version.h" +# include +# include +# include + OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk { namespace metrics { + +// forward declaration +class Meter; +class MetricCollector; +class MetricExporter; +class MetricReader; + /** * A class which stores the MeterProvider context. */ -class MeterContext +class MeterContext : public std::enable_shared_from_this { public: /** @@ -35,7 +42,6 @@ class MeterContext */ MeterContext( std::vector> &&exporters, - std::vector> &&readers, std::unique_ptr views = std::unique_ptr(new ViewRegistry()), opentelemetry::sdk::resource::Resource resource = opentelemetry::sdk::resource::Resource::Create({})) noexcept; @@ -46,18 +52,18 @@ class MeterContext */ const opentelemetry::sdk::resource::Resource &GetResource() const noexcept; - /** - * Obtain the reference of measurement_processor. - * - */ - MeasurementProcessor *GetMeasurementProcessor() const noexcept; - /** * Obtain the View Registry configured * @return The reference to view registry */ ViewRegistry *GetViewRegistry() const noexcept; + /** + * Obtain the configured meters. + * + */ + nostd::span> GetMeters() noexcept; + /** * Attaches a metric exporter to list of configured exporters for this Meter context. * @param exporter The metric exporter for this meter context. This @@ -91,23 +97,33 @@ class MeterContext std::unique_ptr view) noexcept; /** - * Force all active Exporters and Readers to flush any buffered meter data + * Adds a meter to the list of configured meters. + * + * Note: This method is not thread safe, and should ideally be called from main thread in + * thread-safe manner. + * + * @param meter + */ + void AddMeter(std::shared_ptr meter); + + /** + * Force all active Exporters and Collectors to flush any buffered meter data * within the given timeout. */ bool ForceFlush(std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept; /** - * Shutdown the Exporters and Readers associated with this meter provider. + * Shutdown the Exporters and Collectors associated with this meter provider. */ bool Shutdown() noexcept; private: + std::vector> meters_; opentelemetry::sdk::resource::Resource resource_; std::vector> exporters_; - std::vector> readers_; + std::vector> collectors_; std::unique_ptr views_; - std::unique_ptr measurement_processor_; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_provider.h b/sdk/include/opentelemetry/sdk/metrics/meter_provider.h index 7d7966147f..c6efba6222 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_provider.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_provider.h @@ -6,9 +6,9 @@ # include # include # include +# include "opentelemetry/metrics/meter.h" # include "opentelemetry/metrics/meter_provider.h" # include "opentelemetry/nostd/shared_ptr.h" -# include "opentelemetry/sdk/metrics/measurement_processor.h" # include "opentelemetry/sdk/metrics/meter.h" # include "opentelemetry/sdk/metrics/meter_context.h" # include "opentelemetry/sdk/resource/resource.h" @@ -19,19 +19,23 @@ namespace sdk { namespace metrics { + +// forward declaration +class MetricCollector; +class MetricExporter; +class MetricReader; + class MeterProvider final : public opentelemetry::metrics::MeterProvider { public: /** * Initialize a new meter provider * @param exporters The span exporters for this meter provider - * @param readers The readers for this meter provider. * @param views The views for this meter provider * @param resource The resources for this meter provider. */ MeterProvider( std::vector> &&exporters, - std::vector> &&readers, std::unique_ptr views = std::unique_ptr(new ViewRegistry()), sdk::resource::Resource resource = sdk::resource::Resource::Create({})) noexcept; @@ -52,12 +56,6 @@ class MeterProvider final : public opentelemetry::metrics::MeterProvider */ const sdk::resource::Resource &GetResource() const noexcept; - /** - * Obtain the reference of measurement processor. - * - */ - MeasurementProcessor *GetMeasurementProcessor() const noexcept; - /** * Attaches a metric exporter to list of configured exporters for this Meter provider. * @param exporter The metric exporter for this meter provider. This @@ -101,8 +99,6 @@ class MeterProvider final : public opentelemetry::metrics::MeterProvider bool ForceFlush(std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept; private: - // // order of declaration is important here - meter should destroy only after resource. - std::vector> meters_; std::shared_ptr context_; std::mutex lock_; }; diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h b/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h index 039d3819ec..96898c9ad1 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h @@ -3,19 +3,21 @@ #pragma once #ifndef ENABLE_METRICS_PREVIEW -# include -# include + # include "opentelemetry/nostd/span.h" # include "opentelemetry/sdk/common/exporter_utils.h" -# include "opentelemetry/sdk/metrics/data/metric_data.h" # include "opentelemetry/version.h" +# include +# include + OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk { namespace metrics { +class MetricData; /** * MetricExporter defines the interface to be used by metrics libraries to * push metrics data to the OpenTelemetry exporters. diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h index 16a1880113..4b04b569d4 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h @@ -9,12 +9,15 @@ # include "opentelemetry/sdk/metrics/instruments.h" # include "opentelemetry/version.h" +# include + OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk { namespace metrics { +class MetricProducer; /** * MetricReader defines the interface to collect metrics from SDK */ @@ -22,56 +25,38 @@ class MetricReader { public: MetricReader( - AggregationTemporarily aggregation_temporarily = AggregationTemporarily::kCummulative) - : aggregation_temporarily_(aggregation_temporarily), measurement_processor_callback_({}) - {} + AggregationTemporarily aggregation_temporarily = AggregationTemporarily::kCummulative); - virtual ~MetricReader() = default; + void SetMetricProducer(std::shared_ptr &&metric_producer); /** * Collect the metrics from SDK. * @return return the status of the operation. */ - bool Collect() noexcept - { - if (!measurement_processor_callback_) - { - OTEL_INTERNAL_LOG_WARN( - "Cannot invoke Collect() for MetricReader. No collection callback registered!") - } - return measurement_processor_callback_( - *this, aggregation_temporarily_, - [&](MetricData metric_data) noexcept { return ProcessReceivedMetrics(metric_data); }); - } + bool Collect(nostd::function_ref callback) noexcept; - /** - * Register the callback to Measurement Processor - * This function is internal to SDK. - */ - void RegisterCollectorCallback( - std::function)> measurement_processor_callback) - { - measurement_processor_callback_ = measurement_processor_callback; - } + AggregationTemporarily GetAggregationTemporarily() const noexcept; /** - * Process the metrics received through Measurement Processor. + * Shutdown the meter reader. */ - virtual bool ProcessReceivedMetrics(MetricData &metric_data) noexcept = 0; + bool Shutdown() noexcept; /** - * Shut down the metric reader. - * @param timeout an optional timeout. - * @return return the status of the operation. + * Force flush the metric read by the reader. */ - virtual bool Shutdown() noexcept = 0; + bool ForceFlush(std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept; + + virtual bool OnForceFlush() noexcept = 0; + + virtual bool OnShutDown() noexcept = 0; + + virtual void OnInitialized() noexcept {} private: - std::function)> - measurement_processor_callback_; + std::shared_ptr metric_producer_; AggregationTemporarily aggregation_temporarily_; + bool shutdown_; }; } // namespace metrics } // namespace sdk diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h new file mode 100644 index 0000000000..a9e5fd7469 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h @@ -0,0 +1,48 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/data/metric_data.h" +# include "opentelemetry/sdk/metrics/export/metric_producer.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ + +class MetricReader; +class MeterContext; +/** + * An internal opaque interface that the MetricReader receives as + * MetricProducer. It acts as the storage key to the internal metric stream + * state for each MetricReader. + */ + +class MetricCollector : public MetricProducer, public std::enable_shared_from_this +{ +public: + MetricCollector(std::shared_ptr &&context, + std::unique_ptr metric_reader); + + /** + * The callback to be called for each metric exporter. This will only be those + * metrics that have been produced since the last time this method was called. + * + * @return a status of completion of method. + */ + bool Collect(nostd::function_ref callback) noexcept override; + + bool ForceFlush(std::chrono::microseconds timeout) noexcept; + + bool Shutdown() noexcept; + +private: + std::shared_ptr meter_context_; + std::unique_ptr metric_reader_; +}; +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif \ No newline at end of file diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h index c2213a701b..8bb011696e 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h @@ -13,6 +13,7 @@ namespace metrics { /* Represent the storage from which to collect the metrics */ +class MetricCollector; class MetricStorage { diff --git a/sdk/include/opentelemetry/sdk/metrics/sync_instruments.h b/sdk/include/opentelemetry/sdk/metrics/sync_instruments.h index aa0348f0b0..3e8c5c8623 100644 --- a/sdk/include/opentelemetry/sdk/metrics/sync_instruments.h +++ b/sdk/include/opentelemetry/sdk/metrics/sync_instruments.h @@ -7,7 +7,6 @@ # include "opentelemetry/metrics/sync_instruments.h" # include "opentelemetry/nostd/string_view.h" # include "opentelemetry/sdk/metrics/instruments.h" -# include "opentelemetry/sdk/metrics/measurement_processor.h" # include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" @@ -16,6 +15,10 @@ namespace sdk { namespace metrics { + +// forward declaration +class WritableMetricStorage; + class Synchronous { public: diff --git a/sdk/src/metrics/CMakeLists.txt b/sdk/src/metrics/CMakeLists.txt index f9b6d546ed..119477eb06 100644 --- a/sdk/src/metrics/CMakeLists.txt +++ b/sdk/src/metrics/CMakeLists.txt @@ -3,6 +3,8 @@ add_library( meter_provider.cc meter.cc meter_context.cc + metric_reader.cc + state/metric_collector.cc aggregation/histogram_aggregation.cc aggregation/lastvalue_aggregation.cc aggregation/sum_aggregation.cc diff --git a/sdk/src/metrics/meter.cc b/sdk/src/metrics/meter.cc index 52ecfc9e4e..ed83a14955 100644 --- a/sdk/src/metrics/meter.cc +++ b/sdk/src/metrics/meter.cc @@ -7,6 +7,7 @@ # include "opentelemetry/nostd/shared_ptr.h" # include "opentelemetry/sdk/metrics/async_instruments.h" # include "opentelemetry/sdk/metrics/state/multi_metric_storage.h" +# include "opentelemetry/sdk/metrics/state/sync_metric_storage.h" # include "opentelemetry/sdk/metrics/sync_instruments.h" # include "opentelemetry/sdk_config.h" @@ -61,8 +62,8 @@ nostd::shared_ptr> Meter::CreateLongObservableC nostd::string_view description, nostd::string_view unit) noexcept { - return nostd::shared_ptr>{new LongObservableCounter( - name, GetInstrumentationLibrary(), GetMeasurementProcessor(), callback, description, unit)}; + return nostd::shared_ptr>{ + new LongObservableCounter(name, GetInstrumentationLibrary(), callback, description, unit)}; } nostd::shared_ptr> Meter::CreateDoubleObservableCounter( @@ -71,8 +72,8 @@ nostd::shared_ptr> Meter::CreateDoubleObserva nostd::string_view description, nostd::string_view unit) noexcept { - return nostd::shared_ptr>{new DoubleObservableCounter( - name, GetInstrumentationLibrary(), GetMeasurementProcessor(), callback, description, unit)}; + return nostd::shared_ptr>{ + new DoubleObservableCounter(name, GetInstrumentationLibrary(), callback, description, unit)}; } nostd::shared_ptr> Meter::CreateLongHistogram( @@ -109,8 +110,8 @@ nostd::shared_ptr> Meter::CreateLongObservableGau nostd::string_view description, nostd::string_view unit) noexcept { - return nostd::shared_ptr>{new LongObservableGauge( - name, GetInstrumentationLibrary(), GetMeasurementProcessor(), callback, description, unit)}; + return nostd::shared_ptr>{ + new LongObservableGauge(name, GetInstrumentationLibrary(), callback, description, unit)}; } nostd::shared_ptr> Meter::CreateDoubleObservableGauge( @@ -119,8 +120,8 @@ nostd::shared_ptr> Meter::CreateDoubleObservabl nostd::string_view description, nostd::string_view unit) noexcept { - return nostd::shared_ptr>{new DoubleObservableGauge( - name, GetInstrumentationLibrary(), GetMeasurementProcessor(), callback, description, unit)}; + return nostd::shared_ptr>{ + new DoubleObservableGauge(name, GetInstrumentationLibrary(), callback, description, unit)}; } nostd::shared_ptr> Meter::CreateLongUpDownCounter( @@ -158,7 +159,7 @@ nostd::shared_ptr> Meter::CreateLongObser nostd::string_view unit) noexcept { return nostd::shared_ptr>{new LongObservableUpDownCounter( - name, GetInstrumentationLibrary(), GetMeasurementProcessor(), callback, description, unit)}; + name, GetInstrumentationLibrary(), callback, description, unit)}; } nostd::shared_ptr> @@ -168,8 +169,8 @@ Meter::CreateDoubleObservableUpDownCounter(nostd::string_view name, nostd::string_view unit) noexcept { return nostd::shared_ptr>{ - new DoubleObservableUpDownCounter(name, GetInstrumentationLibrary(), - GetMeasurementProcessor(), callback, description, unit)}; + new DoubleObservableUpDownCounter(name, GetInstrumentationLibrary(), callback, description, + unit)}; } const sdk::instrumentationlibrary::InstrumentationLibrary *Meter::GetInstrumentationLibrary() @@ -178,11 +179,6 @@ const sdk::instrumentationlibrary::InstrumentationLibrary *Meter::GetInstrumenta return instrumentation_library_.get(); } -MeasurementProcessor *Meter::GetMeasurementProcessor() const noexcept -{ - return meter_context_->GetMeasurementProcessor(); -} - std::unique_ptr Meter::RegisterMetricStorage( InstrumentDescriptor &instrument_descriptor) { diff --git a/sdk/src/metrics/meter_context.cc b/sdk/src/metrics/meter_context.cc index bc2f75de2a..3280b20fe9 100644 --- a/sdk/src/metrics/meter_context.cc +++ b/sdk/src/metrics/meter_context.cc @@ -2,8 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 #ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/meter_context.h" # include "opentelemetry/sdk/common/global_log_handler.h" -# include "opentelemetry/sdk/metrics/meter.h" +# include "opentelemetry/sdk/metrics/metric_exporter.h" +# include "opentelemetry/sdk/metrics/metric_exporter.h" +# include "opentelemetry/sdk/metrics/metric_reader.h" +# include "opentelemetry/sdk/metrics/state/metric_collector.h" # include "opentelemetry/sdk_config.h" # include "opentelemetry/version.h" @@ -14,13 +18,9 @@ namespace metrics { MeterContext::MeterContext(std::vector> &&exporters, - std::vector> &&readers, std::unique_ptr views, opentelemetry::sdk::resource::Resource resource) noexcept - : exporters_(std::move(exporters)), - readers_(std::move(readers)), - views_(std::move(views)), - resource_{resource} + : exporters_(std::move(exporters)), views_(std::move(views)), resource_{resource} {} const resource::Resource &MeterContext::GetResource() const noexcept @@ -28,14 +28,14 @@ const resource::Resource &MeterContext::GetResource() const noexcept return resource_; } -MeasurementProcessor *MeterContext::GetMeasurementProcessor() const noexcept +ViewRegistry *MeterContext::GetViewRegistry() const noexcept { - return measurement_processor_.get(); + return views_.get(); } -ViewRegistry *MeterContext::GetViewRegistry() const noexcept +nostd::span> MeterContext::GetMeters() noexcept { - return views_.get(); + return nostd::span>{meters_}; } void MeterContext::AddMetricExporter(std::unique_ptr exporter) noexcept @@ -45,7 +45,9 @@ void MeterContext::AddMetricExporter(std::unique_ptr exporter) n void MeterContext::AddMetricReader(std::unique_ptr reader) noexcept { - readers_.push_back(std::move(reader)); + auto collector = + std::shared_ptr{new MetricCollector(shared_from_this(), std::move(reader))}; + collectors_.push_back(collector); } void MeterContext::AddView(std::unique_ptr instrument_selector, @@ -55,10 +57,17 @@ void MeterContext::AddView(std::unique_ptr instrument_select views_->AddView(std::move(instrument_selector), std::move(meter_selector), std::move(view)); } +void MeterContext::AddMeter(std::shared_ptr meter) +{ + meters_.push_back(meter); +} + bool MeterContext::Shutdown() noexcept { - bool result_exporter = true; - bool result_reader = true; + bool result_exporter = true; + bool result_reader = true; + bool result_collector = true; + for (auto &exporter : exporters_) { bool status = exporter->Shutdown(); @@ -68,12 +77,12 @@ bool MeterContext::Shutdown() noexcept { OTEL_INTERNAL_LOG_WARN("[MeterContext::Shutdown] Unable to shutdown all metric exporters"); } - for (auto &reader : readers_) + for (auto &collector : collectors_) { - bool status = reader->Shutdown(); - result_reader = result_reader && status; + bool status = collector->Shutdown(); + result_collector = result_reader && status; } - if (!result_reader) + if (!result_collector) { OTEL_INTERNAL_LOG_WARN("[MeterContext::Shutdown] Unable to shutdown all metric readers"); } diff --git a/sdk/src/metrics/meter_provider.cc b/sdk/src/metrics/meter_provider.cc index db1737ce94..8a9572c88c 100644 --- a/sdk/src/metrics/meter_provider.cc +++ b/sdk/src/metrics/meter_provider.cc @@ -3,6 +3,10 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/sdk/metrics/meter_provider.h" +# include "opentelemetry/metrics/meter.h" +# include "opentelemetry/sdk/metrics/metric_exporter.h" +# include "opentelemetry/sdk/metrics/metric_reader.h" + # include "opentelemetry/sdk/common/global_log_handler.h" # include "opentelemetry/sdk_config.h" # include "opentelemetry/version.h" @@ -20,13 +24,9 @@ namespace metrics_api = opentelemetry::metrics; MeterProvider::MeterProvider(std::shared_ptr context) noexcept : context_{context} {} MeterProvider::MeterProvider(std::vector> &&exporters, - std::vector> &&readers, std::unique_ptr views, sdk::resource::Resource resource) noexcept - : context_(std::make_shared(std::move(exporters), - std::move(readers), - std::move(views), - resource)) + : context_(std::make_shared(std::move(exporters), std::move(views), resource)) {} nostd::shared_ptr MeterProvider::GetMeter( @@ -42,7 +42,7 @@ nostd::shared_ptr MeterProvider::GetMeter( const std::lock_guard guard(lock_); - for (auto &meter : meters_) + for (auto &meter : context_->GetMeters()) { auto meter_lib = meter->GetInstrumentationLibrary(); if (meter_lib->equal(name, version, schema_url)) @@ -50,9 +50,10 @@ nostd::shared_ptr MeterProvider::GetMeter( return nostd::shared_ptr{meter}; } } - auto lib = instrumentationlibrary::InstrumentationLibrary::Create(name, version, schema_url); - meters_.push_back(std::shared_ptr(new Meter(context_, std::move(lib)))); - return nostd::shared_ptr{meters_.back()}; + auto lib = instrumentationlibrary::InstrumentationLibrary::Create(name, version, schema_url); + auto meter = std::shared_ptr(new Meter(context_, std::move(lib))); + context_->AddMeter(meter); + return nostd::shared_ptr{meter}; } const resource::Resource &MeterProvider::GetResource() const noexcept @@ -60,11 +61,6 @@ const resource::Resource &MeterProvider::GetResource() const noexcept return context_->GetResource(); } -MeasurementProcessor *MeterProvider::GetMeasurementProcessor() const noexcept -{ - return context_->GetMeasurementProcessor(); -} - void MeterProvider::AddMetricExporter(std::unique_ptr exporter) noexcept { return context_->AddMetricExporter(std::move(exporter)); diff --git a/sdk/src/metrics/metric_reader.cc b/sdk/src/metrics/metric_reader.cc new file mode 100644 index 0000000000..47ee90e6ab --- /dev/null +++ b/sdk/src/metrics/metric_reader.cc @@ -0,0 +1,78 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/metric_reader.h" +# include "opentelemetry/sdk/metrics/export/metric_producer.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ + +MetricReader::MetricReader(AggregationTemporarily aggregation_temporarily) + : aggregation_temporarily_(aggregation_temporarily) +{} + +void MetricReader::SetMetricProducer(std::shared_ptr &&metric_producer) +{ + metric_producer_ = metric_producer; +} + +AggregationTemporarily MetricReader::GetAggregationTemporarily() const noexcept +{ + return aggregation_temporarily_; +} + +bool MetricReader::Collect(nostd::function_ref callback) noexcept +{ + if (!metric_producer_) + { + OTEL_INTERNAL_LOG_WARN( + "MetricReader::Collect Cannot invoke Collect(). No MetricProducer registered for " + "collection!") + } + if (shutdown_) + { + OTEL_INTERNAL_LOG_WARN("MetricReader::Collect Cannot invoke Collect(). Shutdown in progress!"); + } + + return metric_producer_->Collect(callback); +} + +bool MetricReader::Shutdown() noexcept +{ + bool status = true; + if (shutdown_) + { + OTEL_INTERNAL_LOG_WARN("MetricReader::Shutdown Cannot invoke shutown twice!"); + } + if (!OnShutDown()) + { + status = false; + OTEL_INTERNAL_LOG_ERROR("MetricReader::OnShutDown Shutdown failed. Will not be tried again!"); + } + shutdown_ = true; + return status; +} + +/** Flush metric read by this reader **/ +bool MetricReader::ForceFlush(std::chrono::microseconds timeout) noexcept +{ + bool status = true; + if (shutdown_) + { + OTEL_INTERNAL_LOG_WARN("MetricReader::Shutdown Cannot invoke Force flush on shutdown reader!"); + } + if (!OnForceFlush()) + { + status = false; + OTEL_INTERNAL_LOG_ERROR("MetricReader::OnForceFlush failed!"); + } + return status; +} +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif \ No newline at end of file diff --git a/sdk/src/metrics/state/metric_collector.cc b/sdk/src/metrics/state/metric_collector.cc new file mode 100644 index 0000000000..89c6c14a56 --- /dev/null +++ b/sdk/src/metrics/state/metric_collector.cc @@ -0,0 +1,44 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/state/metric_collector.h" +# include "opentelemetry/sdk/common/global_log_handler.h" +# include "opentelemetry/sdk/metrics/meter_context.h" +# include "opentelemetry/sdk/metrics/metric_reader.h" +# include "opentelemetry/sdk_config.h" +# include "opentelemetry/version.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ + +MetricCollector::MetricCollector( + std::shared_ptr &&context, + std::unique_ptr metric_reader) + : meter_context_{context}, metric_reader_{std::move(metric_reader)} +{ + metric_reader_->SetMetricProducer(this->shared_from_this()); +} + +bool MetricCollector::Collect(nostd::function_ref callback) noexcept +{ + return metric_reader_->Collect(callback); +} + +bool MetricCollector::ForceFlush(std::chrono::microseconds timeout) noexcept +{ + return metric_reader_->ForceFlush(timeout); +} + +bool MetricCollector::Shutdown() noexcept +{ + return metric_reader_->Shutdown(); +} + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif \ No newline at end of file diff --git a/sdk/src/metrics/sync_instruments.cc b/sdk/src/metrics/sync_instruments.cc index 85e770a715..863e5b6323 100644 --- a/sdk/src/metrics/sync_instruments.cc +++ b/sdk/src/metrics/sync_instruments.cc @@ -3,6 +3,7 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/sdk/metrics/sync_instruments.h" +# include "opentelemetry/sdk/metrics/state/metric_storage.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk diff --git a/sdk/test/metrics/async_instruments_test.cc b/sdk/test/metrics/async_instruments_test.cc index abaeb83028..ad3a81b031 100644 --- a/sdk/test/metrics/async_instruments_test.cc +++ b/sdk/test/metrics/async_instruments_test.cc @@ -4,7 +4,6 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/sdk/metrics/async_instruments.h" # include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" -# include "opentelemetry/sdk/metrics/measurement_processor.h" # include @@ -13,7 +12,6 @@ using namespace opentelemetry::sdk::instrumentationlibrary; using namespace opentelemetry::sdk::metrics; auto instrumentation_library = InstrumentationLibrary::Create("opentelemetry-cpp", "0.1.0"); -DefaultMeasurementProcessor measurement_processor; using M = std::map; @@ -25,48 +23,43 @@ TEST(AsyncInstruments, LongObservableCounter) { auto asyc_generate_meas_long = [](opentelemetry::metrics::ObserverResult &observer) {}; EXPECT_NO_THROW(LongObservableCounter counter("long_counter", instrumentation_library.get(), - &measurement_processor, asyc_generate_meas_long, - "description", "1")); + asyc_generate_meas_long, "description", "1")); } TEST(AsyncInstruments, DoubleObservableCounter) { auto asyc_generate_meas_double = [](opentelemetry::metrics::ObserverResult &observer) {}; EXPECT_NO_THROW(DoubleObservableCounter counter("long_counter", instrumentation_library.get(), - &measurement_processor, asyc_generate_meas_double, - "description", "1")); + asyc_generate_meas_double, "description", "1")); } TEST(AsyncInstruments, LongObservableGauge) { auto asyc_generate_meas_long = [](opentelemetry::metrics::ObserverResult &observer) {}; EXPECT_NO_THROW(LongObservableGauge counter("long_counter", instrumentation_library.get(), - &measurement_processor, asyc_generate_meas_long, - "description", "1")); + asyc_generate_meas_long, "description", "1")); } TEST(AsyncInstruments, DoubleObservableGauge) { auto asyc_generate_meas_double = [](opentelemetry::metrics::ObserverResult &observer) {}; EXPECT_NO_THROW(DoubleObservableGauge counter("long_counter", instrumentation_library.get(), - &measurement_processor, asyc_generate_meas_double, - "description", "1")); + asyc_generate_meas_double, "description", "1")); } TEST(AsyncInstruments, LongObservableUpDownCounter) { auto asyc_generate_meas_long = [](opentelemetry::metrics::ObserverResult &observer) {}; EXPECT_NO_THROW(LongObservableUpDownCounter counter("long_counter", instrumentation_library.get(), - &measurement_processor, asyc_generate_meas_long, "description", "1")); } TEST(AsyncInstruments, DoubleObservableUpDownCounter) { auto asyc_generate_meas_double = [](opentelemetry::metrics::ObserverResult &observer) {}; - EXPECT_NO_THROW(DoubleObservableUpDownCounter counter( - "long_counter", instrumentation_library.get(), &measurement_processor, - asyc_generate_meas_double, "description", "1")); + EXPECT_NO_THROW( + DoubleObservableUpDownCounter counter("long_counter", instrumentation_library.get(), + asyc_generate_meas_double, "description", "1")); } #endif diff --git a/sdk/test/metrics/meter_provider_sdk_test.cc b/sdk/test/metrics/meter_provider_sdk_test.cc index e321a29a96..9b6ea95f48 100644 --- a/sdk/test/metrics/meter_provider_sdk_test.cc +++ b/sdk/test/metrics/meter_provider_sdk_test.cc @@ -3,8 +3,11 @@ #ifndef ENABLE_METRICS_PREVIEW # include +# include "opentelemetry/sdk/metrics/export/metric_producer.h" # include "opentelemetry/sdk/metrics/meter.h" # include "opentelemetry/sdk/metrics/meter_provider.h" +# include "opentelemetry/sdk/metrics/metric_exporter.h" +# include "opentelemetry/sdk/metrics/metric_reader.h" # include "opentelemetry/sdk/metrics/view/instrument_selector.h" # include "opentelemetry/sdk/metrics/view/meter_selector.h" @@ -36,17 +39,18 @@ class MockMetricExporter : public MetricExporter class MockMetricReader : public MetricReader { public: - bool ProcessReceivedMetrics(MetricData &metric_data) noexcept override { return true; } + virtual bool OnForceFlush() noexcept override { return true; } - bool Shutdown() noexcept override { return true; } + virtual bool OnShutDown() noexcept override { return true; } + + virtual void OnInitialized() noexcept override {} }; TEST(MeterProvider, GetMeter) { std::vector> exporters; - std::vector> readers; - MeterProvider mp1(std::move(exporters), std::move(readers)); + MeterProvider mp1(std::move(exporters)); // std::unique_ptr view{std::unique_ptr()}; // MeterProvider mp1(std::move(exporters), std::move(readers), std::move(views); auto m1 = mp1.GetMeter("test"); From c729c6ad9427d55b228064e410a06d35ed05ef25 Mon Sep 17 00:00:00 2001 From: Lalit Date: Wed, 2 Mar 2022 00:47:02 -0800 Subject: [PATCH 02/14] fix format, and memory corruption --- sdk/src/metrics/meter_context.cc | 1 - sdk/src/metrics/metric_reader.cc | 2 +- sdk/src/metrics/state/metric_collector.cc | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sdk/src/metrics/meter_context.cc b/sdk/src/metrics/meter_context.cc index 3280b20fe9..62851e7870 100644 --- a/sdk/src/metrics/meter_context.cc +++ b/sdk/src/metrics/meter_context.cc @@ -5,7 +5,6 @@ # include "opentelemetry/sdk/metrics/meter_context.h" # include "opentelemetry/sdk/common/global_log_handler.h" # include "opentelemetry/sdk/metrics/metric_exporter.h" -# include "opentelemetry/sdk/metrics/metric_exporter.h" # include "opentelemetry/sdk/metrics/metric_reader.h" # include "opentelemetry/sdk/metrics/state/metric_collector.h" # include "opentelemetry/sdk_config.h" diff --git a/sdk/src/metrics/metric_reader.cc b/sdk/src/metrics/metric_reader.cc index 47ee90e6ab..180b33c695 100644 --- a/sdk/src/metrics/metric_reader.cc +++ b/sdk/src/metrics/metric_reader.cc @@ -17,7 +17,7 @@ MetricReader::MetricReader(AggregationTemporarily aggregation_temporarily) void MetricReader::SetMetricProducer(std::shared_ptr &&metric_producer) { - metric_producer_ = metric_producer; + metric_producer_ = std::move(metric_producer); } AggregationTemporarily MetricReader::GetAggregationTemporarily() const noexcept diff --git a/sdk/src/metrics/state/metric_collector.cc b/sdk/src/metrics/state/metric_collector.cc index 89c6c14a56..246e906358 100644 --- a/sdk/src/metrics/state/metric_collector.cc +++ b/sdk/src/metrics/state/metric_collector.cc @@ -18,7 +18,7 @@ namespace metrics MetricCollector::MetricCollector( std::shared_ptr &&context, std::unique_ptr metric_reader) - : meter_context_{context}, metric_reader_{std::move(metric_reader)} + : meter_context_{std::move(context)}, metric_reader_{std::move(metric_reader)} { metric_reader_->SetMetricProducer(this->shared_from_this()); } From f692e1572811db01474ba31c8f3c4b4300604b50 Mon Sep 17 00:00:00 2001 From: Lalit Date: Wed, 2 Mar 2022 22:28:26 -0800 Subject: [PATCH 03/14] changes for metric flow --- sdk/include/opentelemetry/sdk/metrics/meter.h | 5 +++ .../opentelemetry/sdk/metrics/meter_context.h | 17 ++++++- .../opentelemetry/sdk/metrics/metric_reader.h | 5 ++- .../sdk/metrics/state/metric_collector.h | 15 +++++-- .../sdk/metrics/state/metric_storage.h | 31 +++++++------ .../sdk/metrics/state/sync_metric_storage.h | 18 ++++---- sdk/src/metrics/meter.cc | 20 +++++++++ sdk/src/metrics/meter_context.cc | 18 ++++++-- sdk/src/metrics/metric_reader.cc | 6 +-- sdk/src/metrics/state/metric_collector.cc | 17 +++++-- sdk/test/metrics/BUILD | 16 +++++++ sdk/test/metrics/CMakeLists.txt | 3 +- sdk/test/metrics/metric_reader_test.cc | 45 +++++++++++++++++++ 13 files changed, 178 insertions(+), 38 deletions(-) create mode 100644 sdk/test/metrics/metric_reader_test.cc diff --git a/sdk/include/opentelemetry/sdk/metrics/meter.h b/sdk/include/opentelemetry/sdk/metrics/meter.h index 43e979c955..fc9fb36503 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter.h @@ -102,6 +102,11 @@ class Meter final : public opentelemetry::metrics::Meter const sdk::instrumentationlibrary::InstrumentationLibrary *GetInstrumentationLibrary() const noexcept; + /** collect metrics across all the meters **/ + bool collect(CollectorHandle *collector, + opentelemetry::common::SystemTimestamp collect_ts, + nostd::function_ref callback) noexcept; + private: // order of declaration is important here - instrumentation library should destroy after // meter-context. diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_context.h b/sdk/include/opentelemetry/sdk/metrics/meter_context.h index c1063427cc..46f9b12825 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_context.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_context.h @@ -4,6 +4,7 @@ #pragma once #ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/state/metric_collector.h" # include "opentelemetry/sdk/metrics/view/instrument_selector.h" # include "opentelemetry/sdk/metrics/view/meter_selector.h" # include "opentelemetry/sdk/metrics/view/view_registry.h" @@ -22,7 +23,6 @@ namespace metrics // forward declaration class Meter; -class MetricCollector; class MetricExporter; class MetricReader; @@ -64,6 +64,18 @@ class MeterContext : public std::enable_shared_from_this */ nostd::span> GetMeters() noexcept; + /** + * Obtain the configured collectors. + * + */ + nostd::span> GetCollectors() noexcept; + + /** + * GET SDK Start time + * + */ + opentelemetry::common::SystemTimestamp GetSDKStartTime() noexcept; + /** * Attaches a metric exporter to list of configured exporters for this Meter context. * @param exporter The metric exporter for this meter context. This @@ -122,8 +134,9 @@ class MeterContext : public std::enable_shared_from_this std::vector> meters_; opentelemetry::sdk::resource::Resource resource_; std::vector> exporters_; - std::vector> collectors_; + std::vector> collectors_; std::unique_ptr views_; + opentelemetry::common::SystemTimestamp sdk_start_ts_; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h index 4b04b569d4..ccabe7d616 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h @@ -27,7 +27,7 @@ class MetricReader MetricReader( AggregationTemporarily aggregation_temporarily = AggregationTemporarily::kCummulative); - void SetMetricProducer(std::shared_ptr &&metric_producer); + void SetMetricProducer(MetricProducer *metric_producer); /** * Collect the metrics from SDK. @@ -47,6 +47,7 @@ class MetricReader */ bool ForceFlush(std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept; +private: virtual bool OnForceFlush() noexcept = 0; virtual bool OnShutDown() noexcept = 0; @@ -54,7 +55,7 @@ class MetricReader virtual void OnInitialized() noexcept {} private: - std::shared_ptr metric_producer_; + MetricProducer *metric_producer_; AggregationTemporarily aggregation_temporarily_; bool shutdown_; }; diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h index a9e5fd7469..799f752e62 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h @@ -14,18 +14,27 @@ namespace metrics class MetricReader; class MeterContext; + +class CollectorHandle +{ +public: + virtual AggregationTemporarily GetAggregationTemporarily() noexcept = 0; +}; + /** * An internal opaque interface that the MetricReader receives as * MetricProducer. It acts as the storage key to the internal metric stream * state for each MetricReader. */ -class MetricCollector : public MetricProducer, public std::enable_shared_from_this +class MetricCollector : public MetricProducer, public CollectorHandle { public: MetricCollector(std::shared_ptr &&context, std::unique_ptr metric_reader); + AggregationTemporarily GetAggregationTemporarily() noexcept override; + /** * The callback to be called for each metric exporter. This will only be those * metrics that have been produced since the last time this method was called. @@ -40,9 +49,9 @@ class MetricCollector : public MetricProducer, public std::enable_shared_from_th private: std::shared_ptr meter_context_; - std::unique_ptr metric_reader_; + std::shared_ptr metric_reader_; }; } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE -#endif \ No newline at end of file +#endif diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h index 8bb011696e..d64aff40e1 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h @@ -4,6 +4,7 @@ #pragma once #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/common/key_value_iterable_view.h" +# include "opentelemetry/common/timestamp.h" # include "opentelemetry/sdk/metrics/data/metric_data.h" # include "opentelemetry/sdk/metrics/instruments.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -13,18 +14,20 @@ namespace metrics { /* Represent the storage from which to collect the metrics */ -class MetricCollector; +class CollectorHandle; class MetricStorage { public: /* collect the metrics from this storage */ - virtual bool Collect( - MetricCollector *collector, - nostd::span collectors, - opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library, - opentelemetry::sdk::resource::Resource *resource, - nostd::function_ref callback) noexcept = 0; + virtual bool Collect(CollectorHandle *collector, + nostd::span> collectors, + const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary + &instrumentation_library, + const opentelemetry::sdk::resource::Resource &resource, + opentelemetry::common::SystemTimestamp sdk_start_ts, + opentelemetry::common::SystemTimestamp collection_ts, + nostd::function_ref callback) noexcept = 0; }; class WritableMetricStorage @@ -44,12 +47,14 @@ class WritableMetricStorage class NoopMetricStorage : public MetricStorage { public: - bool Collect( - MetricCollector *collector, - nostd::span collectors, - opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library, - opentelemetry::sdk::resource::Resource *resource, - nostd::function_ref callback) noexcept override + bool Collect(CollectorHandle *collector, + nostd::span> collectors, + const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary + &instrumentation_library, + const opentelemetry::sdk::resource::Resource &resource, + opentelemetry::common::SystemTimestamp sdk_start_ts, + opentelemetry::common::SystemTimestamp collection_ts, + nostd::function_ref callback) noexcept override { MetricData metric_data; if (callback(metric_data)) diff --git a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h index ee64c5fba4..3744328270 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h @@ -86,15 +86,17 @@ class SyncMetricStorage : public MetricStorage, public WritableMetricStorage aggregation->Aggregate(value); } - bool Collect( - MetricCollector *collector, - nostd::span collectors, - opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library, - opentelemetry::sdk::resource::Resource *resource, - nostd::function_ref callback) noexcept override + bool Collect(CollectorHandle *collector, + nostd::span> collectors, + const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary + &instrumentation_library, + const opentelemetry::sdk::resource::Resource &resource, + opentelemetry::common::SystemTimestamp sdk_start_ts, + opentelemetry::common::SystemTimestamp collection_ts, + nostd::function_ref callback) noexcept override { - - if (callback(MetricData())) + MetricData data; + if (callback(data)) { return true; } diff --git a/sdk/src/metrics/meter.cc b/sdk/src/metrics/meter.cc index ed83a14955..0db8ca59af 100644 --- a/sdk/src/metrics/meter.cc +++ b/sdk/src/metrics/meter.cc @@ -208,6 +208,26 @@ std::unique_ptr Meter::RegisterMetricStorage( return std::move(storages); } +/** collect metrics across all the meters **/ +bool Meter::collect(CollectorHandle *collector, + opentelemetry::common::SystemTimestamp collect_ts, + nostd::function_ref callback) noexcept +{ + std::vector data; + for (auto &metric_storage : storage_registry_) + { + // TBD - this needs to be asynchronous + metric_storage.second->Collect(collector, meter_context_->GetCollectors(), + *instrumentation_library_, meter_context_->GetResource(), + meter_context_->GetSDKStartTime(), collect_ts, + [&callback](MetricData &metric_data) { + callback(metric_data); + return true; + }); + } + return true; +} + } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/src/metrics/meter_context.cc b/sdk/src/metrics/meter_context.cc index 62851e7870..7ec523c463 100644 --- a/sdk/src/metrics/meter_context.cc +++ b/sdk/src/metrics/meter_context.cc @@ -6,7 +6,6 @@ # include "opentelemetry/sdk/common/global_log_handler.h" # include "opentelemetry/sdk/metrics/metric_exporter.h" # include "opentelemetry/sdk/metrics/metric_reader.h" -# include "opentelemetry/sdk/metrics/state/metric_collector.h" # include "opentelemetry/sdk_config.h" # include "opentelemetry/version.h" @@ -19,7 +18,10 @@ namespace metrics MeterContext::MeterContext(std::vector> &&exporters, std::unique_ptr views, opentelemetry::sdk::resource::Resource resource) noexcept - : exporters_(std::move(exporters)), views_(std::move(views)), resource_{resource} + : exporters_(std::move(exporters)), + views_(std::move(views)), + resource_{resource}, + sdk_start_ts_{std::chrono::system_clock::now()} {} const resource::Resource &MeterContext::GetResource() const noexcept @@ -37,6 +39,16 @@ nostd::span> MeterContext::GetMeters() noexcept return nostd::span>{meters_}; } +nostd::span> MeterContext::GetCollectors() noexcept +{ + return nostd::span>(collectors_); +} + +opentelemetry::common::SystemTimestamp MeterContext::GetSDKStartTime() noexcept +{ + return sdk_start_ts_; +} + void MeterContext::AddMetricExporter(std::unique_ptr exporter) noexcept { exporters_.push_back(std::move(exporter)); @@ -78,7 +90,7 @@ bool MeterContext::Shutdown() noexcept } for (auto &collector : collectors_) { - bool status = collector->Shutdown(); + bool status = std::static_pointer_cast(collector)->Shutdown(); result_collector = result_reader && status; } if (!result_collector) diff --git a/sdk/src/metrics/metric_reader.cc b/sdk/src/metrics/metric_reader.cc index 180b33c695..9e2abfb982 100644 --- a/sdk/src/metrics/metric_reader.cc +++ b/sdk/src/metrics/metric_reader.cc @@ -15,9 +15,9 @@ MetricReader::MetricReader(AggregationTemporarily aggregation_temporarily) : aggregation_temporarily_(aggregation_temporarily) {} -void MetricReader::SetMetricProducer(std::shared_ptr &&metric_producer) +void MetricReader::SetMetricProducer(MetricProducer *metric_producer) { - metric_producer_ = std::move(metric_producer); + metric_producer_ = metric_producer; } AggregationTemporarily MetricReader::GetAggregationTemporarily() const noexcept @@ -75,4 +75,4 @@ bool MetricReader::ForceFlush(std::chrono::microseconds timeout) noexcept } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE -#endif \ No newline at end of file +#endif diff --git a/sdk/src/metrics/state/metric_collector.cc b/sdk/src/metrics/state/metric_collector.cc index 246e906358..dc7039c2d4 100644 --- a/sdk/src/metrics/state/metric_collector.cc +++ b/sdk/src/metrics/state/metric_collector.cc @@ -4,6 +4,7 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/sdk/metrics/state/metric_collector.h" # include "opentelemetry/sdk/common/global_log_handler.h" +# include "opentelemetry/sdk/metrics/meter.h" # include "opentelemetry/sdk/metrics/meter_context.h" # include "opentelemetry/sdk/metrics/metric_reader.h" # include "opentelemetry/sdk_config.h" @@ -20,12 +21,22 @@ MetricCollector::MetricCollector( std::unique_ptr metric_reader) : meter_context_{std::move(context)}, metric_reader_{std::move(metric_reader)} { - metric_reader_->SetMetricProducer(this->shared_from_this()); + metric_reader_->SetMetricProducer(this); +} + +AggregationTemporarily MetricCollector::GetAggregationTemporarily() noexcept +{ + return metric_reader_->GetAggregationTemporarily(); } bool MetricCollector::Collect(nostd::function_ref callback) noexcept { - return metric_reader_->Collect(callback); + for (auto &meter : meter_context_->GetMeters()) + { + auto collection_ts = std::chrono::system_clock::now(); + meter->collect(this, collection_ts, callback); + } + return true; } bool MetricCollector::ForceFlush(std::chrono::microseconds timeout) noexcept @@ -41,4 +52,4 @@ bool MetricCollector::Shutdown() noexcept } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE -#endif \ No newline at end of file +#endif diff --git a/sdk/test/metrics/BUILD b/sdk/test/metrics/BUILD index d49d855d8f..79df854e17 100644 --- a/sdk/test/metrics/BUILD +++ b/sdk/test/metrics/BUILD @@ -16,6 +16,22 @@ cc_test( ], ) +cc_test( + name = "meter_reader_test", + srcs = [ + "meter_reader_test.cc", + ], + tags = [ + "metrics", + "test", + ], + deps = [ + "//sdk/src/metrics", + "//sdk/src/resource", + "@com_google_googletest//:gtest_main", + ], +) + cc_test( name = "view_registry_test", srcs = [ diff --git a/sdk/test/metrics/CMakeLists.txt b/sdk/test/metrics/CMakeLists.txt index fb823feaca..5581b739e0 100644 --- a/sdk/test/metrics/CMakeLists.txt +++ b/sdk/test/metrics/CMakeLists.txt @@ -8,7 +8,8 @@ foreach( sync_metric_storage_test multi_metric_storage_test sync_instruments_test - async_instruments_test) + async_instruments_test + metric_reader_test) add_executable(${testname} "${testname}.cc") target_link_libraries( ${testname} ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} diff --git a/sdk/test/metrics/metric_reader_test.cc b/sdk/test/metrics/metric_reader_test.cc new file mode 100644 index 0000000000..0b27d18cc0 --- /dev/null +++ b/sdk/test/metrics/metric_reader_test.cc @@ -0,0 +1,45 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/metric_reader.h" +# include +# include "opentelemetry/sdk/metrics/meter_context.h" +# include "opentelemetry/sdk/metrics/metric_exporter.h" + +using namespace opentelemetry; +using namespace opentelemetry::sdk::instrumentationlibrary; +using namespace opentelemetry::sdk::metrics; + +# include + +class MockMetricReader : public MetricReader +{ +public: + MockMetricReader(AggregationTemporarily aggr_temporarily) : MetricReader(aggr_temporarily) {} + + virtual bool OnForceFlush() noexcept override { return true; } + + virtual bool OnShutDown() noexcept override { return true; } + + virtual void OnInitialized() noexcept override {} +}; + +TEST(MetricReaderTest, BasicTests) +{ + AggregationTemporarily aggr_temporarily = AggregationTemporarily::kDelta; + std::unique_ptr metric_reader1(new MockMetricReader(aggr_temporarily)); + EXPECT_EQ(metric_reader1->GetAggregationTemporarily(), aggr_temporarily); + + std::vector> exporters; + std::shared_ptr meter_context1(new MeterContext(std::move(exporters))); + EXPECT_NO_THROW(meter_context1->AddMetricReader(std::move(metric_reader1))); + + std::unique_ptr metric_reader2(new MockMetricReader(aggr_temporarily)); + std::shared_ptr meter_context2(new MeterContext(std::move(exporters))); + MetricProducer *metric_producer = + new MetricCollector(std::move(meter_context2), std::move(metric_reader2)); + std::cout << metric_producer << "\n"; + EXPECT_NO_THROW(metric_producer->Collect([](MetricData data) { return true; })); +} +#endif From ffb54ee3ba261283682fec959cdfa4ca8b38a5c2 Mon Sep 17 00:00:00 2001 From: Lalit Date: Wed, 2 Mar 2022 22:33:14 -0800 Subject: [PATCH 04/14] fix bazel build --- sdk/test/metrics/BUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/test/metrics/BUILD b/sdk/test/metrics/BUILD index 79df854e17..69dbbe76d2 100644 --- a/sdk/test/metrics/BUILD +++ b/sdk/test/metrics/BUILD @@ -17,9 +17,9 @@ cc_test( ) cc_test( - name = "meter_reader_test", + name = "metric_reader_test", srcs = [ - "meter_reader_test.cc", + "metric_reader_test.cc", ], tags = [ "metrics", From 8ecf7291b22476ff7d35fda849ab395b3fa2621a Mon Sep 17 00:00:00 2001 From: Lalit Date: Wed, 2 Mar 2022 23:27:01 -0800 Subject: [PATCH 05/14] fix ostream exporter --- .../include/opentelemetry/exporters/ostream/metric_exporter.h | 1 + 1 file changed, 1 insertion(+) diff --git a/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h b/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h index 5658e3bff7..024462e7ae 100644 --- a/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h +++ b/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h @@ -8,6 +8,7 @@ # include # include "opentelemetry/common/spin_lock_mutex.h" # include "opentelemetry/nostd/span.h" +# include "opentelemetry/sdk/metrics/data/point_data.h" # include "opentelemetry/sdk/metrics/instruments.h" # include "opentelemetry/sdk/metrics/metric_exporter.h" # include "opentelemetry/sdk/metrics/recordable.h" From ad471d061585bfd4e9e93ad5e4c97acbd2fbd062 Mon Sep 17 00:00:00 2001 From: Lalit Date: Thu, 3 Mar 2022 10:35:11 -0800 Subject: [PATCH 06/14] build error on windows --- .../include/opentelemetry/exporters/ostream/metric_exporter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h b/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h index 024462e7ae..5f27db13d2 100644 --- a/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h +++ b/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h @@ -8,7 +8,7 @@ # include # include "opentelemetry/common/spin_lock_mutex.h" # include "opentelemetry/nostd/span.h" -# include "opentelemetry/sdk/metrics/data/point_data.h" +# include "opentelemetry/sdk/metrics/data/metric_data.h" # include "opentelemetry/sdk/metrics/instruments.h" # include "opentelemetry/sdk/metrics/metric_exporter.h" # include "opentelemetry/sdk/metrics/recordable.h" From 3d584faa107fda0c702ec0cb5711ec7a3127d0b6 Mon Sep 17 00:00:00 2001 From: Lalit Date: Mon, 14 Mar 2022 15:16:00 -0700 Subject: [PATCH 07/14] review comments --- .../opentelemetry/sdk/metrics/meter_context.h | 5 ++--- .../opentelemetry/sdk/metrics/metric_reader.h | 9 ++++++++- sdk/src/metrics/metric_reader.cc | 17 ++++++++++++++--- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_context.h b/sdk/include/opentelemetry/sdk/metrics/meter_context.h index 46f9b12825..e6b17007c0 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_context.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_context.h @@ -131,12 +131,11 @@ class MeterContext : public std::enable_shared_from_this bool Shutdown() noexcept; private: - std::vector> meters_; + opentelemetry::common::SystemTimestamp sdk_start_ts_; opentelemetry::sdk::resource::Resource resource_; - std::vector> exporters_; std::vector> collectors_; std::unique_ptr views_; - opentelemetry::common::SystemTimestamp sdk_start_ts_; + std::vector> meters_; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h index ccabe7d616..e9b0c50a69 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h @@ -3,12 +3,14 @@ #pragma once #ifndef ENABLE_METRICS_PREVIEW -# include +# include "opentelemetry/common/spin_lock_mutex.h" # include "opentelemetry/sdk/common/global_log_handler.h" # include "opentelemetry/sdk/metrics/data/metric_data.h" # include "opentelemetry/sdk/metrics/instruments.h" + # include "opentelemetry/version.h" +# include # include OPENTELEMETRY_BEGIN_NAMESPACE @@ -47,6 +49,8 @@ class MetricReader */ bool ForceFlush(std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept; + virtual ~MetricReader() = default; + private: virtual bool OnForceFlush() noexcept = 0; @@ -54,9 +58,12 @@ class MetricReader virtual void OnInitialized() noexcept {} + bool IsShutdown() const noexcept; + private: MetricProducer *metric_producer_; AggregationTemporarily aggregation_temporarily_; + mutable opentelemetry::common::SpinLockMutex lock_; bool shutdown_; }; } // namespace metrics diff --git a/sdk/src/metrics/metric_reader.cc b/sdk/src/metrics/metric_reader.cc index 9e2abfb982..d07e07e86b 100644 --- a/sdk/src/metrics/metric_reader.cc +++ b/sdk/src/metrics/metric_reader.cc @@ -5,6 +5,8 @@ # include "opentelemetry/sdk/metrics/metric_reader.h" # include "opentelemetry/sdk/metrics/export/metric_producer.h" +# include + OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk { @@ -33,7 +35,7 @@ bool MetricReader::Collect(nostd::function_ref callback) noexc "MetricReader::Collect Cannot invoke Collect(). No MetricProducer registered for " "collection!") } - if (shutdown_) + if (IsShutdown()) { OTEL_INTERNAL_LOG_WARN("MetricReader::Collect Cannot invoke Collect(). Shutdown in progress!"); } @@ -44,15 +46,17 @@ bool MetricReader::Collect(nostd::function_ref callback) noexc bool MetricReader::Shutdown() noexcept { bool status = true; - if (shutdown_) + + if (IsShutdown()) { - OTEL_INTERNAL_LOG_WARN("MetricReader::Shutdown Cannot invoke shutown twice!"); + OTEL_INTERNAL_LOG_WARN("MetricReader::Shutdown - Cannot invoke shutdown twice!"); } if (!OnShutDown()) { status = false; OTEL_INTERNAL_LOG_ERROR("MetricReader::OnShutDown Shutdown failed. Will not be tried again!"); } + const std::lock_guard locked(lock_); shutdown_ = true; return status; } @@ -72,6 +76,13 @@ bool MetricReader::ForceFlush(std::chrono::microseconds timeout) noexcept } return status; } + +bool MetricReader::IsShutdown() const noexcept +{ + const std::lock_guard locked(lock_); + return shutdown_; +} + } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE From 7c713060583d6becfb04561c212656ff385f0793 Mon Sep 17 00:00:00 2001 From: Lalit Date: Mon, 14 Mar 2022 15:18:05 -0700 Subject: [PATCH 08/14] fix --- sdk/include/opentelemetry/sdk/metrics/meter_context.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_context.h b/sdk/include/opentelemetry/sdk/metrics/meter_context.h index e6b17007c0..fb2246d620 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_context.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_context.h @@ -131,10 +131,11 @@ class MeterContext : public std::enable_shared_from_this bool Shutdown() noexcept; private: - opentelemetry::common::SystemTimestamp sdk_start_ts_; opentelemetry::sdk::resource::Resource resource_; + std::vector> exporters_; std::vector> collectors_; std::unique_ptr views_; + opentelemetry::common::SystemTimestamp sdk_start_ts_; std::vector> meters_; }; From 38ae17650f5cc16a7f1a7309da09c2b995ed36c4 Mon Sep 17 00:00:00 2001 From: Lalit Date: Mon, 14 Mar 2022 15:35:57 -0700 Subject: [PATCH 09/14] fix review comment --- sdk/src/metrics/meter_context.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/src/metrics/meter_context.cc b/sdk/src/metrics/meter_context.cc index 7ec523c463..3fe6aaa8bf 100644 --- a/sdk/src/metrics/meter_context.cc +++ b/sdk/src/metrics/meter_context.cc @@ -18,9 +18,9 @@ namespace metrics MeterContext::MeterContext(std::vector> &&exporters, std::unique_ptr views, opentelemetry::sdk::resource::Resource resource) noexcept - : exporters_(std::move(exporters)), + : resource_{resource}, + exporters_(std::move(exporters)), views_(std::move(views)), - resource_{resource}, sdk_start_ts_{std::chrono::system_clock::now()} {} From ea31e1d3d33d980825720238c0e07dcf388e277c Mon Sep 17 00:00:00 2001 From: Lalit Date: Mon, 14 Mar 2022 15:46:28 -0700 Subject: [PATCH 10/14] Fix review --- sdk/include/opentelemetry/sdk/metrics/metric_reader.h | 4 ++-- .../opentelemetry/sdk/metrics/state/metric_collector.h | 4 ++-- sdk/src/metrics/metric_reader.cc | 2 +- sdk/src/metrics/state/metric_collector.cc | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h index e9b0c50a69..7ad359af0b 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h @@ -42,12 +42,12 @@ class MetricReader /** * Shutdown the meter reader. */ - bool Shutdown() noexcept; + bool Shutdown(std::chrono::microseconds timeout = std::chrono::microseconds::max()) noexcept; /** * Force flush the metric read by the reader. */ - bool ForceFlush(std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept; + bool ForceFlush(std::chrono::microseconds timeout = std::chrono::microseconds::max()) noexcept; virtual ~MetricReader() = default; diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h index 799f752e62..3049440d9d 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h @@ -43,9 +43,9 @@ class MetricCollector : public MetricProducer, public CollectorHandle */ bool Collect(nostd::function_ref callback) noexcept override; - bool ForceFlush(std::chrono::microseconds timeout) noexcept; + bool ForceFlush(std::chrono::microseconds timeout = std::chrono::microseconds::max()) noexcept; - bool Shutdown() noexcept; + bool Shutdown(std::chrono::microseconds timeout = std::chrono::microseconds::max()) noexcept; private: std::shared_ptr meter_context_; diff --git a/sdk/src/metrics/metric_reader.cc b/sdk/src/metrics/metric_reader.cc index d07e07e86b..b8c81c1c16 100644 --- a/sdk/src/metrics/metric_reader.cc +++ b/sdk/src/metrics/metric_reader.cc @@ -43,7 +43,7 @@ bool MetricReader::Collect(nostd::function_ref callback) noexc return metric_producer_->Collect(callback); } -bool MetricReader::Shutdown() noexcept +bool MetricReader::Shutdown(std::chrono::microseconds timeout) noexcept { bool status = true; diff --git a/sdk/src/metrics/state/metric_collector.cc b/sdk/src/metrics/state/metric_collector.cc index dc7039c2d4..a52c6e9b1c 100644 --- a/sdk/src/metrics/state/metric_collector.cc +++ b/sdk/src/metrics/state/metric_collector.cc @@ -44,9 +44,9 @@ bool MetricCollector::ForceFlush(std::chrono::microseconds timeout) noexcept return metric_reader_->ForceFlush(timeout); } -bool MetricCollector::Shutdown() noexcept +bool MetricCollector::Shutdown(std::chrono::microseconds timeout) noexcept { - return metric_reader_->Shutdown(); + return metric_reader_->Shutdown(timeout); } } // namespace metrics From 4a1980bb4027aa8da8c4f77441e9d29c1aee87f0 Mon Sep 17 00:00:00 2001 From: Lalit Date: Mon, 14 Mar 2022 15:47:33 -0700 Subject: [PATCH 11/14] fix --- sdk/test/metrics/metric_reader_test.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/test/metrics/metric_reader_test.cc b/sdk/test/metrics/metric_reader_test.cc index 0b27d18cc0..f513c9c2be 100644 --- a/sdk/test/metrics/metric_reader_test.cc +++ b/sdk/test/metrics/metric_reader_test.cc @@ -39,7 +39,6 @@ TEST(MetricReaderTest, BasicTests) std::shared_ptr meter_context2(new MeterContext(std::move(exporters))); MetricProducer *metric_producer = new MetricCollector(std::move(meter_context2), std::move(metric_reader2)); - std::cout << metric_producer << "\n"; EXPECT_NO_THROW(metric_producer->Collect([](MetricData data) { return true; })); } #endif From b1667f9d588d3660de0dafe4b8c5513fc195c2df Mon Sep 17 00:00:00 2001 From: Lalit Date: Mon, 14 Mar 2022 15:59:52 -0700 Subject: [PATCH 12/14] conflict --- .../sdk/metrics/state/metric_storage.h | 22 +++++++++---------- .../sdk/metrics/state/sync_metric_storage.h | 11 +++++----- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h index 332fb49ec2..6f63594ec9 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h @@ -20,12 +20,11 @@ class MetricStorage { public: /* collect the metrics from this storage */ - virtual bool Collect( - MetricCollector *collector, - nostd::span collectors, - opentelemetry::common::SystemTimestamp sdk_start_ts, - opentelemetry::common::SystemTimestamp collection_ts, - nostd::function_ref callback) noexcept = 0; + virtual bool Collect(MetricCollector *collector, + nostd::span collectors, + opentelemetry::common::SystemTimestamp sdk_start_ts, + opentelemetry::common::SystemTimestamp collection_ts, + nostd::function_ref callback) noexcept = 0; }; class WritableMetricStorage @@ -45,12 +44,11 @@ class WritableMetricStorage class NoopMetricStorage : public MetricStorage { public: - bool Collect( - MetricCollector *collector, - nostd::span collectors, - opentelemetry::common::SystemTimestamp sdk_start_ts, - opentelemetry::common::SystemTimestamp collection_ts, - nostd::function_ref callback) noexcept override + bool Collect(MetricCollector *collector, + nostd::span collectors, + opentelemetry::common::SystemTimestamp sdk_start_ts, + opentelemetry::common::SystemTimestamp collection_ts, + nostd::function_ref callback) noexcept override { MetricData metric_data; if (callback(metric_data)) diff --git a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h index 76c2f8374b..9103576695 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h @@ -82,12 +82,11 @@ class SyncMetricStorage : public MetricStorage, public WritableMetricStorage attributes_hashmap_->GetOrSetDefault(attr, create_default_aggregation_)->Aggregate(value); } - bool Collect( - MetricCollector *collector, - nostd::span collectors, - opentelemetry::common::SystemTimestamp sdk_start_ts, - opentelemetry::common::SystemTimestamp collection_ts, - nostd::function_ref callback) noexcept override + bool Collect(MetricCollector *collector, + nostd::span collectors, + opentelemetry::common::SystemTimestamp sdk_start_ts, + opentelemetry::common::SystemTimestamp collection_ts, + nostd::function_ref callback) noexcept override { MetricData data; if (callback(data)) From 3dc665b6fb78a1a00bf53de17b31cb350360cc2e Mon Sep 17 00:00:00 2001 From: Lalit Date: Mon, 14 Mar 2022 17:14:15 -0700 Subject: [PATCH 13/14] fix review --- .../opentelemetry/sdk/metrics/meter_context.h | 3 +- .../sdk/metrics/state/async_metric_storage.h | 11 +++--- .../sdk/metrics/state/metric_storage.h | 8 ++-- .../sdk/metrics/state/sync_metric_storage.h | 4 +- sdk/src/metrics/meter.cc | 1 - sdk/test/metrics/async_metric_storage_test.cc | 37 ++++++++++++++----- sdk/test/metrics/metric_reader_test.cc | 2 - 7 files changed, 39 insertions(+), 27 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_context.h b/sdk/include/opentelemetry/sdk/metrics/meter_context.h index fb2246d620..ac267d61a6 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_context.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_context.h @@ -111,8 +111,7 @@ class MeterContext : public std::enable_shared_from_this /** * Adds a meter to the list of configured meters. * - * Note: This method is not thread safe, and should ideally be called from main thread in - * thread-safe manner. + * Note: This method is INTERNAL to sdk not thread safe. * * @param meter */ diff --git a/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h index d5491e91cb..019d533006 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h @@ -37,12 +37,11 @@ class AsyncMetricStorage : public MetricStorage active_attributes_hashmap_(new AttributesHashMap()) {} - bool Collect( - MetricCollector *collector, - nostd::span collectors, - opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library, - opentelemetry::sdk::resource::Resource *resource, - nostd::function_ref metric_collection_callback) noexcept override + bool Collect(CollectorHandle *collector, + nostd::span> collectors, + opentelemetry::common::SystemTimestamp sdk_start_ts, + opentelemetry::common::SystemTimestamp collection_ts, + nostd::function_ref metric_collection_callback) noexcept override { opentelemetry::sdk::metrics::ObserverResult ob_res(attributes_processor_); diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h index 6f63594ec9..69f1f8f5af 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h @@ -20,8 +20,8 @@ class MetricStorage { public: /* collect the metrics from this storage */ - virtual bool Collect(MetricCollector *collector, - nostd::span collectors, + virtual bool Collect(CollectorHandle *collector, + nostd::span> collectors, opentelemetry::common::SystemTimestamp sdk_start_ts, opentelemetry::common::SystemTimestamp collection_ts, nostd::function_ref callback) noexcept = 0; @@ -44,8 +44,8 @@ class WritableMetricStorage class NoopMetricStorage : public MetricStorage { public: - bool Collect(MetricCollector *collector, - nostd::span collectors, + bool Collect(CollectorHandle *collector, + nostd::span> collectors, opentelemetry::common::SystemTimestamp sdk_start_ts, opentelemetry::common::SystemTimestamp collection_ts, nostd::function_ref callback) noexcept override diff --git a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h index 9103576695..f8c2a86aa4 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h @@ -82,8 +82,8 @@ class SyncMetricStorage : public MetricStorage, public WritableMetricStorage attributes_hashmap_->GetOrSetDefault(attr, create_default_aggregation_)->Aggregate(value); } - bool Collect(MetricCollector *collector, - nostd::span collectors, + bool Collect(CollectorHandle *collector, + nostd::span> collectors, opentelemetry::common::SystemTimestamp sdk_start_ts, opentelemetry::common::SystemTimestamp collection_ts, nostd::function_ref callback) noexcept override diff --git a/sdk/src/metrics/meter.cc b/sdk/src/metrics/meter.cc index 0db8ca59af..360630e786 100644 --- a/sdk/src/metrics/meter.cc +++ b/sdk/src/metrics/meter.cc @@ -218,7 +218,6 @@ bool Meter::collect(CollectorHandle *collector, { // TBD - this needs to be asynchronous metric_storage.second->Collect(collector, meter_context_->GetCollectors(), - *instrumentation_library_, meter_context_->GetResource(), meter_context_->GetSDKStartTime(), collect_ts, [&callback](MetricData &metric_data) { callback(metric_data); diff --git a/sdk/test/metrics/async_metric_storage_test.cc b/sdk/test/metrics/async_metric_storage_test.cc index fd2a41d325..83c4f2b22c 100644 --- a/sdk/test/metrics/async_metric_storage_test.cc +++ b/sdk/test/metrics/async_metric_storage_test.cc @@ -5,18 +5,31 @@ # include "opentelemetry/sdk/metrics/state/async_metric_storage.h" # include "opentelemetry/common/key_value_iterable_view.h" # include "opentelemetry/sdk/metrics/instruments.h" +# include "opentelemetry/sdk/metrics/meter_context.h" +# include "opentelemetry/sdk/metrics/metric_exporter.h" +# include "opentelemetry/sdk/metrics/metric_reader.h" # include "opentelemetry/sdk/metrics/observer_result.h" - -# include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" -# include "opentelemetry/sdk/resource/resource.h" +# include "opentelemetry/sdk/metrics/state/metric_collector.h" # include -# include +# include using namespace opentelemetry::sdk::metrics; using namespace opentelemetry::sdk::instrumentationlibrary; using namespace opentelemetry::sdk::resource; +class MockMetricReader : public MetricReader +{ +public: + MockMetricReader(AggregationTemporarily aggr_temporarily) : MetricReader(aggr_temporarily) {} + + virtual bool OnForceFlush() noexcept override { return true; } + + virtual bool OnShutDown() noexcept override { return true; } + + virtual void OnInitialized() noexcept override {} +}; + void measurement_fetch(opentelemetry::metrics::ObserverResult &observer_result) { observer_result.Observe(20l); @@ -28,14 +41,18 @@ TEST(AsyncMetricStorageTest, BasicTests) auto metric_callback = [](MetricData &metric_data) { return true; }; InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, InstrumentValueType::kLong}; - auto instrumentation_library = InstrumentationLibrary::Create("instr_lib"); - auto resource = Resource::Create({}); - MetricCollector collector; - std::vector collectors; + + std::vector> exporters; + std::shared_ptr meter_context(new MeterContext(std::move(exporters))); + std::unique_ptr metric_reader(new MockMetricReader(AggregationTemporarily::kDelta)); + + CollectorHandle *collector = + new MetricCollector(std::move(meter_context), std::move(metric_reader)); + std::vector> collectors; opentelemetry::sdk::metrics::AsyncMetricStorage storage( instr_desc, AggregationType::kSum, &measurement_fetch, new DefaultAttributesProcessor()); - EXPECT_NO_THROW(storage.Collect(&collector, collectors, instrumentation_library.get(), &resource, - metric_callback)); + storage.Collect(collector, collectors, std::chrono::system_clock::now(), + std::chrono::system_clock::now(), metric_callback); } #endif \ No newline at end of file diff --git a/sdk/test/metrics/metric_reader_test.cc b/sdk/test/metrics/metric_reader_test.cc index f513c9c2be..ece8707961 100644 --- a/sdk/test/metrics/metric_reader_test.cc +++ b/sdk/test/metrics/metric_reader_test.cc @@ -11,8 +11,6 @@ using namespace opentelemetry; using namespace opentelemetry::sdk::instrumentationlibrary; using namespace opentelemetry::sdk::metrics; -# include - class MockMetricReader : public MetricReader { public: From 458bd49a8bc8124af71f85996769d71928cfed46 Mon Sep 17 00:00:00 2001 From: Lalit Date: Mon, 14 Mar 2022 18:19:50 -0700 Subject: [PATCH 14/14] make meter context thread safe --- .../opentelemetry/sdk/metrics/meter_context.h | 4 ++ .../opentelemetry/sdk/metrics/metric_reader.h | 4 +- sdk/src/metrics/meter_context.cc | 48 +++++++++++-------- sdk/src/metrics/metric_reader.cc | 6 +-- sdk/test/metrics/async_metric_storage_test.cc | 13 ++--- sdk/test/metrics/meter_provider_sdk_test.cc | 4 +- sdk/test/metrics/metric_reader_test.cc | 4 +- 7 files changed, 47 insertions(+), 36 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_context.h b/sdk/include/opentelemetry/sdk/metrics/meter_context.h index ac267d61a6..8a31821353 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_context.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_context.h @@ -4,6 +4,7 @@ #pragma once #ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/common/spin_lock_mutex.h" # include "opentelemetry/sdk/metrics/state/metric_collector.h" # include "opentelemetry/sdk/metrics/view/instrument_selector.h" # include "opentelemetry/sdk/metrics/view/meter_selector.h" @@ -136,6 +137,9 @@ class MeterContext : public std::enable_shared_from_this std::unique_ptr views_; opentelemetry::common::SystemTimestamp sdk_start_ts_; std::vector> meters_; + + std::atomic_flag shutdown_latch_ = ATOMIC_FLAG_INIT; + opentelemetry::common::SpinLockMutex forceflush_lock_; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h index 7ad359af0b..fdd5d41291 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h @@ -52,9 +52,9 @@ class MetricReader virtual ~MetricReader() = default; private: - virtual bool OnForceFlush() noexcept = 0; + virtual bool OnForceFlush(std::chrono::microseconds timeout) noexcept = 0; - virtual bool OnShutDown() noexcept = 0; + virtual bool OnShutDown(std::chrono::microseconds timeout) noexcept = 0; virtual void OnInitialized() noexcept {} diff --git a/sdk/src/metrics/meter_context.cc b/sdk/src/metrics/meter_context.cc index 3fe6aaa8bf..f23135fa0c 100644 --- a/sdk/src/metrics/meter_context.cc +++ b/sdk/src/metrics/meter_context.cc @@ -75,34 +75,40 @@ void MeterContext::AddMeter(std::shared_ptr meter) bool MeterContext::Shutdown() noexcept { - bool result_exporter = true; - bool result_reader = true; - bool result_collector = true; - - for (auto &exporter : exporters_) - { - bool status = exporter->Shutdown(); - result_exporter = result_exporter && status; - } - if (!result_exporter) - { - OTEL_INTERNAL_LOG_WARN("[MeterContext::Shutdown] Unable to shutdown all metric exporters"); - } - for (auto &collector : collectors_) - { - bool status = std::static_pointer_cast(collector)->Shutdown(); - result_collector = result_reader && status; - } - if (!result_collector) + bool return_status = true; + if (!shutdown_latch_.test_and_set(std::memory_order_acquire)) { - OTEL_INTERNAL_LOG_WARN("[MeterContext::Shutdown] Unable to shutdown all metric readers"); + bool result_exporter = true; + bool result_reader = true; + bool result_collector = true; + + for (auto &exporter : exporters_) + { + bool status = exporter->Shutdown(); + result_exporter = result_exporter && status; + } + if (!result_exporter) + { + OTEL_INTERNAL_LOG_WARN("[MeterContext::Shutdown] Unable to shutdown all metric exporters"); + } + for (auto &collector : collectors_) + { + bool status = std::static_pointer_cast(collector)->Shutdown(); + result_collector = result_reader && status; + } + if (!result_collector) + { + OTEL_INTERNAL_LOG_WARN("[MeterContext::Shutdown] Unable to shutdown all metric readers"); + } + return_status = result_exporter && result_collector; } - return result_exporter && result_reader; + return return_status; } bool MeterContext::ForceFlush(std::chrono::microseconds timeout) noexcept { // TODO - Implement timeout logic. + const std::lock_guard locked(forceflush_lock_); bool result_exporter = true; for (auto &exporter : exporters_) { diff --git a/sdk/src/metrics/metric_reader.cc b/sdk/src/metrics/metric_reader.cc index b8c81c1c16..71aedc227f 100644 --- a/sdk/src/metrics/metric_reader.cc +++ b/sdk/src/metrics/metric_reader.cc @@ -51,10 +51,10 @@ bool MetricReader::Shutdown(std::chrono::microseconds timeout) noexcept { OTEL_INTERNAL_LOG_WARN("MetricReader::Shutdown - Cannot invoke shutdown twice!"); } - if (!OnShutDown()) + if (!OnShutDown(timeout)) { status = false; - OTEL_INTERNAL_LOG_ERROR("MetricReader::OnShutDown Shutdown failed. Will not be tried again!"); + OTEL_INTERNAL_LOG_WARN("MetricReader::OnShutDown Shutdown failed. Will not be tried again!"); } const std::lock_guard locked(lock_); shutdown_ = true; @@ -69,7 +69,7 @@ bool MetricReader::ForceFlush(std::chrono::microseconds timeout) noexcept { OTEL_INTERNAL_LOG_WARN("MetricReader::Shutdown Cannot invoke Force flush on shutdown reader!"); } - if (!OnForceFlush()) + if (!OnForceFlush(timeout)) { status = false; OTEL_INTERNAL_LOG_ERROR("MetricReader::OnForceFlush failed!"); diff --git a/sdk/test/metrics/async_metric_storage_test.cc b/sdk/test/metrics/async_metric_storage_test.cc index 83c4f2b22c..fd7d24c6f3 100644 --- a/sdk/test/metrics/async_metric_storage_test.cc +++ b/sdk/test/metrics/async_metric_storage_test.cc @@ -23,9 +23,9 @@ class MockMetricReader : public MetricReader public: MockMetricReader(AggregationTemporarily aggr_temporarily) : MetricReader(aggr_temporarily) {} - virtual bool OnForceFlush() noexcept override { return true; } + virtual bool OnForceFlush(std::chrono::microseconds timeout) noexcept override { return true; } - virtual bool OnShutDown() noexcept override { return true; } + virtual bool OnShutDown(std::chrono::microseconds timeout) noexcept override { return true; } virtual void OnInitialized() noexcept override {} }; @@ -46,13 +46,14 @@ TEST(AsyncMetricStorageTest, BasicTests) std::shared_ptr meter_context(new MeterContext(std::move(exporters))); std::unique_ptr metric_reader(new MockMetricReader(AggregationTemporarily::kDelta)); - CollectorHandle *collector = - new MetricCollector(std::move(meter_context), std::move(metric_reader)); - std::vector> collectors; + std::shared_ptr collector = std::shared_ptr( + new MetricCollector(std::move(meter_context), std::move(metric_reader))); + + std::vector> collectors{collector}; opentelemetry::sdk::metrics::AsyncMetricStorage storage( instr_desc, AggregationType::kSum, &measurement_fetch, new DefaultAttributesProcessor()); - storage.Collect(collector, collectors, std::chrono::system_clock::now(), + storage.Collect(collector.get(), collectors, std::chrono::system_clock::now(), std::chrono::system_clock::now(), metric_callback); } #endif \ No newline at end of file diff --git a/sdk/test/metrics/meter_provider_sdk_test.cc b/sdk/test/metrics/meter_provider_sdk_test.cc index 9b6ea95f48..015d3023ae 100644 --- a/sdk/test/metrics/meter_provider_sdk_test.cc +++ b/sdk/test/metrics/meter_provider_sdk_test.cc @@ -39,9 +39,9 @@ class MockMetricExporter : public MetricExporter class MockMetricReader : public MetricReader { public: - virtual bool OnForceFlush() noexcept override { return true; } + virtual bool OnForceFlush(std::chrono::microseconds timeout) noexcept override { return true; } - virtual bool OnShutDown() noexcept override { return true; } + virtual bool OnShutDown(std::chrono::microseconds timeout) noexcept override { return true; } virtual void OnInitialized() noexcept override {} }; diff --git a/sdk/test/metrics/metric_reader_test.cc b/sdk/test/metrics/metric_reader_test.cc index ece8707961..d0f7c14981 100644 --- a/sdk/test/metrics/metric_reader_test.cc +++ b/sdk/test/metrics/metric_reader_test.cc @@ -16,9 +16,9 @@ class MockMetricReader : public MetricReader public: MockMetricReader(AggregationTemporarily aggr_temporarily) : MetricReader(aggr_temporarily) {} - virtual bool OnForceFlush() noexcept override { return true; } + virtual bool OnForceFlush(std::chrono::microseconds timeout) noexcept override { return true; } - virtual bool OnShutDown() noexcept override { return true; } + virtual bool OnShutDown(std::chrono::microseconds timeout) noexcept override { return true; } virtual void OnInitialized() noexcept override {} };