• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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