• 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 <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