1 // 2 // 3 // Copyright 2023 gRPC authors. 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 // 17 // 18 19 #ifndef GRPC_SRC_CPP_SERVER_BACKEND_METRIC_RECORDER_H 20 #define GRPC_SRC_CPP_SERVER_BACKEND_METRIC_RECORDER_H 21 22 #include <grpcpp/ext/call_metric_recorder.h> 23 #include <grpcpp/ext/server_metric_recorder.h> 24 #include <grpcpp/impl/sync.h> 25 #include <grpcpp/support/string_ref.h> 26 #include <stdint.h> 27 28 #include <atomic> 29 #include <map> 30 31 #include "absl/base/thread_annotations.h" 32 #include "absl/strings/string_view.h" 33 #include "src/core/ext/filters/backend_metrics/backend_metric_provider.h" 34 #include "src/core/load_balancing/backend_metric_data.h" 35 36 namespace grpc { 37 namespace experimental { 38 39 // Backend metrics and an associated update sequence number. 40 struct ServerMetricRecorder::BackendMetricDataState { 41 grpc_core::BackendMetricData data; 42 uint64_t sequence_number = 0; 43 }; 44 45 } // namespace experimental 46 47 class BackendMetricState : public grpc_core::BackendMetricProvider, 48 public experimental::CallMetricRecorder { 49 public: 50 // `server_metric_recorder` is optional. When set, GetBackendMetricData() 51 // merges metrics from `server_metric_recorder` with metrics recorded to this. BackendMetricState(experimental::ServerMetricRecorder * server_metric_recorder)52 explicit BackendMetricState( 53 experimental::ServerMetricRecorder* server_metric_recorder) 54 : server_metric_recorder_(server_metric_recorder) {} 55 experimental::CallMetricRecorder& RecordCpuUtilizationMetric( 56 double value) override; 57 experimental::CallMetricRecorder& RecordMemoryUtilizationMetric( 58 double value) override; 59 experimental::CallMetricRecorder& RecordApplicationUtilizationMetric( 60 double value) override; 61 experimental::CallMetricRecorder& RecordQpsMetric(double value) override; 62 experimental::CallMetricRecorder& RecordEpsMetric(double value) override; 63 experimental::CallMetricRecorder& RecordUtilizationMetric( 64 string_ref name, double value) override; 65 experimental::CallMetricRecorder& RecordRequestCostMetric( 66 string_ref name, double value) override; 67 experimental::CallMetricRecorder& RecordNamedMetric(string_ref name, 68 double value) override; 69 // This clears metrics currently recorded. Don't call twice. 70 grpc_core::BackendMetricData GetBackendMetricData() override; 71 72 private: 73 experimental::ServerMetricRecorder* server_metric_recorder_; 74 std::atomic<double> cpu_utilization_{-1.0}; 75 std::atomic<double> mem_utilization_{-1.0}; 76 std::atomic<double> application_utilization_{-1.0}; 77 std::atomic<double> qps_{-1.0}; 78 std::atomic<double> eps_{-1.0}; 79 internal::Mutex mu_; 80 std::map<absl::string_view, double> utilization_ ABSL_GUARDED_BY(mu_); 81 std::map<absl::string_view, double> request_cost_ ABSL_GUARDED_BY(mu_); 82 std::map<absl::string_view, double> named_metrics_ ABSL_GUARDED_BY(mu_); 83 }; 84 85 } // namespace grpc 86 87 #endif // GRPC_SRC_CPP_SERVER_BACKEND_METRIC_RECORDER_H 88