xref: /aosp_15_r20/external/grpc-grpc/test/cpp/qps/report.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1 //
2 //
3 // Copyright 2015 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_TEST_CPP_QPS_REPORT_H
20 #define GRPC_TEST_CPP_QPS_REPORT_H
21 
22 #include <memory>
23 #include <set>
24 #include <vector>
25 
26 #include <grpcpp/channel.h>
27 #include <grpcpp/support/config.h>
28 
29 #include "src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.h"
30 #include "test/cpp/qps/driver.h"
31 
32 namespace grpc {
33 namespace testing {
34 
35 /// Interface for all reporters.
36 class Reporter {
37  public:
38   /// Construct a reporter with the given \a name.
Reporter(const string & name)39   explicit Reporter(const string& name) : name_(name) {}
40 
~Reporter()41   virtual ~Reporter() {}
42 
43   /// Returns this reporter's name.
44   ///
45   /// Names are constants, set at construction time.
name()46   string name() const { return name_; }
47 
48   /// Reports QPS for the given \a result.
49   virtual void ReportQPS(const ScenarioResult& result) = 0;
50 
51   /// Reports QPS per core as (YYY/server core).
52   virtual void ReportQPSPerCore(const ScenarioResult& result) = 0;
53 
54   /// Reports latencies for the 50, 90, 95, 99 and 99.9 percentiles, in ms.
55   virtual void ReportLatency(const ScenarioResult& result) = 0;
56 
57   /// Reports system and user time for client and server systems.
58   virtual void ReportTimes(const ScenarioResult& result) = 0;
59 
60   /// Reports server cpu usage.
61   virtual void ReportCpuUsage(const ScenarioResult& result) = 0;
62 
63   /// Reports client and server poll usage inside completion queue.
64   virtual void ReportPollCount(const ScenarioResult& result) = 0;
65 
66   /// Reports queries per cpu-sec.
67   virtual void ReportQueriesPerCpuSec(const ScenarioResult& result) = 0;
68 
69  private:
70   const string name_;
71 };
72 
73 /// A composite for all reporters to be considered.
74 class CompositeReporter : public Reporter {
75  public:
CompositeReporter()76   CompositeReporter() : Reporter("CompositeReporter") {}
77 
78   /// Adds a \a reporter to the composite.
79   void add(std::unique_ptr<Reporter> reporter);
80 
81   void ReportQPS(const ScenarioResult& result) override;
82   void ReportQPSPerCore(const ScenarioResult& result) override;
83   void ReportLatency(const ScenarioResult& result) override;
84   void ReportTimes(const ScenarioResult& result) override;
85   void ReportCpuUsage(const ScenarioResult& result) override;
86   void ReportPollCount(const ScenarioResult& result) override;
87   void ReportQueriesPerCpuSec(const ScenarioResult& result) override;
88 
89  private:
90   std::vector<std::unique_ptr<Reporter> > reporters_;
91 };
92 
93 /// Reporter to gpr_log(GPR_INFO).
94 class GprLogReporter : public Reporter {
95  public:
GprLogReporter(const string & name)96   explicit GprLogReporter(const string& name) : Reporter(name) {}
97 
98  private:
99   void ReportQPS(const ScenarioResult& result) override;
100   void ReportQPSPerCore(const ScenarioResult& result) override;
101   void ReportLatency(const ScenarioResult& result) override;
102   void ReportTimes(const ScenarioResult& result) override;
103   void ReportCpuUsage(const ScenarioResult& result) override;
104   void ReportPollCount(const ScenarioResult& result) override;
105   void ReportQueriesPerCpuSec(const ScenarioResult& result) override;
106 };
107 
108 /// Dumps the report to a JSON file.
109 class JsonReporter : public Reporter {
110  public:
JsonReporter(const string & name,const string & report_file)111   JsonReporter(const string& name, const string& report_file)
112       : Reporter(name), report_file_(report_file) {}
113 
114  private:
115   void ReportQPS(const ScenarioResult& result) override;
116   void ReportQPSPerCore(const ScenarioResult& result) override;
117   void ReportLatency(const ScenarioResult& result) override;
118   void ReportTimes(const ScenarioResult& result) override;
119   void ReportCpuUsage(const ScenarioResult& result) override;
120   void ReportPollCount(const ScenarioResult& result) override;
121   void ReportQueriesPerCpuSec(const ScenarioResult& result) override;
122 
123   const string report_file_;
124 };
125 
126 class RpcReporter : public Reporter {
127  public:
RpcReporter(const string & name,const std::shared_ptr<grpc::Channel> & channel)128   RpcReporter(const string& name, const std::shared_ptr<grpc::Channel>& channel)
129       : Reporter(name), stub_(ReportQpsScenarioService::NewStub(channel)) {}
130 
131  private:
132   void ReportQPS(const ScenarioResult& result) override;
133   void ReportQPSPerCore(const ScenarioResult& result) override;
134   void ReportLatency(const ScenarioResult& result) override;
135   void ReportTimes(const ScenarioResult& result) override;
136   void ReportCpuUsage(const ScenarioResult& result) override;
137   void ReportPollCount(const ScenarioResult& result) override;
138   void ReportQueriesPerCpuSec(const ScenarioResult& result) override;
139 
140   std::unique_ptr<ReportQpsScenarioService::Stub> stub_;
141 };
142 
143 }  // namespace testing
144 }  // namespace grpc
145 
146 #endif  // GRPC_TEST_CPP_QPS_REPORT_H
147