1*cc02d7e2SAndroid Build Coastguard Worker // 2*cc02d7e2SAndroid Build Coastguard Worker // 3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2023 gRPC authors. 4*cc02d7e2SAndroid Build Coastguard Worker // 5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at 8*cc02d7e2SAndroid Build Coastguard Worker // 9*cc02d7e2SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 10*cc02d7e2SAndroid Build Coastguard Worker // 11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License. 16*cc02d7e2SAndroid Build Coastguard Worker // 17*cc02d7e2SAndroid Build Coastguard Worker // 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPCPP_EXT_CSM_OBSERVABILITY_H 20*cc02d7e2SAndroid Build Coastguard Worker #define GRPCPP_EXT_CSM_OBSERVABILITY_H 21*cc02d7e2SAndroid Build Coastguard Worker 22*cc02d7e2SAndroid Build Coastguard Worker #include <memory> 23*cc02d7e2SAndroid Build Coastguard Worker 24*cc02d7e2SAndroid Build Coastguard Worker #include "absl/functional/any_invocable.h" 25*cc02d7e2SAndroid Build Coastguard Worker #include "absl/status/statusor.h" 26*cc02d7e2SAndroid Build Coastguard Worker #include "absl/strings/string_view.h" 27*cc02d7e2SAndroid Build Coastguard Worker #include "opentelemetry/metrics/meter_provider.h" 28*cc02d7e2SAndroid Build Coastguard Worker 29*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h> 30*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/ext/otel_plugin.h> 31*cc02d7e2SAndroid Build Coastguard Worker 32*cc02d7e2SAndroid Build Coastguard Worker namespace grpc { 33*cc02d7e2SAndroid Build Coastguard Worker 34*cc02d7e2SAndroid Build Coastguard Worker namespace internal { 35*cc02d7e2SAndroid Build Coastguard Worker class OpenTelemetryPluginBuilderImpl; 36*cc02d7e2SAndroid Build Coastguard Worker } // namespace internal 37*cc02d7e2SAndroid Build Coastguard Worker 38*cc02d7e2SAndroid Build Coastguard Worker // This object maintains state around the registered CsmObservability plugin. 39*cc02d7e2SAndroid Build Coastguard Worker // The application is responsible for retaining this object until it has closed 40*cc02d7e2SAndroid Build Coastguard Worker // all channels and servers that are recording metrics. 41*cc02d7e2SAndroid Build Coastguard Worker class CsmObservability { 42*cc02d7e2SAndroid Build Coastguard Worker public: 43*cc02d7e2SAndroid Build Coastguard Worker CsmObservability() = default; 44*cc02d7e2SAndroid Build Coastguard Worker ~CsmObservability(); 45*cc02d7e2SAndroid Build Coastguard Worker // Disable copy constructor and copy-assignment operator. 46*cc02d7e2SAndroid Build Coastguard Worker CsmObservability(const CsmObservability&) = delete; 47*cc02d7e2SAndroid Build Coastguard Worker CsmObservability& operator=(const CsmObservability&) = delete; 48*cc02d7e2SAndroid Build Coastguard Worker CsmObservability(CsmObservability&&) noexcept; 49*cc02d7e2SAndroid Build Coastguard Worker CsmObservability& operator=(CsmObservability&&) noexcept; 50*cc02d7e2SAndroid Build Coastguard Worker 51*cc02d7e2SAndroid Build Coastguard Worker private: 52*cc02d7e2SAndroid Build Coastguard Worker bool valid_ = true; 53*cc02d7e2SAndroid Build Coastguard Worker }; 54*cc02d7e2SAndroid Build Coastguard Worker 55*cc02d7e2SAndroid Build Coastguard Worker // CsmObservabilityBuilder configures observability for all service mesh traffic 56*cc02d7e2SAndroid Build Coastguard Worker // for a binary running on CSM. 57*cc02d7e2SAndroid Build Coastguard Worker class CsmObservabilityBuilder { 58*cc02d7e2SAndroid Build Coastguard Worker public: 59*cc02d7e2SAndroid Build Coastguard Worker CsmObservabilityBuilder(); 60*cc02d7e2SAndroid Build Coastguard Worker ~CsmObservabilityBuilder(); 61*cc02d7e2SAndroid Build Coastguard Worker CsmObservabilityBuilder& SetMeterProvider( 62*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<opentelemetry::metrics::MeterProvider> meter_provider); 63*cc02d7e2SAndroid Build Coastguard Worker // If set, \a target_attribute_filter is called per channel to decide whether 64*cc02d7e2SAndroid Build Coastguard Worker // to record the target attribute on client or to replace it with "other". 65*cc02d7e2SAndroid Build Coastguard Worker // This helps reduce the cardinality on metrics in cases where many channels 66*cc02d7e2SAndroid Build Coastguard Worker // are created with different targets in the same binary (which might happen 67*cc02d7e2SAndroid Build Coastguard Worker // for example, if the channel target string uses IP addresses directly). 68*cc02d7e2SAndroid Build Coastguard Worker CsmObservabilityBuilder& SetTargetAttributeFilter( 69*cc02d7e2SAndroid Build Coastguard Worker absl::AnyInvocable<bool(absl::string_view /*target*/) const> 70*cc02d7e2SAndroid Build Coastguard Worker target_attribute_filter); 71*cc02d7e2SAndroid Build Coastguard Worker // If set, \a generic_method_attribute_filter is called per call with a 72*cc02d7e2SAndroid Build Coastguard Worker // generic method type to decide whether to record the method name or to 73*cc02d7e2SAndroid Build Coastguard Worker // replace it with "other". Non-generic or pre-registered methods remain 74*cc02d7e2SAndroid Build Coastguard Worker // unaffected. If not set, by default, generic method names are replaced with 75*cc02d7e2SAndroid Build Coastguard Worker // "other" when recording metrics. 76*cc02d7e2SAndroid Build Coastguard Worker CsmObservabilityBuilder& SetGenericMethodAttributeFilter( 77*cc02d7e2SAndroid Build Coastguard Worker absl::AnyInvocable<bool(absl::string_view /*generic_method*/) const> 78*cc02d7e2SAndroid Build Coastguard Worker generic_method_attribute_filter); 79*cc02d7e2SAndroid Build Coastguard Worker // Builds the CsmObservability plugin. The return status shows whether 80*cc02d7e2SAndroid Build Coastguard Worker // CsmObservability was successfully enabled or not. 81*cc02d7e2SAndroid Build Coastguard Worker // 82*cc02d7e2SAndroid Build Coastguard Worker // The most common way to use this API is - 83*cc02d7e2SAndroid Build Coastguard Worker // 84*cc02d7e2SAndroid Build Coastguard Worker // auto observability = 85*cc02d7e2SAndroid Build Coastguard Worker // CsmObservabilityBuilder().SetMeterProvider(provider).BuildAndRegister(); 86*cc02d7e2SAndroid Build Coastguard Worker // 87*cc02d7e2SAndroid Build Coastguard Worker // The set of instruments available are - 88*cc02d7e2SAndroid Build Coastguard Worker // grpc.client.attempt.started 89*cc02d7e2SAndroid Build Coastguard Worker // grpc.client.attempt.duration 90*cc02d7e2SAndroid Build Coastguard Worker // grpc.client.attempt.sent_total_compressed_message_size 91*cc02d7e2SAndroid Build Coastguard Worker // grpc.client.attempt.rcvd_total_compressed_message_size 92*cc02d7e2SAndroid Build Coastguard Worker // grpc.server.call.started 93*cc02d7e2SAndroid Build Coastguard Worker // grpc.server.call.duration 94*cc02d7e2SAndroid Build Coastguard Worker // grpc.server.call.sent_total_compressed_message_size 95*cc02d7e2SAndroid Build Coastguard Worker // grpc.server.call.rcvd_total_compressed_message_size 96*cc02d7e2SAndroid Build Coastguard Worker absl::StatusOr<CsmObservability> BuildAndRegister(); 97*cc02d7e2SAndroid Build Coastguard Worker 98*cc02d7e2SAndroid Build Coastguard Worker private: 99*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<grpc::internal::OpenTelemetryPluginBuilderImpl> builder_; 100*cc02d7e2SAndroid Build Coastguard Worker }; 101*cc02d7e2SAndroid Build Coastguard Worker 102*cc02d7e2SAndroid Build Coastguard Worker namespace experimental { 103*cc02d7e2SAndroid Build Coastguard Worker // TODO(yashykt): Remove this once no longer needed. 104*cc02d7e2SAndroid Build Coastguard Worker using CsmObservability GRPC_DEPRECATED("Use grpc::CsmObservability instead.") = 105*cc02d7e2SAndroid Build Coastguard Worker grpc::CsmObservability; 106*cc02d7e2SAndroid Build Coastguard Worker using CsmObservabilityBuilder GRPC_DEPRECATED( 107*cc02d7e2SAndroid Build Coastguard Worker "Use grpc::CsmObservabilityBuilder instead.") = 108*cc02d7e2SAndroid Build Coastguard Worker grpc::CsmObservabilityBuilder; 109*cc02d7e2SAndroid Build Coastguard Worker } // namespace experimental 110*cc02d7e2SAndroid Build Coastguard Worker 111*cc02d7e2SAndroid Build Coastguard Worker } // namespace grpc 112*cc02d7e2SAndroid Build Coastguard Worker 113*cc02d7e2SAndroid Build Coastguard Worker #endif // GRPCPP_EXT_CSM_OBSERVABILITY_H 114