From e072daa229f72431b1c50986645d51180a586d09 Mon Sep 17 00:00:00 2001 From: Ehsan Saei <71217171+esigo@users.noreply.github.com> Date: Mon, 21 Mar 2022 15:02:15 +0100 Subject: [PATCH 01/35] install sdk config (#1273) --- sdk/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sdk/CMakeLists.txt b/sdk/CMakeLists.txt index 9aa45883e5..6421e3ad15 100644 --- a/sdk/CMakeLists.txt +++ b/sdk/CMakeLists.txt @@ -13,6 +13,12 @@ install( LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) +install( + DIRECTORY include/opentelemetry/ + DESTINATION include/opentelemetry/ + FILES_MATCHING + PATTERN "*config.h") + set(LOGS_EXCLUDE_PATTERN "") if(NOT WITH_LOGS_PREVIEW) set(LOGS_EXCLUDE_PATTERN "logs") From 6ec1b596fde0a2d443f5d730bcd14384b68c68e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Mar 2022 18:27:20 +0100 Subject: [PATCH 02/35] Bump actions/cache from 2 to 3 (#1277) --- .github/workflows/benchmark.yml | 2 +- .github/workflows/ci.yml | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index c11e0c564a..cc685faffd 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -17,7 +17,7 @@ jobs: with: submodules: 'recursive' - name: Mount Bazel Cache - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: bazel_cache with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0fd8f80838..a851728a2e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -136,7 +136,7 @@ jobs: with: submodules: 'recursive' - name: Mount Bazel Cache - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: bazel_cache with: @@ -158,7 +158,7 @@ jobs: with: submodules: 'recursive' - name: Mount Bazel Cache - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: bazel_cache with: @@ -180,7 +180,7 @@ jobs: with: submodules: 'recursive' - name: Mount Bazel Cache - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: bazel_cache with: @@ -202,7 +202,7 @@ jobs: with: submodules: 'recursive' - name: Mount Bazel Cache - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: bazel_cache with: @@ -224,7 +224,7 @@ jobs: with: submodules: 'recursive' - name: Mount Bazel Cache - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: bazel_cache with: @@ -246,7 +246,7 @@ jobs: with: submodules: 'recursive' - name: Mount Bazel Cache - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: bazel_cache with: @@ -268,7 +268,7 @@ jobs: with: submodules: 'recursive' - name: Mount Bazel Cache - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: bazel_cache with: @@ -285,7 +285,7 @@ jobs: with: submodules: 'recursive' - name: Mount Bazel Cache - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: bazel_cache with: From b5155a5dea3a8816d1d0aa3f513d6a5c13245d9b Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Wed, 23 Mar 2022 08:06:46 -0700 Subject: [PATCH 03/35] Add owent as an Approver (#1276) * add owent as reviewer * fix order --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 18b9aafd14..7dc77fc940 100644 --- a/README.md +++ b/README.md @@ -119,6 +119,7 @@ For edit access, get in touch on * [Josh Suereth](https://github.com/jsuereth), Google * [Reiley Yang](https://github.com/reyang), Microsoft +* [WenTao Ou](https://github.com/owent), Tencent [Emeritus Maintainer/Approver/Triager](https://github.com/open-telemetry/community/blob/main/community-membership.md#emeritus-maintainerapprovertriager): From 0c9aecea7af2f3f835f79397feb1436f8d51cc25 Mon Sep 17 00:00:00 2001 From: Ehsan Saei <71217171+esigo@users.noreply.github.com> Date: Thu, 24 Mar 2022 16:45:38 +0100 Subject: [PATCH 04/35] Disable benchmark action failure (#1284) --- .github/workflows/benchmark.yml | 2 +- docs/{ => public}/performance/benchmarks.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename docs/{ => public}/performance/benchmarks.rst (69%) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index cc685faffd..d6b12b82d0 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -67,6 +67,6 @@ jobs: # Show alert with commit comment on detecting possible performance regression alert-threshold: '200%' comment-on-alert: true - fail-on-alert: true + fail-on-alert: false gh-pages-branch: gh-pages benchmark-data-dir-path: benchmarks diff --git a/docs/performance/benchmarks.rst b/docs/public/performance/benchmarks.rst similarity index 69% rename from docs/performance/benchmarks.rst rename to docs/public/performance/benchmarks.rst index 0f1044be42..39b13571dc 100644 --- a/docs/performance/benchmarks.rst +++ b/docs/public/performance/benchmarks.rst @@ -3,4 +3,4 @@ Performance Tests - Benchmarks Click `here `_ to view the latest performance benchmarks for packages in this repo. -Please note that the flutation in the results are mainly because [machines with different CPUs](https://github.com/benchmark-action/github-action-benchmark/issues/79) are used for tests. +Please note that the flutation in the results are mainly because `machines with different CPUs `_ are used for tests. From 3c7b44bf4f7a615364b78d4449eaa5f7ac121249 Mon Sep 17 00:00:00 2001 From: Ehsan Saei <71217171+esigo@users.noreply.github.com> Date: Thu, 24 Mar 2022 22:31:41 +0100 Subject: [PATCH 05/35] metrics exemplar round 1 (#1264) --- api/include/opentelemetry/metrics/noop.h | 17 +++- .../opentelemetry/metrics/sync_instruments.h | 90 +++++++++++++++---- api/test/metrics/BUILD | 31 +++++++ api/test/metrics/noop_sync_instrument_test.cc | 13 ++- .../metrics/exemplar/always_sample_filter.h | 43 +++++++++ .../opentelemetry/sdk/metrics/exemplar/data.h | 45 ++++++++++ .../sdk/metrics/exemplar/filter.h | 39 ++++++++ .../metrics/exemplar/never_sample_filter.h | 43 +++++++++ .../metrics/exemplar/no_exemplar_reservoir.h | 55 ++++++++++++ .../sdk/metrics/exemplar/reservoir.h | 55 ++++++++++++ .../sdk/metrics/measurement_processor.h | 42 +++++---- .../sdk/metrics/state/metric_storage.h | 24 +++-- .../sdk/metrics/state/multi_metric_storage.h | 26 +++--- .../sdk/metrics/state/sync_metric_storage.h | 26 ++++-- .../sdk/metrics/sync_instruments.h | 26 +++++- .../sdk/metrics/view/attributes_processor.h | 2 - sdk/src/metrics/meter.cc | 4 +- sdk/src/metrics/sync_instruments.cc | 90 +++++++++++++++---- sdk/test/metrics/BUILD | 16 ++++ sdk/test/metrics/CMakeLists.txt | 2 + sdk/test/metrics/exemplar/BUILD | 47 ++++++++++ sdk/test/metrics/exemplar/CMakeLists.txt | 10 +++ .../exemplar/always_sample_filter_test.cc | 19 ++++ .../exemplar/never_sample_filter_test.cc | 20 +++++ .../exemplar/no_exemplar_reservoir_test.cc | 22 +++++ sdk/test/metrics/multi_metric_storage_test.cc | 27 ++++-- sdk/test/metrics/sync_instruments_test.cc | 50 ++++++++--- sdk/test/metrics/sync_metric_storage_test.cc | 16 ++-- 28 files changed, 787 insertions(+), 113 deletions(-) create mode 100644 api/test/metrics/BUILD create mode 100644 sdk/include/opentelemetry/sdk/metrics/exemplar/always_sample_filter.h create mode 100644 sdk/include/opentelemetry/sdk/metrics/exemplar/data.h create mode 100644 sdk/include/opentelemetry/sdk/metrics/exemplar/filter.h create mode 100644 sdk/include/opentelemetry/sdk/metrics/exemplar/never_sample_filter.h create mode 100644 sdk/include/opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h create mode 100644 sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir.h create mode 100644 sdk/test/metrics/exemplar/BUILD create mode 100644 sdk/test/metrics/exemplar/CMakeLists.txt create mode 100644 sdk/test/metrics/exemplar/always_sample_filter_test.cc create mode 100644 sdk/test/metrics/exemplar/never_sample_filter_test.cc create mode 100644 sdk/test/metrics/exemplar/no_exemplar_reservoir_test.cc diff --git a/api/include/opentelemetry/metrics/noop.h b/api/include/opentelemetry/metrics/noop.h index 19b9443a7d..3332384ee2 100644 --- a/api/include/opentelemetry/metrics/noop.h +++ b/api/include/opentelemetry/metrics/noop.h @@ -24,7 +24,12 @@ class NoopCounter : public Counter nostd::string_view unit) noexcept {} void Add(T value) noexcept override {} + void Add(T value, const opentelemetry::context::Context &context) noexcept override {} void Add(T value, const common::KeyValueIterable &attributes) noexcept override {} + void Add(T value, + const common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override + {} }; template @@ -35,8 +40,11 @@ class NoopHistogram : public Histogram nostd::string_view description, nostd::string_view unit) noexcept {} - void Record(T value) noexcept override {} - void Record(T value, const common::KeyValueIterable &attributes) noexcept override {} + void Record(T value, const opentelemetry::context::Context &context) noexcept override {} + void Record(T value, + const common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override + {} }; template @@ -48,7 +56,12 @@ class NoopUpDownCounter : public UpDownCounter nostd::string_view unit) noexcept {} void Add(T value) noexcept override {} + void Add(T value, const opentelemetry::context::Context &context) noexcept override {} void Add(T value, const common::KeyValueIterable &attributes) noexcept override {} + void Add(T value, + const common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override + {} }; template diff --git a/api/include/opentelemetry/metrics/sync_instruments.h b/api/include/opentelemetry/metrics/sync_instruments.h index 35cb8621ab..e8239743a1 100644 --- a/api/include/opentelemetry/metrics/sync_instruments.h +++ b/api/include/opentelemetry/metrics/sync_instruments.h @@ -6,6 +6,7 @@ # include "opentelemetry/common/attribute_value.h" # include "opentelemetry/common/key_value_iterable_view.h" +# include "opentelemetry/context/context.h" # include "opentelemetry/nostd/span.h" # include "opentelemetry/nostd/string_view.h" # include "opentelemetry/nostd/type_traits.h" @@ -29,6 +30,8 @@ class Counter : public SynchronousInstrument */ virtual void Add(T value) noexcept = 0; + virtual void Add(T value, const opentelemetry::context::Context &context) noexcept = 0; + /** * Add adds the value to the counter's sum. The attributes should contain * the keys and values to be associated with this value. Counters only @@ -40,19 +43,44 @@ class Counter : public SynchronousInstrument virtual void Add(T value, const common::KeyValueIterable &attributes) noexcept = 0; + virtual void Add(T value, + const common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept = 0; + template ::value> * = nullptr> void Add(T value, const U &attributes) noexcept { - this->Add(value, common::KeyValueIterableView{attributes}); + auto context = opentelemetry::context::Context{}; + this->Add(value, common::KeyValueIterableView{attributes}, context); + } + + template ::value> * = nullptr> + void Add(T value, const U &attributes, const opentelemetry::context::Context &context) noexcept + { + this->Add(value, common::KeyValueIterableView{attributes}, context); } void Add(T value, std::initializer_list> attributes) noexcept { - this->Add(value, nostd::span>{ - attributes.begin(), attributes.end()}); + auto context = opentelemetry::context::Context{}; + this->Add(value, + nostd::span>{ + attributes.begin(), attributes.end()}, + context); + } + + void Add(T value, + std::initializer_list> attributes, + const opentelemetry::context::Context &context) noexcept + { + this->Add(value, + nostd::span>{ + attributes.begin(), attributes.end()}, + context); } }; @@ -67,7 +95,7 @@ class Histogram : public SynchronousInstrument * * @param value The increment amount. May be positive, negative or zero. */ - virtual void Record(T value) noexcept = 0; + virtual void Record(T value, const opentelemetry::context::Context &context) noexcept = 0; /** * Records a value with a set of attributes. @@ -75,21 +103,26 @@ class Histogram : public SynchronousInstrument * @param value The increment amount. May be positive, negative or zero. * @param attributes A set of attributes to associate with the count. */ - virtual void Record(T value, const common::KeyValueIterable &attributes) noexcept = 0; + virtual void Record(T value, + const common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept = 0; template ::value> * = nullptr> - void Record(T value, const U &attributes) noexcept + void Record(T value, const U &attributes, const opentelemetry::context::Context &context) noexcept { - this->Record(value, common::KeyValueIterableView{attributes}); + this->Record(value, common::KeyValueIterableView{attributes}, context); } - void Record(T value, - std::initializer_list> - attributes) noexcept + void Record( + T value, + std::initializer_list> attributes, + const opentelemetry::context::Context &context) noexcept { - this->Record(value, nostd::span>{ - attributes.begin(), attributes.end()}); + this->Record(value, + nostd::span>{ + attributes.begin(), attributes.end()}, + context); } }; @@ -106,6 +139,8 @@ class UpDownCounter : public SynchronousInstrument */ virtual void Add(T value) noexcept = 0; + virtual void Add(T value, const opentelemetry::context::Context &context) noexcept = 0; + /** * Add a value with a set of attributes. * @@ -114,19 +149,44 @@ class UpDownCounter : public SynchronousInstrument */ virtual void Add(T value, const common::KeyValueIterable &attributes) noexcept = 0; + virtual void Add(T value, + const common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept = 0; + template ::value> * = nullptr> void Add(T value, const U &attributes) noexcept { - this->Add(value, common::KeyValueIterableView{attributes}); + auto context = opentelemetry::context::Context{}; + this->Add(value, common::KeyValueIterableView{attributes}, context); + } + + template ::value> * = nullptr> + void Add(T value, const U &attributes, const opentelemetry::context::Context &context) noexcept + { + this->Add(value, common::KeyValueIterableView{attributes}, context); } void Add(T value, std::initializer_list> attributes) noexcept { - this->Add(value, nostd::span>{ - attributes.begin(), attributes.end()}); + auto context = opentelemetry::context::Context{}; + this->Add(value, + nostd::span>{ + attributes.begin(), attributes.end()}, + context); + } + + void Add(T value, + std::initializer_list> attributes, + const opentelemetry::context::Context &context) noexcept + { + this->Add(value, + nostd::span>{ + attributes.begin(), attributes.end()}, + context); } }; diff --git a/api/test/metrics/BUILD b/api/test/metrics/BUILD new file mode 100644 index 0000000000..d15d7511f4 --- /dev/null +++ b/api/test/metrics/BUILD @@ -0,0 +1,31 @@ +load("//bazel:otel_cc_benchmark.bzl", "otel_cc_benchmark") + +cc_test( + name = "noop_sync_instrument_test", + srcs = [ + "noop_sync_instrument_test.cc", + ], + tags = [ + "metrics", + "test", + ], + deps = [ + "//api", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( + name = "meter_provider_test", + srcs = [ + "meter_provider_test.cc", + ], + tags = [ + "metrics", + "test", + ], + deps = [ + "//api", + "@com_google_googletest//:gtest_main", + ], +) diff --git a/api/test/metrics/noop_sync_instrument_test.cc b/api/test/metrics/noop_sync_instrument_test.cc index 4597e79e8b..62be4f34ab 100644 --- a/api/test/metrics/noop_sync_instrument_test.cc +++ b/api/test/metrics/noop_sync_instrument_test.cc @@ -14,8 +14,11 @@ TEST(Counter, Add) std::map labels = {{"k1", "v1"}}; EXPECT_NO_THROW(counter->Add(10l, labels)); + EXPECT_NO_THROW(counter->Add(10l, labels, opentelemetry::context::Context{})); EXPECT_NO_THROW(counter->Add(2l)); + EXPECT_NO_THROW(counter->Add(2l, opentelemetry::context::Context{})); EXPECT_NO_THROW(counter->Add(10l, {{"k1", "1"}, {"k2", 2}})); + EXPECT_NO_THROW(counter->Add(10l, {{"k1", "1"}, {"k2", 2}}, opentelemetry::context::Context{})); } TEST(histogram, Record) @@ -24,9 +27,10 @@ TEST(histogram, Record) new opentelemetry::metrics::NoopHistogram("test", "none", "unitless")}; std::map labels = {{"k1", "v1"}}; - EXPECT_NO_THROW(counter->Record(10l, labels)); - EXPECT_NO_THROW(counter->Record(2l)); - EXPECT_NO_THROW(counter->Record(10l, {{"k1", "1"}, {"k2", 2}})); + EXPECT_NO_THROW(counter->Record(10l, labels, opentelemetry::context::Context{})); + EXPECT_NO_THROW(counter->Record(2l, opentelemetry::context::Context{})); + EXPECT_NO_THROW( + counter->Record(10l, {{"k1", "1"}, {"k2", 2}}, opentelemetry::context::Context{})); } TEST(UpDownCountr, Record) @@ -36,8 +40,11 @@ TEST(UpDownCountr, Record) std::map labels = {{"k1", "v1"}}; EXPECT_NO_THROW(counter->Add(10l, labels)); + EXPECT_NO_THROW(counter->Add(10l, labels, opentelemetry::context::Context{})); EXPECT_NO_THROW(counter->Add(2l)); + EXPECT_NO_THROW(counter->Add(2l, opentelemetry::context::Context{})); EXPECT_NO_THROW(counter->Add(10l, {{"k1", "1"}, {"k2", 2}})); + EXPECT_NO_THROW(counter->Add(10l, {{"k1", "1"}, {"k2", 2}}, opentelemetry::context::Context{})); } #endif \ No newline at end of file diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/always_sample_filter.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/always_sample_filter.h new file mode 100644 index 0000000000..5e7f0436eb --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/always_sample_filter.h @@ -0,0 +1,43 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ + +class AlwaysSampleFilter final : public ExemplarFilter +{ +public: + static nostd::shared_ptr GetAlwaysSampleFilter() + { + static nostd::shared_ptr alwaysSampleFilter{new AlwaysSampleFilter{}}; + return alwaysSampleFilter; + } + + bool ShouldSampleMeasurement(long value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context) noexcept override + { + return true; + } + + bool ShouldSampleMeasurement(double value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context) noexcept override + { + return true; + } + +private: + explicit AlwaysSampleFilter() = default; +}; +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/data.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/data.h new file mode 100644 index 0000000000..14eac62499 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/data.h @@ -0,0 +1,45 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/common/timestamp.h" +# include "opentelemetry/context/context.h" +# include "opentelemetry/sdk/common/attribute_utils.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ +using MetricAttributes = opentelemetry::sdk::common::OrderedAttributeMap; +/** + * A sample input measurement. + * + * Exemplars also hold information about the environment when the measurement was recorded, for + * example the span and trace ID of the active span when the exemplar was recorded. + */ +class ExemplarData +{ +public: + /** + * The set of key/value pairs that were filtered out by the aggregator, but recorded alongside the + * original measurement. Only key/value pairs that were filtered out by the aggregator should be + * included + */ + MetricAttributes GetFilteredAttributes(); + + /** Returns the timestamp in nanos when measurement was collected. */ + opentelemetry::common::SystemTimestamp GetEpochNanos(); + + /** + * Returns the SpanContext associated with this exemplar. If the exemplar was not recorded + * inside a sampled trace, the Context will be invalid. + */ + opentelemetry::context::Context GetSpanContext(); +}; + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/filter.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/filter.h new file mode 100644 index 0000000000..4b512e1317 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/filter.h @@ -0,0 +1,39 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/context/context.h" +# include "opentelemetry/sdk/common/attribute_utils.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ +using MetricAttributes = opentelemetry::sdk::common::OrderedAttributeMap; + +/** + * Exemplar filters are used to pre-filter measurements before attempting to store them in a + * reservoir. + */ +class ExemplarFilter +{ +public: + // Returns whether or not a reservoir should attempt to filter a measurement. + virtual bool ShouldSampleMeasurement(long value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context) noexcept = 0; + + // Returns whether or not a reservoir should attempt to filter a measurement. + virtual bool ShouldSampleMeasurement(double value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context) noexcept = 0; + + virtual ~ExemplarFilter() = default; +}; + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/never_sample_filter.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/never_sample_filter.h new file mode 100644 index 0000000000..38f51778ce --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/never_sample_filter.h @@ -0,0 +1,43 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/filter.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ + +class NeverSampleFilter final : public ExemplarFilter +{ +public: + static nostd::shared_ptr GetNeverSampleFilter() + { + nostd::shared_ptr neverSampleFilter{new NeverSampleFilter{}}; + return neverSampleFilter; + } + + bool ShouldSampleMeasurement(long value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context) noexcept override + { + return false; + } + + bool ShouldSampleMeasurement(double value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context) noexcept override + { + return false; + } + +private: + explicit NeverSampleFilter() = default; +}; +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h new file mode 100644 index 0000000000..1fe0586d28 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h @@ -0,0 +1,55 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once +#ifndef ENABLE_METRICS_PREVIEW +# include +# include "opentelemetry/context/context.h" +# include "opentelemetry/nostd/shared_ptr.h" +# include "opentelemetry/sdk/common/attribute_utils.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ +class NoExemplarReservoir final : public ExemplarReservoir +{ + +public: + static nostd::shared_ptr GetNoExemplarReservoir() + { + return nostd::shared_ptr{new NoExemplarReservoir{}}; + } + + void OfferMeasurement(long value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context, + const opentelemetry::common::SystemTimestamp ×tamp) noexcept override + { + // Stores nothing + } + + void OfferMeasurement(double value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context, + const opentelemetry::common::SystemTimestamp ×tamp) noexcept override + { + // Stores nothing. + } + + std::vector CollectAndReset( + const MetricAttributes &pointAttributes) noexcept override + { + return std::vector{}; + } + +private: + explicit NoExemplarReservoir() = default; +}; + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif diff --git a/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir.h b/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir.h new file mode 100644 index 0000000000..25e8421d6b --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/exemplar/reservoir.h @@ -0,0 +1,55 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once +#ifndef ENABLE_METRICS_PREVIEW +# include +# include "opentelemetry/sdk/metrics/exemplar/data.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ +/** + * An interface for an exemplar reservoir of samples. + * + *

This represents a reservoir for a specific "point" of metric data. + */ +class ExemplarReservoir +{ +public: + virtual ~ExemplarReservoir() = default; + + /** Offers a long measurement to be sampled. */ + virtual void OfferMeasurement( + long value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context, + const opentelemetry::common::SystemTimestamp ×tamp) noexcept = 0; + + /** Offers a double measurement to be sampled. */ + virtual void OfferMeasurement( + double value, + const MetricAttributes &attributes, + const opentelemetry::context::Context &context, + const opentelemetry::common::SystemTimestamp ×tamp) noexcept = 0; + + /** + * Builds vector of Exemplars for exporting from the current reservoir. + * + *

Additionally, clears the reservoir for the next sampling period. + * + * @param pointAttributes the Attributes associated with the metric point. + * ExemplarDatas should filter these out of their final data state. + * @return A vector of sampled exemplars for this point. Implementers are expected to + * filter out pointAttributes from the original recorded attributes. + */ + virtual std::vector CollectAndReset( + const MetricAttributes &pointAttributes) noexcept = 0; +}; + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif diff --git a/sdk/include/opentelemetry/sdk/metrics/measurement_processor.h b/sdk/include/opentelemetry/sdk/metrics/measurement_processor.h index ffd47c5c92..f3b998451b 100644 --- a/sdk/include/opentelemetry/sdk/metrics/measurement_processor.h +++ b/sdk/include/opentelemetry/sdk/metrics/measurement_processor.h @@ -2,10 +2,12 @@ // SPDX-License-Identifier: Apache-2.0 #pragma once +#include #ifndef ENABLE_METRICS_PREVIEW # include # include "opentelemetry/common/key_value_iterable_view.h" +# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" # include "opentelemetry/sdk/metrics/instruments.h" # include "opentelemetry/sdk/metrics/metric_reader.h" # include "opentelemetry/sdk/metrics/state/sync_metric_storage.h" @@ -25,15 +27,18 @@ static std::size_t MakeKey(const MetricReader &metric_reader) class MeasurementProcessor { public: - virtual void RecordLong(long value) noexcept = 0; + virtual void RecordLong(long value, const opentelemetry::context::Context &context) noexcept = 0; virtual void RecordLong(long value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept = 0; + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept = 0; - virtual void RecordDouble(double value) noexcept = 0; + virtual void RecordDouble(double value, + const opentelemetry::context::Context &context) noexcept = 0; virtual void RecordDouble(double value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept = 0; + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept = 0; virtual bool Collect(MetricReader &reader, AggregationTemporarily aggregation_temporarily, @@ -50,43 +55,46 @@ class DefaultMeasurementProcessor : public MeasurementProcessor InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, InstrumentValueType::kLong}; metric_storages_[MakeKey(reader)] = std::unique_ptr( - new SyncMetricStorage(instr_desc, AggregationType::kSum, new DefaultAttributesProcessor())); + new SyncMetricStorage(instr_desc, AggregationType::kSum, new DefaultAttributesProcessor(), + NoExemplarReservoir::GetNoExemplarReservoir())); return true; } - virtual void RecordLong(long value) noexcept override + virtual void RecordLong(long value, + const opentelemetry::context::Context &context) noexcept override { for (const auto &kv : metric_storages_) { - kv.second->RecordLong(value); + kv.second->RecordLong(value, context); } } - virtual void RecordLong( - long value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override + virtual void RecordLong(long value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override { for (const auto &kv : metric_storages_) { - kv.second->RecordLong(value, attributes); + kv.second->RecordLong(value, attributes, context); } } - virtual void RecordDouble(double value) noexcept override + virtual void RecordDouble(double value, + const opentelemetry::context::Context &context) noexcept override { for (const auto &kv : metric_storages_) { - kv.second->RecordDouble(value); + kv.second->RecordDouble(value, context); } } - virtual void RecordDouble( - double value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override + virtual void RecordDouble(double value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override { for (const auto &kv : metric_storages_) { - kv.second->RecordDouble(value, attributes); + kv.second->RecordDouble(value, attributes, context); } } diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h index 8ae50554f1..20f7d56140 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h @@ -5,6 +5,7 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/common/key_value_iterable_view.h" # include "opentelemetry/common/timestamp.h" +# include "opentelemetry/context/context.h" # include "opentelemetry/sdk/metrics/data/metric_data.h" # include "opentelemetry/sdk/metrics/instruments.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -30,15 +31,19 @@ class MetricStorage class WritableMetricStorage { public: - virtual void RecordLong(long value) noexcept = 0; + virtual void RecordLong(long value, const opentelemetry::context::Context &context) noexcept = 0; virtual void RecordLong(long value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept = 0; + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept = 0; - virtual void RecordDouble(double value) noexcept = 0; + virtual void RecordDouble(double value, + const opentelemetry::context::Context &context) noexcept = 0; virtual void RecordDouble(double value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept = 0; + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept = 0; + virtual ~WritableMetricStorage() = default; }; @@ -63,16 +68,19 @@ class NoopMetricStorage : public MetricStorage class NoopWritableMetricStorage : public WritableMetricStorage { public: - void RecordLong(long value) noexcept = 0; + void RecordLong(long value, const opentelemetry::context::Context &context) noexcept = 0; void RecordLong(long value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override {} - void RecordDouble(double value) noexcept override {} + void RecordDouble(double value, const opentelemetry::context::Context &context) noexcept override + {} void RecordDouble(double value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override {} }; diff --git a/sdk/include/opentelemetry/sdk/metrics/state/multi_metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/multi_metric_storage.h index d9a66f732a..ceeafa0406 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/multi_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/multi_metric_storage.h @@ -20,39 +20,41 @@ class MultiMetricStorage : public WritableMetricStorage public: void AddStorage(std::shared_ptr storage) { storages_.push_back(storage); } - virtual void RecordLong(long value) noexcept override + virtual void RecordLong(long value, + const opentelemetry::context::Context &context) noexcept override { for (auto &s : storages_) { - s->RecordLong(value); + s->RecordLong(value, context); } } - virtual void RecordLong( - long value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override + virtual void RecordLong(long value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override { for (auto &s : storages_) { - s->RecordLong(value, attributes); + s->RecordLong(value, attributes, context); } } - virtual void RecordDouble(double value) noexcept override + virtual void RecordDouble(double value, + const opentelemetry::context::Context &context) noexcept override { for (auto &s : storages_) { - s->RecordDouble(value); + s->RecordDouble(value, context); } } - virtual void RecordDouble( - double value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override + virtual void RecordDouble(double value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override { for (auto &s : storages_) { - s->RecordDouble(value, attributes); + s->RecordDouble(value, attributes, context); } } 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 f8c2a86aa4..bfe50b152d 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h @@ -7,6 +7,7 @@ # include "opentelemetry/sdk/common/attributemap_hash.h" # include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" # include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" +# include "opentelemetry/sdk/metrics/exemplar/reservoir.h" # include "opentelemetry/sdk/metrics/state/attributes_hashmap.h" # include "opentelemetry/sdk/metrics/state/metric_storage.h" # include "opentelemetry/sdk/metrics/view/attributes_processor.h" @@ -27,11 +28,13 @@ class SyncMetricStorage : public MetricStorage, public WritableMetricStorage public: SyncMetricStorage(InstrumentDescriptor instrument_descriptor, const AggregationType aggregation_type, - const AttributesProcessor *attributes_processor) + const AttributesProcessor *attributes_processor, + nostd::shared_ptr &&exemplar_reservoir) : instrument_descriptor_(instrument_descriptor), aggregation_type_{aggregation_type}, attributes_hashmap_(new AttributesHashMap()), - attributes_processor_{attributes_processor} + attributes_processor_{attributes_processor}, + exemplar_reservoir_(exemplar_reservoir) { create_default_aggregation_ = [&]() -> std::unique_ptr { return std::move( @@ -39,45 +42,55 @@ class SyncMetricStorage : public MetricStorage, public WritableMetricStorage }; } - void RecordLong(long value) noexcept override + void RecordLong(long value, const opentelemetry::context::Context &context) noexcept override { if (instrument_descriptor_.value_type_ != InstrumentValueType::kLong) { return; } + exemplar_reservoir_->OfferMeasurement(value, {}, context, std::chrono::system_clock::now()); attributes_hashmap_->GetOrSetDefault({}, create_default_aggregation_)->Aggregate(value); } void RecordLong(long value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override { if (instrument_descriptor_.value_type_ != InstrumentValueType::kLong) { return; } + exemplar_reservoir_->OfferMeasurement(value, attributes, context, + std::chrono::system_clock::now()); auto attr = attributes_processor_->process(attributes); attributes_hashmap_->GetOrSetDefault(attr, create_default_aggregation_)->Aggregate(value); } - void RecordDouble(double value) noexcept override + void RecordDouble(double value, const opentelemetry::context::Context &context) noexcept override { if (instrument_descriptor_.value_type_ != InstrumentValueType::kDouble) { return; } + exemplar_reservoir_->OfferMeasurement(value, {}, context, std::chrono::system_clock::now()); attributes_hashmap_->GetOrSetDefault({}, create_default_aggregation_)->Aggregate(value); } void RecordDouble(double value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override { + exemplar_reservoir_->OfferMeasurement(value, attributes, context, + std::chrono::system_clock::now()); if (instrument_descriptor_.value_type_ != InstrumentValueType::kDouble) { return; } + exemplar_reservoir_->OfferMeasurement(value, attributes, context, + std::chrono::system_clock::now()); auto attr = attributes_processor_->process(attributes); attributes_hashmap_->GetOrSetDefault(attr, create_default_aggregation_)->Aggregate(value); } @@ -102,6 +115,7 @@ class SyncMetricStorage : public MetricStorage, public WritableMetricStorage std::unique_ptr attributes_hashmap_; const AttributesProcessor *attributes_processor_; std::function()> create_default_aggregation_; + nostd::shared_ptr exemplar_reservoir_; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/sync_instruments.h b/sdk/include/opentelemetry/sdk/metrics/sync_instruments.h index 3e8c5c8623..f4c9bae323 100644 --- a/sdk/include/opentelemetry/sdk/metrics/sync_instruments.h +++ b/sdk/include/opentelemetry/sdk/metrics/sync_instruments.h @@ -39,8 +39,12 @@ class LongCounter : public Synchronous, public opentelemetry::metrics::Counter storage); void Add(long value, const opentelemetry::common::KeyValueIterable &attributes) noexcept override; + void Add(long value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override; void Add(long value) noexcept override; + void Add(long value, const opentelemetry::context::Context &context) noexcept override; }; class DoubleCounter : public Synchronous, public opentelemetry::metrics::Counter @@ -52,8 +56,12 @@ class DoubleCounter : public Synchronous, public opentelemetry::metrics::Counter void Add(double value, const opentelemetry::common::KeyValueIterable &attributes) noexcept override; + void Add(double value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override; void Add(double value) noexcept override; + void Add(double value, const opentelemetry::context::Context &context) noexcept override; }; class LongUpDownCounter : public Synchronous, public opentelemetry::metrics::UpDownCounter @@ -63,8 +71,12 @@ class LongUpDownCounter : public Synchronous, public opentelemetry::metrics::UpD std::unique_ptr storage); void Add(long value, const opentelemetry::common::KeyValueIterable &attributes) noexcept override; + void Add(long value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override; void Add(long value) noexcept override; + void Add(long value, const opentelemetry::context::Context &context) noexcept override; }; class DoubleUpDownCounter : public Synchronous, public opentelemetry::metrics::UpDownCounter @@ -75,8 +87,12 @@ class DoubleUpDownCounter : public Synchronous, public opentelemetry::metrics::U void Add(double value, const opentelemetry::common::KeyValueIterable &attributes) noexcept override; + void Add(double value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override; void Add(double value) noexcept override; + void Add(double value, const opentelemetry::context::Context &context) noexcept override; }; class LongHistogram : public Synchronous, public opentelemetry::metrics::Histogram @@ -86,9 +102,10 @@ class LongHistogram : public Synchronous, public opentelemetry::metrics::Histogr std::unique_ptr storage); void Record(long value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override; + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override; - void Record(long value) noexcept override; + void Record(long value, const opentelemetry::context::Context &context) noexcept override; }; class DoubleHistogram : public Synchronous, public opentelemetry::metrics::Histogram @@ -98,9 +115,10 @@ class DoubleHistogram : public Synchronous, public opentelemetry::metrics::Histo std::unique_ptr storage); void Record(double value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override; + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override; - void Record(double value) noexcept override; + void Record(double value, const opentelemetry::context::Context &context) noexcept override; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/view/attributes_processor.h b/sdk/include/opentelemetry/sdk/metrics/view/attributes_processor.h index d82607357f..fdc4e35c53 100644 --- a/sdk/include/opentelemetry/sdk/metrics/view/attributes_processor.h +++ b/sdk/include/opentelemetry/sdk/metrics/view/attributes_processor.h @@ -23,8 +23,6 @@ class AttributesProcessor // @returns The processed attributes virtual MetricAttributes process( const opentelemetry::common::KeyValueIterable &attributes) const noexcept = 0; - - virtual ~AttributesProcessor() = default; }; /** diff --git a/sdk/src/metrics/meter.cc b/sdk/src/metrics/meter.cc index 360630e786..20e3b02768 100644 --- a/sdk/src/metrics/meter.cc +++ b/sdk/src/metrics/meter.cc @@ -6,6 +6,7 @@ # include "opentelemetry/metrics/noop.h" # include "opentelemetry/nostd/shared_ptr.h" # include "opentelemetry/sdk/metrics/async_instruments.h" +# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.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" @@ -192,7 +193,8 @@ std::unique_ptr Meter::RegisterMetricStorage( view_instr_desc.name_ = view.GetName(); view_instr_desc.description_ = view.GetDescription(); auto storage = std::shared_ptr(new SyncMetricStorage( - view_instr_desc, view.GetAggregationType(), &view.GetAttributesProcessor())); + view_instr_desc, view.GetAggregationType(), &view.GetAttributesProcessor(), + NoExemplarReservoir::GetNoExemplarReservoir())); storage_registry_[instrument_descriptor.name_] = storage; auto multi_storage = static_cast(storages.get()); multi_storage->AddStorage(storage); diff --git a/sdk/src/metrics/sync_instruments.cc b/sdk/src/metrics/sync_instruments.cc index 863e5b6323..5c94ae6f24 100644 --- a/sdk/src/metrics/sync_instruments.cc +++ b/sdk/src/metrics/sync_instruments.cc @@ -18,12 +18,26 @@ LongCounter::LongCounter(InstrumentDescriptor instrument_descriptor, void LongCounter::Add(long value, const opentelemetry::common::KeyValueIterable &attributes) noexcept { - return storage_->RecordLong(value, attributes); + auto context = opentelemetry::context::Context{}; + return storage_->RecordLong(value, attributes, context); +} + +void LongCounter::Add(long value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept +{ + return storage_->RecordLong(value, attributes, context); } void LongCounter::Add(long value) noexcept { - return storage_->RecordLong(value); + auto context = opentelemetry::context::Context{}; + return storage_->RecordLong(value, context); +} + +void LongCounter::Add(long value, const opentelemetry::context::Context &context) noexcept +{ + return storage_->RecordLong(value, context); } DoubleCounter::DoubleCounter(InstrumentDescriptor instrument_descriptor, @@ -34,12 +48,26 @@ DoubleCounter::DoubleCounter(InstrumentDescriptor instrument_descriptor, void DoubleCounter::Add(double value, const opentelemetry::common::KeyValueIterable &attributes) noexcept { - return storage_->RecordDouble(value, attributes); + auto context = opentelemetry::context::Context{}; + return storage_->RecordDouble(value, attributes, context); +} + +void DoubleCounter::Add(double value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept +{ + return storage_->RecordDouble(value, attributes, context); } void DoubleCounter::Add(double value) noexcept { - return storage_->RecordDouble(value); + auto context = opentelemetry::context::Context{}; + return storage_->RecordDouble(value, context); +} + +void DoubleCounter::Add(double value, const opentelemetry::context::Context &context) noexcept +{ + return storage_->RecordDouble(value, context); } LongUpDownCounter::LongUpDownCounter(InstrumentDescriptor instrument_descriptor, @@ -50,12 +78,26 @@ LongUpDownCounter::LongUpDownCounter(InstrumentDescriptor instrument_descriptor, void LongUpDownCounter::Add(long value, const opentelemetry::common::KeyValueIterable &attributes) noexcept { - return storage_->RecordLong(value, attributes); + auto context = opentelemetry::context::Context{}; + return storage_->RecordLong(value, attributes, context); +} + +void LongUpDownCounter::Add(long value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept +{ + return storage_->RecordLong(value, attributes, context); } void LongUpDownCounter::Add(long value) noexcept { - return storage_->RecordLong(value); + auto context = opentelemetry::context::Context{}; + return storage_->RecordLong(value, context); +} + +void LongUpDownCounter::Add(long value, const opentelemetry::context::Context &context) noexcept +{ + return storage_->RecordLong(value, context); } DoubleUpDownCounter::DoubleUpDownCounter(InstrumentDescriptor instrument_descriptor, @@ -66,12 +108,26 @@ DoubleUpDownCounter::DoubleUpDownCounter(InstrumentDescriptor instrument_descrip void DoubleUpDownCounter::Add(double value, const opentelemetry::common::KeyValueIterable &attributes) noexcept { - return storage_->RecordDouble(value, attributes); + auto context = opentelemetry::context::Context{}; + return storage_->RecordDouble(value, attributes, context); +} + +void DoubleUpDownCounter::Add(double value, + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept +{ + return storage_->RecordDouble(value, attributes, context); } void DoubleUpDownCounter::Add(double value) noexcept { - return storage_->RecordDouble(value); + auto context = opentelemetry::context::Context{}; + return storage_->RecordDouble(value, context); +} + +void DoubleUpDownCounter::Add(double value, const opentelemetry::context::Context &context) noexcept +{ + return storage_->RecordDouble(value, context); } LongHistogram::LongHistogram(InstrumentDescriptor instrument_descriptor, @@ -80,14 +136,15 @@ LongHistogram::LongHistogram(InstrumentDescriptor instrument_descriptor, {} void LongHistogram::Record(long value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept { - return storage_->RecordLong(value, attributes); + return storage_->RecordLong(value, attributes, context); } -void LongHistogram::Record(long value) noexcept +void LongHistogram::Record(long value, const opentelemetry::context::Context &context) noexcept { - return storage_->RecordLong(value); + return storage_->RecordLong(value, context); } DoubleHistogram::DoubleHistogram(InstrumentDescriptor instrument_descriptor, @@ -96,14 +153,15 @@ DoubleHistogram::DoubleHistogram(InstrumentDescriptor instrument_descriptor, {} void DoubleHistogram::Record(double value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept { - return storage_->RecordDouble(value, attributes); + return storage_->RecordDouble(value, attributes, context); } -void DoubleHistogram::Record(double value) noexcept +void DoubleHistogram::Record(double value, const opentelemetry::context::Context &context) noexcept { - return storage_->RecordDouble(value); + return storage_->RecordDouble(value, context); } } // namespace metrics diff --git a/sdk/test/metrics/BUILD b/sdk/test/metrics/BUILD index 9ca191574f..819a8d225f 100644 --- a/sdk/test/metrics/BUILD +++ b/sdk/test/metrics/BUILD @@ -80,6 +80,22 @@ cc_test( ], ) +cc_test( + name = "sync_instruments_test", + srcs = [ + "sync_instruments_test.cc", + ], + tags = [ + "metrics", + "test", + ], + deps = [ + "//sdk/src/metrics", + "//sdk/src/resource", + "@com_google_googletest//:gtest_main", + ], +) + cc_test( name = "async_metric_storage_test", srcs = [ diff --git a/sdk/test/metrics/CMakeLists.txt b/sdk/test/metrics/CMakeLists.txt index 3ee2be6552..fa1f22c73a 100644 --- a/sdk/test/metrics/CMakeLists.txt +++ b/sdk/test/metrics/CMakeLists.txt @@ -29,3 +29,5 @@ target_link_libraries(attributes_processor_benchmark benchmark::benchmark add_executable(attributes_hashmap_benchmark attributes_hashmap_benchmark.cc) target_link_libraries(attributes_hashmap_benchmark benchmark::benchmark ${CMAKE_THREAD_LIBS_INIT} opentelemetry_common) + +add_subdirectory(exemplar) diff --git a/sdk/test/metrics/exemplar/BUILD b/sdk/test/metrics/exemplar/BUILD new file mode 100644 index 0000000000..6481f679d2 --- /dev/null +++ b/sdk/test/metrics/exemplar/BUILD @@ -0,0 +1,47 @@ +cc_test( + name = "no_exemplar_reservoir_test", + srcs = [ + "no_exemplar_reservoir_test.cc", + ], + tags = [ + "metrics", + "test", + ], + deps = [ + "//api", + "//sdk:headers", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( + name = "never_sample_filter_test", + srcs = [ + "never_sample_filter_test.cc", + ], + tags = [ + "metrics", + "test", + ], + deps = [ + "//api", + "//sdk:headers", + "@com_google_googletest//:gtest_main", + ], +) + +cc_test( + name = "always_sample_filter_test", + srcs = [ + "always_sample_filter_test.cc", + ], + tags = [ + "metrics", + "test", + ], + deps = [ + "//api", + "//sdk:headers", + "@com_google_googletest//:gtest_main", + ], +) diff --git a/sdk/test/metrics/exemplar/CMakeLists.txt b/sdk/test/metrics/exemplar/CMakeLists.txt new file mode 100644 index 0000000000..303294761a --- /dev/null +++ b/sdk/test/metrics/exemplar/CMakeLists.txt @@ -0,0 +1,10 @@ +foreach(testname no_exemplar_reservoir_test never_sample_filter_test + always_sample_filter_test) + add_executable(${testname} "${testname}.cc") + target_link_libraries(${testname} ${GTEST_BOTH_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} opentelemetry_metrics) + gtest_add_tests( + TARGET ${testname} + TEST_PREFIX metrics. + TEST_LIST ${testname}) +endforeach() diff --git a/sdk/test/metrics/exemplar/always_sample_filter_test.cc b/sdk/test/metrics/exemplar/always_sample_filter_test.cc new file mode 100644 index 0000000000..cf4e449957 --- /dev/null +++ b/sdk/test/metrics/exemplar/always_sample_filter_test.cc @@ -0,0 +1,19 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/always_sample_filter.h" +# include + +using namespace opentelemetry::sdk::metrics; + +TEST(AlwaysSampleFilter, SampleMeasurement) +{ + auto filter = opentelemetry::sdk::metrics::AlwaysSampleFilter::GetAlwaysSampleFilter(); + ASSERT_TRUE( + filter->ShouldSampleMeasurement(1.0, MetricAttributes{}, opentelemetry::context::Context{})); + ASSERT_TRUE( + filter->ShouldSampleMeasurement(1l, MetricAttributes{}, opentelemetry::context::Context{})); +} + +#endif diff --git a/sdk/test/metrics/exemplar/never_sample_filter_test.cc b/sdk/test/metrics/exemplar/never_sample_filter_test.cc new file mode 100644 index 0000000000..930c572205 --- /dev/null +++ b/sdk/test/metrics/exemplar/never_sample_filter_test.cc @@ -0,0 +1,20 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#include "opentelemetry/context/context.h" +#ifndef ENABLE_METRICS_PREVIEW +# include +# include "opentelemetry/sdk/metrics/exemplar/never_sample_filter.h" + +using namespace opentelemetry::sdk::metrics; + +TEST(NeverSampleFilter, SampleMeasurement) +{ + auto filter = opentelemetry::sdk::metrics::NeverSampleFilter::GetNeverSampleFilter(); + ASSERT_FALSE( + filter->ShouldSampleMeasurement(1.0, MetricAttributes{}, opentelemetry::context::Context{})); + ASSERT_FALSE( + filter->ShouldSampleMeasurement(1l, MetricAttributes{}, opentelemetry::context::Context{})); +} + +#endif diff --git a/sdk/test/metrics/exemplar/no_exemplar_reservoir_test.cc b/sdk/test/metrics/exemplar/no_exemplar_reservoir_test.cc new file mode 100644 index 0000000000..3e16940ff4 --- /dev/null +++ b/sdk/test/metrics/exemplar/no_exemplar_reservoir_test.cc @@ -0,0 +1,22 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" +# include + +using namespace opentelemetry::sdk::metrics; + +TEST(NoExemplarReservoir, OfferMeasurement) +{ + auto reservoir = opentelemetry::sdk::metrics::NoExemplarReservoir::GetNoExemplarReservoir(); + EXPECT_NO_THROW(reservoir->OfferMeasurement(1.0, MetricAttributes{}, + opentelemetry::context::Context{}, + std::chrono::system_clock::now())); + EXPECT_NO_THROW(reservoir->OfferMeasurement( + 1l, MetricAttributes{}, opentelemetry::context::Context{}, std::chrono::system_clock::now())); + auto exemplar_data = reservoir->CollectAndReset(MetricAttributes{}); + ASSERT_TRUE(exemplar_data.empty()); +} + +#endif diff --git a/sdk/test/metrics/multi_metric_storage_test.cc b/sdk/test/metrics/multi_metric_storage_test.cc index 6696c7bb0a..d88946485c 100644 --- a/sdk/test/metrics/multi_metric_storage_test.cc +++ b/sdk/test/metrics/multi_metric_storage_test.cc @@ -4,6 +4,7 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/sdk/metrics/state/multi_metric_storage.h" # include "opentelemetry/common/key_value_iterable_view.h" +# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" # include "opentelemetry/sdk/metrics/instruments.h" # include @@ -15,18 +16,26 @@ using namespace opentelemetry::sdk::metrics; class TestMetricStorage : public WritableMetricStorage { public: - void RecordLong(long value) noexcept override { num_calls_long++; } + void RecordLong(long value, const opentelemetry::context::Context &context) noexcept override + { + num_calls_long++; + } void RecordLong(long value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override { num_calls_long++; } - void RecordDouble(double value) noexcept override { num_calls_double++; } + void RecordDouble(double value, const opentelemetry::context::Context &context) noexcept override + { + num_calls_double++; + } void RecordDouble(double value, - const opentelemetry::common::KeyValueIterable &attributes) noexcept override + const opentelemetry::common::KeyValueIterable &attributes, + const opentelemetry::context::Context &context) noexcept override { num_calls_double++; } @@ -39,13 +48,13 @@ TEST(MultiMetricStorageTest, BasicTests) { std::shared_ptr storage( new TestMetricStorage()); - MultiMetricStorage storages; + MultiMetricStorage storages{}; storages.AddStorage(storage); - EXPECT_NO_THROW(storages.RecordLong(10l)); - EXPECT_NO_THROW(storages.RecordLong(20l)); + EXPECT_NO_THROW(storages.RecordLong(10l, opentelemetry::context::Context{})); + EXPECT_NO_THROW(storages.RecordLong(20l, opentelemetry::context::Context{})); - EXPECT_NO_THROW(storages.RecordDouble(10.0)); - EXPECT_NO_THROW(storages.RecordLong(30l)); + EXPECT_NO_THROW(storages.RecordDouble(10.0, opentelemetry::context::Context{})); + EXPECT_NO_THROW(storages.RecordLong(30l, opentelemetry::context::Context{})); EXPECT_EQ(static_cast(storage.get())->num_calls_long, 3); EXPECT_EQ(static_cast(storage.get())->num_calls_double, 1); diff --git a/sdk/test/metrics/sync_instruments_test.cc b/sdk/test/metrics/sync_instruments_test.cc index 27af8711d1..e029821d41 100644 --- a/sdk/test/metrics/sync_instruments_test.cc +++ b/sdk/test/metrics/sync_instruments_test.cc @@ -3,7 +3,9 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/sdk/metrics/sync_instruments.h" +# include "opentelemetry/context/context.h" # include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" +# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" # include "opentelemetry/sdk/metrics/state/multi_metric_storage.h" # include @@ -23,11 +25,16 @@ TEST(SyncInstruments, LongCounter) std::unique_ptr metric_storage(new MultiMetricStorage()); LongCounter counter(instrument_descriptor, std::move(metric_storage)); EXPECT_NO_THROW(counter.Add(10l)); - EXPECT_NO_THROW(counter.Add(10l)); + EXPECT_NO_THROW(counter.Add(10l, opentelemetry::context::Context{})); EXPECT_NO_THROW(counter.Add( 10l, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}))); + EXPECT_NO_THROW(counter.Add( + 10l, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}), + opentelemetry::context::Context{})); EXPECT_NO_THROW(counter.Add(10l, opentelemetry::common::KeyValueIterableView({}))); + EXPECT_NO_THROW(counter.Add(10l, opentelemetry::common::KeyValueIterableView({}), + opentelemetry::context::Context{})); } TEST(SyncInstruments, DoubleCounter) @@ -37,11 +44,16 @@ TEST(SyncInstruments, DoubleCounter) std::unique_ptr metric_storage(new MultiMetricStorage()); DoubleCounter counter(instrument_descriptor, std::move(metric_storage)); EXPECT_NO_THROW(counter.Add(10.10)); - EXPECT_NO_THROW(counter.Add(10.10)); + EXPECT_NO_THROW(counter.Add(10.10, opentelemetry::context::Context{})); EXPECT_NO_THROW(counter.Add( 10.10, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}))); + EXPECT_NO_THROW(counter.Add( + 10.10, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}), + opentelemetry::context::Context{})); EXPECT_NO_THROW(counter.Add(10.10, opentelemetry::common::KeyValueIterableView({}))); + EXPECT_NO_THROW(counter.Add(10.10, opentelemetry::common::KeyValueIterableView({}), + opentelemetry::context::Context{})); } TEST(SyncInstruments, LongUpDownCounter) @@ -52,11 +64,16 @@ TEST(SyncInstruments, LongUpDownCounter) std::unique_ptr metric_storage(new MultiMetricStorage()); LongUpDownCounter counter(instrument_descriptor, std::move(metric_storage)); EXPECT_NO_THROW(counter.Add(10l)); - EXPECT_NO_THROW(counter.Add(10l)); + EXPECT_NO_THROW(counter.Add(10l, opentelemetry::context::Context{})); EXPECT_NO_THROW(counter.Add( 10l, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}))); + EXPECT_NO_THROW(counter.Add( + 10l, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}), + opentelemetry::context::Context{})); EXPECT_NO_THROW(counter.Add(10l, opentelemetry::common::KeyValueIterableView({}))); + EXPECT_NO_THROW(counter.Add(10l, opentelemetry::common::KeyValueIterableView({}), + opentelemetry::context::Context{})); } TEST(SyncInstruments, DoubleUpDownCounter) @@ -67,10 +84,15 @@ TEST(SyncInstruments, DoubleUpDownCounter) std::unique_ptr metric_storage(new MultiMetricStorage()); DoubleUpDownCounter counter(instrument_descriptor, std::move(metric_storage)); EXPECT_NO_THROW(counter.Add(10.10)); - EXPECT_NO_THROW(counter.Add(10.10)); + EXPECT_NO_THROW(counter.Add(10.10, opentelemetry::context::Context{})); + EXPECT_NO_THROW(counter.Add( + 10.10, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}), + opentelemetry::context::Context{})); EXPECT_NO_THROW(counter.Add( 10.10, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}))); + EXPECT_NO_THROW(counter.Add(10.10, opentelemetry::common::KeyValueIterableView({}), + opentelemetry::context::Context{})); EXPECT_NO_THROW(counter.Add(10.10, opentelemetry::common::KeyValueIterableView({}))); } @@ -80,12 +102,14 @@ TEST(SyncInstruments, LongHistogram) "long_histogram", "description", "1", InstrumentType::kHistogram, InstrumentValueType::kLong}; std::unique_ptr metric_storage(new MultiMetricStorage()); LongHistogram counter(instrument_descriptor, std::move(metric_storage)); - EXPECT_NO_THROW(counter.Record(10l)); - EXPECT_NO_THROW(counter.Record(10l)); + EXPECT_NO_THROW(counter.Record(10l, opentelemetry::context::Context{})); + EXPECT_NO_THROW(counter.Record(10l, opentelemetry::context::Context{})); EXPECT_NO_THROW(counter.Record( - 10l, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}))); - EXPECT_NO_THROW(counter.Record(10l, opentelemetry::common::KeyValueIterableView({}))); + 10l, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}), + opentelemetry::context::Context{})); + EXPECT_NO_THROW(counter.Record(10l, opentelemetry::common::KeyValueIterableView({}), + opentelemetry::context::Context{})); } TEST(SyncInstruments, DoubleHistogram) @@ -95,12 +119,14 @@ TEST(SyncInstruments, DoubleHistogram) InstrumentValueType::kDouble}; std::unique_ptr metric_storage(new MultiMetricStorage()); DoubleHistogram counter(instrument_descriptor, std::move(metric_storage)); - EXPECT_NO_THROW(counter.Record(10.10)); - EXPECT_NO_THROW(counter.Record(10.10)); + EXPECT_NO_THROW(counter.Record(10.10, opentelemetry::context::Context{})); + EXPECT_NO_THROW(counter.Record(10.10, opentelemetry::context::Context{})); EXPECT_NO_THROW(counter.Record( - 10.10, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}))); - EXPECT_NO_THROW(counter.Record(10.10, opentelemetry::common::KeyValueIterableView({}))); + 10.10, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}), + opentelemetry::context::Context{})); + EXPECT_NO_THROW(counter.Record(10.10, opentelemetry::common::KeyValueIterableView({}), + opentelemetry::context::Context{})); } #endif \ No newline at end of file diff --git a/sdk/test/metrics/sync_metric_storage_test.cc b/sdk/test/metrics/sync_metric_storage_test.cc index 23ef20b11d..c4bd154460 100644 --- a/sdk/test/metrics/sync_metric_storage_test.cc +++ b/sdk/test/metrics/sync_metric_storage_test.cc @@ -4,6 +4,7 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/sdk/metrics/state/sync_metric_storage.h" # include "opentelemetry/common/key_value_iterable_view.h" +# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" # include "opentelemetry/sdk/metrics/instruments.h" # include "opentelemetry/sdk/metrics/view/attributes_processor.h" @@ -18,13 +19,16 @@ TEST(WritableMetricStorageTest, BasicTests) InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, InstrumentValueType::kLong}; - opentelemetry::sdk::metrics::SyncMetricStorage storage(instr_desc, AggregationType::kSum, - new DefaultAttributesProcessor()); - EXPECT_NO_THROW(storage.RecordLong(10l)); - EXPECT_NO_THROW(storage.RecordDouble(10.10)); + opentelemetry::sdk::metrics::SyncMetricStorage storage( + instr_desc, AggregationType::kSum, new DefaultAttributesProcessor(), + NoExemplarReservoir::GetNoExemplarReservoir()); + EXPECT_NO_THROW(storage.RecordLong(10l, opentelemetry::context::Context{})); + EXPECT_NO_THROW(storage.RecordDouble(10.10, opentelemetry::context::Context{})); EXPECT_NO_THROW(storage.RecordLong( - 10l, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}))); + 10l, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}), + opentelemetry::context::Context{})); - EXPECT_NO_THROW(storage.RecordDouble(10.10, opentelemetry::common::KeyValueIterableView({}))); + EXPECT_NO_THROW(storage.RecordDouble(10.10, opentelemetry::common::KeyValueIterableView({}), + opentelemetry::context::Context{})); } #endif From 2c9ce393e0582a4e0559a73bd9a572cf324b7086 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Thu, 24 Mar 2022 16:47:49 -0700 Subject: [PATCH 06/35] [Metrics SDK] - fix spelling (AggregationTemporarily to AggregationTemporality) (#1288) --- exporters/ostream/test/ostream_metric_test.cc | 4 +- .../sdk/metrics/aggregation/sum_aggregation.h | 2 +- .../sdk/metrics/data/point_data.h | 2 +- .../opentelemetry/sdk/metrics/instruments.h | 2 +- .../sdk/metrics/measurement_processor.h | 124 ------------------ .../sdk/metrics/metric_exporter.h | 2 +- .../opentelemetry/sdk/metrics/metric_reader.h | 6 +- .../sdk/metrics/state/metric_collector.h | 4 +- sdk/src/metrics/metric_reader.cc | 8 +- sdk/src/metrics/state/metric_collector.cc | 4 +- sdk/test/metrics/async_metric_storage_test.cc | 4 +- sdk/test/metrics/metric_reader_test.cc | 10 +- 12 files changed, 24 insertions(+), 148 deletions(-) delete mode 100644 sdk/include/opentelemetry/sdk/metrics/measurement_processor.h diff --git a/exporters/ostream/test/ostream_metric_test.cc b/exporters/ostream/test/ostream_metric_test.cc index 51b9882c47..9e98dd4da4 100644 --- a/exporters/ostream/test/ostream_metric_test.cc +++ b/exporters/ostream/test/ostream_metric_test.cc @@ -35,11 +35,11 @@ TEST(OStreamMetricsExporter, ExportSumPointData) record->instrumentation_library_ = instrumentation_library.get(); record->point_data_ = metric_sdk::SumPointData{ opentelemetry::common::SystemTimestamp{}, opentelemetry::common::SystemTimestamp{}, 10.0, - metric_sdk::AggregationTemporarily::kUnspecified, false}; + metric_sdk::AggregationTemporality::kUnspecified, false}; auto record2 = std::unique_ptr(new metric_sdk::MetricData(*record)); record2->point_data_ = metric_sdk::SumPointData{ opentelemetry::common::SystemTimestamp{}, opentelemetry::common::SystemTimestamp{}, 20l, - metric_sdk::AggregationTemporarily::kUnspecified, false}; + metric_sdk::AggregationTemporality::kUnspecified, false}; std::vector> records; records.push_back(std::move(record)); records.push_back(std::move(record2)); diff --git a/sdk/include/opentelemetry/sdk/metrics/aggregation/sum_aggregation.h b/sdk/include/opentelemetry/sdk/metrics/aggregation/sum_aggregation.h index c8b2eff33c..ff99cec733 100644 --- a/sdk/include/opentelemetry/sdk/metrics/aggregation/sum_aggregation.h +++ b/sdk/include/opentelemetry/sdk/metrics/aggregation/sum_aggregation.h @@ -25,7 +25,7 @@ static inline void PopulateSumPointData(SumPointData &sum, sum.end_epoch_nanos_ = end_ts; sum.value_ = value; sum.is_monotonic_ = is_monotonic; - sum.aggregation_temporarily_ = AggregationTemporarily::kDelta; + sum.aggregation_temporality_ = AggregationTemporality::kDelta; } class LongSumAggregation : public Aggregation, InstrumentMonotonicityAwareAggregation diff --git a/sdk/include/opentelemetry/sdk/metrics/data/point_data.h b/sdk/include/opentelemetry/sdk/metrics/data/point_data.h index 603bcc30bc..5bbcbd0b1e 100644 --- a/sdk/include/opentelemetry/sdk/metrics/data/point_data.h +++ b/sdk/include/opentelemetry/sdk/metrics/data/point_data.h @@ -25,7 +25,7 @@ class SumPointData opentelemetry::common::SystemTimestamp start_epoch_nanos_; opentelemetry::common::SystemTimestamp end_epoch_nanos_; ValueType value_; - AggregationTemporarily aggregation_temporarily_; + AggregationTemporality aggregation_temporality_; bool is_monotonic_; }; diff --git a/sdk/include/opentelemetry/sdk/metrics/instruments.h b/sdk/include/opentelemetry/sdk/metrics/instruments.h index ad64ce718b..15e6a25705 100644 --- a/sdk/include/opentelemetry/sdk/metrics/instruments.h +++ b/sdk/include/opentelemetry/sdk/metrics/instruments.h @@ -36,7 +36,7 @@ enum class AggregationType kDefault }; -enum class AggregationTemporarily +enum class AggregationTemporality { kUnspecified, kDelta, diff --git a/sdk/include/opentelemetry/sdk/metrics/measurement_processor.h b/sdk/include/opentelemetry/sdk/metrics/measurement_processor.h deleted file mode 100644 index f3b998451b..0000000000 --- a/sdk/include/opentelemetry/sdk/metrics/measurement_processor.h +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -#pragma once -#include -#ifndef ENABLE_METRICS_PREVIEW - -# include -# include "opentelemetry/common/key_value_iterable_view.h" -# include "opentelemetry/sdk/metrics/exemplar/no_exemplar_reservoir.h" -# include "opentelemetry/sdk/metrics/instruments.h" -# include "opentelemetry/sdk/metrics/metric_reader.h" -# include "opentelemetry/sdk/metrics/state/sync_metric_storage.h" -# include "opentelemetry/sdk/metrics/view/attributes_processor.h" - -OPENTELEMETRY_BEGIN_NAMESPACE -namespace sdk -{ -namespace metrics -{ - -static std::size_t MakeKey(const MetricReader &metric_reader) -{ - return reinterpret_cast(&metric_reader); -} - -class MeasurementProcessor -{ -public: - virtual void RecordLong(long value, const opentelemetry::context::Context &context) noexcept = 0; - - virtual void RecordLong(long value, - const opentelemetry::common::KeyValueIterable &attributes, - const opentelemetry::context::Context &context) noexcept = 0; - - virtual void RecordDouble(double value, - const opentelemetry::context::Context &context) noexcept = 0; - - virtual void RecordDouble(double value, - const opentelemetry::common::KeyValueIterable &attributes, - const opentelemetry::context::Context &context) noexcept = 0; - - virtual bool Collect(MetricReader &reader, - AggregationTemporarily aggregation_temporarily, - nostd::function_ref callback) noexcept = 0; -}; - -class DefaultMeasurementProcessor : public MeasurementProcessor -{ -public: - bool AddMetricStorage(const MetricReader &reader) - { - // TBD Check if already present - // pass intrumentation type, and aggregation type instead of hardcodig below. - InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, - InstrumentValueType::kLong}; - metric_storages_[MakeKey(reader)] = std::unique_ptr( - new SyncMetricStorage(instr_desc, AggregationType::kSum, new DefaultAttributesProcessor(), - NoExemplarReservoir::GetNoExemplarReservoir())); - return true; - } - - virtual void RecordLong(long value, - const opentelemetry::context::Context &context) noexcept override - { - for (const auto &kv : metric_storages_) - { - kv.second->RecordLong(value, context); - } - } - - virtual void RecordLong(long value, - const opentelemetry::common::KeyValueIterable &attributes, - const opentelemetry::context::Context &context) noexcept override - { - for (const auto &kv : metric_storages_) - { - kv.second->RecordLong(value, attributes, context); - } - } - - virtual void RecordDouble(double value, - const opentelemetry::context::Context &context) noexcept override - { - for (const auto &kv : metric_storages_) - { - kv.second->RecordDouble(value, context); - } - } - - virtual void RecordDouble(double value, - const opentelemetry::common::KeyValueIterable &attributes, - const opentelemetry::context::Context &context) noexcept override - { - for (const auto &kv : metric_storages_) - { - kv.second->RecordDouble(value, attributes, context); - } - } - - bool Collect(MetricReader &reader, - AggregationTemporarily aggregation_temporarily, - nostd::function_ref callback) noexcept override - { - auto i = metric_storages_.find(MakeKey(reader)); - - // TBD - Remove hardcodings below - std::vector collectors; - if (i != metric_storages_.end()) - { - - return i->second->Collect(nullptr, collectors, nullptr, nullptr, callback); - } - return false; - } - -private: - std::map> metric_storages_; -}; - -} // namespace metrics -} // namespace sdk -OPENTELEMETRY_END_NAMESPACE -#endif \ No newline at end of file diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h b/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h index 96898c9ad1..3769259472 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h @@ -51,7 +51,7 @@ class MetricExporter std::chrono::microseconds timeout = std::chrono::microseconds(0)) noexcept = 0; private: - AggregationTemporarily aggregation_temporarily; + AggregationTemporality aggregation_temporality_; }; } // namespace metrics } // namespace sdk diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h index fdd5d41291..1f7cee8d30 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 { public: MetricReader( - AggregationTemporarily aggregation_temporarily = AggregationTemporarily::kCummulative); + AggregationTemporality aggregation_temporality = AggregationTemporality::kCummulative); void SetMetricProducer(MetricProducer *metric_producer); @@ -37,7 +37,7 @@ class MetricReader */ bool Collect(nostd::function_ref callback) noexcept; - AggregationTemporarily GetAggregationTemporarily() const noexcept; + AggregationTemporality GetAggregationTemporality() const noexcept; /** * Shutdown the meter reader. @@ -62,7 +62,7 @@ class MetricReader private: MetricProducer *metric_producer_; - AggregationTemporarily aggregation_temporarily_; + AggregationTemporality aggregation_temporality_; mutable opentelemetry::common::SpinLockMutex lock_; 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 3049440d9d..51c9cf6eff 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h @@ -18,7 +18,7 @@ class MeterContext; class CollectorHandle { public: - virtual AggregationTemporarily GetAggregationTemporarily() noexcept = 0; + virtual AggregationTemporality GetAggregationTemporality() noexcept = 0; }; /** @@ -33,7 +33,7 @@ class MetricCollector : public MetricProducer, public CollectorHandle MetricCollector(std::shared_ptr &&context, std::unique_ptr metric_reader); - AggregationTemporarily GetAggregationTemporarily() noexcept override; + AggregationTemporality GetAggregationTemporality() noexcept override; /** * The callback to be called for each metric exporter. This will only be those diff --git a/sdk/src/metrics/metric_reader.cc b/sdk/src/metrics/metric_reader.cc index 71aedc227f..8238ad2a55 100644 --- a/sdk/src/metrics/metric_reader.cc +++ b/sdk/src/metrics/metric_reader.cc @@ -13,8 +13,8 @@ namespace sdk namespace metrics { -MetricReader::MetricReader(AggregationTemporarily aggregation_temporarily) - : aggregation_temporarily_(aggregation_temporarily) +MetricReader::MetricReader(AggregationTemporality aggregation_temporality) + : aggregation_temporality_(aggregation_temporality) {} void MetricReader::SetMetricProducer(MetricProducer *metric_producer) @@ -22,9 +22,9 @@ void MetricReader::SetMetricProducer(MetricProducer *metric_producer) metric_producer_ = metric_producer; } -AggregationTemporarily MetricReader::GetAggregationTemporarily() const noexcept +AggregationTemporality MetricReader::GetAggregationTemporality() const noexcept { - return aggregation_temporarily_; + return aggregation_temporality_; } bool MetricReader::Collect(nostd::function_ref callback) noexcept diff --git a/sdk/src/metrics/state/metric_collector.cc b/sdk/src/metrics/state/metric_collector.cc index a52c6e9b1c..5b9fc4ab70 100644 --- a/sdk/src/metrics/state/metric_collector.cc +++ b/sdk/src/metrics/state/metric_collector.cc @@ -24,9 +24,9 @@ MetricCollector::MetricCollector( metric_reader_->SetMetricProducer(this); } -AggregationTemporarily MetricCollector::GetAggregationTemporarily() noexcept +AggregationTemporality MetricCollector::GetAggregationTemporality() noexcept { - return metric_reader_->GetAggregationTemporarily(); + return metric_reader_->GetAggregationTemporality(); } bool MetricCollector::Collect(nostd::function_ref callback) noexcept diff --git a/sdk/test/metrics/async_metric_storage_test.cc b/sdk/test/metrics/async_metric_storage_test.cc index fd7d24c6f3..0527c7f0ca 100644 --- a/sdk/test/metrics/async_metric_storage_test.cc +++ b/sdk/test/metrics/async_metric_storage_test.cc @@ -21,7 +21,7 @@ using namespace opentelemetry::sdk::resource; class MockMetricReader : public MetricReader { public: - MockMetricReader(AggregationTemporarily aggr_temporarily) : MetricReader(aggr_temporarily) {} + MockMetricReader(AggregationTemporality aggr_temporality) : MetricReader(aggr_temporality) {} virtual bool OnForceFlush(std::chrono::microseconds timeout) noexcept override { return true; } @@ -44,7 +44,7 @@ TEST(AsyncMetricStorageTest, BasicTests) std::vector> exporters; std::shared_ptr meter_context(new MeterContext(std::move(exporters))); - std::unique_ptr metric_reader(new MockMetricReader(AggregationTemporarily::kDelta)); + std::unique_ptr metric_reader(new MockMetricReader(AggregationTemporality::kDelta)); std::shared_ptr collector = std::shared_ptr( new MetricCollector(std::move(meter_context), std::move(metric_reader))); diff --git a/sdk/test/metrics/metric_reader_test.cc b/sdk/test/metrics/metric_reader_test.cc index d0f7c14981..214f522118 100644 --- a/sdk/test/metrics/metric_reader_test.cc +++ b/sdk/test/metrics/metric_reader_test.cc @@ -14,7 +14,7 @@ using namespace opentelemetry::sdk::metrics; class MockMetricReader : public MetricReader { public: - MockMetricReader(AggregationTemporarily aggr_temporarily) : MetricReader(aggr_temporarily) {} + MockMetricReader(AggregationTemporality aggr_temporality) : MetricReader(aggr_temporality) {} virtual bool OnForceFlush(std::chrono::microseconds timeout) noexcept override { return true; } @@ -25,15 +25,15 @@ class MockMetricReader : public MetricReader TEST(MetricReaderTest, BasicTests) { - AggregationTemporarily aggr_temporarily = AggregationTemporarily::kDelta; - std::unique_ptr metric_reader1(new MockMetricReader(aggr_temporarily)); - EXPECT_EQ(metric_reader1->GetAggregationTemporarily(), aggr_temporarily); + AggregationTemporality aggr_temporality = AggregationTemporality::kDelta; + std::unique_ptr metric_reader1(new MockMetricReader(aggr_temporality)); + EXPECT_EQ(metric_reader1->GetAggregationTemporality(), aggr_temporality); 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::unique_ptr metric_reader2(new MockMetricReader(aggr_temporality)); std::shared_ptr meter_context2(new MeterContext(std::move(exporters))); MetricProducer *metric_producer = new MetricCollector(std::move(meter_context2), std::move(metric_reader2)); From 91b05720ef38bcd065e1ebb8c9c857764d8d0e3b Mon Sep 17 00:00:00 2001 From: Ehsan Saei <71217171+esigo@users.noreply.github.com> Date: Fri, 25 Mar 2022 17:40:21 +0100 Subject: [PATCH 07/35] fix compilation error with protobuf 3.5 (#1289) --- docker/Dockerfile.centos | 14 ++++++++------ .../exporters/otlp/otlp_environment.h | 2 +- exporters/otlp/src/otlp_http_client.cc | 1 + 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docker/Dockerfile.centos b/docker/Dockerfile.centos index 66ca8f24b3..66138ba60a 100644 --- a/docker/Dockerfile.centos +++ b/docker/Dockerfile.centos @@ -1,13 +1,15 @@ FROM centos:7 +ARG TOOLSET_VER=11 + RUN yum update -y && yum install -y centos-release-scl epel-release -RUN yum install -y devtoolset-11 \ +RUN yum install -y devtoolset-${TOOLSET_VER} \ cmake3 git \ openssl-devel \ libcurl-devel \ - && source /opt/rh/devtoolset-11/enable + && source /opt/rh/devtoolset-${TOOLSET_VER}/enable -RUN echo "source /opt/rh/devtoolset-11/enable" >> /etc/bashrc +RUN echo "source /opt/rh/devtoolset-${TOOLSET_VER}/enable" >> /etc/bashrc RUN echo "BOOST_LIBRARYDIR=/usr/lib64/boost169" >> /etc/bashrc RUN echo "BOOST_INCLUDEDIR=/usr/include/boost169" >> /etc/bashrc @@ -17,7 +19,7 @@ ARG GRPC_VERSION=v1.43.2 RUN git clone --depth=1 -b $GRPC_VERSION https://github.com/grpc/grpc.git \ && cd grpc && git submodule update --init \ && mkdir -p "third_party/abseil-cpp/build" && cd "third_party/abseil-cpp/build" \ - && source /opt/rh/devtoolset-11/enable \ + && source /opt/rh/devtoolset-${TOOLSET_VER}/enable \ && cmake3 -DCMAKE_CXX_STANDARD=17 -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE .. \ && make -j${nproc} install && cd ../../.. \ && mkdir build && cd build \ @@ -40,7 +42,7 @@ RUN yum install -y \ && wget https://github.com/apache/thrift/archive/refs/tags/v$THRIFT_VERSION.tar.gz \ && tar -xvf v$THRIFT_VERSION.tar.gz \ && mkdir -p thrift-$THRIFT_VERSION/build && cd thrift-$THRIFT_VERSION/build \ - && source /opt/rh/devtoolset-11/enable \ + && source /opt/rh/devtoolset-${TOOLSET_VER}/enable \ && export BOOST_INCLUDEDIR=/usr/include/boost169 \ && export BOOST_LIBRARYDIR=/usr/lib64/boost169 \ && cmake3 \ @@ -66,7 +68,7 @@ RUN yum install -y \ RUN git clone --depth=1 https://github.com/open-telemetry/opentelemetry-cpp.git \ && cd opentelemetry-cpp && git submodule update --init \ && mkdir -p build && cd build \ - && source /opt/rh/devtoolset-11/enable \ + && source /opt/rh/devtoolset-${TOOLSET_VER}/enable \ && export BOOST_INCLUDEDIR=/usr/include/boost169 \ && export BOOST_LIBRARYDIR=/usr/lib64/boost169 \ && cmake3 \ diff --git a/exporters/otlp/include/opentelemetry/exporters/otlp/otlp_environment.h b/exporters/otlp/include/opentelemetry/exporters/otlp/otlp_environment.h index c60de87eb9..bf7ea6a61c 100644 --- a/exporters/otlp/include/opentelemetry/exporters/otlp/otlp_environment.h +++ b/exporters/otlp/include/opentelemetry/exporters/otlp/otlp_environment.h @@ -53,7 +53,7 @@ inline const std::string GetOtlpDefaultHttpEndpoint() return endpoint.size() ? endpoint : kOtlpEndpointDefault; } -inline const bool GetOtlpDefaultIsSslEnable() +inline bool GetOtlpDefaultIsSslEnable() { constexpr char kOtlpTracesIsSslEnableEnv[] = "OTEL_EXPORTER_OTLP_TRACES_SSL_ENABLE"; constexpr char kOtlpIsSslEnableEnv[] = "OTEL_EXPORTER_OTLP_SSL_ENABLE"; diff --git a/exporters/otlp/src/otlp_http_client.cc b/exporters/otlp/src/otlp_http_client.cc index 544f74ca7c..e3e1a8c467 100644 --- a/exporters/otlp/src/otlp_http_client.cc +++ b/exporters/otlp/src/otlp_http_client.cc @@ -18,6 +18,7 @@ #include "google/protobuf/message.h" #include "google/protobuf/reflection.h" #include "google/protobuf/stubs/common.h" +#include "google/protobuf/stubs/stringpiece.h" #include "nlohmann/json.hpp" #if defined(GOOGLE_PROTOBUF_VERSION) && GOOGLE_PROTOBUF_VERSION >= 3007000 From c1b959079bd6ae03183f54f246017aa1be5c706b Mon Sep 17 00:00:00 2001 From: Ehsan Saei <71217171+esigo@users.noreply.github.com> Date: Sat, 26 Mar 2022 09:25:42 +0100 Subject: [PATCH 08/35] Fix span SetAttribute crash (#1283) --- CHANGELOG.md | 1 + sdk/src/trace/span.cc | 4 ++++ sdk/test/trace/tracer_test.cc | 28 ++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f66ec617a..bd41c75626 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ Increment the: ## [Unreleased] +* [SDK] Bugfix: span SetAttribute crash ([#1283](https://github.com/open-telemetry/opentelemetry-cpp/pull/1283)) * [EXPORTER] Jaeger Exporter - Populate Span Links ([#1251](https://github.com/open-telemetry/opentelemetry-cpp/pull/1251)) ## [1.2.0] 2022-01-31 diff --git a/sdk/src/trace/span.cc b/sdk/src/trace/span.cc index dff84a22b7..13ea99126c 100644 --- a/sdk/src/trace/span.cc +++ b/sdk/src/trace/span.cc @@ -94,6 +94,10 @@ Span::~Span() void Span::SetAttribute(nostd::string_view key, const common::AttributeValue &value) noexcept { std::lock_guard lock_guard{mu_}; + if (recordable_ == nullptr) + { + return; + } recordable_->SetAttribute(key, value); } diff --git a/sdk/test/trace/tracer_test.cc b/sdk/test/trace/tracer_test.cc index 9d1029cd02..dc806b079f 100644 --- a/sdk/test/trace/tracer_test.cc +++ b/sdk/test/trace/tracer_test.cc @@ -383,6 +383,34 @@ TEST(Tracer, SpanSetAttribute) ASSERT_EQ(3.1, nostd::get(cur_span_data->GetAttributes().at("abc"))); } +TEST(Tracer, TestAfterEnd) +{ + std::unique_ptr exporter(new InMemorySpanExporter()); + std::shared_ptr span_data = exporter->GetData(); + auto tracer = initTracer(std::move(exporter)); + auto span = tracer->StartSpan("span 1"); + span->SetAttribute("abc", 3.1); + + span->End(); + + // test after end + span->SetAttribute("testing null recordable", 3.1); + span->AddEvent("event 1"); + span->AddEvent("event 2", std::chrono::system_clock::now()); + span->AddEvent("event 3", std::chrono::system_clock::now(), {{"attr1", 1}}); + std::string new_name{"new name"}; + span->UpdateName(new_name); + span->SetAttribute("attr1", 3.1); + std::string description{"description"}; + span->SetStatus(opentelemetry::trace::StatusCode::kError, description); + span->End(); + + auto spans = span_data->GetSpans(); + ASSERT_EQ(1, spans.size()); + auto &cur_span_data = spans.at(0); + ASSERT_EQ(3.1, nostd::get(cur_span_data->GetAttributes().at("abc"))); +} + TEST(Tracer, SpanSetEvents) { std::unique_ptr exporter(new InMemorySpanExporter()); From a7e814a632fdaee0c76246358ffad811ac06a7e9 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Tue, 29 Mar 2022 18:01:37 -0700 Subject: [PATCH 09/35] Synchronous Metric collection (Delta , Cumulative) (#1265) --- exporters/ostream/BUILD | 57 +++-- .../sdk/metrics/aggregation/aggregation.h | 40 +++- .../metrics/aggregation/default_aggregation.h | 8 +- .../metrics/aggregation/drop_aggregation.h | 20 +- .../aggregation/histogram_aggregation.h | 40 ++-- .../aggregation/lastvalue_aggregation.h | 22 +- .../sdk/metrics/aggregation/sum_aggregation.h | 44 ++-- .../sdk/metrics/data/metric_data.h | 15 +- .../sdk/metrics/data/point_data.h | 56 +++-- .../opentelemetry/sdk/metrics/instruments.h | 2 +- sdk/include/opentelemetry/sdk/metrics/meter.h | 2 +- .../opentelemetry/sdk/metrics/meter_context.h | 1 - .../opentelemetry/sdk/metrics/metric_reader.h | 3 +- .../sdk/metrics/state/async_metric_storage.h | 3 +- .../sdk/metrics/state/attributes_hashmap.h | 19 +- .../sdk/metrics/state/sync_metric_storage.h | 28 ++- sdk/src/metrics/CMakeLists.txt | 1 + .../aggregation/histogram_aggregation.cc | 95 +++++--- .../aggregation/lastvalue_aggregation.cc | 103 ++++++-- .../metrics/aggregation/sum_aggregation.cc | 102 +++++--- sdk/src/metrics/meter.cc | 2 +- sdk/src/metrics/state/metric_collector.cc | 2 +- sdk/src/metrics/state/sync_metric_storage.cc | 131 ++++++++++ sdk/test/metrics/aggregation_test.cc | 38 ++- sdk/test/metrics/async_metric_storage_test.cc | 8 +- sdk/test/metrics/meter_provider_sdk_test.cc | 2 - sdk/test/metrics/metric_reader_test.cc | 2 - sdk/test/metrics/sync_metric_storage_test.cc | 226 +++++++++++++++++- 28 files changed, 804 insertions(+), 268 deletions(-) create mode 100644 sdk/src/metrics/state/sync_metric_storage.cc diff --git a/exporters/ostream/BUILD b/exporters/ostream/BUILD index cca74d6693..19c0f7914d 100644 --- a/exporters/ostream/BUILD +++ b/exporters/ostream/BUILD @@ -43,36 +43,35 @@ cc_library( ], ) -cc_library( - name = "ostream_metric_exporter", - srcs = [ - "src/metric_exporter.cc", - ], - hdrs = [ - "include/opentelemetry/exporters/ostream/metric_exporter.h", - ], - strip_include_prefix = "include", - tags = [ - "metrics", - "ostream", - ], - deps = [ - "//sdk/src/metrics", - ], -) +#TODO MetricData is still changing, uncomment once it is final +# srcs = [ +# "src/metric_exporter.cc", +# ], +# hdrs = [ +# "include/opentelemetry/exporters/ostream/metric_exporter.h", +# ], +# strip_include_prefix = "include", +# tags = [ +# "metrics", +# "ostream", +# ], +# deps = [ +# "//sdk/src/metrics", +# ], +#) -cc_test( - name = "ostream_metric_test", - srcs = ["test/ostream_metric_test.cc"], - tags = [ - "ostream", - "test", - ], - deps = [ - ":ostream_metric_exporter", - "@com_google_googletest//:gtest_main", - ], -) +#cc_test( +# name = "ostream_metric_test", +# srcs = ["test/ostream_metric_test.cc"], +# tags = [ +# "ostream", +# "test", +# ], +# deps = [ +# ":ostream_metric_exporter", +# "@com_google_googletest//:gtest_main", +#], +#) cc_test( name = "ostream_metrics_test_deprecated", diff --git a/sdk/include/opentelemetry/sdk/metrics/aggregation/aggregation.h b/sdk/include/opentelemetry/sdk/metrics/aggregation/aggregation.h index 3bb133ac15..7ec9a6ea2b 100644 --- a/sdk/include/opentelemetry/sdk/metrics/aggregation/aggregation.h +++ b/sdk/include/opentelemetry/sdk/metrics/aggregation/aggregation.h @@ -11,16 +11,6 @@ namespace sdk { namespace metrics { -class InstrumentMonotonicityAwareAggregation -{ -public: - InstrumentMonotonicityAwareAggregation(bool is_monotonic) : is_monotonic_(is_monotonic) {} - bool IsMonotonic() { return is_monotonic_; } - -private: - bool is_monotonic_; -}; - class Aggregation { public: @@ -28,7 +18,35 @@ class Aggregation virtual void Aggregate(double value, const PointAttributes &attributes = {}) noexcept = 0; - virtual PointType Collect() noexcept = 0; + /** + * Returns the result of the merge of the two aggregations. + * + * This should always assume that the aggregations do not overlap and merge together for a new + * cumulative report. + * + * @param delta the newly captured (delta) aggregation + * @return the result of the merge of the given aggregation. + */ + + virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept = 0; + + /** + * Returns a new delta aggregation by comparing two cumulative measurements. + * + * @param next the newly captured (cumulative) aggregation. + * @return The resulting delta aggregation. + */ + virtual std::unique_ptr Diff(const Aggregation &next) const noexcept = 0; + + /** + * Returns the point data that the aggregation will produce. + * + * @return PointType + */ + + virtual PointType ToPoint() const noexcept = 0; + + virtual ~Aggregation() = default; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/aggregation/default_aggregation.h b/sdk/include/opentelemetry/sdk/metrics/aggregation/default_aggregation.h index f193864926..b5a1283d26 100644 --- a/sdk/include/opentelemetry/sdk/metrics/aggregation/default_aggregation.h +++ b/sdk/include/opentelemetry/sdk/metrics/aggregation/default_aggregation.h @@ -30,8 +30,8 @@ class DefaultAggregation case InstrumentType::kUpDownCounter: case InstrumentType::kObservableUpDownCounter: return (instrument_descriptor.value_type_ == InstrumentValueType::kLong) - ? std::move(std::unique_ptr(new LongSumAggregation(true))) - : std::move(std::unique_ptr(new DoubleSumAggregation(true))); + ? std::move(std::unique_ptr(new LongSumAggregation())) + : std::move(std::unique_ptr(new DoubleSumAggregation())); break; case InstrumentType::kHistogram: return (instrument_descriptor.value_type_ == InstrumentValueType::kLong) @@ -79,11 +79,11 @@ class DefaultAggregation case AggregationType::kSum: if (instrument_descriptor.value_type_ == InstrumentValueType::kLong) { - return std::unique_ptr(new LongSumAggregation(true)); + return std::unique_ptr(new LongSumAggregation()); } else { - return std::unique_ptr(new DoubleSumAggregation(true)); + return std::unique_ptr(new DoubleSumAggregation()); } break; default: diff --git a/sdk/include/opentelemetry/sdk/metrics/aggregation/drop_aggregation.h b/sdk/include/opentelemetry/sdk/metrics/aggregation/drop_aggregation.h index 0af5dd43a5..4e29fa2e46 100644 --- a/sdk/include/opentelemetry/sdk/metrics/aggregation/drop_aggregation.h +++ b/sdk/include/opentelemetry/sdk/metrics/aggregation/drop_aggregation.h @@ -14,6 +14,10 @@ namespace sdk namespace metrics { +/** + * A null Aggregation which denotes no aggregation should occur. + */ + class DropAggregation : public Aggregation { public: @@ -23,7 +27,21 @@ class DropAggregation : public Aggregation void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override {} - PointType Collect() noexcept override { return DropPointData(); } + std::unique_ptr Merge(const Aggregation &delta) const noexcept override + { + return std::unique_ptr(new DropAggregation()); + } + + std::unique_ptr Diff(const Aggregation &next) const noexcept override + { + return std::unique_ptr(new DropAggregation()); + } + + PointType ToPoint() const noexcept override + { + static DropPointData point_data; + return point_data; + } }; } // namespace metrics } // namespace sdk diff --git a/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h b/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h index 5a66ecb243..8f33fa27b4 100644 --- a/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h +++ b/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h @@ -13,57 +13,47 @@ namespace sdk { namespace metrics { -template -static inline void PopulateHistogramDataPoint(HistogramPointData &histogram, - opentelemetry::common::SystemTimestamp epoch_nanos, - T sum, - uint64_t count, - std::vector &counts, - std::vector boundaries) -{ - histogram.epoch_nanos_ = epoch_nanos; - histogram.boundaries_ = boundaries; - histogram.sum_ = sum; - histogram.counts_ = counts; - histogram.count_ = count; -} class LongHistogramAggregation : public Aggregation { public: LongHistogramAggregation(); + LongHistogramAggregation(HistogramPointData &&); void Aggregate(long value, const PointAttributes &attributes = {}) noexcept override; void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override {} - PointType Collect() noexcept override; + virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; + + virtual std::unique_ptr Diff(const Aggregation &next) const noexcept override; + + PointType ToPoint() const noexcept override; private: opentelemetry::common::SpinLockMutex lock_; - std::vector boundaries_; - long sum_; - std::vector counts_; - uint64_t count_; + HistogramPointData point_data_; }; class DoubleHistogramAggregation : public Aggregation { public: DoubleHistogramAggregation(); + DoubleHistogramAggregation(HistogramPointData &&); void Aggregate(long value, const PointAttributes &attributes = {}) noexcept override {} void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override; - PointType Collect() noexcept override; + virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; + + virtual std::unique_ptr Diff(const Aggregation &next) const noexcept override; + + PointType ToPoint() const noexcept override; private: - opentelemetry::common::SpinLockMutex lock_; - std::vector boundaries_; - double sum_; - std::vector counts_; - uint64_t count_; + mutable opentelemetry::common::SpinLockMutex lock_; + mutable HistogramPointData point_data_; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/aggregation/lastvalue_aggregation.h b/sdk/include/opentelemetry/sdk/metrics/aggregation/lastvalue_aggregation.h index 092a0df30e..7f185d51a1 100644 --- a/sdk/include/opentelemetry/sdk/metrics/aggregation/lastvalue_aggregation.h +++ b/sdk/include/opentelemetry/sdk/metrics/aggregation/lastvalue_aggregation.h @@ -17,34 +17,42 @@ class LongLastValueAggregation : public Aggregation { public: LongLastValueAggregation(); + LongLastValueAggregation(LastValuePointData &&); void Aggregate(long value, const PointAttributes &attributes = {}) noexcept override; void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override {} - PointType Collect() noexcept override; + virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; + + virtual std::unique_ptr Diff(const Aggregation &next) const noexcept override; + + PointType ToPoint() const noexcept override; private: opentelemetry::common::SpinLockMutex lock_; - long value_; - bool is_lastvalue_valid_; + LastValuePointData point_data_; }; class DoubleLastValueAggregation : public Aggregation { public: DoubleLastValueAggregation(); + DoubleLastValueAggregation(LastValuePointData &&); void Aggregate(long value, const PointAttributes &attributes = {}) noexcept override {} void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override; - PointType Collect() noexcept override; + virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; + + virtual std::unique_ptr Diff(const Aggregation &next) const noexcept override; + + PointType ToPoint() const noexcept override; private: - opentelemetry::common::SpinLockMutex lock_; - double value_; - bool is_lastvalue_valid_; + mutable opentelemetry::common::SpinLockMutex lock_; + mutable LastValuePointData point_data_; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/aggregation/sum_aggregation.h b/sdk/include/opentelemetry/sdk/metrics/aggregation/sum_aggregation.h index ff99cec733..b0f0169b24 100644 --- a/sdk/include/opentelemetry/sdk/metrics/aggregation/sum_aggregation.h +++ b/sdk/include/opentelemetry/sdk/metrics/aggregation/sum_aggregation.h @@ -14,52 +14,46 @@ namespace sdk namespace metrics { -template -static inline void PopulateSumPointData(SumPointData &sum, - opentelemetry::common::SystemTimestamp start_ts, - opentelemetry::common::SystemTimestamp end_ts, - T value, - bool is_monotonic) -{ - sum.start_epoch_nanos_ = start_ts; - sum.end_epoch_nanos_ = end_ts; - sum.value_ = value; - sum.is_monotonic_ = is_monotonic; - sum.aggregation_temporality_ = AggregationTemporality::kDelta; -} - -class LongSumAggregation : public Aggregation, InstrumentMonotonicityAwareAggregation +class LongSumAggregation : public Aggregation { public: - LongSumAggregation(bool is_monotonic); + LongSumAggregation(); + LongSumAggregation(SumPointData &&); void Aggregate(long value, const PointAttributes &attributes = {}) noexcept override; void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override {} - PointType Collect() noexcept override; + virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; + + virtual std::unique_ptr Diff(const Aggregation &next) const noexcept override; + + PointType ToPoint() const noexcept override; private: opentelemetry::common::SpinLockMutex lock_; - opentelemetry::common::SystemTimestamp start_epoch_nanos_; - long sum_; + SumPointData point_data_; }; -class DoubleSumAggregation : public Aggregation, InstrumentMonotonicityAwareAggregation +class DoubleSumAggregation : public Aggregation { public: - DoubleSumAggregation(bool is_monotonic); + DoubleSumAggregation(); + DoubleSumAggregation(SumPointData &&); void Aggregate(long value, const PointAttributes &attributes = {}) noexcept override {} void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override; - PointType Collect() noexcept override; + virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; + + virtual std::unique_ptr Diff(const Aggregation &next) const noexcept override; + + PointType ToPoint() const noexcept override; private: - opentelemetry::common::SpinLockMutex lock_; - opentelemetry::common::SystemTimestamp start_epoch_nanos_; - double sum_; + mutable opentelemetry::common::SpinLockMutex lock_; + SumPointData point_data_; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h b/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h index cb7bc4cf80..738d4540f7 100644 --- a/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h +++ b/sdk/include/opentelemetry/sdk/metrics/data/metric_data.h @@ -17,18 +17,23 @@ namespace sdk namespace metrics { -using PointAttributes = opentelemetry::sdk::common::AttributeMap; +using PointAttributes = opentelemetry::sdk::common::OrderedAttributeMap; using PointType = opentelemetry::nostd:: variant; +struct PointDataAttributes +{ + PointAttributes attributes; + PointType point_data; +}; + class MetricData { public: - opentelemetry::sdk::resource::Resource *resource_; - opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary *instrumentation_library_; - PointAttributes attributes_; InstrumentDescriptor instrument_descriptor; - PointType point_data_; + opentelemetry::common::SystemTimestamp start_ts; + opentelemetry::common::SystemTimestamp end_ts; + std::vector point_data_attr_; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/data/point_data.h b/sdk/include/opentelemetry/sdk/metrics/data/point_data.h index 5bbcbd0b1e..714f96c9af 100644 --- a/sdk/include/opentelemetry/sdk/metrics/data/point_data.h +++ b/sdk/include/opentelemetry/sdk/metrics/data/point_data.h @@ -8,7 +8,7 @@ # include "opentelemetry/sdk/metrics/instruments.h" # include "opentelemetry/version.h" -# include +# include OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk @@ -17,40 +17,62 @@ namespace metrics { using ValueType = nostd::variant; -using ListType = nostd::variant, std::vector>; +using ListType = nostd::variant, std::list>; + +// TODO: remove ctors and initializers from below classes when GCC<5 stops shipping on Ubuntu class SumPointData { public: - opentelemetry::common::SystemTimestamp start_epoch_nanos_; - opentelemetry::common::SystemTimestamp end_epoch_nanos_; - ValueType value_; - AggregationTemporality aggregation_temporality_; - bool is_monotonic_; + // TODO: remove ctors and initializers when GCC<5 stops shipping on Ubuntu + SumPointData(SumPointData &&) = default; + SumPointData(const SumPointData &) = default; + SumPointData &operator=(SumPointData &&) = default; + SumPointData() = default; + + ValueType value_ = {}; }; class LastValuePointData { public: - opentelemetry::common::SystemTimestamp epoch_nanos_; - bool is_lastvalue_valid_; - ValueType value_; + // TODO: remove ctors and initializers when GCC<5 stops shipping on Ubuntu + LastValuePointData(LastValuePointData &&) = default; + LastValuePointData(const LastValuePointData &) = default; + LastValuePointData &operator=(LastValuePointData &&) = default; + LastValuePointData() = default; + + ValueType value_ = {}; + bool is_lastvalue_valid_ = {}; + opentelemetry::common::SystemTimestamp sample_ts_ = {}; }; class HistogramPointData { public: - opentelemetry::common::SystemTimestamp epoch_nanos_; - ListType boundaries_; - ValueType sum_; - std::vector counts_; - uint64_t count_; + // TODO: remove ctors and initializers when GCC<5 stops shipping on Ubuntu + HistogramPointData(HistogramPointData &&) = default; + HistogramPointData &operator=(HistogramPointData &&) = default; + HistogramPointData(const HistogramPointData &) = default; + HistogramPointData() = default; + + ListType boundaries_ = {}; + ValueType sum_ = {}; + std::vector counts_ = {}; + uint64_t count_ = {}; }; class DropPointData -{}; +{ +public: + // TODO: remove ctors and initializers when GCC<5 stops shipping on Ubuntu + DropPointData(DropPointData &&) = default; + DropPointData(const DropPointData &) = default; + DropPointData() = default; + DropPointData &operator=(DropPointData &&) = default; +}; } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE -#endif \ No newline at end of file +#endif diff --git a/sdk/include/opentelemetry/sdk/metrics/instruments.h b/sdk/include/opentelemetry/sdk/metrics/instruments.h index 15e6a25705..5d85357143 100644 --- a/sdk/include/opentelemetry/sdk/metrics/instruments.h +++ b/sdk/include/opentelemetry/sdk/metrics/instruments.h @@ -40,7 +40,7 @@ enum class AggregationTemporality { kUnspecified, kDelta, - kCummulative + kCumulative }; struct InstrumentDescriptor diff --git a/sdk/include/opentelemetry/sdk/metrics/meter.h b/sdk/include/opentelemetry/sdk/metrics/meter.h index fc9fb36503..c9e02918a0 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter.h @@ -103,7 +103,7 @@ class Meter final : public opentelemetry::metrics::Meter const noexcept; /** collect metrics across all the meters **/ - bool collect(CollectorHandle *collector, + bool Collect(CollectorHandle *collector, opentelemetry::common::SystemTimestamp collect_ts, nostd::function_ref callback) noexcept; diff --git a/sdk/include/opentelemetry/sdk/metrics/meter_context.h b/sdk/include/opentelemetry/sdk/metrics/meter_context.h index 8a31821353..74f67a1c46 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter_context.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter_context.h @@ -111,7 +111,6 @@ class MeterContext : public std::enable_shared_from_this /** * Adds a meter to the list of configured meters. - * * Note: This method is INTERNAL to sdk not thread safe. * * @param meter diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h index 1f7cee8d30..57690ac87c 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h @@ -7,7 +7,6 @@ # 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 @@ -27,7 +26,7 @@ class MetricReader { public: MetricReader( - AggregationTemporality aggregation_temporality = AggregationTemporality::kCummulative); + AggregationTemporality aggregation_temporality = AggregationTemporality::kCumulative); void SetMetricProducer(MetricProducer *metric_producer); 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 019d533006..31ab70c5b8 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h @@ -6,12 +6,11 @@ # include "opentelemetry/sdk/common/attributemap_hash.h" # include "opentelemetry/sdk/metrics/instruments.h" -# include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" # include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" # include "opentelemetry/sdk/metrics/state/attributes_hashmap.h" +# include "opentelemetry/sdk/metrics/state/metric_collector.h" # include "opentelemetry/sdk/metrics/state/metric_storage.h" # include "opentelemetry/sdk/metrics/view/attributes_processor.h" -# include "opentelemetry/sdk/resource/resource.h" # include # include "opentelemetry/sdk/metrics/observer_result.h" diff --git a/sdk/include/opentelemetry/sdk/metrics/state/attributes_hashmap.h b/sdk/include/opentelemetry/sdk/metrics/state/attributes_hashmap.h index 32301f8038..50d40e0ae6 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/attributes_hashmap.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/attributes_hashmap.h @@ -37,7 +37,7 @@ class AttributesHashMap public: Aggregation *Get(const MetricAttributes &attributes) const { - std::lock_guard guard(GetLock()); + std::lock_guard guard(lock_); auto it = hash_map_.find(attributes); if (it != hash_map_.end()) { @@ -52,7 +52,7 @@ class AttributesHashMap */ bool Has(const MetricAttributes &attributes) const { - std::lock_guard guard(GetLock()); + std::lock_guard guard(lock_); return (hash_map_.find(attributes) == hash_map_.end()) ? false : true; } @@ -64,7 +64,8 @@ class AttributesHashMap Aggregation *GetOrSetDefault(const MetricAttributes &attributes, std::function()> aggregation_callback) { - std::lock_guard guard(GetLock()); + std::lock_guard guard(lock_); + auto it = hash_map_.find(attributes); if (it != hash_map_.end()) { @@ -80,7 +81,7 @@ class AttributesHashMap */ void Set(const MetricAttributes &attributes, std::unique_ptr value) { - std::lock_guard guard(GetLock()); + std::lock_guard guard(lock_); hash_map_[attributes] = std::move(value); } @@ -90,7 +91,7 @@ class AttributesHashMap bool GetAllEnteries( nostd::function_ref callback) const { - std::lock_guard guard(GetLock()); + std::lock_guard guard(lock_); for (auto &kv : hash_map_) { if (!callback(kv.first, *(kv.second.get()))) @@ -106,7 +107,7 @@ class AttributesHashMap */ size_t Size() { - std::lock_guard guard(GetLock()); + std::lock_guard guard(lock_); return hash_map_.size(); } @@ -114,11 +115,7 @@ class AttributesHashMap std::unordered_map, AttributeHashGenerator> hash_map_; - static opentelemetry::common::SpinLockMutex &GetLock() noexcept - { - static opentelemetry::common::SpinLockMutex lock; - return lock; - } + mutable opentelemetry::common::SpinLockMutex lock_; }; } // namespace metrics 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 bfe50b152d..8269d2fd3c 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h @@ -9,11 +9,14 @@ # include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" # include "opentelemetry/sdk/metrics/exemplar/reservoir.h" # include "opentelemetry/sdk/metrics/state/attributes_hashmap.h" +# include "opentelemetry/sdk/metrics/state/metric_collector.h" # include "opentelemetry/sdk/metrics/state/metric_storage.h" + # include "opentelemetry/sdk/metrics/view/attributes_processor.h" # include "opentelemetry/sdk/metrics/view/view.h" # include "opentelemetry/sdk/resource/resource.h" +# include # include OPENTELEMETRY_BEGIN_NAMESPACE @@ -22,6 +25,12 @@ namespace sdk namespace metrics { +struct LastReportedMetrics +{ + std::unique_ptr attributes_map; + opentelemetry::common::SystemTimestamp collection_ts; +}; + class SyncMetricStorage : public MetricStorage, public WritableMetricStorage { @@ -73,7 +82,6 @@ class SyncMetricStorage : public MetricStorage, public WritableMetricStorage { return; } - exemplar_reservoir_->OfferMeasurement(value, {}, context, std::chrono::system_clock::now()); attributes_hashmap_->GetOrSetDefault({}, create_default_aggregation_)->Aggregate(value); } @@ -88,7 +96,6 @@ class SyncMetricStorage : public MetricStorage, public WritableMetricStorage { return; } - exemplar_reservoir_->OfferMeasurement(value, attributes, context, std::chrono::system_clock::now()); auto attr = attributes_processor_->process(attributes); @@ -99,20 +106,19 @@ class SyncMetricStorage : public MetricStorage, public WritableMetricStorage 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)) - { - return true; - } - return false; - } + nostd::function_ref callback) noexcept override; private: InstrumentDescriptor instrument_descriptor_; AggregationType aggregation_type_; + + // hashmap to maintain the metrics for delta collection (i.e, collection since last Collect call) std::unique_ptr attributes_hashmap_; + // unreported metrics stash for all the collectors + std::unordered_map>> + unreported_metrics_; + // last reported metrics stash for all the collectors. + std::unordered_map last_reported_metrics_; const AttributesProcessor *attributes_processor_; std::function()> create_default_aggregation_; nostd::shared_ptr exemplar_reservoir_; diff --git a/sdk/src/metrics/CMakeLists.txt b/sdk/src/metrics/CMakeLists.txt index 119477eb06..d8eff48cd5 100644 --- a/sdk/src/metrics/CMakeLists.txt +++ b/sdk/src/metrics/CMakeLists.txt @@ -5,6 +5,7 @@ add_library( meter_context.cc metric_reader.cc state/metric_collector.cc + state/sync_metric_storage.cc aggregation/histogram_aggregation.cc aggregation/lastvalue_aggregation.cc aggregation/sum_aggregation.cc diff --git a/sdk/src/metrics/aggregation/histogram_aggregation.cc b/sdk/src/metrics/aggregation/histogram_aggregation.cc index 2ebe3715bb..60f65c51b1 100644 --- a/sdk/src/metrics/aggregation/histogram_aggregation.cc +++ b/sdk/src/metrics/aggregation/histogram_aggregation.cc @@ -13,65 +13,104 @@ namespace metrics { LongHistogramAggregation::LongHistogramAggregation() - : boundaries_{0l, 5l, 10l, 25l, 50l, 75l, 100l, 250l, 500l, 1000l}, - counts_(boundaries_.size() + 1, 0), - sum_(0l), - count_(0) +{ + + point_data_.boundaries_ = std::list{0l, 5l, 10l, 25l, 50l, 75l, 100l, 250l, 500l, 1000l}; + point_data_.counts_ = + std::vector(nostd::get>(point_data_.boundaries_).size() + 1, 0); + point_data_.sum_ = 0l; + point_data_.count_ = 0; +} + +LongHistogramAggregation::LongHistogramAggregation(HistogramPointData &&data) + : point_data_{std::move(data)} {} void LongHistogramAggregation::Aggregate(long value, const PointAttributes &attributes) noexcept { const std::lock_guard locked(lock_); - count_ += 1; - sum_ += value; - for (auto it = boundaries_.begin(); it != boundaries_.end(); ++it) + point_data_.count_ += 1; + point_data_.sum_ = nostd::get(point_data_.sum_) + value; + size_t index = 0; + for (auto it = nostd::get>(point_data_.boundaries_).begin(); + it != nostd::get>(point_data_.boundaries_).end(); ++it) { if (value < *it) { - counts_[std::distance(boundaries_.begin(), it)] += 1; + point_data_.counts_[index] += 1; return; } + index++; } } -PointType LongHistogramAggregation::Collect() noexcept +std::unique_ptr LongHistogramAggregation::Merge( + const Aggregation &delta) const noexcept { - HistogramPointData point_data; - auto epoch_nanos = std::chrono::system_clock::now(); - const std::lock_guard locked(lock_); - PopulateHistogramDataPoint(point_data, epoch_nanos, sum_, count_, counts_, boundaries_); - return point_data; + return nullptr; +} + +std::unique_ptr LongHistogramAggregation::Diff(const Aggregation &next) const noexcept +{ + return nullptr; +} + +PointType LongHistogramAggregation::ToPoint() const noexcept +{ + return point_data_; } DoubleHistogramAggregation::DoubleHistogramAggregation() - : boundaries_{0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 1000.0}, - counts_(boundaries_.size() + 1, 0), - sum_(0.0), - count_(0) +{ + + point_data_.boundaries_ = + std::list{0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 1000.0}; + point_data_.counts_ = + std::vector(nostd::get>(point_data_.boundaries_).size() + 1, 0); + point_data_.sum_ = 0.0; + point_data_.count_ = 0; +} + +DoubleHistogramAggregation::DoubleHistogramAggregation(HistogramPointData &&data) + : point_data_{std::move(data)} {} void DoubleHistogramAggregation::Aggregate(double value, const PointAttributes &attributes) noexcept { const std::lock_guard locked(lock_); - count_ += 1; - sum_ += value; - for (auto it = boundaries_.begin(); it != boundaries_.end(); ++it) + point_data_.count_ += 1; + point_data_.sum_ = nostd::get(point_data_.sum_) + value; + size_t index = 0; + for (auto it = nostd::get>(point_data_.boundaries_).begin(); + it != nostd::get>(point_data_.boundaries_).end(); ++it) { if (value < *it) { - counts_[std::distance(boundaries_.begin(), it)] += 1; + point_data_.counts_[index] += 1; return; } + index++; } } -PointType DoubleHistogramAggregation::Collect() noexcept +std::unique_ptr DoubleHistogramAggregation::Merge( + const Aggregation &delta) const noexcept { - HistogramPointData point_data; - auto epoch_nanos = std::chrono::system_clock::now(); - const std::lock_guard locked(lock_); - PopulateHistogramDataPoint(point_data, epoch_nanos, sum_, count_, counts_, boundaries_); - return point_data; + // TODO - Implement me + return nullptr; +} + +std::unique_ptr DoubleHistogramAggregation::Diff( + const Aggregation &next) const noexcept +{ + // TODO - Implement me + return nullptr; +} + +PointType DoubleHistogramAggregation::ToPoint() const noexcept +{ + // TODO Implement me + return point_data_; } } // namespace metrics diff --git a/sdk/src/metrics/aggregation/lastvalue_aggregation.cc b/sdk/src/metrics/aggregation/lastvalue_aggregation.cc index 290b526344..9c0252be31 100644 --- a/sdk/src/metrics/aggregation/lastvalue_aggregation.cc +++ b/sdk/src/metrics/aggregation/lastvalue_aggregation.cc @@ -14,46 +14,109 @@ namespace sdk namespace metrics { -LongLastValueAggregation::LongLastValueAggregation() : is_lastvalue_valid_(false) {} +LongLastValueAggregation::LongLastValueAggregation() +{ + point_data_.is_lastvalue_valid_ = false; + point_data_.value_ = 0l; +} +LongLastValueAggregation::LongLastValueAggregation(LastValuePointData &&data) + : point_data_{std::move(data)} +{} void LongLastValueAggregation::Aggregate(long value, const PointAttributes &attributes) noexcept { const std::lock_guard locked(lock_); - is_lastvalue_valid_ = true; - value_ = value; + point_data_.is_lastvalue_valid_ = true; + point_data_.value_ = value; } -PointType LongLastValueAggregation::Collect() noexcept +std::unique_ptr LongLastValueAggregation::Merge( + const Aggregation &delta) const noexcept { - const std::lock_guard locked(lock_); - if (!is_lastvalue_valid_) + if (nostd::get(ToPoint()).sample_ts_.time_since_epoch() > + nostd::get(delta.ToPoint()).sample_ts_.time_since_epoch()) + { + LastValuePointData merge_data = std::move(nostd::get(ToPoint())); + return std::unique_ptr(new LongLastValueAggregation(std::move(merge_data))); + } + else { - return LastValuePointData{ - opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now()), false, 0l}; + LastValuePointData merge_data = std::move(nostd::get(delta.ToPoint())); + return std::unique_ptr(new LongLastValueAggregation(std::move(merge_data))); } - return LastValuePointData{ - opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now()), true, value_}; } -DoubleLastValueAggregation::DoubleLastValueAggregation() : is_lastvalue_valid_(false) {} +std::unique_ptr LongLastValueAggregation::Diff(const Aggregation &next) const noexcept +{ + if (nostd::get(ToPoint()).sample_ts_.time_since_epoch() > + nostd::get(next.ToPoint()).sample_ts_.time_since_epoch()) + { + LastValuePointData diff_data = std::move(nostd::get(ToPoint())); + return std::unique_ptr(new LongLastValueAggregation(std::move(diff_data))); + } + else + { + LastValuePointData diff_data = std::move(nostd::get(next.ToPoint())); + return std::unique_ptr(new LongLastValueAggregation(std::move(diff_data))); + } +} + +PointType LongLastValueAggregation::ToPoint() const noexcept +{ + return point_data_; +} + +DoubleLastValueAggregation::DoubleLastValueAggregation() +{ + point_data_.is_lastvalue_valid_ = false; + point_data_.value_ = 0.0; +} +DoubleLastValueAggregation::DoubleLastValueAggregation(LastValuePointData &&data) + : point_data_{std::move(data)} +{} void DoubleLastValueAggregation::Aggregate(double value, const PointAttributes &attributes) noexcept { const std::lock_guard locked(lock_); - is_lastvalue_valid_ = true; - value_ = value; + point_data_.is_lastvalue_valid_ = true; + point_data_.value_ = value; } -PointType DoubleLastValueAggregation::Collect() noexcept +std::unique_ptr DoubleLastValueAggregation::Merge( + const Aggregation &delta) const noexcept { - const std::lock_guard locked(lock_); - if (!is_lastvalue_valid_) + if (nostd::get(ToPoint()).sample_ts_.time_since_epoch() > + nostd::get(delta.ToPoint()).sample_ts_.time_since_epoch()) + { + LastValuePointData merge_data = std::move(nostd::get(ToPoint())); + return std::unique_ptr(new LongLastValueAggregation(std::move(merge_data))); + } + else { - return LastValuePointData{ - opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now()), false, 0.0}; + LastValuePointData merge_data = std::move(nostd::get(delta.ToPoint())); + return std::unique_ptr(new LongLastValueAggregation(std::move(merge_data))); } - return LastValuePointData{ - opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now()), true, value_}; +} + +std::unique_ptr DoubleLastValueAggregation::Diff( + const Aggregation &next) const noexcept +{ + if (nostd::get(ToPoint()).sample_ts_.time_since_epoch() > + nostd::get(next.ToPoint()).sample_ts_.time_since_epoch()) + { + LastValuePointData diff_data = std::move(nostd::get(ToPoint())); + return std::unique_ptr(new LongLastValueAggregation(std::move(diff_data))); + } + else + { + LastValuePointData diff_data = std::move(nostd::get(next.ToPoint())); + return std::unique_ptr(new LongLastValueAggregation(std::move(diff_data))); + } +} + +PointType DoubleLastValueAggregation::ToPoint() const noexcept +{ + return point_data_; } } // namespace metrics } // namespace sdk diff --git a/sdk/src/metrics/aggregation/sum_aggregation.cc b/sdk/src/metrics/aggregation/sum_aggregation.cc index e0d1330f68..94b871cd34 100644 --- a/sdk/src/metrics/aggregation/sum_aggregation.cc +++ b/sdk/src/metrics/aggregation/sum_aggregation.cc @@ -3,8 +3,10 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/sdk/metrics/aggregation/sum_aggregation.h" +# include "opentelemetry/sdk/metrics/data/point_data.h" # include "opentelemetry/version.h" +# include # include OPENTELEMETRY_BEGIN_NAMESPACE @@ -13,54 +15,90 @@ namespace sdk namespace metrics { -LongSumAggregation::LongSumAggregation(bool is_monotonic) - : InstrumentMonotonicityAwareAggregation(is_monotonic), - start_epoch_nanos_(opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now())), - sum_(0l) -{} +LongSumAggregation::LongSumAggregation() +{ + point_data_.value_ = 0l; +} + +LongSumAggregation::LongSumAggregation(SumPointData &&data) : point_data_{std::move(data)} {} void LongSumAggregation::Aggregate(long value, const PointAttributes &attributes) noexcept { const std::lock_guard locked(lock_); - sum_ += value; + point_data_.value_ = nostd::get(point_data_.value_) + value; } -PointType LongSumAggregation::Collect() noexcept +std::unique_ptr LongSumAggregation::Merge(const Aggregation &delta) const noexcept { - opentelemetry::common::SystemTimestamp current_ts(std::chrono::system_clock::now()); - SumPointData sum; - { - const std::lock_guard locked(lock_); - PopulateSumPointData(sum, start_epoch_nanos_, current_ts, sum_, IsMonotonic()); - start_epoch_nanos_ = current_ts; - sum_ = 0; - } - return sum; + long merge_value = + nostd::get( + nostd::get((static_cast(delta).ToPoint())) + .value_) + + nostd::get(nostd::get(ToPoint()).value_); + std::unique_ptr aggr(new LongSumAggregation()); + static_cast(aggr.get())->point_data_.value_ = merge_value; + return aggr; } -DoubleSumAggregation::DoubleSumAggregation(bool is_monotonic) - : InstrumentMonotonicityAwareAggregation(is_monotonic), - start_epoch_nanos_(opentelemetry::common::SystemTimestamp(std::chrono::system_clock::now())), - sum_(0L) -{} +std::unique_ptr LongSumAggregation::Diff(const Aggregation &next) const noexcept +{ + + long diff_value = nostd::get(nostd::get( + (static_cast(next).ToPoint())) + .value_) - + nostd::get(nostd::get(ToPoint()).value_); + std::unique_ptr aggr(new LongSumAggregation()); + static_cast(aggr.get())->point_data_.value_ = diff_value; + return aggr; +} + +PointType LongSumAggregation::ToPoint() const noexcept +{ + return point_data_; +} + +DoubleSumAggregation::DoubleSumAggregation() +{ + point_data_.value_ = 0.0; +} + +DoubleSumAggregation::DoubleSumAggregation(SumPointData &&data) : point_data_(std::move(data)) {} void DoubleSumAggregation::Aggregate(double value, const PointAttributes &attributes) noexcept { const std::lock_guard locked(lock_); - sum_ += value; + point_data_.value_ = nostd::get(point_data_.value_) + value; +} + +std::unique_ptr DoubleSumAggregation::Merge(const Aggregation &delta) const noexcept +{ + double merge_value = + nostd::get( + nostd::get((static_cast(delta).ToPoint())) + .value_) + + nostd::get(nostd::get(ToPoint()).value_); + std::unique_ptr aggr(new DoubleSumAggregation()); + static_cast(aggr.get())->point_data_.value_ = merge_value; + return aggr; } -PointType DoubleSumAggregation::Collect() noexcept +std::unique_ptr DoubleSumAggregation::Diff(const Aggregation &next) const noexcept { - opentelemetry::common::SystemTimestamp current_ts(std::chrono::system_clock::now()); - SumPointData sum; - { - const std::lock_guard locked(lock_); - PopulateSumPointData(sum, start_epoch_nanos_, current_ts, sum_, IsMonotonic()); - start_epoch_nanos_ = current_ts; - sum_ = 0; - } - return sum; + + double diff_value = + nostd::get( + nostd::get((static_cast(next).ToPoint())) + .value_) - + nostd::get(nostd::get(ToPoint()).value_); + std::unique_ptr aggr(new DoubleSumAggregation()); + static_cast(aggr.get())->point_data_.value_ = diff_value; + return aggr; +} + +PointType DoubleSumAggregation::ToPoint() const noexcept +{ + const std::lock_guard locked(lock_); + return point_data_; } } // namespace metrics diff --git a/sdk/src/metrics/meter.cc b/sdk/src/metrics/meter.cc index 20e3b02768..fb74d55eb4 100644 --- a/sdk/src/metrics/meter.cc +++ b/sdk/src/metrics/meter.cc @@ -211,7 +211,7 @@ std::unique_ptr Meter::RegisterMetricStorage( } /** collect metrics across all the meters **/ -bool Meter::collect(CollectorHandle *collector, +bool Meter::Collect(CollectorHandle *collector, opentelemetry::common::SystemTimestamp collect_ts, nostd::function_ref callback) noexcept { diff --git a/sdk/src/metrics/state/metric_collector.cc b/sdk/src/metrics/state/metric_collector.cc index 5b9fc4ab70..cd3b8eb6ca 100644 --- a/sdk/src/metrics/state/metric_collector.cc +++ b/sdk/src/metrics/state/metric_collector.cc @@ -34,7 +34,7 @@ bool MetricCollector::Collect(nostd::function_ref callback) no for (auto &meter : meter_context_->GetMeters()) { auto collection_ts = std::chrono::system_clock::now(); - meter->collect(this, collection_ts, callback); + meter->Collect(this, collection_ts, callback); } return true; } diff --git a/sdk/src/metrics/state/sync_metric_storage.cc b/sdk/src/metrics/state/sync_metric_storage.cc new file mode 100644 index 0000000000..5c14f8bbc3 --- /dev/null +++ b/sdk/src/metrics/state/sync_metric_storage.cc @@ -0,0 +1,131 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef ENABLE_METRICS_PREVIEW + +# include "opentelemetry/sdk/metrics/state/sync_metric_storage.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ + +bool SyncMetricStorage::Collect(CollectorHandle *collector, + nostd::span> collectors, + opentelemetry::common::SystemTimestamp sdk_start_ts, + opentelemetry::common::SystemTimestamp collection_ts, + nostd::function_ref callback) noexcept +{ + opentelemetry::common::SystemTimestamp last_collection_ts = sdk_start_ts; + auto aggregation_temporarily = collector->GetAggregationTemporality(); + + // Add the current delta metrics to `unreported metrics stash` for all the collectors, + // this will also empty the delta metrics hashmap, and make it available for + // recordings + std::shared_ptr delta_metrics = std::move(attributes_hashmap_); + attributes_hashmap_.reset(new AttributesHashMap); + for (auto &col : collectors) + { + unreported_metrics_[col.get()].push_back(delta_metrics); + } + + // Get the unreported metrics for the `collector` from `unreported metrics stash` + // since last collection, this will also cleanup the unreported metrics for `collector` + // from the stash. + auto present = unreported_metrics_.find(collector); + if (present == unreported_metrics_.end()) + { + // no unreported metrics for the collector, return. + return true; + } + auto unreported_list = std::move(present->second); + + // Iterate over the unreporter metrics for `collector` and store result in `merged_metrics` + std::unique_ptr merged_metrics(new AttributesHashMap); + for (auto &agg_hashmap : unreported_list) + { + agg_hashmap->GetAllEnteries([&merged_metrics, this](const MetricAttributes &attributes, + Aggregation &aggregation) { + auto agg = merged_metrics->Get(attributes); + if (agg) + { + merged_metrics->Set(attributes, std::move(agg->Merge(aggregation))); + } + else + { + merged_metrics->Set( + attributes, + std::move( + DefaultAggregation::CreateAggregation(instrument_descriptor_)->Merge(aggregation))); + merged_metrics->GetAllEnteries( + [](const MetricAttributes &attr, Aggregation &aggr) { return true; }); + } + return true; + }); + } + // Get the last reported metrics for the `collector` from `last reported metrics` stash + // - If the aggregation_temporarily for the collector is cumulative + // - Merge the last reported metrics with unreported metrics (which is in merged_metrics), + // Final result of merge would be in merged_metrics. + // - Move the final merge to the `last reported metrics` stash. + // - If the aggregation_temporarily is delta + // - Store the unreported metrics for `collector` (which is in merged_mtrics) to + // `last reported metrics` stash. + + auto reported = last_reported_metrics_.find(collector); + if (reported != last_reported_metrics_.end()) + { + last_collection_ts = last_reported_metrics_[collector].collection_ts; + auto last_aggr_hashmap = std::move(last_reported_metrics_[collector].attributes_map); + if (aggregation_temporarily == AggregationTemporality::kCumulative) + { + // merge current delta to previous cumulative + last_aggr_hashmap->GetAllEnteries( + [&merged_metrics, this](const MetricAttributes &attributes, Aggregation &aggregation) { + auto agg = merged_metrics->Get(attributes); + if (agg) + { + merged_metrics->Set(attributes, agg->Merge(aggregation)); + } + else + { + merged_metrics->Set(attributes, + DefaultAggregation::CreateAggregation(instrument_descriptor_)); + } + return true; + }); + } + last_reported_metrics_[collector] = + LastReportedMetrics{std::move(merged_metrics), collection_ts}; + } + else + { + merged_metrics->GetAllEnteries( + [](const MetricAttributes &attr, Aggregation &aggr) { return true; }); + last_reported_metrics_.insert( + std::make_pair(collector, LastReportedMetrics{std::move(merged_metrics), collection_ts})); + } + + // Generate the MetricData from the final merged_metrics, and invoke callback over it. + + AttributesHashMap *result_to_export = (last_reported_metrics_[collector]).attributes_map.get(); + MetricData metric_data; + metric_data.instrument_descriptor = instrument_descriptor_; + metric_data.start_ts = last_collection_ts; + metric_data.end_ts = collection_ts; + result_to_export->GetAllEnteries( + [&metric_data](const MetricAttributes &attributes, Aggregation &aggregation) { + PointDataAttributes point_data_attr; + point_data_attr.point_data = aggregation.ToPoint(); + point_data_attr.attributes = attributes; + metric_data.point_data_attr_.push_back(point_data_attr); + return true; + }); + return callback(metric_data); +} + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif diff --git a/sdk/test/metrics/aggregation_test.cc b/sdk/test/metrics/aggregation_test.cc index ec753111ff..a32826b145 100644 --- a/sdk/test/metrics/aggregation_test.cc +++ b/sdk/test/metrics/aggregation_test.cc @@ -13,82 +13,80 @@ using namespace opentelemetry::sdk::metrics; namespace nostd = opentelemetry::nostd; TEST(Aggregation, LongSumAggregation) { - LongSumAggregation aggr(true); - auto data = aggr.Collect(); + LongSumAggregation aggr; + auto data = aggr.ToPoint(); ASSERT_TRUE(nostd::holds_alternative(data)); auto sum_data = nostd::get(data); ASSERT_TRUE(nostd::holds_alternative(sum_data.value_)); EXPECT_EQ(nostd::get(sum_data.value_), 0l); - EXPECT_EQ(sum_data.is_monotonic_, true); EXPECT_NO_THROW(aggr.Aggregate(12l, {})); EXPECT_NO_THROW(aggr.Aggregate(0l, {})); - sum_data = nostd::get(aggr.Collect()); + sum_data = nostd::get(aggr.ToPoint()); EXPECT_EQ(nostd::get(sum_data.value_), 12l); } TEST(Aggregation, DoubleSumAggregation) { - DoubleSumAggregation aggr(true); - auto data = aggr.Collect(); + DoubleSumAggregation aggr; + auto data = aggr.ToPoint(); ASSERT_TRUE(nostd::holds_alternative(data)); auto sum_data = nostd::get(data); ASSERT_TRUE(nostd::holds_alternative(sum_data.value_)); EXPECT_EQ(nostd::get(sum_data.value_), 0); - EXPECT_EQ(sum_data.is_monotonic_, true); EXPECT_NO_THROW(aggr.Aggregate(12.0, {})); EXPECT_NO_THROW(aggr.Aggregate(1.0, {})); - sum_data = nostd::get(aggr.Collect()); + sum_data = nostd::get(aggr.ToPoint()); EXPECT_EQ(nostd::get(sum_data.value_), 13.0); } TEST(Aggregation, LongLastValueAggregation) { LongLastValueAggregation aggr; - auto data = aggr.Collect(); + auto data = aggr.ToPoint(); ASSERT_TRUE(nostd::holds_alternative(data)); auto lastvalue_data = nostd::get(data); ASSERT_TRUE(nostd::holds_alternative(lastvalue_data.value_)); EXPECT_EQ(lastvalue_data.is_lastvalue_valid_, false); EXPECT_NO_THROW(aggr.Aggregate(12l, {})); EXPECT_NO_THROW(aggr.Aggregate(1l, {})); - lastvalue_data = nostd::get(aggr.Collect()); + lastvalue_data = nostd::get(aggr.ToPoint()); EXPECT_EQ(nostd::get(lastvalue_data.value_), 1.0); } TEST(Aggregation, DoubleLastValueAggregation) { DoubleLastValueAggregation aggr; - auto data = aggr.Collect(); + auto data = aggr.ToPoint(); ASSERT_TRUE(nostd::holds_alternative(data)); auto lastvalue_data = nostd::get(data); ASSERT_TRUE(nostd::holds_alternative(lastvalue_data.value_)); EXPECT_EQ(lastvalue_data.is_lastvalue_valid_, false); EXPECT_NO_THROW(aggr.Aggregate(12.0, {})); EXPECT_NO_THROW(aggr.Aggregate(1.0, {})); - lastvalue_data = nostd::get(aggr.Collect()); + lastvalue_data = nostd::get(aggr.ToPoint()); EXPECT_EQ(nostd::get(lastvalue_data.value_), 1.0); } TEST(Aggregation, LongHistogramAggregation) { LongHistogramAggregation aggr; - auto data = aggr.Collect(); + auto data = aggr.ToPoint(); ASSERT_TRUE(nostd::holds_alternative(data)); auto histogram_data = nostd::get(data); ASSERT_TRUE(nostd::holds_alternative(histogram_data.sum_)); - ASSERT_TRUE(nostd::holds_alternative>(histogram_data.boundaries_)); + ASSERT_TRUE(nostd::holds_alternative>(histogram_data.boundaries_)); EXPECT_EQ(nostd::get(histogram_data.sum_), 0); EXPECT_EQ(histogram_data.count_, 0); EXPECT_NO_THROW(aggr.Aggregate(12l, {})); // lies in fourth bucket EXPECT_NO_THROW(aggr.Aggregate(100l, {})); // lies in eight bucket - histogram_data = nostd::get(aggr.Collect()); + histogram_data = nostd::get(aggr.ToPoint()); EXPECT_EQ(nostd::get(histogram_data.sum_), 112); EXPECT_EQ(histogram_data.count_, 2); EXPECT_EQ(histogram_data.counts_[3], 1); EXPECT_EQ(histogram_data.counts_[7], 1); EXPECT_NO_THROW(aggr.Aggregate(13l, {})); // lies in fourth bucket EXPECT_NO_THROW(aggr.Aggregate(252l, {})); // lies in ninth bucket - histogram_data = nostd::get(aggr.Collect()); + histogram_data = nostd::get(aggr.ToPoint()); EXPECT_EQ(histogram_data.count_, 4); EXPECT_EQ(histogram_data.counts_[3], 2); EXPECT_EQ(histogram_data.counts_[8], 1); @@ -97,23 +95,23 @@ TEST(Aggregation, LongHistogramAggregation) TEST(Aggregation, DoubleHistogramAggregation) { DoubleHistogramAggregation aggr; - auto data = aggr.Collect(); + auto data = aggr.ToPoint(); ASSERT_TRUE(nostd::holds_alternative(data)); auto histogram_data = nostd::get(data); ASSERT_TRUE(nostd::holds_alternative(histogram_data.sum_)); - ASSERT_TRUE(nostd::holds_alternative>(histogram_data.boundaries_)); + ASSERT_TRUE(nostd::holds_alternative>(histogram_data.boundaries_)); EXPECT_EQ(nostd::get(histogram_data.sum_), 0); EXPECT_EQ(histogram_data.count_, 0); EXPECT_NO_THROW(aggr.Aggregate(12.0, {})); // lies in fourth bucket EXPECT_NO_THROW(aggr.Aggregate(100.0, {})); // lies in eight bucket - histogram_data = nostd::get(aggr.Collect()); + histogram_data = nostd::get(aggr.ToPoint()); EXPECT_EQ(nostd::get(histogram_data.sum_), 112); EXPECT_EQ(histogram_data.count_, 2); EXPECT_EQ(histogram_data.counts_[3], 1); EXPECT_EQ(histogram_data.counts_[7], 1); EXPECT_NO_THROW(aggr.Aggregate(13.0, {})); // lies in fourth bucket EXPECT_NO_THROW(aggr.Aggregate(252.0, {})); // lies in ninth bucket - histogram_data = nostd::get(aggr.Collect()); + histogram_data = nostd::get(aggr.ToPoint()); EXPECT_EQ(histogram_data.count_, 4); EXPECT_EQ(histogram_data.counts_[3], 2); EXPECT_EQ(histogram_data.counts_[8], 1); diff --git a/sdk/test/metrics/async_metric_storage_test.cc b/sdk/test/metrics/async_metric_storage_test.cc index 0527c7f0ca..f7c9914e3c 100644 --- a/sdk/test/metrics/async_metric_storage_test.cc +++ b/sdk/test/metrics/async_metric_storage_test.cc @@ -42,6 +42,10 @@ TEST(AsyncMetricStorageTest, BasicTests) InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, InstrumentValueType::kLong}; + auto sdk_start_ts = std::chrono::system_clock::now(); + // Some computation here + auto collection_ts = std::chrono::system_clock::now() + std::chrono::seconds(5); + std::vector> exporters; std::shared_ptr meter_context(new MeterContext(std::move(exporters))); std::unique_ptr metric_reader(new MockMetricReader(AggregationTemporality::kDelta)); @@ -53,7 +57,7 @@ TEST(AsyncMetricStorageTest, BasicTests) opentelemetry::sdk::metrics::AsyncMetricStorage storage( instr_desc, AggregationType::kSum, &measurement_fetch, new DefaultAttributesProcessor()); - storage.Collect(collector.get(), collectors, std::chrono::system_clock::now(), - std::chrono::system_clock::now(), metric_callback); + EXPECT_NO_THROW( + storage.Collect(collector.get(), collectors, sdk_start_ts, collection_ts, 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 015d3023ae..6ede67d032 100644 --- a/sdk/test/metrics/meter_provider_sdk_test.cc +++ b/sdk/test/metrics/meter_provider_sdk_test.cc @@ -40,9 +40,7 @@ class MockMetricReader : public MetricReader { public: virtual bool OnForceFlush(std::chrono::microseconds timeout) 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 214f522118..68a3fcc5f5 100644 --- a/sdk/test/metrics/metric_reader_test.cc +++ b/sdk/test/metrics/metric_reader_test.cc @@ -17,9 +17,7 @@ class MockMetricReader : public MetricReader MockMetricReader(AggregationTemporality aggr_temporality) : MetricReader(aggr_temporality) {} virtual bool OnForceFlush(std::chrono::microseconds timeout) 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/sync_metric_storage_test.cc b/sdk/test/metrics/sync_metric_storage_test.cc index c4bd154460..b0440fdbb3 100644 --- a/sdk/test/metrics/sync_metric_storage_test.cc +++ b/sdk/test/metrics/sync_metric_storage_test.cc @@ -12,23 +12,235 @@ # include using namespace opentelemetry::sdk::metrics; +using namespace opentelemetry::common; using M = std::map; -TEST(WritableMetricStorageTest, BasicTests) +class MockCollectorHandle : public CollectorHandle { - InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, +public: + MockCollectorHandle(AggregationTemporality temp) : temporality(temp) {} + + AggregationTemporality GetAggregationTemporality() noexcept override { return temporality; } + +private: + AggregationTemporality temporality; +}; + +class WritableMetricStorageTestFixture : public ::testing::TestWithParam +{}; + +TEST_P(WritableMetricStorageTestFixture, LongSumAggregation) +{ + AggregationTemporality temporality = GetParam(); + auto sdk_start_ts = std::chrono::system_clock::now(); + long expected_total_get_requests = 0; + long expected_total_put_requests = 0; + InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, InstrumentValueType::kLong}; + std::map attributes_get = {{"RequestType", "GET"}}; + std::map attributes_put = {{"RequestType", "PUT"}}; opentelemetry::sdk::metrics::SyncMetricStorage storage( instr_desc, AggregationType::kSum, new DefaultAttributesProcessor(), NoExemplarReservoir::GetNoExemplarReservoir()); - EXPECT_NO_THROW(storage.RecordLong(10l, opentelemetry::context::Context{})); - EXPECT_NO_THROW(storage.RecordDouble(10.10, opentelemetry::context::Context{})); + + storage.RecordLong(10l, KeyValueIterableView>(attributes_get), + opentelemetry::context::Context{}); + expected_total_get_requests += 10; + + EXPECT_NO_THROW(storage.RecordLong( + 30l, KeyValueIterableView>(attributes_put), + opentelemetry::context::Context{})); + expected_total_put_requests += 30; + + storage.RecordLong(20l, KeyValueIterableView>(attributes_get), + opentelemetry::context::Context{}); + expected_total_get_requests += 20; + + EXPECT_NO_THROW(storage.RecordLong( + 40l, KeyValueIterableView>(attributes_put), + opentelemetry::context::Context{})); + expected_total_put_requests += 40; + + std::shared_ptr collector(new MockCollectorHandle(temporality)); + std::vector> collectors; + collectors.push_back(collector); + + // Some computation here + auto collection_ts = std::chrono::system_clock::now(); + size_t count_attributes = 0; + storage.Collect( + collector.get(), collectors, sdk_start_ts, collection_ts, [&](const MetricData data) { + for (auto data_attr : data.point_data_attr_) + { + auto data = opentelemetry::nostd::get(data_attr.point_data); + if (opentelemetry::nostd::get( + data_attr.attributes.find("RequestType")->second) == "GET") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), expected_total_get_requests); + count_attributes++; + } + else if (opentelemetry::nostd::get( + data_attr.attributes.find("RequestType")->second) == "PUT") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), expected_total_put_requests); + count_attributes++; + } + } + return true; + }); + + // In case of delta temporarily, subsequent collection would contain new data points, so resetting + // the counts + if (temporality == AggregationTemporality::kDelta) + { + expected_total_get_requests = 0; + expected_total_put_requests = 0; + } + EXPECT_NO_THROW(storage.RecordLong( - 10l, opentelemetry::common::KeyValueIterableView({{"abc", "123"}, {"xyz", "456"}}), + 50l, KeyValueIterableView>(attributes_get), + opentelemetry::context::Context{})); + expected_total_get_requests += 50; + EXPECT_NO_THROW(storage.RecordLong( + 40l, KeyValueIterableView>(attributes_put), + opentelemetry::context::Context{})); + expected_total_put_requests += 40; + + collection_ts = std::chrono::system_clock::now(); + count_attributes = 0; + storage.Collect( + collector.get(), collectors, sdk_start_ts, collection_ts, [&](const MetricData data) { + for (auto data_attr : data.point_data_attr_) + { + auto data = opentelemetry::nostd::get(data_attr.point_data); + if (opentelemetry::nostd::get( + data_attr.attributes.find("RequestType")->second) == "GET") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), expected_total_get_requests); + count_attributes++; + } + else if (opentelemetry::nostd::get( + data_attr.attributes.find("RequestType")->second) == "PUT") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), expected_total_put_requests); + count_attributes++; + } + } + return true; + }); +} +INSTANTIATE_TEST_CASE_P(WritableMetricStorageTestLong, + WritableMetricStorageTestFixture, + ::testing::Values(AggregationTemporality::kCumulative, + AggregationTemporality::kDelta)); + +TEST_P(WritableMetricStorageTestFixture, DoubleSumAggregation) +{ + AggregationTemporality temporality = GetParam(); + auto sdk_start_ts = std::chrono::system_clock::now(); + double expected_total_get_requests = 0; + double expected_total_put_requests = 0; + InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, + InstrumentValueType::kDouble}; + std::map attributes_get = {{"RequestType", "GET"}}; + std::map attributes_put = {{"RequestType", "PUT"}}; + + opentelemetry::sdk::metrics::SyncMetricStorage storage( + instr_desc, AggregationType::kSum, new DefaultAttributesProcessor(), + NoExemplarReservoir::GetNoExemplarReservoir()); + + storage.RecordDouble(10.0, + KeyValueIterableView>(attributes_get), + opentelemetry::context::Context{}); + expected_total_get_requests += 10; + + EXPECT_NO_THROW(storage.RecordDouble( + 30.0, KeyValueIterableView>(attributes_put), opentelemetry::context::Context{})); + expected_total_put_requests += 30; - EXPECT_NO_THROW(storage.RecordDouble(10.10, opentelemetry::common::KeyValueIterableView({}), - opentelemetry::context::Context{})); + storage.RecordDouble(20.0, + KeyValueIterableView>(attributes_get), + opentelemetry::context::Context{}); + expected_total_get_requests += 20; + + EXPECT_NO_THROW(storage.RecordDouble( + 40.0, KeyValueIterableView>(attributes_put), + opentelemetry::context::Context{})); + expected_total_put_requests += 40; + + std::shared_ptr collector(new MockCollectorHandle(temporality)); + std::vector> collectors; + collectors.push_back(collector); + + // Some computation here + auto collection_ts = std::chrono::system_clock::now(); + size_t count_attributes = 0; + storage.Collect( + collector.get(), collectors, sdk_start_ts, collection_ts, [&](const MetricData data) { + for (auto data_attr : data.point_data_attr_) + { + auto data = opentelemetry::nostd::get(data_attr.point_data); + if (opentelemetry::nostd::get( + data_attr.attributes.find("RequestType")->second) == "GET") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), expected_total_get_requests); + count_attributes++; + } + else if (opentelemetry::nostd::get( + data_attr.attributes.find("RequestType")->second) == "PUT") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), expected_total_put_requests); + count_attributes++; + } + } + return true; + }); + + // In case of delta temporarily, subsequent collection would contain new data points, so resetting + // the counts + if (temporality == AggregationTemporality::kDelta) + { + expected_total_get_requests = 0; + expected_total_put_requests = 0; + } + + EXPECT_NO_THROW(storage.RecordDouble( + 50.0, KeyValueIterableView>(attributes_get), + opentelemetry::context::Context{})); + expected_total_get_requests += 50; + EXPECT_NO_THROW(storage.RecordDouble( + 40.0, KeyValueIterableView>(attributes_put), + opentelemetry::context::Context{})); + expected_total_put_requests += 40; + + collection_ts = std::chrono::system_clock::now(); + count_attributes = 0; + storage.Collect( + collector.get(), collectors, sdk_start_ts, collection_ts, [&](const MetricData data) { + for (auto data_attr : data.point_data_attr_) + { + auto data = opentelemetry::nostd::get(data_attr.point_data); + if (opentelemetry::nostd::get( + data_attr.attributes.find("RequestType")->second) == "GET") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), expected_total_get_requests); + count_attributes++; + } + else if (opentelemetry::nostd::get( + data_attr.attributes.find("RequestType")->second) == "PUT") + { + EXPECT_EQ(opentelemetry::nostd::get(data.value_), expected_total_put_requests); + count_attributes++; + } + } + return true; + }); } +INSTANTIATE_TEST_CASE_P(WritableMetricStorageTestDouble, + WritableMetricStorageTestFixture, + ::testing::Values(AggregationTemporality::kCumulative, + AggregationTemporality::kDelta)); + #endif From 76c664a20b8219b91ead69ded6b7ee873b1a85ba Mon Sep 17 00:00:00 2001 From: WenTao Ou Date: Fri, 1 Apr 2022 02:51:26 +0800 Subject: [PATCH 10/35] Rename `http_client_curl` to `opentelemetry_http_client_curl` (#1301) Signed-off-by: owent --- examples/http/CMakeLists.txt | 9 +++++---- exporters/elasticsearch/CMakeLists.txt | 2 +- exporters/jaeger/CMakeLists.txt | 2 +- exporters/otlp/CMakeLists.txt | 2 +- exporters/zipkin/CMakeLists.txt | 3 ++- ext/src/http/client/curl/CMakeLists.txt | 19 ++++++++++--------- ext/test/http/CMakeLists.txt | 6 ++++-- ext/test/w3c_tracecontext_test/CMakeLists.txt | 6 +++--- 8 files changed, 27 insertions(+), 22 deletions(-) diff --git a/examples/http/CMakeLists.txt b/examples/http/CMakeLists.txt index 2eddcfe03f..a1181c93a4 100644 --- a/examples/http/CMakeLists.txt +++ b/examples/http/CMakeLists.txt @@ -10,10 +10,11 @@ else() add_executable(http_server server.cc) target_link_libraries( - http_client ${CMAKE_THREAD_LIBS_INIT} opentelemetry_trace http_client_curl - opentelemetry_exporter_ostream_span ${CURL_LIBRARIES}) + http_client ${CMAKE_THREAD_LIBS_INIT} opentelemetry_trace + opentelemetry_http_client_curl opentelemetry_exporter_ostream_span + ${CURL_LIBRARIES}) target_link_libraries( - http_server ${CMAKE_THREAD_LIBS_INIT} opentelemetry_trace http_client_curl - opentelemetry_exporter_ostream_span) + http_server ${CMAKE_THREAD_LIBS_INIT} opentelemetry_trace + opentelemetry_http_client_curl opentelemetry_exporter_ostream_span) endif() diff --git a/exporters/elasticsearch/CMakeLists.txt b/exporters/elasticsearch/CMakeLists.txt index 1538a6f44a..9b2833854e 100644 --- a/exporters/elasticsearch/CMakeLists.txt +++ b/exporters/elasticsearch/CMakeLists.txt @@ -10,7 +10,7 @@ target_include_directories( target_link_libraries( opentelemetry_exporter_elasticsearch_logs - PUBLIC opentelemetry_trace opentelemetry_logs http_client_curl) + PUBLIC opentelemetry_trace opentelemetry_logs opentelemetry_http_client_curl) install( TARGETS opentelemetry_exporter_elasticsearch_logs diff --git a/exporters/jaeger/CMakeLists.txt b/exporters/jaeger/CMakeLists.txt index 0659c399b0..6d3d8b88fb 100644 --- a/exporters/jaeger/CMakeLists.txt +++ b/exporters/jaeger/CMakeLists.txt @@ -31,7 +31,7 @@ target_include_directories( target_link_libraries( opentelemetry_exporter_jaeger_trace - PUBLIC opentelemetry_resources http_client_curl + PUBLIC opentelemetry_resources opentelemetry_http_client_curl PRIVATE thrift::thrift) if(MSVC) diff --git a/exporters/otlp/CMakeLists.txt b/exporters/otlp/CMakeLists.txt index 0332267922..1dba7ea1c7 100755 --- a/exporters/otlp/CMakeLists.txt +++ b/exporters/otlp/CMakeLists.txt @@ -46,7 +46,7 @@ if(WITH_OTLP_HTTP) PROPERTIES EXPORT_NAME otlp_http_client) target_link_libraries( opentelemetry_exporter_otlp_http_client - PUBLIC opentelemetry_sdk opentelemetry_proto http_client_curl + PUBLIC opentelemetry_sdk opentelemetry_proto opentelemetry_http_client_curl nlohmann_json::nlohmann_json) if(nlohmann_json_clone) add_dependencies(opentelemetry_exporter_otlp_http_client diff --git a/exporters/zipkin/CMakeLists.txt b/exporters/zipkin/CMakeLists.txt index b9591324fd..b82339f1ee 100644 --- a/exporters/zipkin/CMakeLists.txt +++ b/exporters/zipkin/CMakeLists.txt @@ -20,7 +20,8 @@ add_library(opentelemetry_exporter_zipkin_trace src/zipkin_exporter.cc target_link_libraries( opentelemetry_exporter_zipkin_trace - PUBLIC opentelemetry_trace http_client_curl nlohmann_json::nlohmann_json) + PUBLIC opentelemetry_trace opentelemetry_http_client_curl + nlohmann_json::nlohmann_json) install( TARGETS opentelemetry_exporter_zipkin_trace diff --git a/ext/src/http/client/curl/CMakeLists.txt b/ext/src/http/client/curl/CMakeLists.txt index 64486b96db..78a81cfe3e 100644 --- a/ext/src/http/client/curl/CMakeLists.txt +++ b/ext/src/http/client/curl/CMakeLists.txt @@ -1,22 +1,23 @@ find_package(CURL) if(CURL_FOUND) - add_library(http_client_curl http_client_factory_curl.cc http_client_curl.cc) + add_library(opentelemetry_http_client_curl http_client_factory_curl.cc + http_client_curl.cc) - set_target_properties(http_client_curl PROPERTIES EXPORT_NAME - http_client_curl) + set_target_properties(opentelemetry_http_client_curl + PROPERTIES EXPORT_NAME http_client_curl) if(TARGET CURL::libcurl) - target_link_libraries(http_client_curl PUBLIC opentelemetry_ext - CURL::libcurl) + target_link_libraries(opentelemetry_http_client_curl + PUBLIC opentelemetry_ext CURL::libcurl) else() - target_include_directories(http_client_curl + target_include_directories(opentelemetry_http_client_curl INTERFACE "${CURL_INCLUDE_DIRS}") - target_link_libraries(http_client_curl PUBLIC opentelemetry_ext - ${CURL_LIBRARIES}) + target_link_libraries(opentelemetry_http_client_curl + PUBLIC opentelemetry_ext ${CURL_LIBRARIES}) endif() install( - TARGETS http_client_curl + TARGETS opentelemetry_http_client_curl EXPORT "${PROJECT_NAME}-target" RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/ext/test/http/CMakeLists.txt b/ext/test/http/CMakeLists.txt index 13b7c8206e..341648085d 100644 --- a/ext/test/http/CMakeLists.txt +++ b/ext/test/http/CMakeLists.txt @@ -7,10 +7,12 @@ if(CURL_FOUND) ${CMAKE_THREAD_LIBS_INIT}) if(TARGET CURL::libcurl) - target_link_libraries(${FILENAME} CURL::libcurl http_client_curl) + target_link_libraries(${FILENAME} opentelemetry_http_client_curl + CURL::libcurl) else() include_directories(${CURL_INCLUDE_DIRS}) - target_link_libraries(${FILENAME} ${CURL_LIBRARIES} http_client_curl) + target_link_libraries(${FILENAME} ${CURL_LIBRARIES} + opentelemetry_http_client_curl) endif() gtest_add_tests( TARGET ${FILENAME} diff --git a/ext/test/w3c_tracecontext_test/CMakeLists.txt b/ext/test/w3c_tracecontext_test/CMakeLists.txt index 30e2f5d0f3..ea74a8eeb0 100644 --- a/ext/test/w3c_tracecontext_test/CMakeLists.txt +++ b/ext/test/w3c_tracecontext_test/CMakeLists.txt @@ -7,9 +7,9 @@ else() add_executable(w3c_tracecontext_test main.cc) target_link_libraries( w3c_tracecontext_test - PRIVATE ${CMAKE_THREAD_LIBS_INIT} opentelemetry_trace http_client_curl - opentelemetry_exporter_ostream_span ${CURL_LIBRARIES} - nlohmann_json::nlohmann_json) + PRIVATE ${CMAKE_THREAD_LIBS_INIT} opentelemetry_trace + opentelemetry_http_client_curl opentelemetry_exporter_ostream_span + ${CURL_LIBRARIES} nlohmann_json::nlohmann_json) if(nlohmann_json_clone) add_dependencies(w3c_tracecontext_test nlohmann_json::nlohmann_json) endif() From 2034c9bcfa9cf6a995891efed36264088a333d37 Mon Sep 17 00:00:00 2001 From: Tom Tan Date: Fri, 1 Apr 2022 10:57:31 -0700 Subject: [PATCH 11/35] Don't show coverage annotation for pull requests (#1304) --- .github/.codecov.yaml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/.codecov.yaml b/.github/.codecov.yaml index e2c304a9b4..2b3003ff57 100644 --- a/.github/.codecov.yaml +++ b/.github/.codecov.yaml @@ -12,11 +12,7 @@ coverage: informational: true target: auto threshold: 10% - patch: - default: - informational: true - target: auto - threshold: 10% + patch: false parsers: gcov: From 33d9c628f2e7029b6b92733df69336f7e384c7e4 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Fri, 1 Apr 2022 14:07:44 -0700 Subject: [PATCH 12/35] Implement periodic exporting metric reader (#1286) --- exporters/ostream/BUILD | 6 +- .../export/periodic_exporting_metric_reader.h | 72 +++++++++++++ .../sdk/metrics/metric_exporter.h | 9 +- .../opentelemetry/sdk/metrics/metric_reader.h | 1 + sdk/src/metrics/CMakeLists.txt | 1 + .../periodic_exporting_metric_reader.cc | 101 ++++++++++++++++++ sdk/src/metrics/metric_reader.cc | 10 +- sdk/test/metrics/CMakeLists.txt | 3 +- sdk/test/metrics/meter_provider_sdk_test.cc | 3 +- .../periodic_exporting_metric_reader_test.cc | 81 ++++++++++++++ 10 files changed, 272 insertions(+), 15 deletions(-) create mode 100644 sdk/include/opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h create mode 100644 sdk/src/metrics/export/periodic_exporting_metric_reader.cc create mode 100644 sdk/test/metrics/periodic_exporting_metric_reader_test.cc diff --git a/exporters/ostream/BUILD b/exporters/ostream/BUILD index 19c0f7914d..f74d896344 100644 --- a/exporters/ostream/BUILD +++ b/exporters/ostream/BUILD @@ -43,7 +43,9 @@ cc_library( ], ) -#TODO MetricData is still changing, uncomment once it is final +# TODO - Uncomment once MetricData interface is finalised +#cc_library( +# name = "ostream_metric_exporter", # srcs = [ # "src/metric_exporter.cc", # ], @@ -70,7 +72,7 @@ cc_library( # deps = [ # ":ostream_metric_exporter", # "@com_google_googletest//:gtest_main", -#], +# ], #) cc_test( diff --git a/sdk/include/opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h b/sdk/include/opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h new file mode 100644 index 0000000000..29125a6ea2 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h @@ -0,0 +1,72 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once +#ifndef ENABLE_METRICS_PREVIEW + +# include "opentelemetry/sdk/metrics/metric_reader.h" +# include "opentelemetry/version.h" + +# include +# include +# include +# include + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ + +class MetricExporter; +/** + * Struct to hold PeriodicExortingMetricReader options. + */ + +constexpr std::chrono::milliseconds kExportIntervalMillis = std::chrono::milliseconds(60000); +constexpr std::chrono::milliseconds kExportTimeOutMillis = std::chrono::milliseconds(30000); +struct PeriodicExportingMetricReaderOptions +{ + + /* The time interval between two consecutive exports. */ + std::chrono::milliseconds export_interval_millis = + std::chrono::milliseconds(kExportIntervalMillis); + + /* how long the export can run before it is cancelled. */ + std::chrono::milliseconds export_timeout_millis = std::chrono::milliseconds(kExportTimeOutMillis); +}; + +class PeriodicExportingMetricReader : public MetricReader +{ + +public: + PeriodicExportingMetricReader( + std::unique_ptr exporter, + const PeriodicExportingMetricReaderOptions &option, + AggregationTemporality aggregation_temporality = AggregationTemporality::kCumulative); + +private: + bool OnForceFlush(std::chrono::microseconds timeout) noexcept override; + + bool OnShutDown(std::chrono::microseconds timeout) noexcept override; + + void OnInitialized() noexcept override; + + std::unique_ptr exporter_; + std::chrono::milliseconds export_interval_millis_; + std::chrono::milliseconds export_timeout_millis_; + + void DoBackgroundWork(); + + /* The background worker thread */ + std::thread worker_thread_; + + /* Synchronization primitives */ + std::condition_variable cv_; + std::mutex cv_m_; +}; + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h b/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h index 3769259472..2488edd7ed 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h @@ -30,11 +30,9 @@ class MetricExporter /** * Exports a batch of metrics recordables. This method must not be called * concurrently for the same exporter instance. - * @param spans a span of unique pointers to metrics data + * @param data metrics data */ - virtual opentelemetry::sdk::common::ExportResult Export( - const nostd::span> - &records) noexcept = 0; + virtual opentelemetry::sdk::common::ExportResult Export(const MetricData &data) noexcept = 0; /** * Force flush the exporter. @@ -49,9 +47,6 @@ class MetricExporter */ virtual bool Shutdown( std::chrono::microseconds timeout = std::chrono::microseconds(0)) noexcept = 0; - -private: - AggregationTemporality aggregation_temporality_; }; } // namespace metrics } // namespace sdk diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h index 57690ac87c..7cf449e1e3 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h @@ -57,6 +57,7 @@ class MetricReader virtual void OnInitialized() noexcept {} +protected: bool IsShutdown() const noexcept; private: diff --git a/sdk/src/metrics/CMakeLists.txt b/sdk/src/metrics/CMakeLists.txt index d8eff48cd5..b6656b5bf8 100644 --- a/sdk/src/metrics/CMakeLists.txt +++ b/sdk/src/metrics/CMakeLists.txt @@ -4,6 +4,7 @@ add_library( meter.cc meter_context.cc metric_reader.cc + export/periodic_exporting_metric_reader.cc state/metric_collector.cc state/sync_metric_storage.cc aggregation/histogram_aggregation.cc diff --git a/sdk/src/metrics/export/periodic_exporting_metric_reader.cc b/sdk/src/metrics/export/periodic_exporting_metric_reader.cc new file mode 100644 index 0000000000..e9a91a9e06 --- /dev/null +++ b/sdk/src/metrics/export/periodic_exporting_metric_reader.cc @@ -0,0 +1,101 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h" +# include "opentelemetry/sdk/common/global_log_handler.h" +# include "opentelemetry/sdk/metrics/metric_exporter.h" + +# include +# include + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace metrics +{ + +PeriodicExportingMetricReader::PeriodicExportingMetricReader( + std::unique_ptr exporter, + const PeriodicExportingMetricReaderOptions &option, + AggregationTemporality aggregation_temporality) + : MetricReader(aggregation_temporality), + exporter_{std::move(exporter)}, + export_interval_millis_{option.export_interval_millis}, + export_timeout_millis_{option.export_timeout_millis} +{ + if (export_interval_millis_ <= export_timeout_millis_) + { + OTEL_INTERNAL_LOG_WARN( + "[Periodic Exporting Metric Reader] Invalid configuration: " + "export_interval_millis_ should be less than export_timeout_millis_, using default values"); + export_interval_millis_ = kExportIntervalMillis; + export_timeout_millis_ = kExportTimeOutMillis; + } +} + +void PeriodicExportingMetricReader::OnInitialized() noexcept +{ + worker_thread_ = std::thread(&PeriodicExportingMetricReader::DoBackgroundWork, this); +} + +void PeriodicExportingMetricReader::DoBackgroundWork() +{ + std::unique_lock lk(cv_m_); + do + { + if (IsShutdown()) + { + break; + } + std::atomic cancel_export_for_timeout{false}; + auto start = std::chrono::steady_clock::now(); + auto future_receive = std::async(std::launch::async, [this, &cancel_export_for_timeout] { + Collect([this, &cancel_export_for_timeout](MetricData data) { + if (cancel_export_for_timeout) + { + OTEL_INTERNAL_LOG_ERROR( + "[Periodic Exporting Metric Reader] Collect took longer configured time: " + << export_timeout_millis_.count() << " ms, and timed out"); + return false; + } + this->exporter_->Export(data); + return true; + }); + }); + std::future_status status; + do + { + status = future_receive.wait_for(std::chrono::milliseconds(export_timeout_millis_)); + if (status == std::future_status::timeout) + { + cancel_export_for_timeout = true; + break; + } + } while (status != std::future_status::ready); + auto end = std::chrono::steady_clock::now(); + auto export_time_ms = std::chrono::duration_cast(end - start); + auto remaining_wait_interval_ms = export_interval_millis_ - export_time_ms; + cv_.wait_for(lk, remaining_wait_interval_ms); + } while (true); +} + +bool PeriodicExportingMetricReader::OnForceFlush(std::chrono::microseconds timeout) noexcept +{ + return exporter_->ForceFlush(timeout); +} + +bool PeriodicExportingMetricReader::OnShutDown(std::chrono::microseconds timeout) noexcept +{ + if (worker_thread_.joinable()) + { + cv_.notify_one(); + worker_thread_.join(); + } + return exporter_->Shutdown(timeout); +} + +} // namespace metrics +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE +#endif \ No newline at end of file diff --git a/sdk/src/metrics/metric_reader.cc b/sdk/src/metrics/metric_reader.cc index 8238ad2a55..abf73d766a 100644 --- a/sdk/src/metrics/metric_reader.cc +++ b/sdk/src/metrics/metric_reader.cc @@ -20,6 +20,7 @@ MetricReader::MetricReader(AggregationTemporality aggregation_temporality) void MetricReader::SetMetricProducer(MetricProducer *metric_producer) { metric_producer_ = metric_producer; + OnInitialized(); } AggregationTemporality MetricReader::GetAggregationTemporality() const noexcept @@ -46,18 +47,21 @@ bool MetricReader::Collect(nostd::function_ref callback) noexc bool MetricReader::Shutdown(std::chrono::microseconds timeout) noexcept { bool status = true; - if (IsShutdown()) { OTEL_INTERNAL_LOG_WARN("MetricReader::Shutdown - Cannot invoke shutdown twice!"); } + + { + const std::lock_guard locked(lock_); + shutdown_ = true; + } + if (!OnShutDown(timeout)) { status = false; OTEL_INTERNAL_LOG_WARN("MetricReader::OnShutDown Shutdown failed. Will not be tried again!"); } - const std::lock_guard locked(lock_); - shutdown_ = true; return status; } diff --git a/sdk/test/metrics/CMakeLists.txt b/sdk/test/metrics/CMakeLists.txt index fa1f22c73a..faf2f2b49f 100644 --- a/sdk/test/metrics/CMakeLists.txt +++ b/sdk/test/metrics/CMakeLists.txt @@ -11,7 +11,8 @@ foreach( observer_result_test sync_instruments_test async_instruments_test - metric_reader_test) + metric_reader_test + periodic_exporting_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/meter_provider_sdk_test.cc b/sdk/test/metrics/meter_provider_sdk_test.cc index 6ede67d032..ec0a39b523 100644 --- a/sdk/test/metrics/meter_provider_sdk_test.cc +++ b/sdk/test/metrics/meter_provider_sdk_test.cc @@ -18,8 +18,7 @@ class MockMetricExporter : public MetricExporter public: MockMetricExporter() = default; - opentelemetry::sdk::common::ExportResult Export( - const opentelemetry::nostd::span> &records) noexcept override + opentelemetry::sdk::common::ExportResult Export(const MetricData &records) noexcept override { return opentelemetry::sdk::common::ExportResult::kSuccess; } diff --git a/sdk/test/metrics/periodic_exporting_metric_reader_test.cc b/sdk/test/metrics/periodic_exporting_metric_reader_test.cc new file mode 100644 index 0000000000..f13fbb0e04 --- /dev/null +++ b/sdk/test/metrics/periodic_exporting_metric_reader_test.cc @@ -0,0 +1,81 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef ENABLE_METRICS_PREVIEW + +# include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h" +# include "opentelemetry/sdk/metrics/export/metric_producer.h" +# include "opentelemetry/sdk/metrics/metric_exporter.h" + +# include + +using namespace opentelemetry; +using namespace opentelemetry::sdk::instrumentationlibrary; +using namespace opentelemetry::sdk::metrics; + +class MockPushMetricExporter : public MetricExporter +{ +public: + opentelemetry::sdk::common::ExportResult Export(const MetricData &record) noexcept override + { + records_.push_back(record); + return opentelemetry::sdk::common::ExportResult::kSuccess; + } + + bool ForceFlush( + std::chrono::microseconds timeout = (std::chrono::microseconds::max)()) noexcept override + { + return false; + } + + bool Shutdown(std::chrono::microseconds timeout = std::chrono::microseconds(0)) noexcept override + { + return true; + } + + size_t GetDataCount() { return records_.size(); } + +private: + std::vector records_; +}; + +class MockMetricProducer : public MetricProducer +{ +public: + MockMetricProducer(std::chrono::microseconds sleep_ms = std::chrono::microseconds::zero()) + : sleep_ms_{sleep_ms}, data_sent_size_(0) + {} + + bool Collect(nostd::function_ref callback) noexcept override + { + std::this_thread::sleep_for(sleep_ms_); + data_sent_size_++; + MetricData data; + callback(data); + return true; + } + + size_t GetDataCount() { return data_sent_size_; } + +private: + std::chrono::microseconds sleep_ms_; + size_t data_sent_size_; +}; + +TEST(PeriodicExporingMetricReader, BasicTests) +{ + std::unique_ptr exporter(new MockPushMetricExporter()); + PeriodicExportingMetricReaderOptions options; + options.export_timeout_millis = std::chrono::milliseconds(200); + options.export_interval_millis = std::chrono::milliseconds(500); + auto exporter_ptr = exporter.get(); + PeriodicExportingMetricReader reader(std::move(exporter), options); + MockMetricProducer producer; + reader.SetMetricProducer(&producer); + std::this_thread::sleep_for(std::chrono::milliseconds(2000)); + reader.Shutdown(); + EXPECT_EQ(static_cast(exporter_ptr)->GetDataCount(), + static_cast(&producer)->GetDataCount()); +} + +#endif \ No newline at end of file From 48a40601061905542a52dd11109a868517a6e304 Mon Sep 17 00:00:00 2001 From: WenTao Ou Date: Tue, 5 Apr 2022 04:09:48 +0800 Subject: [PATCH 13/35] Add `async-changes` branch to pull_request of github action (#1309) Signed-off-by: owent --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a851728a2e..c29ee3084f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,7 +4,7 @@ on: push: branches: [ main ] pull_request: - branches: [ main ] + branches: [ main, async-changes ] jobs: cmake_test: From be75bbc862a81319f8f9cae11c14f79f2c776aa9 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Mon, 4 Apr 2022 15:09:02 -0700 Subject: [PATCH 14/35] Add InstrumentationInfo and Resource to the metrics data to be exported. (#1299) --- .../sdk/metrics/async_instruments.h | 53 ++++++------------- .../sdk/metrics/export/metric_producer.h | 23 +++++++- sdk/include/opentelemetry/sdk/metrics/meter.h | 7 ++- .../sdk/metrics/metric_exporter.h | 2 +- .../opentelemetry/sdk/metrics/metric_reader.h | 4 +- .../sdk/metrics/state/async_metric_storage.h | 9 ++-- .../sdk/metrics/state/metric_collector.h | 2 +- .../sdk/metrics/state/metric_storage.h | 10 ++-- .../sdk/metrics/state/sync_metric_storage.h | 2 +- .../periodic_exporting_metric_reader.cc | 4 +- sdk/src/metrics/meter.cc | 29 +++++----- sdk/src/metrics/metric_reader.cc | 3 +- sdk/src/metrics/state/metric_collector.cc | 11 +++- sdk/src/metrics/state/sync_metric_storage.cc | 2 +- sdk/test/metrics/async_instruments_test.cc | 29 +++++----- sdk/test/metrics/async_metric_storage_test.cc | 2 +- sdk/test/metrics/meter_provider_sdk_test.cc | 2 +- sdk/test/metrics/metric_reader_test.cc | 2 +- .../periodic_exporting_metric_reader_test.cc | 8 +-- 19 files changed, 98 insertions(+), 106 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/async_instruments.h b/sdk/include/opentelemetry/sdk/metrics/async_instruments.h index f38ad6a3b4..8b1f76377b 100644 --- a/sdk/include/opentelemetry/sdk/metrics/async_instruments.h +++ b/sdk/include/opentelemetry/sdk/metrics/async_instruments.h @@ -6,7 +6,6 @@ # include "opentelemetry/metrics/async_instruments.h" # include "opentelemetry/metrics/observer_result.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 @@ -19,22 +18,14 @@ class Asynchronous { public: Asynchronous(nostd::string_view name, - const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary - *instrumentation_library, void (*callback)(opentelemetry::metrics::ObserverResult &), nostd::string_view description = "", nostd::string_view unit = "") - : name_(name), - instrumentation_library_{instrumentation_library}, - callback_(callback), - description_(description), - unit_(unit) + : name_(name), callback_(callback), description_(description), unit_(unit) {} protected: std::string name_; - const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary - *instrumentation_library_; void (*callback_)(opentelemetry::metrics::ObserverResult &); std::string description_; std::string unit_; @@ -45,12 +36,10 @@ class LongObservableCounter : public opentelemetry::metrics::ObservableCounter &), nostd::string_view description = "", nostd::string_view unit = "") - : Asynchronous(name, instrumentation_library, callback, description, unit) + : Asynchronous(name, callback, description, unit) {} }; @@ -60,12 +49,10 @@ class DoubleObservableCounter : public opentelemetry::metrics::ObservableCounter { public: DoubleObservableCounter(nostd::string_view name, - const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary - *instrumentation_library, void (*callback)(opentelemetry::metrics::ObserverResult &), nostd::string_view description = "", nostd::string_view unit = "") - : Asynchronous(name, instrumentation_library, callback, description, unit) + : Asynchronous(name, callback, description, unit) {} }; @@ -75,12 +62,10 @@ class LongObservableGauge : public opentelemetry::metrics::ObservableGauge { public: LongObservableGauge(nostd::string_view name, - const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary - *instrumentation_library, void (*callback)(opentelemetry::metrics::ObserverResult &), nostd::string_view description = "", nostd::string_view unit = "") - : Asynchronous(name, instrumentation_library, callback, description, unit) + : Asynchronous(name, callback, description, unit) {} }; @@ -90,12 +75,10 @@ class DoubleObservableGauge : public opentelemetry::metrics::ObservableGauge &), nostd::string_view description = "", nostd::string_view unit = "") - : Asynchronous(name, instrumentation_library, callback, description, unit) + : Asynchronous(name, callback, description, unit) {} }; @@ -104,14 +87,11 @@ class LongObservableUpDownCounter : public opentelemetry::metrics::ObservableUpD public Asynchronous { public: - LongObservableUpDownCounter( - nostd::string_view name, - const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary - *instrumentation_library, - void (*callback)(opentelemetry::metrics::ObserverResult &), - nostd::string_view description = "", - nostd::string_view unit = "") - : Asynchronous(name, instrumentation_library, callback, description, unit) + LongObservableUpDownCounter(nostd::string_view name, + void (*callback)(opentelemetry::metrics::ObserverResult &), + nostd::string_view description = "", + nostd::string_view unit = "") + : Asynchronous(name, callback, description, unit) {} }; @@ -121,14 +101,11 @@ class DoubleObservableUpDownCounter public Asynchronous { public: - DoubleObservableUpDownCounter( - nostd::string_view name, - const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary - *instrumentation_library, - void (*callback)(opentelemetry::metrics::ObserverResult &), - nostd::string_view description = "", - nostd::string_view unit = "") - : Asynchronous(name, instrumentation_library, callback, description, unit) + DoubleObservableUpDownCounter(nostd::string_view name, + void (*callback)(opentelemetry::metrics::ObserverResult &), + nostd::string_view description = "", + nostd::string_view unit = "") + : Asynchronous(name, 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 index 7c9ee57755..d3b38759ad 100644 --- a/sdk/include/opentelemetry/sdk/metrics/export/metric_producer.h +++ b/sdk/include/opentelemetry/sdk/metrics/export/metric_producer.h @@ -3,13 +3,33 @@ #pragma once #ifndef ENABLE_METRICS_PREVIEW +# include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" # include "opentelemetry/sdk/metrics/data/metric_data.h" +# include "opentelemetry/sdk/resource/resource.h" + OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk { namespace metrics { +/** + * Metric Data to be exported along with resources and + * Instrumentation library. + */ +struct InstrumentationInfoMetrics +{ + const opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary + *instrumentation_library_; + std::vector metric_data_; +}; + +struct ResourceMetrics +{ + const opentelemetry::sdk::resource::Resource *resource_; + std::vector instrumentation_info_metric_data_; +}; + /** * 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 @@ -27,7 +47,8 @@ class MetricProducer * * @return a status of completion of method. */ - virtual bool Collect(nostd::function_ref callback) noexcept = 0; + virtual bool Collect( + nostd::function_ref callback) noexcept = 0; }; } // namespace metrics diff --git a/sdk/include/opentelemetry/sdk/metrics/meter.h b/sdk/include/opentelemetry/sdk/metrics/meter.h index c9e02918a0..4a6ea26aeb 100644 --- a/sdk/include/opentelemetry/sdk/metrics/meter.h +++ b/sdk/include/opentelemetry/sdk/metrics/meter.h @@ -102,10 +102,9 @@ 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; + /** collect metrics across all the instruments configured for the meter **/ + std::vector Collect(CollectorHandle *collector, + opentelemetry::common::SystemTimestamp collect_ts) noexcept; private: // order of declaration is important here - instrumentation library should destroy after diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h b/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h index 2488edd7ed..b6b5acf3a9 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h @@ -32,7 +32,7 @@ class MetricExporter * concurrently for the same exporter instance. * @param data metrics data */ - virtual opentelemetry::sdk::common::ExportResult Export(const MetricData &data) noexcept = 0; + virtual opentelemetry::sdk::common::ExportResult Export(const ResourceMetrics &data) noexcept = 0; /** * Force flush the exporter. diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h index 7cf449e1e3..94924315f8 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_reader.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_reader.h @@ -6,6 +6,7 @@ # 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/export/metric_producer.h" # include "opentelemetry/sdk/metrics/instruments.h" # include "opentelemetry/version.h" @@ -18,7 +19,6 @@ namespace sdk namespace metrics { -class MetricProducer; /** * MetricReader defines the interface to collect metrics from SDK */ @@ -34,7 +34,7 @@ class MetricReader * Collect the metrics from SDK. * @return return the status of the operation. */ - bool Collect(nostd::function_ref callback) noexcept; + bool Collect(nostd::function_ref callback) noexcept; AggregationTemporality GetAggregationTemporality() const noexcept; 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 31ab70c5b8..cfbf521538 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/async_metric_storage.h @@ -4,16 +4,15 @@ #pragma once #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/sdk/common/attributemap_hash.h" -# include "opentelemetry/sdk/metrics/instruments.h" - # include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" +# include "opentelemetry/sdk/metrics/instruments.h" +# include "opentelemetry/sdk/metrics/observer_result.h" # include "opentelemetry/sdk/metrics/state/attributes_hashmap.h" # include "opentelemetry/sdk/metrics/state/metric_collector.h" # include "opentelemetry/sdk/metrics/state/metric_storage.h" # include "opentelemetry/sdk/metrics/view/attributes_processor.h" # include -# include "opentelemetry/sdk/metrics/observer_result.h" OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk @@ -40,7 +39,7 @@ class AsyncMetricStorage : public MetricStorage nostd::span> collectors, opentelemetry::common::SystemTimestamp sdk_start_ts, opentelemetry::common::SystemTimestamp collection_ts, - nostd::function_ref metric_collection_callback) noexcept override + nostd::function_ref metric_collection_callback) noexcept override { opentelemetry::sdk::metrics::ObserverResult ob_res(attributes_processor_); @@ -57,7 +56,7 @@ class AsyncMetricStorage : public MetricStorage // TBD -> read aggregation from hashmap, and perform metric collection MetricData metric_data; - if (metric_collection_callback(metric_data)) + if (metric_collection_callback(std::move(metric_data))) { return true; } diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h index 51c9cf6eff..20372f5209 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_collector.h @@ -41,7 +41,7 @@ class MetricCollector : public MetricProducer, public CollectorHandle * * @return a status of completion of method. */ - bool Collect(nostd::function_ref callback) noexcept override; + bool Collect(nostd::function_ref callback) noexcept override; bool ForceFlush(std::chrono::microseconds timeout = std::chrono::microseconds::max()) noexcept; diff --git a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h index 20f7d56140..e0ba55cbfe 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/metric_storage.h @@ -25,7 +25,7 @@ class MetricStorage nostd::span> collectors, opentelemetry::common::SystemTimestamp sdk_start_ts, opentelemetry::common::SystemTimestamp collection_ts, - nostd::function_ref callback) noexcept = 0; + nostd::function_ref callback) noexcept = 0; }; class WritableMetricStorage @@ -54,14 +54,10 @@ class NoopMetricStorage : public MetricStorage nostd::span> collectors, opentelemetry::common::SystemTimestamp sdk_start_ts, opentelemetry::common::SystemTimestamp collection_ts, - nostd::function_ref callback) noexcept override + nostd::function_ref callback) noexcept override { MetricData metric_data; - if (callback(metric_data)) - { - return true; - } - return false; + return callback(std::move(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 8269d2fd3c..c16f33ede2 100644 --- a/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h +++ b/sdk/include/opentelemetry/sdk/metrics/state/sync_metric_storage.h @@ -106,7 +106,7 @@ class SyncMetricStorage : public MetricStorage, public WritableMetricStorage nostd::span> collectors, opentelemetry::common::SystemTimestamp sdk_start_ts, opentelemetry::common::SystemTimestamp collection_ts, - nostd::function_ref callback) noexcept override; + nostd::function_ref callback) noexcept override; private: InstrumentDescriptor instrument_descriptor_; diff --git a/sdk/src/metrics/export/periodic_exporting_metric_reader.cc b/sdk/src/metrics/export/periodic_exporting_metric_reader.cc index e9a91a9e06..f11f84544f 100644 --- a/sdk/src/metrics/export/periodic_exporting_metric_reader.cc +++ b/sdk/src/metrics/export/periodic_exporting_metric_reader.cc @@ -51,7 +51,7 @@ void PeriodicExportingMetricReader::DoBackgroundWork() std::atomic cancel_export_for_timeout{false}; auto start = std::chrono::steady_clock::now(); auto future_receive = std::async(std::launch::async, [this, &cancel_export_for_timeout] { - Collect([this, &cancel_export_for_timeout](MetricData data) { + Collect([this, &cancel_export_for_timeout](ResourceMetrics &metric_data) { if (cancel_export_for_timeout) { OTEL_INTERNAL_LOG_ERROR( @@ -59,7 +59,7 @@ void PeriodicExportingMetricReader::DoBackgroundWork() << export_timeout_millis_.count() << " ms, and timed out"); return false; } - this->exporter_->Export(data); + this->exporter_->Export(metric_data); return true; }); }); diff --git a/sdk/src/metrics/meter.cc b/sdk/src/metrics/meter.cc index fb74d55eb4..e7ca822b6d 100644 --- a/sdk/src/metrics/meter.cc +++ b/sdk/src/metrics/meter.cc @@ -64,7 +64,7 @@ nostd::shared_ptr> Meter::CreateLongObservableC nostd::string_view unit) noexcept { return nostd::shared_ptr>{ - new LongObservableCounter(name, GetInstrumentationLibrary(), callback, description, unit)}; + new LongObservableCounter(name, callback, description, unit)}; } nostd::shared_ptr> Meter::CreateDoubleObservableCounter( @@ -74,7 +74,7 @@ nostd::shared_ptr> Meter::CreateDoubleObserva nostd::string_view unit) noexcept { return nostd::shared_ptr>{ - new DoubleObservableCounter(name, GetInstrumentationLibrary(), callback, description, unit)}; + new DoubleObservableCounter(name, callback, description, unit)}; } nostd::shared_ptr> Meter::CreateLongHistogram( @@ -112,7 +112,7 @@ nostd::shared_ptr> Meter::CreateLongObservableGau nostd::string_view unit) noexcept { return nostd::shared_ptr>{ - new LongObservableGauge(name, GetInstrumentationLibrary(), callback, description, unit)}; + new LongObservableGauge(name, callback, description, unit)}; } nostd::shared_ptr> Meter::CreateDoubleObservableGauge( @@ -122,7 +122,7 @@ nostd::shared_ptr> Meter::CreateDoubleObservabl nostd::string_view unit) noexcept { return nostd::shared_ptr>{ - new DoubleObservableGauge(name, GetInstrumentationLibrary(), callback, description, unit)}; + new DoubleObservableGauge(name, callback, description, unit)}; } nostd::shared_ptr> Meter::CreateLongUpDownCounter( @@ -159,8 +159,8 @@ nostd::shared_ptr> Meter::CreateLongObser nostd::string_view description, nostd::string_view unit) noexcept { - return nostd::shared_ptr>{new LongObservableUpDownCounter( - name, GetInstrumentationLibrary(), callback, description, unit)}; + return nostd::shared_ptr>{ + new LongObservableUpDownCounter(name, callback, description, unit)}; } nostd::shared_ptr> @@ -170,8 +170,7 @@ Meter::CreateDoubleObservableUpDownCounter(nostd::string_view name, nostd::string_view unit) noexcept { return nostd::shared_ptr>{ - new DoubleObservableUpDownCounter(name, GetInstrumentationLibrary(), callback, description, - unit)}; + new DoubleObservableUpDownCounter(name, callback, description, unit)}; } const sdk::instrumentationlibrary::InstrumentationLibrary *Meter::GetInstrumentationLibrary() @@ -211,22 +210,20 @@ std::unique_ptr Meter::RegisterMetricStorage( } /** collect metrics across all the meters **/ -bool Meter::Collect(CollectorHandle *collector, - opentelemetry::common::SystemTimestamp collect_ts, - nostd::function_ref callback) noexcept +std::vector Meter::Collect(CollectorHandle *collector, + opentelemetry::common::SystemTimestamp collect_ts) noexcept { - std::vector data; + std::vector metric_data_list; for (auto &metric_storage : storage_registry_) { - // TBD - this needs to be asynchronous metric_storage.second->Collect(collector, meter_context_->GetCollectors(), meter_context_->GetSDKStartTime(), collect_ts, - [&callback](MetricData &metric_data) { - callback(metric_data); + [&metric_data_list](MetricData metric_data) { + metric_data_list.push_back(metric_data); return true; }); } - return true; + return metric_data_list; } } // namespace metrics diff --git a/sdk/src/metrics/metric_reader.cc b/sdk/src/metrics/metric_reader.cc index abf73d766a..eafcc60e7e 100644 --- a/sdk/src/metrics/metric_reader.cc +++ b/sdk/src/metrics/metric_reader.cc @@ -28,7 +28,8 @@ AggregationTemporality MetricReader::GetAggregationTemporality() const noexcept return aggregation_temporality_; } -bool MetricReader::Collect(nostd::function_ref callback) noexcept +bool MetricReader::Collect( + nostd::function_ref callback) noexcept { if (!metric_producer_) { diff --git a/sdk/src/metrics/state/metric_collector.cc b/sdk/src/metrics/state/metric_collector.cc index cd3b8eb6ca..6cae7bf12c 100644 --- a/sdk/src/metrics/state/metric_collector.cc +++ b/sdk/src/metrics/state/metric_collector.cc @@ -29,13 +29,20 @@ AggregationTemporality MetricCollector::GetAggregationTemporality() noexcept return metric_reader_->GetAggregationTemporality(); } -bool MetricCollector::Collect(nostd::function_ref callback) noexcept +bool MetricCollector::Collect( + nostd::function_ref callback) noexcept { + ResourceMetrics resource_metrics; for (auto &meter : meter_context_->GetMeters()) { auto collection_ts = std::chrono::system_clock::now(); - meter->Collect(this, collection_ts, callback); + InstrumentationInfoMetrics instrumentation_info_metrics; + instrumentation_info_metrics.metric_data_ = meter->Collect(this, collection_ts); + instrumentation_info_metrics.instrumentation_library_ = meter->GetInstrumentationLibrary(); + resource_metrics.instrumentation_info_metric_data_.push_back(instrumentation_info_metrics); } + resource_metrics.resource_ = &meter_context_->GetResource(); + callback(resource_metrics); return true; } diff --git a/sdk/src/metrics/state/sync_metric_storage.cc b/sdk/src/metrics/state/sync_metric_storage.cc index 5c14f8bbc3..f42de82b4b 100644 --- a/sdk/src/metrics/state/sync_metric_storage.cc +++ b/sdk/src/metrics/state/sync_metric_storage.cc @@ -15,7 +15,7 @@ bool SyncMetricStorage::Collect(CollectorHandle *collector, nostd::span> collectors, opentelemetry::common::SystemTimestamp sdk_start_ts, opentelemetry::common::SystemTimestamp collection_ts, - nostd::function_ref callback) noexcept + nostd::function_ref callback) noexcept { opentelemetry::common::SystemTimestamp last_collection_ts = sdk_start_ts; auto aggregation_temporarily = collector->GetAggregationTemporality(); diff --git a/sdk/test/metrics/async_instruments_test.cc b/sdk/test/metrics/async_instruments_test.cc index ad3a81b031..ff9504f78c 100644 --- a/sdk/test/metrics/async_instruments_test.cc +++ b/sdk/test/metrics/async_instruments_test.cc @@ -3,16 +3,12 @@ #ifndef ENABLE_METRICS_PREVIEW # include "opentelemetry/sdk/metrics/async_instruments.h" -# include "opentelemetry/sdk/instrumentationlibrary/instrumentation_library.h" # include using namespace opentelemetry; -using namespace opentelemetry::sdk::instrumentationlibrary; using namespace opentelemetry::sdk::metrics; -auto instrumentation_library = InstrumentationLibrary::Create("opentelemetry-cpp", "0.1.0"); - using M = std::map; void asyc_generate_measurements_long(opentelemetry::metrics::ObserverResult &observer) {} @@ -22,44 +18,43 @@ void asyc_generate_measurements_double(opentelemetry::metrics::ObserverResult &observer) {}; - EXPECT_NO_THROW(LongObservableCounter counter("long_counter", instrumentation_library.get(), - asyc_generate_meas_long, "description", "1")); + EXPECT_NO_THROW( + LongObservableCounter counter("long_counter", 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(), - asyc_generate_meas_double, "description", "1")); + EXPECT_NO_THROW(DoubleObservableCounter counter("long_counter", 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(), - asyc_generate_meas_long, "description", "1")); + EXPECT_NO_THROW( + LongObservableGauge counter("long_counter", 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(), - asyc_generate_meas_double, "description", "1")); + EXPECT_NO_THROW( + DoubleObservableGauge counter("long_counter", 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(), - asyc_generate_meas_long, "description", "1")); + EXPECT_NO_THROW(LongObservableUpDownCounter counter("long_counter", 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(), - asyc_generate_meas_double, "description", "1")); + EXPECT_NO_THROW(DoubleObservableUpDownCounter counter("long_counter", asyc_generate_meas_double, + "description", "1")); } #endif diff --git a/sdk/test/metrics/async_metric_storage_test.cc b/sdk/test/metrics/async_metric_storage_test.cc index f7c9914e3c..512e24472c 100644 --- a/sdk/test/metrics/async_metric_storage_test.cc +++ b/sdk/test/metrics/async_metric_storage_test.cc @@ -38,7 +38,7 @@ void measurement_fetch(opentelemetry::metrics::ObserverResult &observer_re TEST(AsyncMetricStorageTest, BasicTests) { - auto metric_callback = [](MetricData &metric_data) { return true; }; + auto metric_callback = [](MetricData &&metric_data) { return true; }; InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, InstrumentValueType::kLong}; diff --git a/sdk/test/metrics/meter_provider_sdk_test.cc b/sdk/test/metrics/meter_provider_sdk_test.cc index ec0a39b523..3c059cc44c 100644 --- a/sdk/test/metrics/meter_provider_sdk_test.cc +++ b/sdk/test/metrics/meter_provider_sdk_test.cc @@ -18,7 +18,7 @@ class MockMetricExporter : public MetricExporter public: MockMetricExporter() = default; - opentelemetry::sdk::common::ExportResult Export(const MetricData &records) noexcept override + opentelemetry::sdk::common::ExportResult Export(const ResourceMetrics &records) noexcept override { return opentelemetry::sdk::common::ExportResult::kSuccess; } diff --git a/sdk/test/metrics/metric_reader_test.cc b/sdk/test/metrics/metric_reader_test.cc index 68a3fcc5f5..61a4364934 100644 --- a/sdk/test/metrics/metric_reader_test.cc +++ b/sdk/test/metrics/metric_reader_test.cc @@ -35,6 +35,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)); - EXPECT_NO_THROW(metric_producer->Collect([](MetricData data) { return true; })); + EXPECT_NO_THROW(metric_producer->Collect([](ResourceMetrics &metric_data) { return true; })); } #endif diff --git a/sdk/test/metrics/periodic_exporting_metric_reader_test.cc b/sdk/test/metrics/periodic_exporting_metric_reader_test.cc index f13fbb0e04..5219f31100 100644 --- a/sdk/test/metrics/periodic_exporting_metric_reader_test.cc +++ b/sdk/test/metrics/periodic_exporting_metric_reader_test.cc @@ -16,7 +16,7 @@ using namespace opentelemetry::sdk::metrics; class MockPushMetricExporter : public MetricExporter { public: - opentelemetry::sdk::common::ExportResult Export(const MetricData &record) noexcept override + opentelemetry::sdk::common::ExportResult Export(const ResourceMetrics &record) noexcept override { records_.push_back(record); return opentelemetry::sdk::common::ExportResult::kSuccess; @@ -36,7 +36,7 @@ class MockPushMetricExporter : public MetricExporter size_t GetDataCount() { return records_.size(); } private: - std::vector records_; + std::vector records_; }; class MockMetricProducer : public MetricProducer @@ -46,11 +46,11 @@ class MockMetricProducer : public MetricProducer : sleep_ms_{sleep_ms}, data_sent_size_(0) {} - bool Collect(nostd::function_ref callback) noexcept override + bool Collect(nostd::function_ref callback) noexcept override { std::this_thread::sleep_for(sleep_ms_); data_sent_size_++; - MetricData data; + ResourceMetrics data; callback(data); return true; } From 237a0b26372b8a75ae941272b78bc07f12692c7b Mon Sep 17 00:00:00 2001 From: Tom Tan Date: Mon, 4 Apr 2022 20:41:02 -0700 Subject: [PATCH 15/35] Excempt should be applied on issue instead of PR (#1316) --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 53ebe3259b..e55a93d08d 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -13,4 +13,4 @@ jobs: close-issue-message: 'Closed as inactive. Feel free to reopen if this is still an issue.' days-before-issue-stale: 60 days-before-issue-close: 7 - exempt-pr-labels: 'do-not-stale' + exempt-issue-labels: 'do-not-stale' From fd338cc9f96cd2ad2af7b3bed496c10c22098582 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 23:05:14 -0700 Subject: [PATCH 16/35] Bump codecov/codecov-action from 2.1.0 to 3 (#1318) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c29ee3084f..3b0af15acb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -375,7 +375,7 @@ jobs: - name: run tests and generate report run: ./ci/do_ci.sh code.coverage - name: upload report - uses: codecov/codecov-action@v2.1.0 + uses: codecov/codecov-action@v3 with: file: /home/runner/build/coverage.info From 74ec691e4a73c3160f2bb2aaf0a9626fb282beec Mon Sep 17 00:00:00 2001 From: WenTao Ou Date: Thu, 7 Apr 2022 14:06:59 +0800 Subject: [PATCH 17/35] Move public definitions into `opentelemetry_api`. (#1314) Signed-off-by: owent --- CMakeLists.txt | 46 +--------------------------------------------- api/CMakeLists.txt | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 47 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5573d156e8..09c21fd678 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,24 +125,11 @@ if(NOT DEFINED CMAKE_CXX_STANDARD) endif() endif() -if(WITH_ABSEIL) - find_package(absl CONFIG REQUIRED) - - set(CORE_RUNTIME_LIBS absl::bad_variant_access absl::any absl::base - absl::bits absl::city) - - # target_link_libraries(main PRIVATE absl::any absl::base absl::bits - # absl::city) -endif() - if(WITH_STL) # These definitions are needed for test projects that do not link against # opentelemetry-api library directly. We ensure that variant implementation # (absl::variant or std::variant) in variant unit test code is consistent with - # the global project build definitions. - add_definitions(-DHAVE_CPP_STDLIB) - - # Optimize for speed to reduce the hops + # the global project build definitions. Optimize for speed to reduce the hops if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") if(CMAKE_BUILD_TYPE MATCHES Debug) # Turn off optimizations for DEBUG @@ -157,20 +144,6 @@ if(WITH_STL) endif() endif() -if(WITH_GSL) - add_definitions(-DHAVE_GSL) - - # Guidelines Support Library path. Used if we are not on not get C++20. - # - find_package(Microsoft.GSL QUIET) - if(TARGET Microsoft.GSL::GSL) - list(APPEND CORE_RUNTIME_LIBS Microsoft.GSL::GSL) - else() - set(GSL_DIR third_party/ms-gsl) - include_directories(${GSL_DIR}/include) - endif() -endif() - option(WITH_OTLP "Whether to include the OpenTelemetry Protocol in the SDK" OFF) option(WITH_ZIPKIN "Whether to include the Zipkin exporter in the SDK" OFF) @@ -190,12 +163,7 @@ option(BUILD_TESTING "Whether to enable tests" ON) option(BUILD_W3CTRACECONTEXT_TEST "Whether to build w3c trace context" OFF) -if(WITH_NO_GENENV) - add_definitions(-DNO_GETENV) -endif() - if(WIN32) - add_definitions(-DNOMINMAX) if(BUILD_TESTING) if(MSVC) # GTest bug: https://github.com/google/googletest/issues/860 @@ -203,9 +171,6 @@ if(WIN32) endif() endif() option(WITH_ETW "Whether to include the ETW Exporter in the SDK" ON) - if(WITH_ETW) - add_definitions(-DHAVE_MSGPACK) - endif(WITH_ETW) endif(WIN32) option( @@ -215,17 +180,8 @@ option( option(WITH_EXAMPLES "Whether to build examples" ON) option(WITH_METRICS_PREVIEW "Whether to build metrics preview" OFF) - -if(WITH_METRICS_PREVIEW) - add_definitions(-DENABLE_METRICS_PREVIEW) -endif() - option(WITH_LOGS_PREVIEW "Whether to build logs preview" OFF) -if(WITH_LOGS_PREVIEW) - add_definitions(-DENABLE_LOGS_PREVIEW) -endif() - find_package(Threads) function(install_windows_deps) diff --git a/api/CMakeLists.txt b/api/CMakeLists.txt index adea77ca2d..375e8458e8 100644 --- a/api/CMakeLists.txt +++ b/api/CMakeLists.txt @@ -42,7 +42,14 @@ if(BUILD_TESTING) endif() if(WITH_ABSEIL) + + find_package(absl CONFIG REQUIRED) + target_compile_definitions(opentelemetry_api INTERFACE HAVE_ABSEIL) + target_link_libraries( + opentelemetry_api INTERFACE absl::bad_variant_access absl::any absl::base + absl::bits absl::city) + endif() if(WITH_STL) @@ -52,6 +59,21 @@ else() message("Building with nostd types...") endif() +if(WITH_GSL) + target_compile_definitions(opentelemetry_api INTERFACE HAVE_GSL) + + # Guidelines Support Library path. Used if we are not on not get C++20. + # + find_package(Microsoft.GSL QUIET) + if(TARGET Microsoft.GSL::GSL) + target_link_libraries(opentelemetry_api INTERFACE Microsoft.GSL::GSL) + else() + set(GSL_DIR third_party/ms-gsl) + target_include_directories( + opentelemetry_api INTERFACE "$") + endif() +endif() + if(WITH_METRICS_PREVIEW) target_compile_definitions(opentelemetry_api INTERFACE ENABLE_METRICS_PREVIEW) endif() @@ -60,6 +82,13 @@ if(WITH_LOGS_PREVIEW) target_compile_definitions(opentelemetry_api INTERFACE ENABLE_LOGS_PREVIEW) endif() -if(CORE_RUNTIME_LIBS) - target_link_libraries(opentelemetry_api INTERFACE ${CORE_RUNTIME_LIBS}) +if(WITH_NO_GENENV) + target_compile_definitions(opentelemetry_api INTERFACE NO_GETENV) +endif() + +if(WIN32) + target_compile_definitions(opentelemetry_api INTERFACE NOMINMAX) + if(WITH_ETW) + target_compile_definitions(opentelemetry_api INTERFACE HAVE_MSGPACK) + endif() endif() From 6b87300b5a354cf377f164eecd914e80171a69e6 Mon Sep 17 00:00:00 2001 From: WenTao Ou Date: Thu, 7 Apr 2022 23:56:44 +0800 Subject: [PATCH 18/35] Add building test without RTTI (#1294) --- .github/workflows/ci.yml | 22 +++ api/include/opentelemetry/common/macros.h | 16 +++ ci/README.md | 2 + ci/do_ci.sh | 12 +- examples/multi_processor/main.cc | 12 +- .../opentelemetry/exporters/etw/etw_logger.h | 2 +- .../opentelemetry/exporters/etw/etw_tracer.h | 4 +- .../opentelemetry/exporters/etw/utils.h | 17 +-- .../memory/in_memory_span_exporter.h | 2 +- .../opentelemetry/sdk/_metrics/controller.h | 6 + .../sdk/_metrics/sync_instruments.h | 14 ++ .../sdk/_metrics/ungrouped_processor.h | 56 ++++++++ sdk/src/_metrics/meter.cc | 14 +- sdk/test/_metrics/metric_instrument_test.cc | 126 ++++++++++-------- sdk/test/metrics/meter_provider_sdk_test.cc | 2 +- sdk/test/trace/tracer_provider_test.cc | 6 +- sdk/test/trace/tracer_test.cc | 4 +- 17 files changed, 226 insertions(+), 91 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b0af15acb..7030c719d5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -216,6 +216,28 @@ jobs: - name: run tests run: ./ci/do_ci.sh bazel.noexcept + bazel_nortti: + name: Bazel nortti + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: 'recursive' + - name: Mount Bazel Cache + uses: actions/cache@v3 + env: + cache-name: bazel_cache + with: + path: /home/runner/.cache/bazel + key: bazel_nortti + - name: setup + run: | + sudo ./ci/setup_thrift.sh dependencies_only + sudo ./ci/setup_ci_environment.sh + sudo ./ci/install_bazelisk.sh + - name: run tests + run: ./ci/do_ci.sh bazel.nortti + bazel_asan: name: Bazel asan config runs-on: ubuntu-latest diff --git a/api/include/opentelemetry/common/macros.h b/api/include/opentelemetry/common/macros.h index 8c2b6bd175..982e368ce3 100644 --- a/api/include/opentelemetry/common/macros.h +++ b/api/include/opentelemetry/common/macros.h @@ -24,3 +24,19 @@ #else # define OPENTELEMETRY_MAYBE_UNUSED #endif + +#ifndef OPENTELEMETRY_RTTI_ENABLED +# if defined(__clang__) +# if __has_feature(cxx_rtti) +# define OPENTELEMETRY_RTTI_ENABLED +# endif +# elif defined(__GNUG__) +# if defined(__GXX_RTTI) +# define OPENTELEMETRY_RTTI_ENABLED +# endif +# elif defined(_MSC_VER) +# if defined(_CPPRTTI) +# define OPENTELEMETRY_RTTI_ENABLED +# endif +# endif +#endif diff --git a/ci/README.md b/ci/README.md index d315965962..14a6107eb8 100644 --- a/ci/README.md +++ b/ci/README.md @@ -12,6 +12,8 @@ CI tests can be run on docker by invoking the script `./ci/run_docker.sh * `bazel.legacy.test`: build bazel targets and run tests for the targets meant to work with older compilers. * `bazel.noexcept`: build bazel targets and run tests with exceptions disabled. +* `bazel.nortti`: build bazel targets and run tests with runtime type + identification disabled. * `bazel.asan`: build bazel targets and run tests with AddressSanitizer. * `bazel.tsan`: build bazel targets and run tests with ThreadSanitizer. * `bazel.valgrind`: build bazel targets and run tests under the valgrind memory diff --git a/ci/do_ci.sh b/ci/do_ci.sh index f9fc8ed215..008e983842 100755 --- a/ci/do_ci.sh +++ b/ci/do_ci.sh @@ -59,7 +59,11 @@ mkdir -p "${BUILD_DIR}" [ -z "${PLUGIN_DIR}" ] && export PLUGIN_DIR=$HOME/plugin mkdir -p "${PLUGIN_DIR}" -BAZEL_OPTIONS="--copt=-DENABLE_METRICS_PREVIEW --copt=-DENABLE_LOGS_PREVIEW --copt=-DENABLE_TEST" +BAZEL_OPTIONS="--copt=-DENABLE_LOGS_PREVIEW --copt=-DENABLE_TEST" +# Previous legacy metrics use virtual drive, which can not be used without RTTI +if [[ "$1" != "bazel.nortti" ]]; then + BAZEL_OPTIONS="$BAZEL_OPTIONS --copt=-DENABLE_METRICS_PREVIEW" +fi BAZEL_TEST_OPTIONS="$BAZEL_OPTIONS --test_output=errors" # https://github.com/bazelbuild/bazel/issues/4341 @@ -221,6 +225,12 @@ elif [[ "$1" == "bazel.noexcept" ]]; then bazel $BAZEL_STARTUP_OPTIONS build --copt=-fno-exceptions --build_tag_filters=-jaeger $BAZEL_OPTIONS -- //... -//exporters/prometheus/... -//exporters/jaeger/... bazel $BAZEL_STARTUP_OPTIONS test --copt=-fno-exceptions --build_tag_filters=-jaeger $BAZEL_TEST_OPTIONS -- //... -//exporters/prometheus/... -//exporters/jaeger/... exit 0 +elif [[ "$1" == "bazel.nortti" ]]; then + # there are some exceptions and error handling code from the Prometheus and Jaeger Clients + # that make this test always fail. ignore Prometheus and Jaeger exporters in the noexcept here. + bazel $BAZEL_STARTUP_OPTIONS build --cxxopt=-fno-rtti --build_tag_filters=-jaeger $BAZEL_OPTIONS -- //... -//exporters/prometheus/... -//exporters/jaeger/... + bazel $BAZEL_STARTUP_OPTIONS test --cxxopt=-fno-rtti --build_tag_filters=-jaeger $BAZEL_TEST_OPTIONS -- //... -//exporters/prometheus/... -//exporters/jaeger/... + exit 0 elif [[ "$1" == "bazel.asan" ]]; then bazel $BAZEL_STARTUP_OPTIONS test --config=asan $BAZEL_TEST_OPTIONS //... exit 0 diff --git a/examples/multi_processor/main.cc b/examples/multi_processor/main.cc index f57da5e228..2b722b6688 100644 --- a/examples/multi_processor/main.cc +++ b/examples/multi_processor/main.cc @@ -20,21 +20,19 @@ namespace trace_api = opentelemetry::trace; namespace trace_sdk = opentelemetry::sdk::trace; namespace nostd = opentelemetry::nostd; -InMemorySpanExporter *memory_span_exporter; - namespace { -void initTracer() +InMemorySpanExporter *initTracer() { auto exporter1 = std::unique_ptr( new opentelemetry::exporter::trace::OStreamSpanExporter); auto processor1 = std::unique_ptr( new trace_sdk::SimpleSpanProcessor(std::move(exporter1))); - auto exporter2 = std::unique_ptr(new InMemorySpanExporter()); + InMemorySpanExporter *memory_span_exporter = new InMemorySpanExporter(); + auto exporter2 = std::unique_ptr(memory_span_exporter); // fetch the exporter for dumping data later - memory_span_exporter = dynamic_cast(exporter2.get()); auto processor2 = std::unique_ptr( new trace_sdk::SimpleSpanProcessor(std::move(exporter2))); @@ -44,6 +42,8 @@ void initTracer() provider->AddProcessor(std::move(processor2)); // Set the global trace provider trace_api::Provider::SetTracerProvider(std::move(provider)); + + return memory_span_exporter; } void dumpSpans(std::vector> &spans) @@ -81,7 +81,7 @@ void dumpSpans(std::vector> &spans) int main() { // Removing this line will leave the default noop TracerProvider in place. - initTracer(); + InMemorySpanExporter *memory_span_exporter = initTracer(); foo_library(); auto memory_spans = memory_span_exporter->GetData()->GetSpans(); diff --git a/exporters/etw/include/opentelemetry/exporters/etw/etw_logger.h b/exporters/etw/include/opentelemetry/exporters/etw/etw_logger.h index 6f3a394b0d..84f6b6970f 100644 --- a/exporters/etw/include/opentelemetry/exporters/etw/etw_logger.h +++ b/exporters/etw/include/opentelemetry/exporters/etw/etw_logger.h @@ -110,7 +110,7 @@ class Logger : public opentelemetry::logs::Logger common::SystemTimestamp timestamp) noexcept override { -# ifdef RTTI_ENABLED +# ifdef OPENTELEMETRY_RTTI_ENABLED common::KeyValueIterable &attribs = const_cast(attributes); Properties *evt = dynamic_cast(&attribs); // Properties *res = dynamic_cast(&resr); diff --git a/exporters/etw/include/opentelemetry/exporters/etw/etw_tracer.h b/exporters/etw/include/opentelemetry/exporters/etw/etw_tracer.h index a946e70a6f..65fe2770f2 100644 --- a/exporters/etw/include/opentelemetry/exporters/etw/etw_tracer.h +++ b/exporters/etw/include/opentelemetry/exporters/etw/etw_tracer.h @@ -377,7 +377,7 @@ class Tracer : public opentelemetry::trace::Tracer const opentelemetry::trace::SpanContextKeyValueIterable &links, const opentelemetry::trace::StartSpanOptions &options = {}) noexcept override { -#ifdef RTTI_ENABLED +#ifdef OPENTELEMETRY_RTTI_ENABLED common::KeyValueIterable &attribs = const_cast(attributes); Properties *evt = dynamic_cast(&attribs); if (evt != nullptr) @@ -531,7 +531,7 @@ class Tracer : public opentelemetry::trace::Tracer common::SystemTimestamp timestamp, const common::KeyValueIterable &attributes) noexcept { -#ifdef RTTI_ENABLED +#ifdef OPENTELEMETRY_RTTI_ENABLED common::KeyValueIterable &attribs = const_cast(attributes); Properties *evt = dynamic_cast(&attribs); if (evt != nullptr) diff --git a/exporters/etw/include/opentelemetry/exporters/etw/utils.h b/exporters/etw/include/opentelemetry/exporters/etw/utils.h index f1f2898954..8b0a015821 100644 --- a/exporters/etw/include/opentelemetry/exporters/etw/utils.h +++ b/exporters/etw/include/opentelemetry/exporters/etw/utils.h @@ -12,6 +12,7 @@ #include #include +#include "opentelemetry/common/macros.h" #include "opentelemetry/exporters/etw/uuid.h" #include "opentelemetry/version.h" @@ -25,22 +26,6 @@ # pragma comment(lib, "Ole32.Lib") #endif -#ifndef RTTI_ENABLED -# if defined(__clang__) -# if __has_feature(cxx_rtti) -# define RTTI_ENABLED -# endif -# elif defined(__GNUG__) -# if defined(__GXX_RTTI) -# define RTTI_ENABLED -# endif -# elif defined(_MSC_VER) -# if defined(_CPPRTTI) -# define RTTI_ENABLED -# endif -# endif -#endif - OPENTELEMETRY_BEGIN_NAMESPACE namespace utils diff --git a/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_exporter.h b/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_exporter.h index 3e47ccb177..28b7bc34e8 100644 --- a/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_exporter.h +++ b/exporters/memory/include/opentelemetry/exporters/memory/in_memory_span_exporter.h @@ -54,7 +54,7 @@ class InMemorySpanExporter final : public opentelemetry::sdk::trace::SpanExporte for (auto &recordable : recordables) { auto span = std::unique_ptr( - dynamic_cast(recordable.release())); + static_cast(recordable.release())); if (span != nullptr) { data_->Add(std::move(span)); diff --git a/sdk/include/opentelemetry/sdk/_metrics/controller.h b/sdk/include/opentelemetry/sdk/_metrics/controller.h index 9d80787bcd..66a57a2efa 100644 --- a/sdk/include/opentelemetry/sdk/_metrics/controller.h +++ b/sdk/include/opentelemetry/sdk/_metrics/controller.h @@ -9,7 +9,9 @@ # include # include # include + # include "opentelemetry/_metrics/instrument.h" +# include "opentelemetry/common/macros.h" # include "opentelemetry/nostd/unique_ptr.h" # include "opentelemetry/sdk/_metrics/exporter.h" # include "opentelemetry/sdk/_metrics/meter.h" @@ -120,7 +122,11 @@ class PushController void tick() { this->mu_.lock(); +# ifdef OPENTELEMETRY_RTTI_ENABLED std::vector collected = dynamic_cast(meter_.get())->Collect(); +# else + std::vector collected = static_cast(meter_.get())->Collect(); +# endif for (const auto &rec : collected) { processor_->process(rec); diff --git a/sdk/include/opentelemetry/sdk/_metrics/sync_instruments.h b/sdk/include/opentelemetry/sdk/_metrics/sync_instruments.h index 46274571af..80d9b6092d 100644 --- a/sdk/include/opentelemetry/sdk/_metrics/sync_instruments.h +++ b/sdk/include/opentelemetry/sdk/_metrics/sync_instruments.h @@ -9,7 +9,9 @@ # include # include # include + # include "opentelemetry/_metrics/sync_instruments.h" +# include "opentelemetry/common/macros.h" # include "opentelemetry/sdk/_metrics/aggregator/counter_aggregator.h" # include "opentelemetry/sdk/_metrics/aggregator/min_max_sum_count_aggregator.h" # include "opentelemetry/sdk/_metrics/instrument.h" @@ -156,7 +158,11 @@ class Counter final : public SynchronousInstrument, public opentelemetry::met { toDelete.push_back(x.first); } +# ifdef OPENTELEMETRY_RTTI_ENABLED auto agg_ptr = dynamic_cast *>(x.second.get())->GetAggregator(); +# else + auto agg_ptr = static_cast *>(x.second.get())->GetAggregator(); +# endif if (agg_ptr->is_updated()) { agg_ptr->checkpoint(); @@ -287,7 +293,11 @@ class UpDownCounter final : public SynchronousInstrument, { toDelete.push_back(x.first); } +# ifdef OPENTELEMETRY_RTTI_ENABLED auto agg_ptr = dynamic_cast *>(x.second.get())->GetAggregator(); +# else + auto agg_ptr = static_cast *>(x.second.get())->GetAggregator(); +# endif if (agg_ptr->is_updated()) { agg_ptr->checkpoint(); @@ -417,7 +427,11 @@ class ValueRecorder final : public SynchronousInstrument, { toDelete.push_back(x.first); } +# ifdef OPENTELEMETRY_RTTI_ENABLED auto agg_ptr = dynamic_cast *>(x.second.get())->GetAggregator(); +# else + auto agg_ptr = static_cast *>(x.second.get())->GetAggregator(); +# endif if (agg_ptr->is_updated()) { agg_ptr->checkpoint(); diff --git a/sdk/include/opentelemetry/sdk/_metrics/ungrouped_processor.h b/sdk/include/opentelemetry/sdk/_metrics/ungrouped_processor.h index 5894144c7f..cc13ae52b6 100644 --- a/sdk/include/opentelemetry/sdk/_metrics/ungrouped_processor.h +++ b/sdk/include/opentelemetry/sdk/_metrics/ungrouped_processor.h @@ -5,6 +5,8 @@ #ifdef ENABLE_METRICS_PREVIEW # include + +# include "opentelemetry/common/macros.h" # include "opentelemetry/sdk/_metrics/aggregator/counter_aggregator.h" # include "opentelemetry/sdk/_metrics/aggregator/exact_aggregator.h" # include "opentelemetry/sdk/_metrics/aggregator/gauge_aggregator.h" @@ -216,12 +218,19 @@ class UngroupedMetricsProcessor : public MetricsProcessor auto agg_kind = batch_agg->get_aggregator_kind(); if (agg_kind == opentelemetry::sdk::metrics::AggregatorKind::Counter) { +# ifdef OPENTELEMETRY_RTTI_ENABLED std::shared_ptr> temp_batch_agg_counter = std::dynamic_pointer_cast>(batch_agg); std::shared_ptr> temp_record_agg_counter = std::dynamic_pointer_cast>(record_agg); +# else + std::shared_ptr> temp_batch_agg_counter = + std::static_pointer_cast>(batch_agg); + std::shared_ptr> temp_record_agg_counter = + std::static_pointer_cast>(record_agg); +# endif auto temp_batch_agg_raw_counter = temp_batch_agg_counter.get(); auto temp_record_agg_raw_counter = temp_record_agg_counter.get(); @@ -229,6 +238,7 @@ class UngroupedMetricsProcessor : public MetricsProcessor } else if (agg_kind == opentelemetry::sdk::metrics::AggregatorKind::MinMaxSumCount) { +# ifdef OPENTELEMETRY_RTTI_ENABLED std::shared_ptr> temp_batch_agg_mmsc = std::dynamic_pointer_cast>( @@ -238,6 +248,17 @@ class UngroupedMetricsProcessor : public MetricsProcessor temp_record_agg_mmsc = std::dynamic_pointer_cast>( record_agg); +# else + std::shared_ptr> + temp_batch_agg_mmsc = + std::static_pointer_cast>( + batch_agg); + + std::shared_ptr> + temp_record_agg_mmsc = + std::static_pointer_cast>( + record_agg); +# endif auto temp_batch_agg_raw_mmsc = temp_batch_agg_mmsc.get(); auto temp_record_agg_raw_mmsc = temp_record_agg_mmsc.get(); @@ -246,11 +267,19 @@ class UngroupedMetricsProcessor : public MetricsProcessor } else if (agg_kind == opentelemetry::sdk::metrics::AggregatorKind::Gauge) { +# ifdef OPENTELEMETRY_RTTI_ENABLED std::shared_ptr> temp_batch_agg_gauge = std::dynamic_pointer_cast>(batch_agg); std::shared_ptr> temp_record_agg_gauge = std::dynamic_pointer_cast>(record_agg); +# else + std::shared_ptr> temp_batch_agg_gauge = + std::static_pointer_cast>(batch_agg); + + std::shared_ptr> temp_record_agg_gauge = + std::static_pointer_cast>(record_agg); +# endif auto temp_batch_agg_raw_gauge = temp_batch_agg_gauge.get(); auto temp_record_agg_raw_gauge = temp_record_agg_gauge.get(); @@ -259,12 +288,19 @@ class UngroupedMetricsProcessor : public MetricsProcessor } else if (agg_kind == opentelemetry::sdk::metrics::AggregatorKind::Sketch) { +# ifdef OPENTELEMETRY_RTTI_ENABLED std::shared_ptr> temp_batch_agg_sketch = std::dynamic_pointer_cast>(batch_agg); std::shared_ptr> temp_record_agg_sketch = std::dynamic_pointer_cast>(record_agg); +# else + std::shared_ptr> temp_batch_agg_sketch = + std::static_pointer_cast>(batch_agg); + std::shared_ptr> temp_record_agg_sketch = + std::static_pointer_cast>(record_agg); +# endif auto temp_batch_agg_raw_sketch = temp_batch_agg_sketch.get(); auto temp_record_agg_raw_sketch = temp_record_agg_sketch.get(); @@ -272,6 +308,7 @@ class UngroupedMetricsProcessor : public MetricsProcessor } else if (agg_kind == opentelemetry::sdk::metrics::AggregatorKind::Histogram) { +# ifdef OPENTELEMETRY_RTTI_ENABLED std::shared_ptr> temp_batch_agg_histogram = std::dynamic_pointer_cast>( @@ -281,6 +318,17 @@ class UngroupedMetricsProcessor : public MetricsProcessor temp_record_agg_histogram = std::dynamic_pointer_cast>( record_agg); +# else + std::shared_ptr> + temp_batch_agg_histogram = + std::static_pointer_cast>( + batch_agg); + + std::shared_ptr> + temp_record_agg_histogram = + std::static_pointer_cast>( + record_agg); +# endif auto temp_batch_agg_raw_histogram = temp_batch_agg_histogram.get(); auto temp_record_agg_raw_histogram = temp_record_agg_histogram.get(); @@ -289,11 +337,19 @@ class UngroupedMetricsProcessor : public MetricsProcessor } else if (agg_kind == opentelemetry::sdk::metrics::AggregatorKind::Exact) { +# ifdef OPENTELEMETRY_RTTI_ENABLED std::shared_ptr> temp_batch_agg_exact = std::dynamic_pointer_cast>(batch_agg); std::shared_ptr> temp_record_agg_exact = std::dynamic_pointer_cast>(record_agg); +# else + std::shared_ptr> temp_batch_agg_exact = + std::static_pointer_cast>(batch_agg); + + std::shared_ptr> temp_record_agg_exact = + std::static_pointer_cast>(record_agg); +# endif auto temp_batch_agg_raw_exact = temp_batch_agg_exact.get(); auto temp_record_agg_raw_exact = temp_record_agg_exact.get(); diff --git a/sdk/src/_metrics/meter.cc b/sdk/src/_metrics/meter.cc index 5207865b9c..f48eccfbd6 100644 --- a/sdk/src/_metrics/meter.cc +++ b/sdk/src/_metrics/meter.cc @@ -2,7 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 #ifdef ENABLE_METRICS_PREVIEW + # include "opentelemetry/sdk/_metrics/meter.h" +# include "opentelemetry/common/macros.h" namespace metrics_api = opentelemetry::metrics; @@ -664,7 +666,11 @@ void Meter::CollectSingleSyncInstrument( i++; return; } - auto cast_ptr = std::dynamic_pointer_cast>(i->second); +# ifdef OPENTELEMETRY_RTTI_ENABLED + auto cast_ptr = std::dynamic_pointer_cast>(i->second); +# else + auto cast_ptr = std::static_pointer_cast>(i->second); +# endif std::vector new_records = cast_ptr->GetRecords(); records.insert(records.begin(), new_records.begin(), new_records.end()); } @@ -734,7 +740,11 @@ void Meter::CollectSingleAsyncInstrument( i++; return; } - auto cast_ptr = std::dynamic_pointer_cast>(i->second); +# ifdef OPENTELEMETRY_RTTI_ENABLED + auto cast_ptr = std::dynamic_pointer_cast>(i->second); +# else + auto cast_ptr = std::static_pointer_cast>(i->second); +# endif std::vector new_records = cast_ptr->GetRecords(); records.insert(records.begin(), new_records.begin(), new_records.end()); } diff --git a/sdk/test/_metrics/metric_instrument_test.cc b/sdk/test/_metrics/metric_instrument_test.cc index 089baf1211..28df53fc32 100644 --- a/sdk/test/_metrics/metric_instrument_test.cc +++ b/sdk/test/_metrics/metric_instrument_test.cc @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 #ifdef ENABLE_METRICS_PREVIEW + # include # include # include @@ -9,11 +10,19 @@ # include # include # include + +# include "opentelemetry/common/macros.h" # include "opentelemetry/sdk/_metrics/async_instruments.h" # include "opentelemetry/sdk/_metrics/sync_instruments.h" namespace metrics_api = opentelemetry::metrics; +# ifdef OPENTELEMETRY_RTTI_ENABLED +# define METRICS_TEST_TYPE_CAST(TO, FROM) dynamic_cast(FROM) +# else +# define METRICS_TEST_TYPE_CAST(TO, FROM) static_cast(FROM) +# endif + OPENTELEMETRY_BEGIN_NAMESPACE namespace sdk { @@ -37,12 +46,15 @@ TEST(ApiSdkConversion, async) auto labelkv = common::KeyValueIterableView{labels}; alpha->observe(123456, labelkv); - EXPECT_EQ(dynamic_cast *>(alpha.get())->GetRecords()[0].GetLabels(), + EXPECT_EQ(METRICS_TEST_TYPE_CAST(AsynchronousInstrument *, alpha.get()) + ->GetRecords()[0] + .GetLabels(), "{key587:value264}"); alpha->observe(123456, labelkv); - AggregatorVariant canCollect = - dynamic_cast *>(alpha.get())->GetRecords()[0].GetAggregator(); + AggregatorVariant canCollect = METRICS_TEST_TYPE_CAST(AsynchronousInstrument *, alpha.get()) + ->GetRecords()[0] + .GetAggregator(); EXPECT_EQ(nostd::holds_alternative>>(canCollect), false); EXPECT_EQ(nostd::holds_alternative>>(canCollect), true); EXPECT_EQ(nostd::get>>(canCollect)->get_checkpoint()[0], 123456); @@ -292,11 +304,13 @@ TEST(Counter, StressAdd) second.join(); third.join(); - EXPECT_EQ(dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv)].get()) + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundCounter *, + alpha->boundInstruments_[KvToString(labelkv)].get()) ->GetAggregator() ->get_values()[0], 2000); - EXPECT_EQ(dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv1)].get()) + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundCounter *, + alpha->boundInstruments_[KvToString(labelkv1)].get()) ->GetAggregator() ->get_values()[0], 3000); @@ -343,16 +357,16 @@ TEST(IntUpDownCounter, StressAdd) third.join(); fourth.join(); - EXPECT_EQ( - dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv)].get()) - ->GetAggregator() - ->get_values()[0], - 12340 * 2); - EXPECT_EQ( - dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv1)].get()) - ->GetAggregator() - ->get_values()[0], - 56780 - 12340); + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundUpDownCounter *, + alpha->boundInstruments_[KvToString(labelkv)].get()) + ->GetAggregator() + ->get_values()[0], + 12340 * 2); + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundUpDownCounter *, + alpha->boundInstruments_[KvToString(labelkv1)].get()) + ->GetAggregator() + ->get_values()[0], + 56780 - 12340); } void RecorderCallback(std::shared_ptr> in, @@ -396,47 +410,47 @@ TEST(IntValueRecorder, StressRecord) third.join(); fourth.join(); - EXPECT_EQ( - dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv)].get()) - ->GetAggregator() - ->get_values()[0], - 0); // min - EXPECT_EQ( - dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv)].get()) - ->GetAggregator() - ->get_values()[1], - 49); // max - EXPECT_EQ( - dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv)].get()) - ->GetAggregator() - ->get_values()[2], - 1525); // sum - EXPECT_EQ( - dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv)].get()) - ->GetAggregator() - ->get_values()[3], - 75); // count - - EXPECT_EQ( - dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv1)].get()) - ->GetAggregator() - ->get_values()[0], - -99); // min - EXPECT_EQ( - dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv1)].get()) - ->GetAggregator() - ->get_values()[1], - 24); // max - EXPECT_EQ( - dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv1)].get()) - ->GetAggregator() - ->get_values()[2], - -4650); // sum - EXPECT_EQ( - dynamic_cast *>(alpha->boundInstruments_[KvToString(labelkv1)].get()) - ->GetAggregator() - ->get_values()[3], - 125); // count + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundValueRecorder *, + alpha->boundInstruments_[KvToString(labelkv)].get()) + ->GetAggregator() + ->get_values()[0], + 0); // min + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundValueRecorder *, + alpha->boundInstruments_[KvToString(labelkv)].get()) + ->GetAggregator() + ->get_values()[1], + 49); // max + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundValueRecorder *, + alpha->boundInstruments_[KvToString(labelkv)].get()) + ->GetAggregator() + ->get_values()[2], + 1525); // sum + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundValueRecorder *, + alpha->boundInstruments_[KvToString(labelkv)].get()) + ->GetAggregator() + ->get_values()[3], + 75); // count + + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundValueRecorder *, + alpha->boundInstruments_[KvToString(labelkv1)].get()) + ->GetAggregator() + ->get_values()[0], + -99); // min + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundValueRecorder *, + alpha->boundInstruments_[KvToString(labelkv1)].get()) + ->GetAggregator() + ->get_values()[1], + 24); // max + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundValueRecorder *, + alpha->boundInstruments_[KvToString(labelkv1)].get()) + ->GetAggregator() + ->get_values()[2], + -4650); // sum + EXPECT_EQ(METRICS_TEST_TYPE_CAST(BoundValueRecorder *, + alpha->boundInstruments_[KvToString(labelkv1)].get()) + ->GetAggregator() + ->get_values()[3], + 125); // count } TEST(Instruments, NoUpdateNoRecord) diff --git a/sdk/test/metrics/meter_provider_sdk_test.cc b/sdk/test/metrics/meter_provider_sdk_test.cc index 3c059cc44c..4a2792c3a7 100644 --- a/sdk/test/metrics/meter_provider_sdk_test.cc +++ b/sdk/test/metrics/meter_provider_sdk_test.cc @@ -68,7 +68,7 @@ TEST(MeterProvider, GetMeter) ASSERT_NE(m3, m6); // Should be an sdk::trace::Tracer with the processor attached. -# ifdef RTTI_ENABLED +# ifdef OPENTELEMETRY_RTTI_ENABLED auto sdkMeter1 = dynamic_cast(m1.get()); # else auto sdkMeter1 = static_cast(m1.get()); diff --git a/sdk/test/trace/tracer_provider_test.cc b/sdk/test/trace/tracer_provider_test.cc index d72d6bd40f..498f66127d 100644 --- a/sdk/test/trace/tracer_provider_test.cc +++ b/sdk/test/trace/tracer_provider_test.cc @@ -39,7 +39,7 @@ TEST(TracerProvider, GetTracer) ASSERT_NE(t3, t6); // Should be an sdk::trace::Tracer with the processor attached. -#ifdef RTTI_ENABLED +#ifdef OPENTELEMETRY_RTTI_ENABLED auto sdkTracer1 = dynamic_cast(t1.get()); #else auto sdkTracer1 = static_cast(t1.get()); @@ -53,7 +53,7 @@ TEST(TracerProvider, GetTracer) std::make_shared(std::move(processors2), Resource::Create({}), std::unique_ptr(new AlwaysOffSampler()), std::unique_ptr(new RandomIdGenerator))); -#ifdef RTTI_ENABLED +#ifdef OPENTELEMETRY_RTTI_ENABLED auto sdkTracer2 = dynamic_cast(tp2.GetTracer("test").get()); #else auto sdkTracer2 = static_cast(tp2.GetTracer("test").get()); @@ -65,7 +65,7 @@ TEST(TracerProvider, GetTracer) ASSERT_EQ(instrumentation_library1.GetVersion(), ""); // Should be an sdk::trace::Tracer with the processor attached. -#ifdef RTTI_ENABLED +#ifdef OPENTELEMETRY_RTTI_ENABLED auto sdkTracer3 = dynamic_cast(t3.get()); #else auto sdkTracer3 = static_cast(t3.get()); diff --git a/sdk/test/trace/tracer_test.cc b/sdk/test/trace/tracer_test.cc index dc806b079f..15a7566b9b 100644 --- a/sdk/test/trace/tracer_test.cc +++ b/sdk/test/trace/tracer_test.cc @@ -347,7 +347,7 @@ TEST(Tracer, GetSampler) // Create a Tracer with a default AlwaysOnSampler auto tracer_on = initTracer(nullptr); -#ifdef RTTI_ENABLED +#ifdef OPENTELEMETRY_RTTI_ENABLED auto &t1 = std::dynamic_pointer_cast(tracer_on)->GetSampler(); #else auto &t1 = std::static_pointer_cast(tracer_on)->GetSampler(); @@ -357,7 +357,7 @@ TEST(Tracer, GetSampler) // Create a Tracer with a AlwaysOffSampler auto tracer_off = initTracer(nullptr, new AlwaysOffSampler()); -#ifdef RTTI_ENABLED +#ifdef OPENTELEMETRY_RTTI_ENABLED auto &t2 = std::dynamic_pointer_cast(tracer_off)->GetSampler(); #else auto &t2 = std::static_pointer_cast(tracer_off)->GetSampler(); From 3122254e8238738d74f78130817b090a8fdc0a9a Mon Sep 17 00:00:00 2001 From: Ben Landrum <71329856+benlandrum@users.noreply.github.com> Date: Thu, 7 Apr 2022 13:02:11 -0400 Subject: [PATCH 19/35] Remove implicitly deleted default constructor (#1267) Co-authored-by: Tom Tan Co-authored-by: Lalit Kumar Bhasin --- api/include/opentelemetry/context/runtime_context.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/api/include/opentelemetry/context/runtime_context.h b/api/include/opentelemetry/context/runtime_context.h index fbcf425c2c..74fa2151ea 100644 --- a/api/include/opentelemetry/context/runtime_context.h +++ b/api/include/opentelemetry/context/runtime_context.h @@ -22,8 +22,6 @@ class Token private: friend class RuntimeContextStorage; - Token() noexcept = default; - // A constructor that sets the token's Context object to the // one that was passed in. Token(const Context &context) : context_(context) {} From d72dcb69b07ffe773e490ee797126357480b9cb0 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Mon, 11 Apr 2022 00:45:36 -0700 Subject: [PATCH 20/35] [ETW Exporter] - ETW provider handle cleanup (#1322) --- .../include/opentelemetry/exporters/etw/etw_provider.h | 8 ++++++-- exporters/etw/test/etw_provider_test.cc | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/exporters/etw/include/opentelemetry/exporters/etw/etw_provider.h b/exporters/etw/include/opentelemetry/exporters/etw/etw_provider.h index 5b00f05574..51cca03a60 100644 --- a/exporters/etw/include/opentelemetry/exporters/etw/etw_provider.h +++ b/exporters/etw/include/opentelemetry/exporters/etw/etw_provider.h @@ -203,7 +203,8 @@ class ETWProvider { std::lock_guard lock(m_providerMapLock); - auto m = providers(); + // use reference to provider list, NOT it' copy. + auto &m = providers(); auto it = m.begin(); while (it != m.end()) { @@ -228,7 +229,10 @@ class ETWProvider } it->second.providerHandle = INVALID_HANDLE; - m.erase(it); + if (result == STATUS_OK) + { + m.erase(it); + } } return result; } diff --git a/exporters/etw/test/etw_provider_test.cc b/exporters/etw/test/etw_provider_test.cc index 433630270f..d5ebbcad43 100644 --- a/exporters/etw/test/etw_provider_test.cc +++ b/exporters/etw/test/etw_provider_test.cc @@ -18,6 +18,7 @@ TEST(ETWProvider, ProviderIsRegisteredSuccessfully) bool registered = etw.is_registered(providerName); ASSERT_TRUE(registered); + etw.close(handle); } TEST(ETWProvider, ProviderIsNotRegisteredSuccessfully) @@ -46,6 +47,7 @@ TEST(ETWProvider, CheckOpenGUIDDataSuccessfully) auto guidStrName = uuid_name.to_string(); ASSERT_STREQ(guidStrHandle.c_str(), guidStrName.c_str()); + etw.close(handle); } TEST(ETWProvider, CheckCloseSuccess) @@ -53,10 +55,10 @@ TEST(ETWProvider, CheckCloseSuccess) std::string providerName = "OpenTelemetry-ETW-Provider"; static ETWProvider etw; - auto handle = etw.open(providerName.c_str()); - + auto handle = etw.open(providerName.c_str(), ETWProvider::EventFormat::ETW_MANIFEST); auto result = etw.close(handle); ASSERT_NE(result, etw.STATUS_ERROR); + ASSERT_FALSE(etw.is_registered(providerName)); } #endif From e200c1f183ab1340448b0992e96054f5aa591f46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Apr 2022 07:55:15 -0700 Subject: [PATCH 21/35] Bump actions/stale from 4 to 5 (#1323) --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index e55a93d08d..ff3e02df62 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -7,7 +7,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v4 + - uses: actions/stale@v5 with: stale-issue-message: 'This issue was marked as stale due to lack of activity. It will be closed in 7 days if no furthur activity occurs.' close-issue-message: 'Closed as inactive. Feel free to reopen if this is still an issue.' From 755f109a0d44f277da33145af1e285da624b3fd8 Mon Sep 17 00:00:00 2001 From: Ehsan Saei <71217171+esigo@users.noreply.github.com> Date: Tue, 12 Apr 2022 20:12:21 +0200 Subject: [PATCH 22/35] ostream metrics example (#1312) --- examples/common/metrics_foo_library/BUILD | 17 ++ .../common/metrics_foo_library/foo_library.cc | 25 ++ .../common/metrics_foo_library/foo_library.h | 9 + examples/metrics_simple/BUILD | 15 + examples/metrics_simple/metrics_ostream.cc | 65 ++++ exporters/ostream/BUILD | 59 ++-- .../exporters/ostream/metric_exporter.h | 10 +- exporters/ostream/src/metric_exporter.cc | 88 +++--- exporters/ostream/test/ostream_metric_test.cc | 278 ++++++++++-------- .../sdk/metrics/metric_exporter.h | 1 + .../sdk/metrics/view/instrument_selector.h | 2 +- 11 files changed, 382 insertions(+), 187 deletions(-) create mode 100644 examples/common/metrics_foo_library/BUILD create mode 100644 examples/common/metrics_foo_library/foo_library.cc create mode 100644 examples/common/metrics_foo_library/foo_library.h create mode 100644 examples/metrics_simple/metrics_ostream.cc diff --git a/examples/common/metrics_foo_library/BUILD b/examples/common/metrics_foo_library/BUILD new file mode 100644 index 0000000000..bc84949732 --- /dev/null +++ b/examples/common/metrics_foo_library/BUILD @@ -0,0 +1,17 @@ +package(default_visibility = ["//visibility:public"]) + +cc_library( + name = "common_metrics_foo_library", + srcs = [ + "foo_library.cc", + ], + hdrs = [ + "foo_library.h", + ], + defines = ["BAZEL_BUILD"], + deps = [ + "//api", + "//sdk:headers", + "//sdk/src/metrics", + ], +) diff --git a/examples/common/metrics_foo_library/foo_library.cc b/examples/common/metrics_foo_library/foo_library.cc new file mode 100644 index 0000000000..344f51c082 --- /dev/null +++ b/examples/common/metrics_foo_library/foo_library.cc @@ -0,0 +1,25 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef ENABLE_METRICS_PREVIEW +# include +# include +# include "opentelemetry/metrics/provider.h" + +namespace nostd = opentelemetry::nostd; +namespace metrics_api = opentelemetry::metrics; + +void foo_library(const std::string &name) +{ + // Get the Meter from the MeterProvider + auto provider = metrics_api::Provider::GetMeterProvider(); + nostd::shared_ptr meter = provider->GetMeter(name, "1.2.0"); + auto double_counter = meter->CreateDoubleCounter(name); + double_counter->Add(28.5); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + double_counter->Add(3.14); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + double_counter->Add(23.5); + std::this_thread::sleep_for(std::chrono::milliseconds(5000)); +} +#endif diff --git a/examples/common/metrics_foo_library/foo_library.h b/examples/common/metrics_foo_library/foo_library.h new file mode 100644 index 0000000000..662646a6a4 --- /dev/null +++ b/examples/common/metrics_foo_library/foo_library.h @@ -0,0 +1,9 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once +#ifndef ENABLE_METRICS_PREVIEW +# include + +void foo_library(const std::string &name); +#endif diff --git a/examples/metrics_simple/BUILD b/examples/metrics_simple/BUILD index b845a2f890..95d6490ba2 100644 --- a/examples/metrics_simple/BUILD +++ b/examples/metrics_simple/BUILD @@ -11,3 +11,18 @@ cc_binary( "//sdk/src/_metrics:metrics_deprecated", ], ) + +cc_binary( + name = "metrics_ostream_example", + srcs = [ + "metrics_ostream.cc", + ], + linkopts = ["-pthread"], + tags = ["ostream"], + deps = [ + "//api", + "//examples/common/metrics_foo_library:common_metrics_foo_library", + "//exporters/ostream:ostream_metric_exporter", + "//sdk/src/metrics", + ], +) diff --git a/examples/metrics_simple/metrics_ostream.cc b/examples/metrics_simple/metrics_ostream.cc new file mode 100644 index 0000000000..9fae5f07b7 --- /dev/null +++ b/examples/metrics_simple/metrics_ostream.cc @@ -0,0 +1,65 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef ENABLE_METRICS_PREVIEW +# include +# include "opentelemetry/exporters/ostream/metric_exporter.h" +# include "opentelemetry/metrics/provider.h" +# include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" +# include "opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h" +# include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h" +# include "opentelemetry/sdk/metrics/meter.h" +# include "opentelemetry/sdk/metrics/meter_provider.h" + +# ifdef BAZEL_BUILD +# include "examples/common/metrics_foo_library/foo_library.h" +# else +# include "metrics_foo_library/foo_library.h" +# endif + +namespace metric_sdk = opentelemetry::sdk::metrics; +namespace nostd = opentelemetry::nostd; +namespace common = opentelemetry::common; +namespace exportermetrics = opentelemetry::exporter::metrics; +namespace metrics_api = opentelemetry::metrics; + +namespace +{ + +void initMetrics(const std::string &name) +{ + std::unique_ptr exporter{new exportermetrics::OStreamMetricExporter}; + std::vector> exporters; + + std::string version{"1.2.0"}; + std::string schema{"https://opentelemetry.io/schemas/1.2.0"}; + + // Initialize and set the global MeterProvider + metric_sdk::PeriodicExportingMetricReaderOptions options; + options.export_interval_millis = std::chrono::milliseconds(1000); + options.export_timeout_millis = std::chrono::milliseconds(500); + std::unique_ptr reader{ + new metric_sdk::PeriodicExportingMetricReader(std::move(exporter), options)}; + auto provider = std::shared_ptr( + new metric_sdk::MeterProvider(std::move(exporters))); + auto p = std::static_pointer_cast(provider); + p->AddMetricReader(std::move(reader)); + std::unique_ptr instrument_selector{ + new metric_sdk::InstrumentSelector(metric_sdk::InstrumentType::kCounter, name)}; + std::unique_ptr meter_selector{ + new metric_sdk::MeterSelector(name, version, schema)}; + std::unique_ptr view{ + new metric_sdk::View{name, "description", metric_sdk::AggregationType::kSum}}; + p->AddView(std::move(instrument_selector), std::move(meter_selector), std::move(view)); + metrics_api::Provider::SetMeterProvider(provider); +} +} // namespace +int main() +{ + std::string name{"ostream_metric_example"}; + initMetrics(name); + foo_library(name); +} +#else +int main() {} +#endif diff --git a/exporters/ostream/BUILD b/exporters/ostream/BUILD index f74d896344..cca74d6693 100644 --- a/exporters/ostream/BUILD +++ b/exporters/ostream/BUILD @@ -43,37 +43,36 @@ cc_library( ], ) -# TODO - Uncomment once MetricData interface is finalised -#cc_library( -# name = "ostream_metric_exporter", -# srcs = [ -# "src/metric_exporter.cc", -# ], -# hdrs = [ -# "include/opentelemetry/exporters/ostream/metric_exporter.h", -# ], -# strip_include_prefix = "include", -# tags = [ -# "metrics", -# "ostream", -# ], -# deps = [ -# "//sdk/src/metrics", -# ], -#) +cc_library( + name = "ostream_metric_exporter", + srcs = [ + "src/metric_exporter.cc", + ], + hdrs = [ + "include/opentelemetry/exporters/ostream/metric_exporter.h", + ], + strip_include_prefix = "include", + tags = [ + "metrics", + "ostream", + ], + deps = [ + "//sdk/src/metrics", + ], +) -#cc_test( -# name = "ostream_metric_test", -# srcs = ["test/ostream_metric_test.cc"], -# tags = [ -# "ostream", -# "test", -# ], -# deps = [ -# ":ostream_metric_exporter", -# "@com_google_googletest//:gtest_main", -# ], -#) +cc_test( + name = "ostream_metric_test", + srcs = ["test/ostream_metric_test.cc"], + tags = [ + "ostream", + "test", + ], + deps = [ + ":ostream_metric_exporter", + "@com_google_googletest//:gtest_main", + ], +) cc_test( name = "ostream_metrics_test_deprecated", diff --git a/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h b/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h index 5f27db13d2..465ae02bb6 100644 --- a/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h +++ b/exporters/ostream/include/opentelemetry/exporters/ostream/metric_exporter.h @@ -35,11 +35,9 @@ class OStreamMetricExporter final : public opentelemetry::sdk::metrics::MetricEx /** * Export - * @param records a span of unique pointers to metrics data + * @param data metrics data */ - sdk::common::ExportResult Export( - const nostd::span> &records) noexcept - override; + sdk::common::ExportResult Export(const sdk::metrics::ResourceMetrics &data) noexcept override; /** * Force flush the exporter. @@ -60,7 +58,9 @@ class OStreamMetricExporter final : public opentelemetry::sdk::metrics::MetricEx bool is_shutdown_ = false; mutable opentelemetry::common::SpinLockMutex lock_; bool isShutdown() const noexcept; - void printPointData(opentelemetry::sdk::metrics::PointType &point_data); + void printInstrumentationInfoMetricData( + const sdk::metrics::InstrumentationInfoMetrics &info_metrics); + void printPointData(const opentelemetry::sdk::metrics::PointType &point_data); }; } // namespace metrics } // namespace exporter diff --git a/exporters/ostream/src/metric_exporter.cc b/exporters/ostream/src/metric_exporter.cc index f8d26a7fa5..fad9e03d49 100644 --- a/exporters/ostream/src/metric_exporter.cc +++ b/exporters/ostream/src/metric_exporter.cc @@ -1,68 +1,90 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include #ifndef ENABLE_METRICS_PREVIEW -# include "opentelemetry/exporters/ostream/metric_exporter.h" # include +# include "opentelemetry/exporters/ostream/metric_exporter.h" # include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" # include "opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h" # include "opentelemetry/sdk_config.h" +namespace +{ +std::string timeToString(opentelemetry::common::SystemTimestamp time_stamp) +{ + std::time_t epoch_time = std::chrono::system_clock::to_time_t(time_stamp); + return std::ctime(&epoch_time); +} +} // namespace + OPENTELEMETRY_BEGIN_NAMESPACE namespace exporter { namespace metrics { +template +inline void printVec(std::ostream &os, Container &vec) +{ + using T = typename std::decay::type; + os << '['; + if (vec.size() > 1) + { + std::copy(vec.begin(), vec.end(), std::ostream_iterator(os, ", ")); + } + os << ']'; +} + OStreamMetricExporter::OStreamMetricExporter(std::ostream &sout) noexcept : sout_(sout) {} sdk::common::ExportResult OStreamMetricExporter::Export( - const nostd::span> &records) noexcept + const sdk::metrics::ResourceMetrics &data) noexcept { if (isShutdown()) { OTEL_INTERNAL_LOG_ERROR("[OStream Metric] Exporting " - << records.size() << " records(s) failed, exporter is shutdown"); + << data.instrumentation_info_metric_data_.size() + << " records(s) failed, exporter is shutdown"); return sdk::common::ExportResult::kFailure; } - for (auto &record : records) + for (auto &record : data.instrumentation_info_metric_data_) { - sout_ << "{" - << "\n name : " << record->instrumentation_library_->GetName() - << "\n version : " << record->instrumentation_library_->GetVersion(); - printPointData(record->point_data_); - sout_ << "\n}\n"; + printInstrumentationInfoMetricData(record); } return sdk::common::ExportResult::kSuccess; } -template -inline void printVec(std::ostream &os, std::vector &vec) +void OStreamMetricExporter::printInstrumentationInfoMetricData( + const sdk::metrics::InstrumentationInfoMetrics &info_metric) { - os << '['; - if (vec.size() > 1) - { - std::copy(vec.begin(), vec.end() - 1, std::ostream_iterator(os, ", ")); - } - if (!vec.empty()) + sout_ << "{"; + sout_ << "\n name\t\t: " << info_metric.instrumentation_library_->GetName() + << "\n schema url\t: " << info_metric.instrumentation_library_->GetSchemaURL() + << "\n version\t: " << info_metric.instrumentation_library_->GetVersion(); + for (const auto &record : info_metric.metric_data_) { - os << vec.back(); + sout_ << "\n start time\t: " << timeToString(record.start_ts) + << " end time\t: " << timeToString(record.end_ts) + << " description\t: " << record.instrument_descriptor.description_ + << "\n unit\t\t: " << record.instrument_descriptor.unit_; + + for (const auto &pd : record.point_data_attr_) + { + printPointData(pd.point_data); + } } - os << ']'; + sout_ << "\n}\n"; } -void OStreamMetricExporter::printPointData(opentelemetry::sdk::metrics::PointType &point_data) +void OStreamMetricExporter::printPointData(const opentelemetry::sdk::metrics::PointType &point_data) { if (nostd::holds_alternative(point_data)) { auto sum_point_data = nostd::get(point_data); - sout_ << "\n type : SumPointData"; - sout_ << "\n start timestamp : " - << std::to_string(sum_point_data.start_epoch_nanos_.time_since_epoch().count()); - sout_ << "\n end timestamp : " - << std::to_string(sum_point_data.end_epoch_nanos_.time_since_epoch().count()); - sout_ << "\n value : "; + sout_ << "\n type\t\t: SumPointData"; + sout_ << "\n value\t\t: "; if (nostd::holds_alternative(sum_point_data.value_)) { sout_ << nostd::get(sum_point_data.value_); @@ -76,8 +98,6 @@ void OStreamMetricExporter::printPointData(opentelemetry::sdk::metrics::PointTyp { auto histogram_point_data = nostd::get(point_data); sout_ << "\n type : HistogramPointData"; - sout_ << "\n timestamp : " - << std::to_string(histogram_point_data.epoch_nanos_.time_since_epoch().count()); sout_ << "\n count : " << histogram_point_data.count_; sout_ << "\n sum : "; if (nostd::holds_alternative(histogram_point_data.sum_)) @@ -90,14 +110,14 @@ void OStreamMetricExporter::printPointData(opentelemetry::sdk::metrics::PointTyp } sout_ << "\n buckets : "; - if (nostd::holds_alternative>(histogram_point_data.boundaries_)) + if (nostd::holds_alternative>(histogram_point_data.boundaries_)) { - auto &double_boundaries = nostd::get>(histogram_point_data.boundaries_); + auto &double_boundaries = nostd::get>(histogram_point_data.boundaries_); printVec(sout_, double_boundaries); } - else if (nostd::holds_alternative>(histogram_point_data.boundaries_)) + else if (nostd::holds_alternative>(histogram_point_data.boundaries_)) { - auto &long_boundaries = nostd::get>(histogram_point_data.boundaries_); + auto &long_boundaries = nostd::get>(histogram_point_data.boundaries_); printVec(sout_, long_boundaries); } @@ -109,8 +129,8 @@ void OStreamMetricExporter::printPointData(opentelemetry::sdk::metrics::PointTyp auto last_point_data = nostd::get(point_data); sout_ << "\n type : LastValuePointData"; sout_ << "\n timestamp : " - << std::to_string(last_point_data.epoch_nanos_.time_since_epoch().count()) - << std::boolalpha << "\n valid : " << last_point_data.is_lastvalue_valid_; + << std::to_string(last_point_data.sample_ts_.time_since_epoch().count()) << std::boolalpha + << "\n valid : " << last_point_data.is_lastvalue_valid_; sout_ << "\n value : "; if (nostd::holds_alternative(last_point_data.value_)) { diff --git a/exporters/ostream/test/ostream_metric_test.cc b/exporters/ostream/test/ostream_metric_test.cc index 9e98dd4da4..3618d93e7a 100644 --- a/exporters/ostream/test/ostream_metric_test.cc +++ b/exporters/ostream/test/ostream_metric_test.cc @@ -1,14 +1,19 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 - -#include #ifndef ENABLE_METRICS_PREVIEW +# include +# include +# include +# include "opentelemetry/sdk/metrics/instruments.h" +# include "opentelemetry/sdk/resource/resource_detector.h" + +# include # include "opentelemetry/exporters/ostream/metric_exporter.h" # include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" # include "opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h" - -# include +# include "opentelemetry/sdk/metrics/data/metric_data.h" +# include "opentelemetry/sdk/resource/resource.h" namespace metric_sdk = opentelemetry::sdk::metrics; namespace nostd = opentelemetry::nostd; @@ -19,7 +24,7 @@ TEST(OStreamMetricsExporter, Shutdown) auto exporter = std::unique_ptr(new exportermetrics::OStreamMetricExporter); ASSERT_TRUE(exporter->Shutdown()); - auto result = exporter->Export(nostd::span>{}); + auto result = exporter->Export(metric_sdk::ResourceMetrics{}); EXPECT_EQ(result, opentelemetry::sdk::common::ExportResult::kFailure); } @@ -28,48 +33,51 @@ TEST(OStreamMetricsExporter, ExportSumPointData) auto exporter = std::unique_ptr(new exportermetrics::OStreamMetricExporter); - std::unique_ptr record(new metric_sdk::MetricData); + metric_sdk::SumPointData sum_point_data{}; + sum_point_data.value_ = 10.0; + metric_sdk::SumPointData sum_point_data2{}; + sum_point_data2.value_ = 20.0; + metric_sdk::ResourceMetrics data; + auto resource = opentelemetry::sdk::resource::Resource::Create( + opentelemetry::sdk::resource::ResourceAttributes{}); + data.resource_ = &resource; auto instrumentation_library = opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary::Create("library_name", "1.2.0"); - record->instrumentation_library_ = instrumentation_library.get(); - record->point_data_ = metric_sdk::SumPointData{ - opentelemetry::common::SystemTimestamp{}, opentelemetry::common::SystemTimestamp{}, 10.0, - metric_sdk::AggregationTemporality::kUnspecified, false}; - auto record2 = std::unique_ptr(new metric_sdk::MetricData(*record)); - record2->point_data_ = metric_sdk::SumPointData{ - opentelemetry::common::SystemTimestamp{}, opentelemetry::common::SystemTimestamp{}, 20l, - metric_sdk::AggregationTemporality::kUnspecified, false}; - std::vector> records; - records.push_back(std::move(record)); - records.push_back(std::move(record2)); + metric_sdk::MetricData metric_data{ + metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", + metric_sdk::InstrumentType::kCounter, + metric_sdk::InstrumentValueType::kDouble}, + opentelemetry::common::SystemTimestamp{}, opentelemetry::common::SystemTimestamp{}, + std::vector{ + {metric_sdk::PointAttributes{}, sum_point_data}, + {metric_sdk::PointAttributes{}, sum_point_data2}}}; + data.instrumentation_info_metric_data_ = std::vector{ + {instrumentation_library.get(), std::vector{metric_data}}}; std::stringstream stdoutOutput; std::streambuf *sbuf = std::cout.rdbuf(); std::cout.rdbuf(stdoutOutput.rdbuf()); - auto result = exporter->Export(records); + auto result = exporter->Export(data); EXPECT_EQ(result, opentelemetry::sdk::common::ExportResult::kSuccess); std::cout.rdbuf(sbuf); - std::string expectedOutput = - "{\n" - " name : library_name\n" - " version : 1.2.0\n" - " type : SumPointData\n" - " start timestamp : 0\n" - " end timestamp : 0\n" - " value : 10\n" - "}\n" - "{\n" - " name : library_name\n" - " version : 1.2.0\n" - " type : SumPointData\n" - " start timestamp : 0\n" - " end timestamp : 0\n" - " value : 20\n" - "}\n"; - ASSERT_EQ(stdoutOutput.str(), expectedOutput); + std::string expected_output = + "{" + "\n name\t\t: library_name" + "\n schema url\t: " + "\n version\t: 1.2.0" + "\n start time\t: Thu Jan 1 00:00:00 1970" + "\n end time\t: Thu Jan 1 00:00:00 1970" + "\n description\t: description" + "\n unit\t\t: unit" + "\n type\t\t: SumPointData" + "\n value\t\t: 10" + "\n type\t\t: SumPointData" + "\n value\t\t: 20" + "\n}\n"; + ASSERT_EQ(stdoutOutput.str(), expected_output); } TEST(OStreamMetricsExporter, ExportHistogramPointData) @@ -77,56 +85,63 @@ TEST(OStreamMetricsExporter, ExportHistogramPointData) auto exporter = std::unique_ptr(new exportermetrics::OStreamMetricExporter); - std::unique_ptr record(new metric_sdk::MetricData); + metric_sdk::HistogramPointData histogram_point_data{}; + histogram_point_data.boundaries_ = std::list{10.1, 20.2, 30.2}; + histogram_point_data.count_ = 3; + histogram_point_data.counts_ = {200, 300, 400, 500}; + histogram_point_data.sum_ = 900.5; + metric_sdk::HistogramPointData histogram_point_data2{}; + histogram_point_data2.boundaries_ = std::list{10, 20, 30}; + histogram_point_data2.count_ = 3; + histogram_point_data2.counts_ = {200, 300, 400, 500}; + histogram_point_data2.sum_ = 900l; + metric_sdk::ResourceMetrics data; + auto resource = opentelemetry::sdk::resource::Resource::Create( + opentelemetry::sdk::resource::ResourceAttributes{}); + data.resource_ = &resource; auto instrumentation_library = opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary::Create("library_name", "1.2.0"); - record->instrumentation_library_ = instrumentation_library.get(); - record->point_data_ = metric_sdk::HistogramPointData{opentelemetry::common::SystemTimestamp{}, - std::vector{10.1, 20.2, 30.2}, - 900.5, - {200, 300, 400, 500}, - 3}; - auto record2 = std::unique_ptr(new metric_sdk::MetricData(*record)); - record2->point_data_ = metric_sdk::HistogramPointData{opentelemetry::common::SystemTimestamp{}, - std::vector{10, 20, 30}, - 900l, - {200, 300, 400, 500}, - 3}; - std::vector> records; - records.push_back(std::move(record)); - records.push_back(std::move(record2)); + metric_sdk::MetricData metric_data{ + metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", + metric_sdk::InstrumentType::kCounter, + metric_sdk::InstrumentValueType::kDouble}, + opentelemetry::common::SystemTimestamp{}, opentelemetry::common::SystemTimestamp{}, + std::vector{ + {metric_sdk::PointAttributes{}, histogram_point_data}, + {metric_sdk::PointAttributes{}, histogram_point_data2}}}; + data.instrumentation_info_metric_data_ = std::vector{ + {instrumentation_library.get(), std::vector{metric_data}}}; std::stringstream stdoutOutput; std::streambuf *sbuf = std::cout.rdbuf(); std::cout.rdbuf(stdoutOutput.rdbuf()); - auto result = exporter->Export(records); + auto result = exporter->Export(data); EXPECT_EQ(result, opentelemetry::sdk::common::ExportResult::kSuccess); std::cout.rdbuf(sbuf); - std::string expectedOutput = - "{\n" - " name : library_name\n" - " version : 1.2.0\n" - " type : HistogramPointData\n" - " timestamp : 0\n" - " count : 3\n" - " sum : 900.5\n" - " buckets : [10.1, 20.2, 30.2]\n" - " counts : [200, 300, 400, 500]\n" - "}\n" - "{\n" - " name : library_name\n" - " version : 1.2.0\n" - " type : HistogramPointData\n" - " timestamp : 0\n" - " count : 3\n" - " sum : 900\n" - " buckets : [10, 20, 30]\n" - " counts : [200, 300, 400, 500]\n" - "}\n"; - ASSERT_EQ(stdoutOutput.str(), expectedOutput); + std::string expected_output = + "{" + "\n name\t\t: library_name" + "\n schema url\t: " + "\n version\t: 1.2.0" + "\n start time\t: Thu Jan 1 00:00:00 1970" + "\n end time\t: Thu Jan 1 00:00:00 1970" + "\n description\t: description" + "\n unit\t\t: unit" + "\n type : HistogramPointData" + "\n count : 3" + "\n sum : 900.5" + "\n buckets : [10.1, 20.2, 30.2, ]" + "\n counts : [200, 300, 400, 500, ]" + "\n type : HistogramPointData" + "\n count : 3" + "\n sum : 900" + "\n buckets : [10, 20, 30, ]" + "\n counts : [200, 300, 400, 500, ]" + "\n}\n"; + ASSERT_EQ(stdoutOutput.str(), expected_output); } TEST(OStreamMetricsExporter, ExportLastValuePointData) @@ -134,46 +149,59 @@ TEST(OStreamMetricsExporter, ExportLastValuePointData) auto exporter = std::unique_ptr(new exportermetrics::OStreamMetricExporter); - std::unique_ptr record(new metric_sdk::MetricData); + metric_sdk::ResourceMetrics data; + auto resource = opentelemetry::sdk::resource::Resource::Create( + opentelemetry::sdk::resource::ResourceAttributes{}); + data.resource_ = &resource; auto instrumentation_library = opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary::Create("library_name", "1.2.0"); - record->instrumentation_library_ = instrumentation_library.get(); - record->point_data_ = - metric_sdk::LastValuePointData{opentelemetry::common::SystemTimestamp{}, true, 10.0}; - auto record2 = std::unique_ptr(new metric_sdk::MetricData(*record)); - record2->point_data_ = - metric_sdk::LastValuePointData{opentelemetry::common::SystemTimestamp{}, true, 20l}; - std::vector> records; - records.push_back(std::move(record)); - records.push_back(std::move(record2)); + metric_sdk::LastValuePointData last_value_point_data{}; + last_value_point_data.value_ = 10.0; + last_value_point_data.is_lastvalue_valid_ = true; + last_value_point_data.sample_ts_ = opentelemetry::common::SystemTimestamp{}; + metric_sdk::LastValuePointData last_value_point_data2{}; + last_value_point_data2.value_ = 20l; + last_value_point_data2.is_lastvalue_valid_ = true; + last_value_point_data2.sample_ts_ = opentelemetry::common::SystemTimestamp{}; + metric_sdk::MetricData metric_data{ + metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", + metric_sdk::InstrumentType::kCounter, + metric_sdk::InstrumentValueType::kDouble}, + opentelemetry::common::SystemTimestamp{}, opentelemetry::common::SystemTimestamp{}, + std::vector{ + {metric_sdk::PointAttributes{}, last_value_point_data}, + {metric_sdk::PointAttributes{}, last_value_point_data2}}}; + data.instrumentation_info_metric_data_ = std::vector{ + {instrumentation_library.get(), std::vector{metric_data}}}; std::stringstream stdoutOutput; std::streambuf *sbuf = std::cout.rdbuf(); std::cout.rdbuf(stdoutOutput.rdbuf()); - auto result = exporter->Export(records); + auto result = exporter->Export(data); EXPECT_EQ(result, opentelemetry::sdk::common::ExportResult::kSuccess); std::cout.rdbuf(sbuf); - std::string expectedOutput = - "{\n" - " name : library_name\n" - " version : 1.2.0\n" - " type : LastValuePointData\n" - " timestamp : 0\n" - " valid : true\n" - " value : 10\n" - "}\n" - "{\n" - " name : library_name\n" - " version : 1.2.0\n" - " type : LastValuePointData\n" - " timestamp : 0\n" - " valid : true\n" - " value : 20\n" - "}\n"; - ASSERT_EQ(stdoutOutput.str(), expectedOutput); + std::string expected_output = + "{" + "\n name\t\t: library_name" + "\n schema url\t: " + "\n version\t: 1.2.0" + "\n start time\t: Thu Jan 1 00:00:00 1970" + "\n end time\t: Thu Jan 1 00:00:00 1970" + "\n description\t: description" + "\n unit\t\t: unit" + "\n type : LastValuePointData" + "\n timestamp : 0" + "\n valid : true" + "\n value : 10" + "\n type : LastValuePointData" + "\n timestamp : 0" + "\n valid : true" + "\n value : 20" + "\n}\n"; + ASSERT_EQ(stdoutOutput.str(), expected_output); } TEST(OStreamMetricsExporter, ExportDropPointData) @@ -181,30 +209,46 @@ TEST(OStreamMetricsExporter, ExportDropPointData) auto exporter = std::unique_ptr(new exportermetrics::OStreamMetricExporter); - std::unique_ptr record(new metric_sdk::MetricData); + metric_sdk::ResourceMetrics data; + auto resource = opentelemetry::sdk::resource::Resource::Create( + opentelemetry::sdk::resource::ResourceAttributes{}); + data.resource_ = &resource; auto instrumentation_library = opentelemetry::sdk::instrumentationlibrary::InstrumentationLibrary::Create("library_name", "1.2.0"); - record->instrumentation_library_ = instrumentation_library.get(); - record->point_data_ = metric_sdk::DropPointData{}; - std::vector> records; - records.push_back(std::move(record)); + metric_sdk::DropPointData drop_point_data{}; + metric_sdk::DropPointData drop_point_data2{}; + metric_sdk::MetricData metric_data{ + metric_sdk::InstrumentDescriptor{"library_name", "description", "unit", + metric_sdk::InstrumentType::kCounter, + metric_sdk::InstrumentValueType::kDouble}, + opentelemetry::common::SystemTimestamp{}, opentelemetry::common::SystemTimestamp{}, + std::vector{ + {metric_sdk::PointAttributes{}, drop_point_data}, + {metric_sdk::PointAttributes{}, drop_point_data2}}}; + data.instrumentation_info_metric_data_ = std::vector{ + {instrumentation_library.get(), std::vector{metric_data}}}; std::stringstream stdoutOutput; std::streambuf *sbuf = std::cout.rdbuf(); std::cout.rdbuf(stdoutOutput.rdbuf()); - auto result = exporter->Export(records); + auto result = exporter->Export(data); EXPECT_EQ(result, opentelemetry::sdk::common::ExportResult::kSuccess); std::cout.rdbuf(sbuf); - std::string expectedOutput = - "{\n" - " name : library_name\n" - " version : 1.2.0\n" - "}\n"; - - ASSERT_EQ(stdoutOutput.str(), expectedOutput); + std::string expected_output = + "{" + "\n name\t\t: library_name" + "\n schema url\t: " + "\n version\t: 1.2.0" + "\n start time\t: Thu Jan 1 00:00:00 1970" + "\n end time\t: Thu Jan 1 00:00:00 1970" + "\n description\t: description" + "\n unit\t\t: unit" + "\n}\n"; + + ASSERT_EQ(stdoutOutput.str(), expected_output); } #endif diff --git a/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h b/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h index b6b5acf3a9..127ef468ac 100644 --- a/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h +++ b/sdk/include/opentelemetry/sdk/metrics/metric_exporter.h @@ -6,6 +6,7 @@ # include "opentelemetry/nostd/span.h" # include "opentelemetry/sdk/common/exporter_utils.h" +# include "opentelemetry/sdk/metrics/export/metric_producer.h" # include "opentelemetry/version.h" # include diff --git a/sdk/include/opentelemetry/sdk/metrics/view/instrument_selector.h b/sdk/include/opentelemetry/sdk/metrics/view/instrument_selector.h index 4912277d09..e79a292c0b 100644 --- a/sdk/include/opentelemetry/sdk/metrics/view/instrument_selector.h +++ b/sdk/include/opentelemetry/sdk/metrics/view/instrument_selector.h @@ -27,8 +27,8 @@ class InstrumentSelector InstrumentType GetInstrumentType() { return instrument_type_; } private: - opentelemetry::sdk::metrics::InstrumentType instrument_type_; std::unique_ptr name_filter_; + opentelemetry::sdk::metrics::InstrumentType instrument_type_; }; } // namespace metrics } // namespace sdk From da2911cf4458c7068f967c17c65d07eeba449a08 Mon Sep 17 00:00:00 2001 From: Tom Tan Date: Tue, 12 Apr 2022 12:46:07 -0700 Subject: [PATCH 23/35] Prepare v1.3.0 release (#1324) --- CHANGELOG.md | 44 +++++++++++++++++++ api/include/opentelemetry/version.h | 2 +- docs/public/conf.py | 2 +- .../opentelemetry/sdk/version/version.h | 2 +- sdk/src/version/version.cc | 2 +- 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd41c75626..425029d72f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,8 +15,52 @@ Increment the: ## [Unreleased] +## [1.3.0] 2022-04-11 + +* [ETW EXPORTER] ETW provider handle cleanup ([#1322](https://github.com/open-telemetry/opentelemetry-cpp/pull/1322)) +* [BUILD] Move public definitions into `opentelemetry_api`. ([#1314](https://github.com/open-telemetry/opentelemetry-cpp/pull/1314)) +* [METRICS] OStream example ([#1312](https://github.com/open-telemetry/opentelemetry-cpp/pull/1312)) +* [BUILD] Rename `http_client_curl` to `opentelemetry_http_client_curl` ([#1301](https://github.com/open-telemetry/opentelemetry-cpp/pull/1301)) +* [METRICS SDK] Add InstrumentationInfo and Resource to the metrics data to be + exported. + ([#1299](https://github.com/open-telemetry/opentelemetry-cpp/pull/1299)) +* [TESTS] Add building test without RTTI ([#1294](https://github.com/open-telemetry/opentelemetry-cpp/pull/1294)) +* [METRICS SDK] Implement periodic exporting metric reader ([#1286](https://github.com/open-telemetry/opentelemetry-cpp/pull/1286)) * [SDK] Bugfix: span SetAttribute crash ([#1283](https://github.com/open-telemetry/opentelemetry-cpp/pull/1283)) +* [BUG] Remove implicitly deleted default constructor ([#1267](https://github.com/open-telemetry/opentelemetry-cpp/pull/1267)) +* [METRICS SDK] Synchronous Metric collection (Delta , Cumulative) ([#1265](https://github.com/open-telemetry/opentelemetry-cpp/pull/1265)) +* [METRICS SDK] Metrics exemplar round 1 ([#1264](https://github.com/open-telemetry/opentelemetry-cpp/pull/1264)) +* [EXPORTER] Fix: use CURLOPT_TIMEOUT_MS to config OtlpHttpExporter's timeout + instead of CURLOPT_TIMEOUT + ([#1261](https://github.com/open-telemetry/opentelemetry-cpp/pull/1261)) * [EXPORTER] Jaeger Exporter - Populate Span Links ([#1251](https://github.com/open-telemetry/opentelemetry-cpp/pull/1251)) +* [SDK] Reorder the destructor of members in LoggerProvider and TracerProvider ([#1245](https://github.com/open-telemetry/opentelemetry-cpp/pull/1245)) +* [METRICS SDK] Enable metric collection from MetricReader ([#1241](https://github.com/open-telemetry/opentelemetry-cpp/pull/1241)) +* [METRICS SDK] Asynchronous Aggregation storage ([#1232](https://github.com/open-telemetry/opentelemetry-cpp/pull/1232)) +* [METRICS SDK] Synchronous Instruments - Aggregation Storage(s) creation for + configured views + ([#1219](https://github.com/open-telemetry/opentelemetry-cpp/pull/1219)) +* [BUILD] Added s390x arch into CMake build. ([#1216](https://github.com/open-telemetry/opentelemetry-cpp/pull/1216)) +* [API] Allow extension of the lifetime of ContextStorage. ([#1214](https://github.com/open-telemetry/opentelemetry-cpp/pull/1214)) +* [METRICS SDK] Add Aggregation storage ([#1213](https://github.com/open-telemetry/opentelemetry-cpp/pull/1213)) +* [TESTS] Fix ostream_log_test Mac ([#1208](https://github.com/open-telemetry/opentelemetry-cpp/pull/1208)) +* [BUILD] Update grpc to v1.43.2 to support VS2022/MSVC 19.30 and bazel 5.0 ([#1207](https://github.com/open-telemetry/opentelemetry-cpp/pull/1207)) +* [DOCS] Benchmark documentation ([#1205](https://github.com/open-telemetry/opentelemetry-cpp/pull/1205)) +* [DOCS] Fix errors in SDK documentation ([#1201](https://github.com/open-telemetry/opentelemetry-cpp/pull/1201)) +* [METRICS EXPORTER] Ostream metric exporter ([#1196](https://github.com/open-telemetry/opentelemetry-cpp/pull/1196)) +* [Metrics SDK] Filtering metrics attributes ([#1191](https://github.com/open-telemetry/opentelemetry-cpp/pull/1191)) +* [Metrics SDK] Sync and Async Instruments SDK ([#1184](https://github.com/open-telemetry/opentelemetry-cpp/pull/1184)) +* [Metrics SDK] Add Aggregation as part of metrics SDK. ([#1178](https://github.com/open-telemetry/opentelemetry-cpp/pull/1178)) +* [BUILD] Cmake: thrift requires boost headers, include them as + Boost_INCLUDE_DIRS + ([#1100](https://github.com/open-telemetry/opentelemetry-cpp/pull/1100)) + +Notes: + +[#1301](https://github.com/open-telemetry/opentelemetry-cpp/pull/1301) added +`opentelemetry_` as prefix to http_client_curl library for resolving potential +naming conflict, this could break existing cmake build if http_client_curl is +listed as explicit dependency in user's cmake file. ## [1.2.0] 2022-01-31 diff --git a/api/include/opentelemetry/version.h b/api/include/opentelemetry/version.h index 2fe333f3d4..1e01e242ed 100644 --- a/api/include/opentelemetry/version.h +++ b/api/include/opentelemetry/version.h @@ -6,7 +6,7 @@ #include "opentelemetry/detail/preprocessor.h" #define OPENTELEMETRY_ABI_VERSION_NO 1 -#define OPENTELEMETRY_VERSION "1.2.0" +#define OPENTELEMETRY_VERSION "1.3.0" #define OPENTELEMETRY_ABI_VERSION OPENTELEMETRY_STRINGIFY(OPENTELEMETRY_ABI_VERSION_NO) // clang-format off diff --git a/docs/public/conf.py b/docs/public/conf.py index cd6c7ec6df..910cfc6346 100644 --- a/docs/public/conf.py +++ b/docs/public/conf.py @@ -21,7 +21,7 @@ author = 'OpenTelemetry authors' # The full version, including alpha/beta/rc tags -release = '1.2.0' +release = '1.3.0' # Run sphinx on subprojects and copy output # ----------------------------------------- diff --git a/sdk/include/opentelemetry/sdk/version/version.h b/sdk/include/opentelemetry/sdk/version/version.h index 3155ea8e0b..155cba3f87 100644 --- a/sdk/include/opentelemetry/sdk/version/version.h +++ b/sdk/include/opentelemetry/sdk/version/version.h @@ -5,7 +5,7 @@ #include "opentelemetry/detail/preprocessor.h" -#define OPENTELEMETRY_SDK_VERSION "1.2.0" +#define OPENTELEMETRY_SDK_VERSION "1.3.0" #include "opentelemetry/version.h" diff --git a/sdk/src/version/version.cc b/sdk/src/version/version.cc index 9c4aadf1c9..a153196514 100644 --- a/sdk/src/version/version.cc +++ b/sdk/src/version/version.cc @@ -9,7 +9,7 @@ namespace sdk namespace version { const int MAJOR_VERSION = 1; -const int MINOR_VERSION = 2; +const int MINOR_VERSION = 3; const int PATCH_VERSION = 0; const char *PRE_RELEASE = ""; const char *BUILD_METADATA = ""; From 75c2a8f7a6bf81d9799e76804473609cc236b7be Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Tue, 12 Apr 2022 14:33:39 -0700 Subject: [PATCH 24/35] Update yield logic for ARM processor (#1325) --- api/include/opentelemetry/common/spin_lock_mutex.h | 4 +--- api/test/common/spinlock_benchmark.cc | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/api/include/opentelemetry/common/spin_lock_mutex.h b/api/include/opentelemetry/common/spin_lock_mutex.h index b35f54081a..d38d5791d5 100644 --- a/api/include/opentelemetry/common/spin_lock_mutex.h +++ b/api/include/opentelemetry/common/spin_lock_mutex.h @@ -101,9 +101,7 @@ class SpinLockMutex __builtin_ia32_pause(); # endif #elif defined(__arm__) - // This intrinsic should fail to be found if YIELD is not supported on the current - // processor. - __yield(); + __asm__ volatile("yield" ::: "memory"); #else // TODO: Issue PAGE/YIELD on other architectures. #endif diff --git a/api/test/common/spinlock_benchmark.cc b/api/test/common/spinlock_benchmark.cc index 28692bee56..07579579c7 100644 --- a/api/test/common/spinlock_benchmark.cc +++ b/api/test/common/spinlock_benchmark.cc @@ -93,7 +93,7 @@ static void BM_ProcYieldSpinLockThrashing(benchmark::State &s) __builtin_ia32_pause(); # endif #elif defined(__arm__) - __yield(); + __asm__ volatile("yield" ::: "memory"); #endif } }, From e7f051edf72c6b162ba27fe624d2a6a05e2210d6 Mon Sep 17 00:00:00 2001 From: jmanjon <67091862+juandemanjon@users.noreply.github.com> Date: Wed, 13 Apr 2022 21:21:47 -0700 Subject: [PATCH 25/35] Fix for #1292 (#1326) --- tools/build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/build.cmd b/tools/build.cmd index 7558f4efff..5a47d87764 100644 --- a/tools/build.cmd +++ b/tools/build.cmd @@ -170,5 +170,5 @@ REM REM ########################################################################################## :build_config_ninja cmake -G "Ninja" -DCMAKE_MAKE_PROGRAM="!NINJA!" -DCMAKE_TOOLCHAIN_FILE="!VCPKG_CMAKE!" !CONFIG! "!ROOT!" -%NINJA% +"%NINJA%" exit /b From 29d68f1146e0082bf774685a41ad201883461d88 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Thu, 14 Apr 2022 22:23:09 +0530 Subject: [PATCH 26/35] Implement Merge and Diff operation for Histogram Aggregation (#1303) --- .../aggregation/histogram_aggregation.h | 39 +++++++++++ .../aggregation/histogram_aggregation.cc | 33 +++++++--- sdk/test/metrics/aggregation_test.cc | 64 ++++++++++++++++++- 3 files changed, 126 insertions(+), 10 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h b/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h index 8f33fa27b4..b5cc2c349e 100644 --- a/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h +++ b/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h @@ -24,8 +24,15 @@ class LongHistogramAggregation : public Aggregation void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override {} + /* Returns the result of merge of the existing aggregation with delta aggregation with same + * boundaries */ virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; + /* Returns the new delta aggregation by comparing existing aggregation with next aggregation with + * same boundaries. Data points for `next` aggregation (sum , bucket-counts) should be more than + * the current aggregation - which is the normal scenario as measurements values are monotonic + * increasing. + */ virtual std::unique_ptr Diff(const Aggregation &next) const noexcept override; PointType ToPoint() const noexcept override; @@ -45,8 +52,15 @@ class DoubleHistogramAggregation : public Aggregation void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override; + /* Returns the result of merge of the existing aggregation with delta aggregation with same + * boundaries */ virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; + /* Returns the new delta aggregation by comparing existing aggregation with next aggregation with + * same boundaries. Data points for `next` aggregation (sum , bucket-counts) should be more than + * the current aggregation - which is the normal scenario as measurements values are monotonic + * increasing. + */ virtual std::unique_ptr Diff(const Aggregation &next) const noexcept override; PointType ToPoint() const noexcept override; @@ -56,6 +70,31 @@ class DoubleHistogramAggregation : public Aggregation mutable HistogramPointData point_data_; }; +template +void HistogramMerge(HistogramPointData ¤t, + HistogramPointData &delta, + HistogramPointData &merge) +{ + for (size_t i = 0; i < current.counts_.size(); i++) + { + merge.counts_[i] = current.counts_[i] + delta.counts_[i]; + } + merge.boundaries_ = current.boundaries_; + merge.sum_ = nostd::get(current.sum_) + nostd::get(delta.sum_); + merge.count_ = current.count_ + delta.count_; +} + +template +void HistogramDiff(HistogramPointData ¤t, HistogramPointData &next, HistogramPointData &diff) +{ + for (size_t i = 0; i < current.counts_.size(); i++) + { + diff.counts_[i] = next.counts_[i] - current.counts_[i]; + } + diff.boundaries_ = current.boundaries_; + diff.count_ = next.count_ - current.count_; +} + } // namespace metrics } // namespace sdk OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/src/metrics/aggregation/histogram_aggregation.cc b/sdk/src/metrics/aggregation/histogram_aggregation.cc index 60f65c51b1..27405999c9 100644 --- a/sdk/src/metrics/aggregation/histogram_aggregation.cc +++ b/sdk/src/metrics/aggregation/histogram_aggregation.cc @@ -14,7 +14,6 @@ namespace metrics LongHistogramAggregation::LongHistogramAggregation() { - point_data_.boundaries_ = std::list{0l, 5l, 10l, 25l, 50l, 75l, 100l, 250l, 500l, 1000l}; point_data_.counts_ = std::vector(nostd::get>(point_data_.boundaries_).size() + 1, 0); @@ -47,12 +46,22 @@ void LongHistogramAggregation::Aggregate(long value, const PointAttributes &attr std::unique_ptr LongHistogramAggregation::Merge( const Aggregation &delta) const noexcept { - return nullptr; + auto curr_value = nostd::get(ToPoint()); + auto delta_value = nostd::get( + (static_cast(delta).ToPoint())); + LongHistogramAggregation *aggr = new LongHistogramAggregation(); + HistogramMerge(curr_value, delta_value, aggr->point_data_); + return std::unique_ptr(aggr); } std::unique_ptr LongHistogramAggregation::Diff(const Aggregation &next) const noexcept { - return nullptr; + auto curr_value = nostd::get(ToPoint()); + auto next_value = nostd::get( + (static_cast(next).ToPoint())); + LongHistogramAggregation *aggr = new LongHistogramAggregation(); + HistogramDiff(curr_value, next_value, aggr->point_data_); + return std::unique_ptr(aggr); } PointType LongHistogramAggregation::ToPoint() const noexcept @@ -62,7 +71,6 @@ PointType LongHistogramAggregation::ToPoint() const noexcept DoubleHistogramAggregation::DoubleHistogramAggregation() { - point_data_.boundaries_ = std::list{0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 1000.0}; point_data_.counts_ = @@ -96,20 +104,27 @@ void DoubleHistogramAggregation::Aggregate(double value, const PointAttributes & std::unique_ptr DoubleHistogramAggregation::Merge( const Aggregation &delta) const noexcept { - // TODO - Implement me - return nullptr; + auto curr_value = nostd::get(ToPoint()); + auto delta_value = nostd::get( + (static_cast(delta).ToPoint())); + DoubleHistogramAggregation *aggr = new DoubleHistogramAggregation(); + HistogramMerge(curr_value, delta_value, aggr->point_data_); + return std::unique_ptr(aggr); } std::unique_ptr DoubleHistogramAggregation::Diff( const Aggregation &next) const noexcept { - // TODO - Implement me - return nullptr; + auto curr_value = nostd::get(ToPoint()); + auto next_value = nostd::get( + (static_cast(next).ToPoint())); + DoubleHistogramAggregation *aggr = new DoubleHistogramAggregation(); + HistogramDiff(curr_value, next_value, aggr->point_data_); + return std::unique_ptr(aggr); } PointType DoubleHistogramAggregation::ToPoint() const noexcept { - // TODO Implement me return point_data_; } diff --git a/sdk/test/metrics/aggregation_test.cc b/sdk/test/metrics/aggregation_test.cc index a32826b145..f8051776d1 100644 --- a/sdk/test/metrics/aggregation_test.cc +++ b/sdk/test/metrics/aggregation_test.cc @@ -90,6 +90,37 @@ TEST(Aggregation, LongHistogramAggregation) EXPECT_EQ(histogram_data.count_, 4); EXPECT_EQ(histogram_data.counts_[3], 2); EXPECT_EQ(histogram_data.counts_[8], 1); + + // Merge + LongHistogramAggregation aggr1; + aggr1.Aggregate(1l, {}); + aggr1.Aggregate(11l, {}); + aggr1.Aggregate(26l, {}); + + LongHistogramAggregation aggr2; + aggr2.Aggregate(2l, {}); + aggr2.Aggregate(3l, {}); + aggr2.Aggregate(13l, {}); + aggr2.Aggregate(28l, {}); + aggr2.Aggregate(105l, {}); + + auto aggr3 = aggr1.Merge(aggr2); + histogram_data = nostd::get(aggr3->ToPoint()); + + EXPECT_EQ(histogram_data.count_, 8); // 3 each from aggr1 and aggr2 + EXPECT_EQ(histogram_data.counts_[1], 3); // 1, 2, 3 + EXPECT_EQ(histogram_data.counts_[3], 2); // 11, 13 + EXPECT_EQ(histogram_data.counts_[4], 2); // 25, 28 + EXPECT_EQ(histogram_data.counts_[7], 1); // 105 + + // Diff + auto aggr4 = aggr1.Diff(aggr2); + histogram_data = nostd::get(aggr4->ToPoint()); + EXPECT_EQ(histogram_data.count_, 2); // aggr2:5 - aggr1:3 + EXPECT_EQ(histogram_data.counts_[1], 1); // aggr2(2, 3) - aggr1(1) + EXPECT_EQ(histogram_data.counts_[3], 0); // aggr2(13) - aggr1(11) + EXPECT_EQ(histogram_data.counts_[4], 0); // aggr2(28) - aggr1(25) + EXPECT_EQ(histogram_data.counts_[7], 1); // aggr2(105) - aggr1(0) } TEST(Aggregation, DoubleHistogramAggregation) @@ -116,5 +147,36 @@ TEST(Aggregation, DoubleHistogramAggregation) EXPECT_EQ(histogram_data.counts_[3], 2); EXPECT_EQ(histogram_data.counts_[8], 1); EXPECT_EQ(nostd::get(histogram_data.sum_), 377); + + // Merge + DoubleHistogramAggregation aggr1; + aggr1.Aggregate(1.0, {}); + aggr1.Aggregate(11.0, {}); + aggr1.Aggregate(25.1, {}); + + DoubleHistogramAggregation aggr2; + aggr2.Aggregate(2.0, {}); + aggr2.Aggregate(3.0, {}); + aggr2.Aggregate(13.0, {}); + aggr2.Aggregate(28.1, {}); + aggr2.Aggregate(105.0, {}); + + auto aggr3 = aggr1.Merge(aggr2); + histogram_data = nostd::get(aggr3->ToPoint()); + + EXPECT_EQ(histogram_data.count_, 8); // 3 each from aggr1 and aggr2 + EXPECT_EQ(histogram_data.counts_[1], 3); // 1.0, 2.0, 3.0 + EXPECT_EQ(histogram_data.counts_[3], 2); // 11.0, 13.0 + EXPECT_EQ(histogram_data.counts_[4], 2); // 25.1, 28.1 + EXPECT_EQ(histogram_data.counts_[7], 1); // 105.0 + + // Diff + auto aggr4 = aggr1.Diff(aggr2); + histogram_data = nostd::get(aggr4->ToPoint()); + EXPECT_EQ(histogram_data.count_, 2); // aggr2:5 - aggr1:3 + EXPECT_EQ(histogram_data.counts_[1], 1); // aggr2(2.0, 3.0) - aggr1(1.0) + EXPECT_EQ(histogram_data.counts_[3], 0); // aggr2(13.0) - aggr1(11.0) + EXPECT_EQ(histogram_data.counts_[4], 0); // aggr2(28.1) - aggr1(25.1) + EXPECT_EQ(histogram_data.counts_[7], 1); // aggr2(105.0) - aggr1(0) } -#endif \ No newline at end of file +#endif From e3304d7897fe72f628da5a567166970b103e17b6 Mon Sep 17 00:00:00 2001 From: Ehsan Saei <71217171+esigo@users.noreply.github.com> Date: Fri, 15 Apr 2022 09:20:47 +0200 Subject: [PATCH 27/35] fix metrics compiler warnings (#1328) --- .../opentelemetry/sdk/metrics/view/attributes_processor.h | 2 ++ sdk/src/metrics/meter.cc | 2 +- sdk/test/metrics/attributes_hashmap_benchmark.cc | 5 ++--- sdk/test/metrics/attributes_hashmap_test.cc | 3 +-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/view/attributes_processor.h b/sdk/include/opentelemetry/sdk/metrics/view/attributes_processor.h index fdc4e35c53..d82607357f 100644 --- a/sdk/include/opentelemetry/sdk/metrics/view/attributes_processor.h +++ b/sdk/include/opentelemetry/sdk/metrics/view/attributes_processor.h @@ -23,6 +23,8 @@ class AttributesProcessor // @returns The processed attributes virtual MetricAttributes process( const opentelemetry::common::KeyValueIterable &attributes) const noexcept = 0; + + virtual ~AttributesProcessor() = default; }; /** diff --git a/sdk/src/metrics/meter.cc b/sdk/src/metrics/meter.cc index e7ca822b6d..d5af7f9ec9 100644 --- a/sdk/src/metrics/meter.cc +++ b/sdk/src/metrics/meter.cc @@ -206,7 +206,7 @@ std::unique_ptr Meter::RegisterMetricStorage( "[Meter::RegisterMetricStorage] - Error during finding matching views." << "Some of the matching view configurations mayn't be used for metric collection"); } - return std::move(storages); + return storages; } /** collect metrics across all the meters **/ diff --git a/sdk/test/metrics/attributes_hashmap_benchmark.cc b/sdk/test/metrics/attributes_hashmap_benchmark.cc index 68160aa579..38d515a7ea 100644 --- a/sdk/test/metrics/attributes_hashmap_benchmark.cc +++ b/sdk/test/metrics/attributes_hashmap_benchmark.cc @@ -27,13 +27,12 @@ void BM_AttributseHashMap(benchmark::State &state) std::function()> create_default_aggregation = []() -> std::unique_ptr { - auto agg = std::unique_ptr(new DropAggregation); - return std::move(agg); + return std::unique_ptr(new DropAggregation); }; while (state.KeepRunning()) { - for (int i = 0; i < MAX_THREADS; i++) + for (size_t i = 0; i < MAX_THREADS; i++) { workers.push_back(std::thread([&]() { hash_map.GetOrSetDefault(attributes[i % 2], create_default_aggregation)->Aggregate(1l); diff --git a/sdk/test/metrics/attributes_hashmap_test.cc b/sdk/test/metrics/attributes_hashmap_test.cc index 454ece1ea0..610744c8e1 100644 --- a/sdk/test/metrics/attributes_hashmap_test.cc +++ b/sdk/test/metrics/attributes_hashmap_test.cc @@ -49,8 +49,7 @@ TEST(AttributesHashMap, BasicTests) // GetOrSetDefault std::function()> create_default_aggregation = []() -> std::unique_ptr { - auto agg = std::unique_ptr(new DropAggregation); - return std::move(agg); + return std::unique_ptr(new DropAggregation); }; MetricAttributes m4 = {{"k1", "v1"}, {"k2", "v2"}, {"k3", "v3"}}; EXPECT_NO_THROW(hash_map.GetOrSetDefault(m4, create_default_aggregation)->Aggregate(1l)); From defdfd2ca7b641beb4462aa0d55331938fada38c Mon Sep 17 00:00:00 2001 From: Tom Tan Date: Fri, 15 Apr 2022 09:08:26 -0700 Subject: [PATCH 28/35] Replace deprecated googletest API (#1327) --- sdk/test/metrics/sync_metric_storage_test.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sdk/test/metrics/sync_metric_storage_test.cc b/sdk/test/metrics/sync_metric_storage_test.cc index b0440fdbb3..7dfc4f9475 100644 --- a/sdk/test/metrics/sync_metric_storage_test.cc +++ b/sdk/test/metrics/sync_metric_storage_test.cc @@ -130,10 +130,10 @@ TEST_P(WritableMetricStorageTestFixture, LongSumAggregation) return true; }); } -INSTANTIATE_TEST_CASE_P(WritableMetricStorageTestLong, - WritableMetricStorageTestFixture, - ::testing::Values(AggregationTemporality::kCumulative, - AggregationTemporality::kDelta)); +INSTANTIATE_TEST_SUITE_P(WritableMetricStorageTestLong, + WritableMetricStorageTestFixture, + ::testing::Values(AggregationTemporality::kCumulative, + AggregationTemporality::kDelta)); TEST_P(WritableMetricStorageTestFixture, DoubleSumAggregation) { @@ -238,9 +238,9 @@ TEST_P(WritableMetricStorageTestFixture, DoubleSumAggregation) return true; }); } -INSTANTIATE_TEST_CASE_P(WritableMetricStorageTestDouble, - WritableMetricStorageTestFixture, - ::testing::Values(AggregationTemporality::kCumulative, - AggregationTemporality::kDelta)); +INSTANTIATE_TEST_SUITE_P(WritableMetricStorageTestDouble, + WritableMetricStorageTestFixture, + ::testing::Values(AggregationTemporality::kCumulative, + AggregationTemporality::kDelta)); #endif From 2e9b7a1867d3700c789fe7f39d2747df9af65a33 Mon Sep 17 00:00:00 2001 From: Tom Tan Date: Fri, 15 Apr 2022 23:49:53 -0700 Subject: [PATCH 29/35] Remove redundant tail / in CMake install (#1329) --- exporters/elasticsearch/CMakeLists.txt | 2 +- exporters/etw/CMakeLists.txt | 2 +- exporters/jaeger/CMakeLists.txt | 2 +- exporters/memory/CMakeLists.txt | 2 +- exporters/ostream/CMakeLists.txt | 6 +++--- exporters/otlp/CMakeLists.txt | 2 +- exporters/prometheus/CMakeLists.txt | 2 +- exporters/zipkin/CMakeLists.txt | 2 +- sdk/CMakeLists.txt | 14 ++++---------- 9 files changed, 14 insertions(+), 20 deletions(-) diff --git a/exporters/elasticsearch/CMakeLists.txt b/exporters/elasticsearch/CMakeLists.txt index 9b2833854e..b21dae400a 100644 --- a/exporters/elasticsearch/CMakeLists.txt +++ b/exporters/elasticsearch/CMakeLists.txt @@ -21,7 +21,7 @@ install( install( DIRECTORY include/opentelemetry/exporters/elasticsearch - DESTINATION include/opentelemetry/exporters/ + DESTINATION include/opentelemetry/exporters FILES_MATCHING PATTERN "*.h" PATTERN "es_log_recordable.h" EXCLUDE) diff --git a/exporters/etw/CMakeLists.txt b/exporters/etw/CMakeLists.txt index 0489b41af6..47791b4abf 100644 --- a/exporters/etw/CMakeLists.txt +++ b/exporters/etw/CMakeLists.txt @@ -23,7 +23,7 @@ install( install( DIRECTORY include/opentelemetry/exporters/etw - DESTINATION include/opentelemetry/exporters/ + DESTINATION include/opentelemetry/exporters FILES_MATCHING PATTERN "*.h") diff --git a/exporters/jaeger/CMakeLists.txt b/exporters/jaeger/CMakeLists.txt index 6d3d8b88fb..a95c0cc941 100644 --- a/exporters/jaeger/CMakeLists.txt +++ b/exporters/jaeger/CMakeLists.txt @@ -52,7 +52,7 @@ install( install( DIRECTORY include/opentelemetry/exporters/jaeger - DESTINATION include/opentelemetry/exporters/ + DESTINATION include/opentelemetry/exporters FILES_MATCHING PATTERN "*.h" PATTERN "recordable.h" EXCLUDE) diff --git a/exporters/memory/CMakeLists.txt b/exporters/memory/CMakeLists.txt index a4b8d837fd..d489ec1606 100644 --- a/exporters/memory/CMakeLists.txt +++ b/exporters/memory/CMakeLists.txt @@ -17,7 +17,7 @@ install( install( DIRECTORY include/opentelemetry/exporters/memory - DESTINATION include/opentelemetry/exporters/ + DESTINATION include/opentelemetry/exporters FILES_MATCHING PATTERN "*.h") diff --git a/exporters/ostream/CMakeLists.txt b/exporters/ostream/CMakeLists.txt index e83719cce3..31f1e9b0d0 100644 --- a/exporters/ostream/CMakeLists.txt +++ b/exporters/ostream/CMakeLists.txt @@ -19,7 +19,7 @@ install( install( DIRECTORY include/opentelemetry/exporters/ostream - DESTINATION include/opentelemetry/exporters/ + DESTINATION include/opentelemetry/exporters PATTERN "*.h" PATTERN "metrics_exporter.h" EXCLUDE PATTERN "log_Exporter.h" EXCLUDE) @@ -52,7 +52,7 @@ if(WITH_METRICS_PREVIEW) ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) install( DIRECTORY include/opentelemetry/exporters/ostream - DESTINATION include/opentelemetry/exporters/ + DESTINATION include/opentelemetry/exporters PATTERN "metrics_exporter.h") if(BUILD_TESTING) add_executable(ostream_metrics_test test/ostream_metrics_test.cc) @@ -82,7 +82,7 @@ if(WITH_LOGS_PREVIEW) ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) install( DIRECTORY include/opentelemetry/exporters/ostream - DESTINATION include/opentelemetry/exporters/ + DESTINATION include/opentelemetry/exporters PATTERN "log_exporter.h") if(BUILD_TESTING) add_executable(ostream_log_test test/ostream_log_test.cc) diff --git a/exporters/otlp/CMakeLists.txt b/exporters/otlp/CMakeLists.txt index 1dba7ea1c7..1b1b200504 100755 --- a/exporters/otlp/CMakeLists.txt +++ b/exporters/otlp/CMakeLists.txt @@ -98,7 +98,7 @@ install( install( DIRECTORY include/opentelemetry/exporters/otlp - DESTINATION include/opentelemetry/exporters/ + DESTINATION include/opentelemetry/exporters FILES_MATCHING PATTERN "*.h" PATTERN "otlp_recordable.h" EXCLUDE) diff --git a/exporters/prometheus/CMakeLists.txt b/exporters/prometheus/CMakeLists.txt index 9b2c92ef73..753fa18cac 100755 --- a/exporters/prometheus/CMakeLists.txt +++ b/exporters/prometheus/CMakeLists.txt @@ -46,7 +46,7 @@ install( install( DIRECTORY include/opentelemetry/exporters/prometheus - DESTINATION include/opentelemetry/exporters/ + DESTINATION include/opentelemetry/exporters FILES_MATCHING PATTERN "*.h") diff --git a/exporters/zipkin/CMakeLists.txt b/exporters/zipkin/CMakeLists.txt index b82339f1ee..559e8d5001 100644 --- a/exporters/zipkin/CMakeLists.txt +++ b/exporters/zipkin/CMakeLists.txt @@ -32,7 +32,7 @@ install( install( DIRECTORY include/opentelemetry/exporters/zipkin - DESTINATION include/opentelemetry/exporters/ + DESTINATION include/opentelemetry/exporters FILES_MATCHING PATTERN "*.h" PATTERN "recordable.h" EXCLUDE) diff --git a/sdk/CMakeLists.txt b/sdk/CMakeLists.txt index 6421e3ad15..1a824fe09b 100644 --- a/sdk/CMakeLists.txt +++ b/sdk/CMakeLists.txt @@ -14,8 +14,8 @@ install( ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) install( - DIRECTORY include/opentelemetry/ - DESTINATION include/opentelemetry/ + DIRECTORY include/opentelemetry + DESTINATION include/opentelemetry FILES_MATCHING PATTERN "*config.h") @@ -31,16 +31,10 @@ endif() install( DIRECTORY include/opentelemetry/sdk - DESTINATION include/opentelemetry/ - FILES_MATCHING - PATTERN "*.h" - PATTERN "${METRICS_EXCLUDE_PATTERN}" EXCLUDE) - -install( - DIRECTORY include/opentelemetry/sdk - DESTINATION include/opentelemetry/ + DESTINATION include/opentelemetry FILES_MATCHING PATTERN "*.h" + PATTERN "${METRICS_EXCLUDE_PATTERN}" EXCLUDE PATTERN "${LOGS_EXCLUDE_PATTERN}" EXCLUDE) add_subdirectory(src) From 1d2cd4225da38cb8e7e95bb5c8e33b614555c0d1 Mon Sep 17 00:00:00 2001 From: Ehsan Saei <71217171+esigo@users.noreply.github.com> Date: Mon, 18 Apr 2022 17:39:02 +0200 Subject: [PATCH 30/35] dependencies image as artifact (#1333) Co-authored-by: Lalit Kumar Bhasin --- .github/workflows/dependencies_image.yml | 46 ++++++++++++++++++++++++ ci/setup_grpc.sh | 10 ++++-- ci/setup_thrift.sh | 15 +++++++- docker/Dockerfile.debian.deps | 43 ++++++++++++++++++++++ 4 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/dependencies_image.yml create mode 100644 docker/Dockerfile.debian.deps diff --git a/.github/workflows/dependencies_image.yml b/.github/workflows/dependencies_image.yml new file mode 100644 index 0000000000..aa7d923071 --- /dev/null +++ b/.github/workflows/dependencies_image.yml @@ -0,0 +1,46 @@ +name: 'OpenTelemetry-cpp dependencies image' +on: + schedule: + - cron: "0 3 * * 6" + +jobs: + docker_image: + name: Docker Image + runs-on: ubuntu-latest + timeout-minutes: 300 + steps: + - + name: checkout + uses: actions/checkout@v2 + - + name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - + name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 + - + name: Build Image + uses: docker/build-push-action@v2 + with: + builder: ${{ steps.buildx.outputs.name }} + context: ci/ + file: ./docker/Dockerfile + build-args: BASE_IMAGE=ubuntu:latest + platforms: linux/amd64 + # platforms: linux/amd64,linux/arm64 + push: false + tags: otel-cpp-deps + load: true + - + name: Save Image + run: | + docker images + docker save -o /opt/otel-cpp-deps-debian.tar otel-cpp-deps + - + name: Upload Image + uses: actions/upload-artifact@v3 + with: + name: otel-cpp-deps + path: /opt/otel-cpp-deps-debian.tar + retention-days: 14 diff --git a/ci/setup_grpc.sh b/ci/setup_grpc.sh index 2995f7b4ba..d42fbb7d2e 100755 --- a/ci/setup_grpc.sh +++ b/ci/setup_grpc.sh @@ -10,13 +10,17 @@ new_grpc_version='v1.43.2' gcc_version_for_new_grpc='5.1' install_grpc_version=${new_grpc_version} grpc_version='v1.39.0' -usage() { echo "Usage: $0 -v " 1>&2; exit 1; } +install_dir='/usr/local/' +usage() { echo "Usage: $0 [-v ] [-i "] 1>&2; exit 1;} -while getopts ":v:" o; do +while getopts ":v:i:" o; do case "${o}" in v) gcc_version=${OPTARG} ;; + i) + install_dir=${OPTARG} + ;; *) usage ;; @@ -34,7 +38,7 @@ if ! type cmake > /dev/null; then exit 1 fi export BUILD_DIR=/tmp/ -export INSTALL_DIR=/usr/local/ +export INSTALL_DIR=${install_dir} pushd $BUILD_DIR echo "installing grpc version: ${install_grpc_version}" git clone --depth=1 -b ${install_grpc_version} https://github.com/grpc/grpc diff --git a/ci/setup_thrift.sh b/ci/setup_thrift.sh index af8cc3ffc8..98e14d5e71 100755 --- a/ci/setup_thrift.sh +++ b/ci/setup_thrift.sh @@ -4,6 +4,17 @@ set -e export DEBIAN_FRONTEND=noninteractive export THRIFT_VERSION=0.14.1 +install_dir='/usr/local/' +while getopts ":i:" o; do + case "${o}" in + i) + install_dir=${OPTARG} + ;; + *) + ;; + esac +done + apt update if ! type cmake > /dev/null; then @@ -11,7 +22,7 @@ if ! type cmake > /dev/null; then exit 1 fi export BUILD_DIR=/tmp/ -export INSTALL_DIR=/usr/local/ +export INSTALL_DIR=${install_dir} apt install -y --no-install-recommends \ libboost-locale-dev \ @@ -44,6 +55,8 @@ cmake -G Ninja .. \ -DWITH_BOOSTTHREADS=OFF \ -DWITH_BOOST_FUNCTIONAL=OFF \ -DWITH_BOOST_SMART_PTR=OFF \ + -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR \ + -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ .. ninja -j $(nproc) diff --git a/docker/Dockerfile.debian.deps b/docker/Dockerfile.debian.deps new file mode 100644 index 0000000000..0634c11970 --- /dev/null +++ b/docker/Dockerfile.debian.deps @@ -0,0 +1,43 @@ +ARG BASE_IMAGE=ubuntu:latest +ARG CORES=${nproc} + +FROM ${BASE_IMAGE} as base + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get install -y build-essential autoconf \ + libtool pkg-config cmake git libssl-dev curl \ + libcurl4-openssl-dev libgtest-dev libgmock-dev libbenchmark-dev + +WORKDIR /work +RUN mkdir -p /opt/otel-cpp + +FROM base as grpc +# install grpc, protobuf and abseil +ARG GRPC_VERSION=1.43.2 + +ADD setup_grpc.sh . +RUN ./setup_grpc.sh -i "/opt/otel-cpp" -v ${GRPC_VERSION} + +FROM base as thrift +RUN apt-get install -y --no-install-recommends wget + +# install thrift +ARG THRIFT_VERSION=0.14.1 +ADD setup_thrift.sh . +RUN ./setup_thrift.sh -i "/opt/otel-cpp" + +FROM scratch as final + +COPY --from=grpc /opt/otel-cpp / +COPY --from=thrift /opt/otel-cpp / + +# how to use: +# +# docker create -ti --name deps otel-cpp-deps bash +# docker cp deps:/ ./ +# docker rm -f deps +# +# or: +# +# COPY --from=otel-cpp-deps /usr From b33dd0920ad71f3c04f40e753d3167beabca9dcb Mon Sep 17 00:00:00 2001 From: Ehsan Saei <71217171+esigo@users.noreply.github.com> Date: Mon, 18 Apr 2022 18:37:01 +0200 Subject: [PATCH 31/35] metrics histogram example (#1330) --- .../common/metrics_foo_library/foo_library.cc | 53 +++++++++++++++---- .../common/metrics_foo_library/foo_library.h | 7 ++- examples/metrics_simple/metrics_ostream.cc | 47 ++++++++++++++-- exporters/ostream/src/metric_exporter.cc | 2 + 4 files changed, 94 insertions(+), 15 deletions(-) diff --git a/examples/common/metrics_foo_library/foo_library.cc b/examples/common/metrics_foo_library/foo_library.cc index 344f51c082..cd15adad5b 100644 --- a/examples/common/metrics_foo_library/foo_library.cc +++ b/examples/common/metrics_foo_library/foo_library.cc @@ -2,24 +2,59 @@ // SPDX-License-Identifier: Apache-2.0 #ifndef ENABLE_METRICS_PREVIEW +# include "foo_library.h" # include +# include # include # include "opentelemetry/metrics/provider.h" namespace nostd = opentelemetry::nostd; namespace metrics_api = opentelemetry::metrics; -void foo_library(const std::string &name) +namespace { - // Get the Meter from the MeterProvider +std::map get_random_attr() +{ + static const std::vector> labels = {{"key1", "value1"}, + {"key2", "value2"}, + {"key3", "value3"}, + {"key4", "value4"}, + {"key5", "value5"}}; + return std::map{labels[rand() % (labels.size() - 1)], + labels[rand() % (labels.size() - 1)]}; +} +} // namespace + +void foo_library::counter_example(const std::string &name) +{ + std::string counter_name = name + "_counter"; auto provider = metrics_api::Provider::GetMeterProvider(); nostd::shared_ptr meter = provider->GetMeter(name, "1.2.0"); - auto double_counter = meter->CreateDoubleCounter(name); - double_counter->Add(28.5); - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - double_counter->Add(3.14); - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - double_counter->Add(23.5); - std::this_thread::sleep_for(std::chrono::milliseconds(5000)); + auto double_counter = meter->CreateDoubleCounter(counter_name); + + while (true) + { + double val = (rand() % 700) + 1.1; + double_counter->Add(val); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } } + +void foo_library::histogram_example(const std::string &name) +{ + std::string histogram_name = name + "_histogram"; + auto provider = metrics_api::Provider::GetMeterProvider(); + nostd::shared_ptr meter = provider->GetMeter(name, "1.2.0"); + auto histogram_counter = meter->CreateDoubleHistogram(histogram_name); + auto context = opentelemetry::context::Context{}; + while (true) + { + double val = (rand() % 700) + 1.1; + std::map labels = get_random_attr(); + auto labelkv = opentelemetry::common::KeyValueIterableView{labels}; + histogram_counter->Record(val, labelkv, context); + std::this_thread::sleep_for(std::chrono::milliseconds(250)); + } +} + #endif diff --git a/examples/common/metrics_foo_library/foo_library.h b/examples/common/metrics_foo_library/foo_library.h index 662646a6a4..73cd30d2d5 100644 --- a/examples/common/metrics_foo_library/foo_library.h +++ b/examples/common/metrics_foo_library/foo_library.h @@ -5,5 +5,10 @@ #ifndef ENABLE_METRICS_PREVIEW # include -void foo_library(const std::string &name); +class foo_library +{ +public: + static void counter_example(const std::string &name); + static void histogram_example(const std::string &name); +}; #endif diff --git a/examples/metrics_simple/metrics_ostream.cc b/examples/metrics_simple/metrics_ostream.cc index 9fae5f07b7..d0e4dccfeb 100644 --- a/examples/metrics_simple/metrics_ostream.cc +++ b/examples/metrics_simple/metrics_ostream.cc @@ -3,6 +3,7 @@ #ifndef ENABLE_METRICS_PREVIEW # include +# include # include "opentelemetry/exporters/ostream/metric_exporter.h" # include "opentelemetry/metrics/provider.h" # include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h" @@ -44,21 +45,57 @@ void initMetrics(const std::string &name) new metric_sdk::MeterProvider(std::move(exporters))); auto p = std::static_pointer_cast(provider); p->AddMetricReader(std::move(reader)); + + // counter view + std::string counter_name = name + "_counter"; std::unique_ptr instrument_selector{ - new metric_sdk::InstrumentSelector(metric_sdk::InstrumentType::kCounter, name)}; + new metric_sdk::InstrumentSelector(metric_sdk::InstrumentType::kCounter, counter_name)}; std::unique_ptr meter_selector{ new metric_sdk::MeterSelector(name, version, schema)}; - std::unique_ptr view{ + std::unique_ptr sum_view{ new metric_sdk::View{name, "description", metric_sdk::AggregationType::kSum}}; - p->AddView(std::move(instrument_selector), std::move(meter_selector), std::move(view)); + p->AddView(std::move(instrument_selector), std::move(meter_selector), std::move(sum_view)); + + // histogram view + std::string histogram_name = name + "_histogram"; + std::unique_ptr histogram_instrument_selector{ + new metric_sdk::InstrumentSelector(metric_sdk::InstrumentType::kHistogram, histogram_name)}; + std::unique_ptr histogram_meter_selector{ + new metric_sdk::MeterSelector(name, version, schema)}; + std::unique_ptr histogram_view{ + new metric_sdk::View{name, "description", metric_sdk::AggregationType::kHistogram}}; + p->AddView(std::move(histogram_instrument_selector), std::move(histogram_meter_selector), + std::move(histogram_view)); metrics_api::Provider::SetMeterProvider(provider); } } // namespace -int main() + +int main(int argc, char **argv) { + std::string example_type; + if (argc >= 2) + { + example_type = argv[1]; + } + std::string name{"ostream_metric_example"}; initMetrics(name); - foo_library(name); + + if (example_type == "counter") + { + foo_library::counter_example(name); + } + else if (example_type == "histogram") + { + foo_library::histogram_example(name); + } + else + { + std::thread counter_example{&foo_library::counter_example, name}; + std::thread histogram_example{&foo_library::histogram_example, name}; + counter_example.join(); + histogram_example.join(); + } } #else int main() {} diff --git a/exporters/ostream/src/metric_exporter.cc b/exporters/ostream/src/metric_exporter.cc index fad9e03d49..5cdd3fe78d 100644 --- a/exporters/ostream/src/metric_exporter.cc +++ b/exporters/ostream/src/metric_exporter.cc @@ -59,6 +59,8 @@ sdk::common::ExportResult OStreamMetricExporter::Export( void OStreamMetricExporter::printInstrumentationInfoMetricData( const sdk::metrics::InstrumentationInfoMetrics &info_metric) { + // sout_ is shared + const std::lock_guard locked(lock_); sout_ << "{"; sout_ << "\n name\t\t: " << info_metric.instrumentation_library_->GetName() << "\n schema url\t: " << info_metric.instrumentation_library_->GetSchemaURL() From 7fde3bc7928a4ae55e5502ff6934454a23c3a384 Mon Sep 17 00:00:00 2001 From: WenTao Ou Date: Fri, 22 Apr 2022 00:46:29 +0800 Subject: [PATCH 32/35] Link `opentelemetry_ext` with `opentelemetry_api` (#1336) --- ext/CMakeLists.txt | 1 + ext/src/http/client/nosend/CMakeLists.txt | 2 +- ext/src/zpages/CMakeLists.txt | 5 ++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt index a2baa47a32..034328eaa5 100644 --- a/ext/CMakeLists.txt +++ b/ext/CMakeLists.txt @@ -5,6 +5,7 @@ target_include_directories( "$") set_target_properties(opentelemetry_ext PROPERTIES EXPORT_NAME "ext") +target_link_libraries(opentelemetry_ext INTERFACE opentelemetry_api) install( TARGETS opentelemetry_ext diff --git a/ext/src/http/client/nosend/CMakeLists.txt b/ext/src/http/client/nosend/CMakeLists.txt index 9118abbfb5..497daeb342 100644 --- a/ext/src/http/client/nosend/CMakeLists.txt +++ b/ext/src/http/client/nosend/CMakeLists.txt @@ -25,7 +25,7 @@ if(${BUILD_TESTING}) endif() target_link_libraries(http_client_nosend ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIB} - opentelemetry_api opentelemetry_ext) + opentelemetry_ext) install( TARGETS http_client_nosend diff --git a/ext/src/zpages/CMakeLists.txt b/ext/src/zpages/CMakeLists.txt index 64d9c73728..e3fd480df6 100644 --- a/ext/src/zpages/CMakeLists.txt +++ b/ext/src/zpages/CMakeLists.txt @@ -10,9 +10,8 @@ add_library( set_target_properties(opentelemetry_zpages PROPERTIES EXPORT_NAME zpages) -target_link_libraries( - opentelemetry_zpages PUBLIC opentelemetry_ext opentelemetry_api - opentelemetry_trace) +target_link_libraries(opentelemetry_zpages PUBLIC opentelemetry_ext + opentelemetry_trace) install( TARGETS opentelemetry_zpages From bf8f433cae41ad682cf9e390650158a2751373c1 Mon Sep 17 00:00:00 2001 From: Ehsan Saei <71217171+esigo@users.noreply.github.com> Date: Thu, 21 Apr 2022 23:27:19 +0200 Subject: [PATCH 33/35] ostream metrics cmake (#1344) --- examples/CMakeLists.txt | 4 +-- examples/common/CMakeLists.txt | 1 + .../common/metrics_foo_library/CMakeLists.txt | 2 ++ examples/metrics_simple/CMakeLists.txt | 17 +++++++---- exporters/ostream/CMakeLists.txt | 29 +++++++++++++++++++ 5 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 examples/common/metrics_foo_library/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 70bca10221..db0fe159be 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -18,9 +18,7 @@ endif() add_subdirectory(plugin) add_subdirectory(simple) add_subdirectory(batch) -if(WITH_METRICS_PREVIEW) - add_subdirectory(metrics_simple) -endif() +add_subdirectory(metrics_simple) add_subdirectory(multithreaded) add_subdirectory(multi_processor) add_subdirectory(http) diff --git a/examples/common/CMakeLists.txt b/examples/common/CMakeLists.txt index f89faf4a2f..c2fdca2594 100644 --- a/examples/common/CMakeLists.txt +++ b/examples/common/CMakeLists.txt @@ -2,3 +2,4 @@ add_subdirectory(foo_library) if(WITH_LOGS_PREVIEW) add_subdirectory(logs_foo_library) endif() +add_subdirectory(metrics_foo_library) diff --git a/examples/common/metrics_foo_library/CMakeLists.txt b/examples/common/metrics_foo_library/CMakeLists.txt new file mode 100644 index 0000000000..4f2bca2a0b --- /dev/null +++ b/examples/common/metrics_foo_library/CMakeLists.txt @@ -0,0 +1,2 @@ +add_library(common_metrics_foo_library foo_library.h foo_library.cc) +target_link_libraries(common_metrics_foo_library PUBLIC opentelemetry_api) diff --git a/examples/metrics_simple/CMakeLists.txt b/examples/metrics_simple/CMakeLists.txt index 94b441061b..a2088fd510 100644 --- a/examples/metrics_simple/CMakeLists.txt +++ b/examples/metrics_simple/CMakeLists.txt @@ -1,6 +1,13 @@ include_directories(${CMAKE_SOURCE_DIR}/exporters/ostream/include) - -add_executable(simple_metrics main.cc) -target_link_libraries( - simple_metrics ${CMAKE_THREAD_LIBS_INIT} opentelemetry_metrics_deprecated - opentelemetry_exporter_ostream_metrics_deprecated) +if(WITH_METRICS_PREVIEW) + add_executable(simple_metrics main.cc) + target_link_libraries( + simple_metrics ${CMAKE_THREAD_LIBS_INIT} opentelemetry_metrics_deprecated + opentelemetry_exporter_ostream_metrics_deprecated) +else() + add_executable(metrics_ostream_example metrics_ostream.cc) + target_link_libraries( + metrics_ostream_example ${CMAKE_THREAD_LIBS_INIT} opentelemetry_metrics + opentelemetry_exporter_ostream_metrics opentelemetry_resources + common_metrics_foo_library) +endif() diff --git a/exporters/ostream/CMakeLists.txt b/exporters/ostream/CMakeLists.txt index 31f1e9b0d0..db2562ddde 100644 --- a/exporters/ostream/CMakeLists.txt +++ b/exporters/ostream/CMakeLists.txt @@ -63,6 +63,35 @@ if(WITH_METRICS_PREVIEW) TEST_PREFIX exporter. TEST_LIST ostream_metrics_test) endif() +else() + add_library(opentelemetry_exporter_ostream_metrics src/metric_exporter.cc) + set_target_properties(opentelemetry_exporter_ostream_metrics + PROPERTIES EXPORT_NAME ostream_metrics_exporter) + target_include_directories( + opentelemetry_exporter_ostream_metrics + PUBLIC "$") + target_link_libraries(opentelemetry_exporter_ostream_metrics + PUBLIC opentelemetry_metrics) + install( + TARGETS opentelemetry_exporter_ostream_metrics + EXPORT "${PROJECT_NAME}-target" + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install( + DIRECTORY include/opentelemetry/exporters/ostream + DESTINATION include/opentelemetry/exporters + PATTERN "metric_exporter.h") + if(BUILD_TESTING) + add_executable(ostream_metric_test test/ostream_metric_test.cc) + target_link_libraries( + ostream_metric_test ${GTEST_BOTH_LIBRARIES} + opentelemetry_exporter_ostream_metrics opentelemetry_resources) + gtest_add_tests( + TARGET ostream_metric_test + TEST_PREFIX exporter. + TEST_LIST ostream_metric_test) + endif() endif() if(WITH_LOGS_PREVIEW) From ac3087729336f4aff75c2be76f7f5a3f58463975 Mon Sep 17 00:00:00 2001 From: owent Date: Sun, 24 Apr 2022 12:09:17 +0800 Subject: [PATCH 34/35] Fix conflicts Signed-off-by: owent --- .../aggregation/histogram_aggregation.h | 10 ------- .../aggregation/histogram_aggregation.cc | 30 ------------------- sdk/test/metrics/sync_metric_storage_test.cc | 18 ++--------- 3 files changed, 2 insertions(+), 56 deletions(-) diff --git a/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h b/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h index e7e473a322..b5cc2c349e 100644 --- a/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h +++ b/sdk/include/opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h @@ -24,10 +24,6 @@ class LongHistogramAggregation : public Aggregation void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override {} -<<<<<<< HEAD - virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; - -======= /* Returns the result of merge of the existing aggregation with delta aggregation with same * boundaries */ virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; @@ -37,7 +33,6 @@ class LongHistogramAggregation : public Aggregation * the current aggregation - which is the normal scenario as measurements values are monotonic * increasing. */ ->>>>>>> origin/main virtual std::unique_ptr Diff(const Aggregation &next) const noexcept override; PointType ToPoint() const noexcept override; @@ -57,10 +52,6 @@ class DoubleHistogramAggregation : public Aggregation void Aggregate(double value, const PointAttributes &attributes = {}) noexcept override; -<<<<<<< HEAD - virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; - -======= /* Returns the result of merge of the existing aggregation with delta aggregation with same * boundaries */ virtual std::unique_ptr Merge(const Aggregation &delta) const noexcept override; @@ -70,7 +61,6 @@ class DoubleHistogramAggregation : public Aggregation * the current aggregation - which is the normal scenario as measurements values are monotonic * increasing. */ ->>>>>>> origin/main virtual std::unique_ptr Diff(const Aggregation &next) const noexcept override; PointType ToPoint() const noexcept override; diff --git a/sdk/src/metrics/aggregation/histogram_aggregation.cc b/sdk/src/metrics/aggregation/histogram_aggregation.cc index 6c4c4976ea..27405999c9 100644 --- a/sdk/src/metrics/aggregation/histogram_aggregation.cc +++ b/sdk/src/metrics/aggregation/histogram_aggregation.cc @@ -14,10 +14,6 @@ namespace metrics LongHistogramAggregation::LongHistogramAggregation() { -<<<<<<< HEAD - -======= ->>>>>>> origin/main point_data_.boundaries_ = std::list{0l, 5l, 10l, 25l, 50l, 75l, 100l, 250l, 500l, 1000l}; point_data_.counts_ = std::vector(nostd::get>(point_data_.boundaries_).size() + 1, 0); @@ -50,30 +46,22 @@ void LongHistogramAggregation::Aggregate(long value, const PointAttributes &attr std::unique_ptr LongHistogramAggregation::Merge( const Aggregation &delta) const noexcept { -<<<<<<< HEAD - return nullptr; -======= auto curr_value = nostd::get(ToPoint()); auto delta_value = nostd::get( (static_cast(delta).ToPoint())); LongHistogramAggregation *aggr = new LongHistogramAggregation(); HistogramMerge(curr_value, delta_value, aggr->point_data_); return std::unique_ptr(aggr); ->>>>>>> origin/main } std::unique_ptr LongHistogramAggregation::Diff(const Aggregation &next) const noexcept { -<<<<<<< HEAD - return nullptr; -======= auto curr_value = nostd::get(ToPoint()); auto next_value = nostd::get( (static_cast(next).ToPoint())); LongHistogramAggregation *aggr = new LongHistogramAggregation(); HistogramDiff(curr_value, next_value, aggr->point_data_); return std::unique_ptr(aggr); ->>>>>>> origin/main } PointType LongHistogramAggregation::ToPoint() const noexcept @@ -83,10 +71,6 @@ PointType LongHistogramAggregation::ToPoint() const noexcept DoubleHistogramAggregation::DoubleHistogramAggregation() { -<<<<<<< HEAD - -======= ->>>>>>> origin/main point_data_.boundaries_ = std::list{0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 1000.0}; point_data_.counts_ = @@ -120,41 +104,27 @@ void DoubleHistogramAggregation::Aggregate(double value, const PointAttributes & std::unique_ptr DoubleHistogramAggregation::Merge( const Aggregation &delta) const noexcept { -<<<<<<< HEAD - // TODO - Implement me - return nullptr; -======= auto curr_value = nostd::get(ToPoint()); auto delta_value = nostd::get( (static_cast(delta).ToPoint())); DoubleHistogramAggregation *aggr = new DoubleHistogramAggregation(); HistogramMerge(curr_value, delta_value, aggr->point_data_); return std::unique_ptr(aggr); ->>>>>>> origin/main } std::unique_ptr DoubleHistogramAggregation::Diff( const Aggregation &next) const noexcept { -<<<<<<< HEAD - // TODO - Implement me - return nullptr; -======= auto curr_value = nostd::get(ToPoint()); auto next_value = nostd::get( (static_cast(next).ToPoint())); DoubleHistogramAggregation *aggr = new DoubleHistogramAggregation(); HistogramDiff(curr_value, next_value, aggr->point_data_); return std::unique_ptr(aggr); ->>>>>>> origin/main } PointType DoubleHistogramAggregation::ToPoint() const noexcept { -<<<<<<< HEAD - // TODO Implement me -======= ->>>>>>> origin/main return point_data_; } diff --git a/sdk/test/metrics/sync_metric_storage_test.cc b/sdk/test/metrics/sync_metric_storage_test.cc index 137d224353..ea1db2be0c 100644 --- a/sdk/test/metrics/sync_metric_storage_test.cc +++ b/sdk/test/metrics/sync_metric_storage_test.cc @@ -36,7 +36,7 @@ TEST_P(WritableMetricStorageTestFixture, LongSumAggregation) long expected_total_get_requests = 0; long expected_total_put_requests = 0; InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, - InstrumentValueType::kLong}; + InstrumentValueType::kLong}; std::map attributes_get = {{"RequestType", "GET"}}; std::map attributes_put = {{"RequestType", "PUT"}}; @@ -130,17 +130,10 @@ TEST_P(WritableMetricStorageTestFixture, LongSumAggregation) return true; }); } -<<<<<<< HEAD -INSTANTIATE_TEST_CASE_P(WritableMetricStorageTestLong, - WritableMetricStorageTestFixture, - ::testing::Values(AggregationTemporality::kCumulative, - AggregationTemporality::kDelta)); -======= INSTANTIATE_TEST_SUITE_P(WritableMetricStorageTestLong, WritableMetricStorageTestFixture, ::testing::Values(AggregationTemporality::kCumulative, AggregationTemporality::kDelta)); ->>>>>>> origin/main TEST_P(WritableMetricStorageTestFixture, DoubleSumAggregation) { @@ -149,7 +142,7 @@ TEST_P(WritableMetricStorageTestFixture, DoubleSumAggregation) double expected_total_get_requests = 0; double expected_total_put_requests = 0; InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, - InstrumentValueType::kDouble}; + InstrumentValueType::kDouble}; std::map attributes_get = {{"RequestType", "GET"}}; std::map attributes_put = {{"RequestType", "PUT"}}; @@ -245,16 +238,9 @@ TEST_P(WritableMetricStorageTestFixture, DoubleSumAggregation) return true; }); } -<<<<<<< HEAD -INSTANTIATE_TEST_CASE_P(WritableMetricStorageTestDouble, - WritableMetricStorageTestFixture, - ::testing::Values(AggregationTemporality::kCumulative, - AggregationTemporality::kDelta)); -======= INSTANTIATE_TEST_SUITE_P(WritableMetricStorageTestDouble, WritableMetricStorageTestFixture, ::testing::Values(AggregationTemporality::kCumulative, AggregationTemporality::kDelta)); ->>>>>>> origin/main #endif From f078a6d159e4e8ec3a25396196d11041b75ec280 Mon Sep 17 00:00:00 2001 From: owent Date: Sun, 24 Apr 2022 12:45:13 +0800 Subject: [PATCH 35/35] Using clang-format-10 to format codes(clang-format-14 has a different output) Signed-off-by: owent --- .../opentelemetry/common/spin_lock_mutex.h | 11 ++-- exporters/ostream/BUILD | 59 +++++++++---------- sdk/test/metrics/sync_metric_storage_test.cc | 4 +- 3 files changed, 35 insertions(+), 39 deletions(-) diff --git a/api/include/opentelemetry/common/spin_lock_mutex.h b/api/include/opentelemetry/common/spin_lock_mutex.h index a23fc03b80..764b5fc6b8 100644 --- a/api/include/opentelemetry/common/spin_lock_mutex.h +++ b/api/include/opentelemetry/common/spin_lock_mutex.h @@ -54,9 +54,9 @@ class SpinLockMutex { public: SpinLockMutex() noexcept {} - ~SpinLockMutex() noexcept = default; - SpinLockMutex(const SpinLockMutex &) = delete; - SpinLockMutex &operator=(const SpinLockMutex &) = delete; + ~SpinLockMutex() noexcept = default; + SpinLockMutex(const SpinLockMutex &) = delete; + SpinLockMutex &operator=(const SpinLockMutex &) = delete; SpinLockMutex &operator=(const SpinLockMutex &) volatile = delete; static inline void fast_yield() noexcept @@ -123,10 +123,7 @@ class SpinLockMutex return; } /** Releases the lock held by the execution agent. Throws no exceptions. */ - void unlock() noexcept - { - flag_.store(false, std::memory_order_release); - } + void unlock() noexcept { flag_.store(false, std::memory_order_release); } private: std::atomic flag_{false}; diff --git a/exporters/ostream/BUILD b/exporters/ostream/BUILD index f74d896344..cca74d6693 100644 --- a/exporters/ostream/BUILD +++ b/exporters/ostream/BUILD @@ -43,37 +43,36 @@ cc_library( ], ) -# TODO - Uncomment once MetricData interface is finalised -#cc_library( -# name = "ostream_metric_exporter", -# srcs = [ -# "src/metric_exporter.cc", -# ], -# hdrs = [ -# "include/opentelemetry/exporters/ostream/metric_exporter.h", -# ], -# strip_include_prefix = "include", -# tags = [ -# "metrics", -# "ostream", -# ], -# deps = [ -# "//sdk/src/metrics", -# ], -#) +cc_library( + name = "ostream_metric_exporter", + srcs = [ + "src/metric_exporter.cc", + ], + hdrs = [ + "include/opentelemetry/exporters/ostream/metric_exporter.h", + ], + strip_include_prefix = "include", + tags = [ + "metrics", + "ostream", + ], + deps = [ + "//sdk/src/metrics", + ], +) -#cc_test( -# name = "ostream_metric_test", -# srcs = ["test/ostream_metric_test.cc"], -# tags = [ -# "ostream", -# "test", -# ], -# deps = [ -# ":ostream_metric_exporter", -# "@com_google_googletest//:gtest_main", -# ], -#) +cc_test( + name = "ostream_metric_test", + srcs = ["test/ostream_metric_test.cc"], + tags = [ + "ostream", + "test", + ], + deps = [ + ":ostream_metric_exporter", + "@com_google_googletest//:gtest_main", + ], +) cc_test( name = "ostream_metrics_test_deprecated", diff --git a/sdk/test/metrics/sync_metric_storage_test.cc b/sdk/test/metrics/sync_metric_storage_test.cc index ea1db2be0c..7dfc4f9475 100644 --- a/sdk/test/metrics/sync_metric_storage_test.cc +++ b/sdk/test/metrics/sync_metric_storage_test.cc @@ -36,7 +36,7 @@ TEST_P(WritableMetricStorageTestFixture, LongSumAggregation) long expected_total_get_requests = 0; long expected_total_put_requests = 0; InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, - InstrumentValueType::kLong}; + InstrumentValueType::kLong}; std::map attributes_get = {{"RequestType", "GET"}}; std::map attributes_put = {{"RequestType", "PUT"}}; @@ -142,7 +142,7 @@ TEST_P(WritableMetricStorageTestFixture, DoubleSumAggregation) double expected_total_get_requests = 0; double expected_total_put_requests = 0; InstrumentDescriptor instr_desc = {"name", "desc", "1unit", InstrumentType::kCounter, - InstrumentValueType::kDouble}; + InstrumentValueType::kDouble}; std::map attributes_get = {{"RequestType", "GET"}}; std::map attributes_put = {{"RequestType", "PUT"}};