@ -34,22 +34,112 @@
# ifndef TEST_QPS_REPORT_H
# define TEST_QPS_REPORT_H
# include <memory>
# include <set>
# include <vector>
# include <grpc++/config.h>
# include "test/cpp/qps/driver.h"
# include "test/cpp/qps/qpstest.grpc.pb.h"
namespace grpc {
namespace testing {
// QPS: XXX
void ReportQPS ( const ScenarioResult & result ) ;
// QPS: XXX (YYY/server core)
void ReportQPSPerCore ( const ScenarioResult & result , const ServerConfig & config ) ;
// Latency (50/90/95/99/99.9%-ile): AA/BB/CC/DD/EE us
void ReportLatency ( const ScenarioResult & result ) ;
// Server system time: XX%
// Server user time: XX%
// Client system time: XX%
// Client user time: XX%
void ReportTimes ( const ScenarioResult & result ) ;
/** General set of data required for report generation. */
struct ReportData {
const ClientConfig & client_config ;
const ServerConfig & server_config ;
const ScenarioResult & scenario_result ;
} ;
/** Specifies the type of performance report we are interested in.
*
* \ note The special type \ c REPORT_ALL is equivalent to specifying all the
* other fields . */
enum ReportType {
/** Equivalent to the combination of all other fields. */
REPORT_ALL ,
/** Report only QPS information. */
REPORT_QPS ,
/** Report only QPS per core information. */
REPORT_QPS_PER_CORE ,
/** Report latency info for the 50, 90, 95, 99 and 99.9th percentiles. */
REPORT_LATENCY ,
/** Report user and system time. */
REPORT_TIMES
} ;
class Reporter ;
/** A registry of Reporter instances.
*
* Instances registered will be taken into account by the Report ( ) method .
*/
class ReportersRegistry {
public :
/** Adds the \c reporter to the registry.
* \ attention Takes ownership of \ c reporter . */
void Register ( const Reporter * reporter ) ;
/** Returns the names of the registered \c Reporter instances. */
std : : vector < string > GetNamesRegistered ( ) const ;
/** Triggers the reporting for all registered \c Reporter instances.
*
* \ param data Configuration and results for the scenario being reported .
* \ param types A collection of report types to include in the report . */
void Report ( const ReportData & data ,
const std : : set < ReportType > & types ) const ;
private :
std : : vector < std : : unique_ptr < const Reporter > > reporters_ ;
} ;
/** Interface for all reporters. */
class Reporter {
public :
/** Construct a reporter with the given \a name. */
Reporter ( const string & name ) : name_ ( name ) { }
/** Returns this reporter's name.
*
* Names are constants , set at construction time . */
string name ( ) const { return name_ ; }
/** Template method responsible for the generation of the requested types. */
void Report ( const ReportData & data , const std : : set < ReportType > & types ) const ;
protected :
/** Reports QPS for the given \a result. */
virtual void ReportQPS ( const ScenarioResult & result ) const = 0 ;
/** Reports QPS per core as (YYY/server core). */
virtual void ReportQPSPerCore ( const ScenarioResult & result ,
const ServerConfig & config ) const = 0 ;
/** Reports latencies for the 50, 90, 95, 99 and 99.9 percentiles, in ms. */
virtual void ReportLatency ( const ScenarioResult & result ) const = 0 ;
/** Reports system and user time for client and server systems. */
virtual void ReportTimes ( const ScenarioResult & result ) const = 0 ;
private :
const string name_ ;
} ;
// Reporters.
/** Reporter to gpr_log(GPR_INFO). */
class GprLogReporter : public Reporter {
public :
GprLogReporter ( const string & name ) : Reporter ( name ) { }
private :
void ReportQPS ( const ScenarioResult & result ) const GRPC_OVERRIDE ;
void ReportQPSPerCore ( const ScenarioResult & result ,
const ServerConfig & config ) const GRPC_OVERRIDE ;
void ReportLatency ( const ScenarioResult & result ) const GRPC_OVERRIDE ;
void ReportTimes ( const ScenarioResult & result ) const GRPC_OVERRIDE ;
} ;
} // namespace testing
} // namespace grpc