diff --git a/google/cloud/bigtable/internal/data_connection_impl.cc b/google/cloud/bigtable/internal/data_connection_impl.cc index 81ac2fb5d3c68..2c2d44d2d6a89 100644 --- a/google/cloud/bigtable/internal/data_connection_impl.cc +++ b/google/cloud/bigtable/internal/data_connection_impl.cc @@ -31,6 +31,8 @@ #include "google/cloud/bigtable/result_source_interface.h" #include "google/cloud/bigtable/retry_policy.h" #include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" #include "google/cloud/grpc_options.h" #include "google/cloud/idempotency.h" #include "google/cloud/internal/algorithm.h" @@ -39,6 +41,10 @@ #include "google/cloud/internal/random.h" #include "google/cloud/internal/retry_loop.h" #include "google/cloud/internal/streaming_read_rpc.h" +#ifdef GOOGLE_CLOUD_CPP_BIGTABLE_WITH_OTEL_METRICS +#include "google/cloud/monitoring/v3/metric_connection.h" +#endif // GOOGLE_CLOUD_CPP_BIGTABLE_WITH_OTEL_METRICS +#include "google/cloud/universe_domain_options.h" #include #include @@ -195,6 +201,17 @@ std::string_view InstanceNameFromTableName(std::string_view table_name) { return table_name.substr(0, pos); } +#ifdef GOOGLE_CLOUD_CPP_BIGTABLE_WITH_OTEL_METRICS +Options MetricsExporterConnectionOptions(Options options) { + // We start with a copy of the client options to preserve credentials and + // universe domain, but we must unset Bigtable-specific endpoints/authorities + // to allow default Monitoring defaults. + options.unset(); + options.unset(); + return options; +} +#endif // GOOGLE_CLOUD_CPP_BIGTABLE_WITH_OTEL_METRICS + } // namespace bigtable::Row TransformReadModifyWriteRowResponse( @@ -227,6 +244,8 @@ DataConnectionImpl::DataConnectionImpl( options_(MergeOptions(std::move(options), DataConnection::options())) { #ifdef GOOGLE_CLOUD_CPP_BIGTABLE_WITH_OTEL_METRICS if (options_.get()) { + metric_service_connection_ = monitoring_v3::MakeMetricServiceConnection( + MetricsExporterConnectionOptions(options_)); // The client_uid is eventually used in conjunction with other data labels // to identify metric data points. This pseudorandom string is used to aid // in disambiguation. @@ -234,8 +253,8 @@ DataConnectionImpl::DataConnectionImpl( std::string client_uid = internal::Sample(gen, 16, "abcdefghijklmnopqrstuvwxyz0123456789"); operation_context_factory_ = - std::make_unique(std::move(client_uid), - options_); + std::make_unique( + std::move(client_uid), metric_service_connection_, options_); } else { operation_context_factory_ = std::make_unique(); @@ -243,7 +262,7 @@ DataConnectionImpl::DataConnectionImpl( #else operation_context_factory_ = std::make_unique(); -#endif +#endif // GOOGLE_CLOUD_CPP_BIGTABLE_WITH_OTEL_METRICS } DataConnectionImpl::DataConnectionImpl( diff --git a/google/cloud/bigtable/internal/data_connection_impl.h b/google/cloud/bigtable/internal/data_connection_impl.h index 7722ae2755a0e..a859d5c938ace 100644 --- a/google/cloud/bigtable/internal/data_connection_impl.h +++ b/google/cloud/bigtable/internal/data_connection_impl.h @@ -33,6 +33,11 @@ namespace google { namespace cloud { +namespace monitoring_v3 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +class MetricServiceConnection; +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace monitoring_v3 namespace bigtable_internal { GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN @@ -142,6 +147,8 @@ class DataConnectionImpl : public bigtable::DataConnection { std::unique_ptr background_; std::unique_ptr stub_manager_; + std::shared_ptr<::google::cloud::monitoring_v3::MetricServiceConnection> + metric_service_connection_; std::unique_ptr operation_context_factory_; std::shared_ptr limiter_; Options options_; diff --git a/google/cloud/bigtable/internal/operation_context_factory.cc b/google/cloud/bigtable/internal/operation_context_factory.cc index 6337dcac4113b..bd020586a8f95 100644 --- a/google/cloud/bigtable/internal/operation_context_factory.cc +++ b/google/cloud/bigtable/internal/operation_context_factory.cc @@ -158,9 +158,11 @@ MetricsOperationContextFactory::MetricsOperationContextFactory( } MetricsOperationContextFactory::MetricsOperationContextFactory( - std::string client_uid, Options options) + std::string client_uid, + std::shared_ptr conn, + Options options) : MetricsOperationContextFactory( - std::move(client_uid), nullptr, + std::move(client_uid), std::move(conn), std::make_shared(), std::move(options)) {} MetricsOperationContextFactory::MetricsOperationContextFactory( diff --git a/google/cloud/bigtable/internal/operation_context_factory.h b/google/cloud/bigtable/internal/operation_context_factory.h index e1ca4ea5c3407..c8d77b4f7c6b0 100644 --- a/google/cloud/bigtable/internal/operation_context_factory.h +++ b/google/cloud/bigtable/internal/operation_context_factory.h @@ -88,16 +88,16 @@ class SimpleOperationContextFactory : public OperationContextFactory { class MetricsOperationContextFactory : public OperationContextFactory { public: - explicit MetricsOperationContextFactory(std::string client_uid, - Options options = {}); + MetricsOperationContextFactory( + std::string client_uid, + std::shared_ptr conn, + Options options = {}); // Used for injecting a MockMetricsServiceConnection for testing. MetricsOperationContextFactory( std::string client_uid, std::shared_ptr conn, - std::shared_ptr clock = - std::make_shared(), - Options options = {}); + std::shared_ptr clock, Options options = {}); // This constructs an instance only suitable for testing. The provided metric // is copied into every RPC metric vector, preventing normal Metric