diff --git a/google/cloud/bigtable/internal/client_schema_metrics_test.cc b/google/cloud/bigtable/internal/client_schema_metrics_test.cc index ce95e16c2541d..835060d7b5da4 100644 --- a/google/cloud/bigtable/internal/client_schema_metrics_test.cc +++ b/google/cloud/bigtable/internal/client_schema_metrics_test.cc @@ -20,10 +20,10 @@ #include "google/cloud/bigtable/internal/client_schema_metrics.h" #include "google/cloud/bigtable/options.h" #include "google/cloud/bigtable/version.h" +#include "google/cloud/testing_util/mock_opentelemetry_metrics.h" +#include "google/cloud/testing_util/opentelemetry_attributes.h" #include #include -#include -#include namespace google { namespace cloud { @@ -31,198 +31,16 @@ namespace bigtable_internal { GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN namespace { +using ::google::cloud::testing_util::MakeAttributesMap; +using ::google::cloud::testing_util::MockHistogram; +using ::google::cloud::testing_util::MockMeter; +using ::google::cloud::testing_util::MockMeterProvider; using ::testing::A; using ::testing::Eq; using ::testing::IsEmpty; using ::testing::Pair; using ::testing::UnorderedElementsAre; -using ::opentelemetry::metrics::Counter; -#if OPENTELEMETRY_ABI_VERSION_NO >= 2 -using ::opentelemetry::metrics::Gauge; -#endif -using ::opentelemetry::metrics::Histogram; -using ::opentelemetry::metrics::ObservableInstrument; -using ::opentelemetry::metrics::UpDownCounter; - -template -class MockHistogram : public opentelemetry::metrics::Histogram { - public: -#if OPENTELEMETRY_ABI_VERSION_NO >= 2 - MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) - (T value), (noexcept, override)); - MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) - (T, opentelemetry::common::KeyValueIterable const&), - (noexcept, override)); - -#endif - MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) - (T value, opentelemetry::context::Context const& context), - (noexcept, override)); - MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) - (T value, - opentelemetry::common::KeyValueIterable const& attributes, - opentelemetry::context::Context const& context), - (noexcept, override)); -}; - -class MockMeter : public opentelemetry::metrics::Meter { - public: - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateUInt64Counter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateDoubleCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD( - opentelemetry::nostd::shared_ptr, - CreateInt64ObservableCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD( - opentelemetry::nostd::shared_ptr, - CreateDoubleObservableCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateUInt64Histogram, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateDoubleHistogram, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - -#if OPENTELEMETRY_ABI_VERSION_NO >= 2 - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateInt64Gauge, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateDoubleGauge, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(uintptr_t, - RegisterCallback, // NOLINT(bugprone-exception-escape) - (opentelemetry::metrics::MultiObservableCallbackPtr, void*, - opentelemetry::nostd::span< - opentelemetry::metrics::ObservableInstrument*>), - (noexcept, override)); - - MOCK_METHOD(void, - DeregisterCallback, // NOLINT(bugprone-exception-escape) - (uintptr_t), (noexcept, override)); -#endif - - MOCK_METHOD(opentelemetry::nostd::shared_ptr, - CreateInt64ObservableGauge, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::shared_ptr, - CreateDoubleObservableGauge, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateInt64UpDownCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateDoubleUpDownCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD( - opentelemetry::nostd::shared_ptr, - CreateInt64ObservableUpDownCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD( - opentelemetry::nostd::shared_ptr, - CreateDoubleObservableUpDownCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); -}; - -class MockMeterProvider : public opentelemetry::metrics::MeterProvider { - public: -#if OPENTELEMETRY_ABI_VERSION_NO >= 2 - MOCK_METHOD(opentelemetry::nostd::shared_ptr, - GetMeter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::common::KeyValueIterable const*), - (noexcept, override)); - - MOCK_METHOD(void, RemoveMeter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - -#else - MOCK_METHOD(opentelemetry::nostd::shared_ptr, - GetMeter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); -#endif -}; - -std::unordered_map MakeAttributesMap( - opentelemetry::common::KeyValueIterable const& attributes) { - std::unordered_map m; - attributes.ForEachKeyValue([&](opentelemetry::nostd::string_view k, - opentelemetry::common::AttributeValue v) { - if (opentelemetry::nostd::holds_alternative< - opentelemetry::nostd::string_view>(v)) { - m.emplace( - std::string{k}, - opentelemetry::nostd::get(v)); - } - return true; - }); - return m; -} - TEST(ClientSchemaMetricsTest, IntoLabelMapClient) { ClientResourceLabels resource{"p-1", "i-1", "app-1", "client-1", "uid-1", "cp-1", "loc-1", "cloud-1", diff --git a/google/cloud/bigtable/internal/table_schema_metrics_test.cc b/google/cloud/bigtable/internal/table_schema_metrics_test.cc index 66840f990ba0e..849b282d688cd 100644 --- a/google/cloud/bigtable/internal/table_schema_metrics_test.cc +++ b/google/cloud/bigtable/internal/table_schema_metrics_test.cc @@ -21,6 +21,8 @@ #include "google/cloud/bigtable/options.h" #include "google/cloud/bigtable/version.h" #include "google/cloud/testing_util/fake_clock.h" +#include "google/cloud/testing_util/mock_opentelemetry_metrics.h" +#include "google/cloud/testing_util/opentelemetry_attributes.h" #include "google/cloud/testing_util/validate_metadata.h" #include "absl/strings/escaping.h" #include "google/bigtable/v2/peer_info.pb.h" @@ -34,6 +36,11 @@ GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::google::cloud::testing_util::FakeSteadyClock; +using ::google::cloud::testing_util::MakeAttributesMap; +using ::google::cloud::testing_util::MockCounter; +using ::google::cloud::testing_util::MockHistogram; +using ::google::cloud::testing_util::MockMeter; +using ::google::cloud::testing_util::MockMeterProvider; using ::google::cloud::testing_util::SetServerMetadata; using ::testing::A; @@ -41,193 +48,6 @@ using ::testing::Eq; using ::testing::Pair; using ::testing::UnorderedElementsAre; -using ::opentelemetry::metrics::Counter; -#if OPENTELEMETRY_ABI_VERSION_NO >= 2 -using ::opentelemetry::metrics::Gauge; -#endif -using ::opentelemetry::metrics::Histogram; -using ::opentelemetry::metrics::ObservableInstrument; -using ::opentelemetry::metrics::UpDownCounter; - -template -class MockHistogram : public opentelemetry::metrics::Histogram { - public: -#if OPENTELEMETRY_ABI_VERSION_NO >= 2 - MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) - (T value), (noexcept, override)); - MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) - (T, opentelemetry::common::KeyValueIterable const&), - (noexcept, override)); - -#endif - MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) - (T value, opentelemetry::context::Context const& context), - (noexcept, override)); - MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) - (T value, - opentelemetry::common::KeyValueIterable const& attributes, - opentelemetry::context::Context const& context), - (noexcept, override)); -}; - -template -class MockCounter : public opentelemetry::metrics::Counter { - public: - MOCK_METHOD(void, Add, // NOLINT(bugprone-exception-escape) - (T value), (noexcept, override)); - MOCK_METHOD(void, Add, // NOLINT(bugprone-exception-escape) - (T value, opentelemetry::context::Context const&), - (noexcept, override)); - MOCK_METHOD(void, Add, // NOLINT(bugprone-exception-escape) - (T value, opentelemetry::common::KeyValueIterable const&), - (noexcept, override)); - MOCK_METHOD(void, Add, // NOLINT(bugprone-exception-escape) - (T value, opentelemetry::common::KeyValueIterable const&, - opentelemetry::context::Context const&), - (noexcept, override)); -}; - -class MockMeter : public opentelemetry::metrics::Meter { - public: - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateUInt64Counter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateDoubleCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD( - opentelemetry::nostd::shared_ptr, - CreateInt64ObservableCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD( - opentelemetry::nostd::shared_ptr, - CreateDoubleObservableCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateUInt64Histogram, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateDoubleHistogram, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - -#if OPENTELEMETRY_ABI_VERSION_NO >= 2 - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateInt64Gauge, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateDoubleGauge, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(uintptr_t, - RegisterCallback, // NOLINT(bugprone-exception-escape) - (opentelemetry::metrics::MultiObservableCallbackPtr, void*, - opentelemetry::nostd::span< - opentelemetry::metrics::ObservableInstrument*>), - (noexcept, override)); - - MOCK_METHOD(void, - DeregisterCallback, // NOLINT(bugprone-exception-escape) - (uintptr_t), (noexcept, override)); -#endif - - MOCK_METHOD(opentelemetry::nostd::shared_ptr, - CreateInt64ObservableGauge, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::shared_ptr, - CreateDoubleObservableGauge, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateInt64UpDownCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD(opentelemetry::nostd::unique_ptr>, - CreateDoubleUpDownCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD( - opentelemetry::nostd::shared_ptr, - CreateInt64ObservableUpDownCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - - MOCK_METHOD( - opentelemetry::nostd::shared_ptr, - CreateDoubleObservableUpDownCounter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); -}; - -class MockMeterProvider : public opentelemetry::metrics::MeterProvider { - public: -#if OPENTELEMETRY_ABI_VERSION_NO >= 2 - MOCK_METHOD(opentelemetry::nostd::shared_ptr, - GetMeter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::common::KeyValueIterable const*), - (noexcept, override)); - - MOCK_METHOD(void, RemoveMeter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); - -#else - MOCK_METHOD(opentelemetry::nostd::shared_ptr, - GetMeter, // NOLINT(bugprone-exception-escape) - (opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view, - opentelemetry::nostd::string_view), - (noexcept, override)); -#endif -}; - TEST(LabelMap, IntoLabelMap) { TableResourceLabels r{"my-project", "my-instance", "my-table", "my-cluster", "my-zone"}; @@ -438,22 +258,6 @@ TEST(GetPeerInfoFromMetadata, InvalidBase64Trailers) { } } -std::unordered_map MakeAttributesMap( - opentelemetry::common::KeyValueIterable const& attributes) { - std::unordered_map m; - attributes.ForEachKeyValue([&](opentelemetry::nostd::string_view k, - opentelemetry::common::AttributeValue v) { - if (opentelemetry::nostd::holds_alternative< - opentelemetry::nostd::string_view>(v)) { - m.emplace( - std::string{k}, - opentelemetry::nostd::get(v)); - } - return true; - }); - return m; -} - void SetClusterZone(grpc::ClientContext& client_context) { CreateServerMetadata(client_context, CreateServerMetadataOptions{false, true}); diff --git a/google/cloud/testing_util/CMakeLists.txt b/google/cloud/testing_util/CMakeLists.txt index 1a4d1cc1bb20f..0ff9e28efc320 100644 --- a/google/cloud/testing_util/CMakeLists.txt +++ b/google/cloud/testing_util/CMakeLists.txt @@ -40,6 +40,9 @@ add_library( mock_backoff_policy.h mock_fake_clock.cc mock_fake_clock.h + mock_opentelemetry_metrics.h + opentelemetry_attributes.cc + opentelemetry_attributes.h opentelemetry_matchers.cc opentelemetry_matchers.h scoped_environment.cc diff --git a/google/cloud/testing_util/google_cloud_cpp_testing.bzl b/google/cloud/testing_util/google_cloud_cpp_testing.bzl index 8f9de55ad2254..78c1f37b14c75 100644 --- a/google/cloud/testing_util/google_cloud_cpp_testing.bzl +++ b/google/cloud/testing_util/google_cloud_cpp_testing.bzl @@ -32,6 +32,8 @@ google_cloud_cpp_testing_hdrs = [ "mock_async_streaming_write_rpc.h", "mock_backoff_policy.h", "mock_fake_clock.h", + "mock_opentelemetry_metrics.h", + "opentelemetry_attributes.h", "opentelemetry_matchers.h", "scoped_environment.h", "scoped_log.h", @@ -47,6 +49,7 @@ google_cloud_cpp_testing_srcs = [ "example_driver.cc", "integration_test.cc", "mock_fake_clock.cc", + "opentelemetry_attributes.cc", "opentelemetry_matchers.cc", "scoped_environment.cc", "scoped_log.cc", diff --git a/google/cloud/testing_util/mock_opentelemetry_metrics.h b/google/cloud/testing_util/mock_opentelemetry_metrics.h new file mode 100644 index 0000000000000..0f838628c376b --- /dev/null +++ b/google/cloud/testing_util/mock_opentelemetry_metrics.h @@ -0,0 +1,233 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_TESTING_UTIL_MOCK_OPENTELEMETRY_METRICS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_TESTING_UTIL_MOCK_OPENTELEMETRY_METRICS_H + +#include "google/cloud/version.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace testing_util { + +template +class MockHistogram : public opentelemetry::metrics::Histogram { + public: +#if OPENTELEMETRY_ABI_VERSION_NO >= 2 + MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) + (T value), (noexcept, override)); + MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) + (T, opentelemetry::common::KeyValueIterable const&), + (noexcept, override)); + +#endif + MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) + (T value, opentelemetry::context::Context const& context), + (noexcept, override)); + MOCK_METHOD(void, Record, // NOLINT(bugprone-exception-escape) + (T value, + opentelemetry::common::KeyValueIterable const& attributes, + opentelemetry::context::Context const& context), + (noexcept, override)); +}; + +template +class MockCounter : public opentelemetry::metrics::Counter { + public: + MOCK_METHOD(void, Add, // NOLINT(bugprone-exception-escape) + (T value), (noexcept, override)); + MOCK_METHOD(void, Add, // NOLINT(bugprone-exception-escape) + (T value, opentelemetry::context::Context const&), + (noexcept, override)); + MOCK_METHOD(void, Add, // NOLINT(bugprone-exception-escape) + (T value, opentelemetry::common::KeyValueIterable const&), + (noexcept, override)); + MOCK_METHOD(void, Add, // NOLINT(bugprone-exception-escape) + (T value, opentelemetry::common::KeyValueIterable const&, + opentelemetry::context::Context const&), + (noexcept, override)); +}; + +class MockMeter : public opentelemetry::metrics::Meter { + public: + MOCK_METHOD(opentelemetry::nostd::unique_ptr< + opentelemetry::metrics::Counter>, + CreateUInt64Counter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD( + opentelemetry::nostd::unique_ptr>, + CreateDoubleCounter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD( + opentelemetry::nostd::shared_ptr< + opentelemetry::metrics::ObservableInstrument>, + CreateInt64ObservableCounter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD( + opentelemetry::nostd::shared_ptr< + opentelemetry::metrics::ObservableInstrument>, + CreateDoubleObservableCounter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD(opentelemetry::nostd::unique_ptr< + opentelemetry::metrics::Histogram>, + CreateUInt64Histogram, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD(opentelemetry::nostd::unique_ptr< + opentelemetry::metrics::Histogram>, + CreateDoubleHistogram, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + +#if OPENTELEMETRY_ABI_VERSION_NO >= 2 + MOCK_METHOD( + opentelemetry::nostd::unique_ptr>, + CreateInt64Gauge, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD( + opentelemetry::nostd::unique_ptr>, + CreateDoubleGauge, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD(uintptr_t, + RegisterCallback, // NOLINT(bugprone-exception-escape) + (opentelemetry::metrics::MultiObservableCallbackPtr, void*, + opentelemetry::nostd::span< + opentelemetry::metrics::ObservableInstrument*>), + (noexcept, override)); + + MOCK_METHOD(void, + DeregisterCallback, // NOLINT(bugprone-exception-escape) + (uintptr_t), (noexcept, override)); +#endif + + MOCK_METHOD(opentelemetry::nostd::shared_ptr< + opentelemetry::metrics::ObservableInstrument>, + CreateInt64ObservableGauge, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD(opentelemetry::nostd::shared_ptr< + opentelemetry::metrics::ObservableInstrument>, + CreateDoubleObservableGauge, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD(opentelemetry::nostd::unique_ptr< + opentelemetry::metrics::UpDownCounter>, + CreateInt64UpDownCounter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD(opentelemetry::nostd::unique_ptr< + opentelemetry::metrics::UpDownCounter>, + CreateDoubleUpDownCounter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD( + opentelemetry::nostd::shared_ptr< + opentelemetry::metrics::ObservableInstrument>, + CreateInt64ObservableUpDownCounter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + + MOCK_METHOD( + opentelemetry::nostd::shared_ptr< + opentelemetry::metrics::ObservableInstrument>, + CreateDoubleObservableUpDownCounter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); +}; + +class MockMeterProvider : public opentelemetry::metrics::MeterProvider { + public: +#if OPENTELEMETRY_ABI_VERSION_NO >= 2 + MOCK_METHOD(opentelemetry::nostd::shared_ptr, + GetMeter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::common::KeyValueIterable const*), + (noexcept, override)); + + MOCK_METHOD(void, RemoveMeter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); + +#else + MOCK_METHOD(opentelemetry::nostd::shared_ptr, + GetMeter, // NOLINT(bugprone-exception-escape) + (opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view, + opentelemetry::nostd::string_view), + (noexcept, override)); +#endif +}; + +} // namespace testing_util +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_TESTING_UTIL_MOCK_OPENTELEMETRY_METRICS_H diff --git a/google/cloud/testing_util/opentelemetry_attributes.cc b/google/cloud/testing_util/opentelemetry_attributes.cc new file mode 100644 index 0000000000000..2e6e0db56afbb --- /dev/null +++ b/google/cloud/testing_util/opentelemetry_attributes.cc @@ -0,0 +1,44 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "google/cloud/testing_util/opentelemetry_attributes.h" +#include +#include +#include + +namespace google { +namespace cloud { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace testing_util { + +std::unordered_map MakeAttributesMap( + opentelemetry::common::KeyValueIterable const& attributes) { + std::unordered_map m; + attributes.ForEachKeyValue([&](opentelemetry::nostd::string_view k, + opentelemetry::common::AttributeValue v) { + if (opentelemetry::nostd::holds_alternative< + opentelemetry::nostd::string_view>(v)) { + m.emplace( + std::string{k}, + opentelemetry::nostd::get(v)); + } + return true; + }); + return m; +} + +} // namespace testing_util +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace cloud +} // namespace google diff --git a/google/cloud/testing_util/opentelemetry_attributes.h b/google/cloud/testing_util/opentelemetry_attributes.h new file mode 100644 index 0000000000000..d71da537ca088 --- /dev/null +++ b/google/cloud/testing_util/opentelemetry_attributes.h @@ -0,0 +1,36 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_TESTING_UTIL_OPENTELEMETRY_ATTRIBUTES_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_TESTING_UTIL_OPENTELEMETRY_ATTRIBUTES_H + +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace testing_util { + +std::unordered_map MakeAttributesMap( + opentelemetry::common::KeyValueIterable const& attributes); + +} // namespace testing_util +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_TESTING_UTIL_OPENTELEMETRY_ATTRIBUTES_H