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 <stdint.h> 23 24 #include <atomic> 25 #include <map> 26 27 #include "absl/base/thread_annotations.h" 28 #include "absl/strings/string_view.h" 29 30 #include <grpcpp/ext/call_metric_recorder.h> 31 #include <grpcpp/ext/server_metric_recorder.h> 32 #include <grpcpp/impl/sync.h> 33 #include <grpcpp/support/string_ref.h> 34 35 #include "src/core/ext/filters/backend_metrics/backend_metric_provider.h" 36 #include "src/core/load_balancing/backend_metric_data.h" 37 38 namespace grpc { 39 namespace experimental { 40 41 // Backend metrics and an associated update sequence number. 42 struct ServerMetricRecorder::BackendMetricDataState { 43 grpc_core::BackendMetricData data; 44 uint64_t sequence_number = 0; 45 }; 46 47 } // namespace experimental 48 49 class BackendMetricState : public grpc_core::BackendMetricProvider, 50 public experimental::CallMetricRecorder { 51 public: 52 // `server_metric_recorder` is optional. When set, GetBackendMetricData() 53 // merges metrics from `server_metric_recorder` with metrics recorded to this. BackendMetricState(experimental::ServerMetricRecorder * server_metric_recorder)54 explicit BackendMetricState( 55 experimental::ServerMetricRecorder* server_metric_recorder) 56 : server_metric_recorder_(server_metric_recorder) {} 57 experimental::CallMetricRecorder& RecordCpuUtilizationMetric( 58 double value) override; 59 experimental::CallMetricRecorder& RecordMemoryUtilizationMetric( 60 double value) override; 61 experimental::CallMetricRecorder& RecordApplicationUtilizationMetric( 62 double value) override; 63 experimental::CallMetricRecorder& RecordQpsMetric(double value) override; 64 experimental::CallMetricRecorder& RecordEpsMetric(double value) override; 65 experimental::CallMetricRecorder& RecordUtilizationMetric( 66 string_ref name, double value) override; 67 experimental::CallMetricRecorder& RecordRequestCostMetric( 68 string_ref name, double value) override; 69 experimental::CallMetricRecorder& RecordNamedMetric(string_ref name, 70 double value) override; 71 // This clears metrics currently recorded. Don't call twice. 72 grpc_core::BackendMetricData GetBackendMetricData() override; 73 74 private: 75 experimental::ServerMetricRecorder* server_metric_recorder_; 76 std::atomic<double> cpu_utilization_{-1.0}; 77 std::atomic<double> mem_utilization_{-1.0}; 78 std::atomic<double> application_utilization_{-1.0}; 79 std::atomic<double> qps_{-1.0}; 80 std::atomic<double> eps_{-1.0}; 81 internal::Mutex mu_; 82 std::map<absl::string_view, double> utilization_ ABSL_GUARDED_BY(mu_); 83 std::map<absl::string_view, double> request_cost_ ABSL_GUARDED_BY(mu_); 84 std::map<absl::string_view, double> named_metrics_ ABSL_GUARDED_BY(mu_); 85 }; 86 87 } // namespace grpc 88 89 #endif // GRPC_SRC_CPP_SERVER_BACKEND_METRIC_RECORDER_H 90