1*cc02d7e2SAndroid Build Coastguard Worker // 2*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2022 gRPC authors. 3*cc02d7e2SAndroid Build Coastguard Worker // 4*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 5*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 6*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at 7*cc02d7e2SAndroid Build Coastguard Worker // 8*cc02d7e2SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 9*cc02d7e2SAndroid Build Coastguard Worker // 10*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 11*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 12*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 14*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License. 15*cc02d7e2SAndroid Build Coastguard Worker // 16*cc02d7e2SAndroid Build Coastguard Worker 17*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPCPP_EXT_GCP_OBSERVABILITY_H 18*cc02d7e2SAndroid Build Coastguard Worker #define GRPCPP_EXT_GCP_OBSERVABILITY_H 19*cc02d7e2SAndroid Build Coastguard Worker 20*cc02d7e2SAndroid Build Coastguard Worker #include "absl/status/status.h" 21*cc02d7e2SAndroid Build Coastguard Worker #include "absl/status/statusor.h" 22*cc02d7e2SAndroid Build Coastguard Worker 23*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h> 24*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/grpc_library.h> 25*cc02d7e2SAndroid Build Coastguard Worker 26*cc02d7e2SAndroid Build Coastguard Worker namespace grpc { 27*cc02d7e2SAndroid Build Coastguard Worker 28*cc02d7e2SAndroid Build Coastguard Worker // GcpObservability objects follow the RAII idiom and help manage the lifetime 29*cc02d7e2SAndroid Build Coastguard Worker // of gRPC Observability data exporting to GCP. `GcpObservability::Init()` 30*cc02d7e2SAndroid Build Coastguard Worker // should be invoked instead to return an `GcpObservability` instance. 31*cc02d7e2SAndroid Build Coastguard Worker // Observability data is flushed at regular intervals, and also when this 32*cc02d7e2SAndroid Build Coastguard Worker // instance goes out of scope and its destructor is invoked. 33*cc02d7e2SAndroid Build Coastguard Worker class GcpObservability { 34*cc02d7e2SAndroid Build Coastguard Worker public: 35*cc02d7e2SAndroid Build Coastguard Worker // Initialize GCP Observability for gRPC. 36*cc02d7e2SAndroid Build Coastguard Worker // This should be called before any other gRPC operations like creating a 37*cc02d7e2SAndroid Build Coastguard Worker // channel, server, credentials etc. 38*cc02d7e2SAndroid Build Coastguard Worker // The return value helps determine whether observability was 39*cc02d7e2SAndroid Build Coastguard Worker // successfully enabled or not. On success, an object of class `Observability` 40*cc02d7e2SAndroid Build Coastguard Worker // is returned. When this object goes out of scope, GCP Observability stats, 41*cc02d7e2SAndroid Build Coastguard Worker // tracing and logging data is flushed. On failure, the status message can be 42*cc02d7e2SAndroid Build Coastguard Worker // used to determine the cause of failure. It is up to the applications to 43*cc02d7e2SAndroid Build Coastguard Worker // either crash on failure, or continue without GCP observability being 44*cc02d7e2SAndroid Build Coastguard Worker // enabled. The status codes do not have any special meaning at present, and 45*cc02d7e2SAndroid Build Coastguard Worker // users should not make any assumptions based on the status code, other than 46*cc02d7e2SAndroid Build Coastguard Worker // a non-OK status code meaning that observability initialization failed. 47*cc02d7e2SAndroid Build Coastguard Worker // 48*cc02d7e2SAndroid Build Coastguard Worker // The expected usage is to call this at the top (or near the top) in 49*cc02d7e2SAndroid Build Coastguard Worker // main(), and let it go out of scope after all RPCs and activities that we 50*cc02d7e2SAndroid Build Coastguard Worker // want to observe are done. Please look at 51*cc02d7e2SAndroid Build Coastguard Worker // https://github.com/grpc/grpc/blob/master/examples/cpp/gcp_observability/helloworld/greeter_client.cc 52*cc02d7e2SAndroid Build Coastguard Worker // and 53*cc02d7e2SAndroid Build Coastguard Worker // https://github.com/grpc/grpc/blob/master/examples/cpp/gcp_observability/helloworld/greeter_server.cc 54*cc02d7e2SAndroid Build Coastguard Worker // for sample usage. 55*cc02d7e2SAndroid Build Coastguard Worker // 56*cc02d7e2SAndroid Build Coastguard Worker // It is possible for an initialized GcpObservability object to go out of 57*cc02d7e2SAndroid Build Coastguard Worker // scope while RPCs and other gRPC operations are still ongoing. In this case, 58*cc02d7e2SAndroid Build Coastguard Worker // GCP Observability tries to flush all observability data collected till that 59*cc02d7e2SAndroid Build Coastguard Worker // point. 60*cc02d7e2SAndroid Build Coastguard Worker // 61*cc02d7e2SAndroid Build Coastguard Worker // Note that this is a blocking call which properly sets up gRPC Observability 62*cc02d7e2SAndroid Build Coastguard Worker // to work with GCP and might take a few seconds to return. Similarly, the 63*cc02d7e2SAndroid Build Coastguard Worker // destruction of a non-moved-from `Observability` object is also blocking 64*cc02d7e2SAndroid Build Coastguard Worker // since it flushes the observability data to GCP. 65*cc02d7e2SAndroid Build Coastguard Worker // 66*cc02d7e2SAndroid Build Coastguard Worker // As an implementation detail, this properly initializes the OpenCensus stats 67*cc02d7e2SAndroid Build Coastguard Worker // and tracing plugin, so applications do not need to perform any additional 68*cc02d7e2SAndroid Build Coastguard Worker // gRPC C++ OpenCensus setup/registration to get GCP Observability for gRPC. 69*cc02d7e2SAndroid Build Coastguard Worker static absl::StatusOr<GcpObservability> Init(); 70*cc02d7e2SAndroid Build Coastguard Worker 71*cc02d7e2SAndroid Build Coastguard Worker GcpObservability() = default; 72*cc02d7e2SAndroid Build Coastguard Worker // Move constructor and Move-assignment operator. 73*cc02d7e2SAndroid Build Coastguard Worker // The moved-from object will no longer be valid and will not cause GCP 74*cc02d7e2SAndroid Build Coastguard Worker // Observability stats, tracing and logging data to flush. 75*cc02d7e2SAndroid Build Coastguard Worker GcpObservability(GcpObservability&& other) noexcept; 76*cc02d7e2SAndroid Build Coastguard Worker GcpObservability& operator=(GcpObservability&& other) noexcept; 77*cc02d7e2SAndroid Build Coastguard Worker 78*cc02d7e2SAndroid Build Coastguard Worker // Delete copy and copy-assignment operator 79*cc02d7e2SAndroid Build Coastguard Worker GcpObservability(const GcpObservability&) = delete; 80*cc02d7e2SAndroid Build Coastguard Worker GcpObservability& operator=(const GcpObservability&) = delete; 81*cc02d7e2SAndroid Build Coastguard Worker 82*cc02d7e2SAndroid Build Coastguard Worker private: 83*cc02d7e2SAndroid Build Coastguard Worker // Helper class that aids in implementing GCP Observability. 84*cc02d7e2SAndroid Build Coastguard Worker // Inheriting from GrpcLibrary makes sure that gRPC is initialized and remains 85*cc02d7e2SAndroid Build Coastguard Worker // initialized for the lifetime of GCP Observability. In the future, when gRPC 86*cc02d7e2SAndroid Build Coastguard Worker // initialization goes away, we might still want to keep gRPC Event Engine 87*cc02d7e2SAndroid Build Coastguard Worker // initialized, just in case, we need to perform some IO operations during 88*cc02d7e2SAndroid Build Coastguard Worker // observability close. 89*cc02d7e2SAndroid Build Coastguard Worker // Note that the lifetime guarantees are only one way, i.e., GcpObservability 90*cc02d7e2SAndroid Build Coastguard Worker // object guarantees that gRPC will not shutdown while the object is still in 91*cc02d7e2SAndroid Build Coastguard Worker // scope, but the other way around does not hold true. Even though that is not 92*cc02d7e2SAndroid Build Coastguard Worker // the expected usage, GCP Observability can shutdown before gRPC shuts down. 93*cc02d7e2SAndroid Build Coastguard Worker // It follows that gRPC should not hold any callbacks from GcpObservability. A 94*cc02d7e2SAndroid Build Coastguard Worker // change in this restriction should go through a design review. 95*cc02d7e2SAndroid Build Coastguard Worker class GcpObservabilityImpl : private internal::GrpcLibrary { 96*cc02d7e2SAndroid Build Coastguard Worker public: 97*cc02d7e2SAndroid Build Coastguard Worker ~GcpObservabilityImpl() override; 98*cc02d7e2SAndroid Build Coastguard Worker }; 99*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<GcpObservabilityImpl> impl_; 100*cc02d7e2SAndroid Build Coastguard Worker }; 101*cc02d7e2SAndroid Build Coastguard Worker 102*cc02d7e2SAndroid Build Coastguard Worker namespace experimental { 103*cc02d7e2SAndroid Build Coastguard Worker // TODO(yashykt): Delete this after the 1.55 release. 104*cc02d7e2SAndroid Build Coastguard Worker GRPC_DEPRECATED("Use grpc::GcpObservability::Init() instead.") 105*cc02d7e2SAndroid Build Coastguard Worker absl::Status GcpObservabilityInit(); 106*cc02d7e2SAndroid Build Coastguard Worker GRPC_DEPRECATED("Use grpc::GcpObservability::Init() instead.") 107*cc02d7e2SAndroid Build Coastguard Worker void GcpObservabilityClose(); 108*cc02d7e2SAndroid Build Coastguard Worker } // namespace experimental 109*cc02d7e2SAndroid Build Coastguard Worker 110*cc02d7e2SAndroid Build Coastguard Worker } // namespace grpc 111*cc02d7e2SAndroid Build Coastguard Worker 112*cc02d7e2SAndroid Build Coastguard Worker #endif // GRPCPP_EXT_GCP_OBSERVABILITY_H 113