|  | @@ -134,36 +134,38 @@ static bool IsSuccess(const Status& s) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Postprocess ScenarioResult and populate result summary.
 | 
	
		
			
				|  |  |  static void postprocess_scenario_result(ScenarioResult* result) {
 | 
	
		
			
				|  |  | +  // Get latencies from ScenarioResult latencies histogram and populate to
 | 
	
		
			
				|  |  | +  // result summary.
 | 
	
		
			
				|  |  |    Histogram histogram;
 | 
	
		
			
				|  |  |    histogram.MergeProto(result->latencies());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  auto time_estimate = average(result->client_stats(), WallTime);
 | 
	
		
			
				|  |  | -  auto qps = histogram.Count() / time_estimate;
 | 
	
		
			
				|  |  | -  auto qps_per_server_core = qps / sum(result->server_cores(), Cores);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  result->mutable_summary()->set_qps(qps);
 | 
	
		
			
				|  |  | -  result->mutable_summary()->set_qps_per_server_core(qps_per_server_core);
 | 
	
		
			
				|  |  |    result->mutable_summary()->set_latency_50(histogram.Percentile(50));
 | 
	
		
			
				|  |  |    result->mutable_summary()->set_latency_90(histogram.Percentile(90));
 | 
	
		
			
				|  |  |    result->mutable_summary()->set_latency_95(histogram.Percentile(95));
 | 
	
		
			
				|  |  |    result->mutable_summary()->set_latency_99(histogram.Percentile(99));
 | 
	
		
			
				|  |  |    result->mutable_summary()->set_latency_999(histogram.Percentile(99.9));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  auto server_system_time = 100.0 *
 | 
	
		
			
				|  |  | -                            sum(result->server_stats(), ServerSystemTime) /
 | 
	
		
			
				|  |  | -                            sum(result->server_stats(), ServerWallTime);
 | 
	
		
			
				|  |  | -  auto server_user_time = 100.0 * sum(result->server_stats(), ServerUserTime) /
 | 
	
		
			
				|  |  | -                          sum(result->server_stats(), ServerWallTime);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  auto client_system_time = 100.0 * sum(result->client_stats(), SystemTime) /
 | 
	
		
			
				|  |  | -                            sum(result->client_stats(), WallTime);
 | 
	
		
			
				|  |  | -  auto client_user_time = 100.0 * sum(result->client_stats(), UserTime) /
 | 
	
		
			
				|  |  | -                          sum(result->client_stats(), WallTime);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  result->mutable_summary()->set_server_system_time(server_system_time);
 | 
	
		
			
				|  |  | -  result->mutable_summary()->set_server_user_time(server_user_time);
 | 
	
		
			
				|  |  | -  result->mutable_summary()->set_client_system_time(client_system_time);
 | 
	
		
			
				|  |  | -  result->mutable_summary()->set_client_user_time(client_user_time);
 | 
	
		
			
				|  |  | +  // Calculate qps and cpu load for each client and then aggregate results for all clients 
 | 
	
		
			
				|  |  | +  double qps = 0;
 | 
	
		
			
				|  |  | +  double client_system_cpu_load = 0, client_user_cpu_load = 0;
 | 
	
		
			
				|  |  | +  double server_system_cpu_load = 0, server_user_cpu_load = 0;
 | 
	
		
			
				|  |  | +  for (size_t i = 0; i < result->client_stats_size(); i++){
 | 
	
		
			
				|  |  | +    auto client_stat = result->client_stats(i);
 | 
	
		
			
				|  |  | +    qps += client_stat.latencies().count() / client_stat.time_system();
 | 
	
		
			
				|  |  | +    client_system_cpu_load += client_stat.time_system() / client_stat.time_elapsed();
 | 
	
		
			
				|  |  | +    client_user_cpu_load += client_stat.time_user() / client_stat.time_elapsed();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // Calculate cpu load for each server and then aggregate results for all servers
 | 
	
		
			
				|  |  | +  for (size_t i = 0; i < result->server_stats_size(); i++){
 | 
	
		
			
				|  |  | +    auto server_stat = result->server_stats(i);
 | 
	
		
			
				|  |  | +    server_system_cpu_load += server_stat.time_system() / server_stat.time_elapsed();
 | 
	
		
			
				|  |  | +    server_user_cpu_load += server_stat.time_user() / server_stat.time_elapsed();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  result->mutable_summary()->set_qps(qps);
 | 
	
		
			
				|  |  | +  // Populate the percentage of cpu load to result summary.
 | 
	
		
			
				|  |  | +  result->mutable_summary()->set_server_system_time(100 * server_system_cpu_load);
 | 
	
		
			
				|  |  | +  result->mutable_summary()->set_server_user_time(100 * server_user_cpu_load);
 | 
	
		
			
				|  |  | +  result->mutable_summary()->set_client_system_time(100* client_system_cpu_load);
 | 
	
		
			
				|  |  | +  result->mutable_summary()->set_client_user_time(100 * client_user_cpu_load);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // For Non-linux platform, get_cpu_usage() is not implemented. Thus,
 | 
	
		
			
				|  |  |    // ServerTotalCpuTime and ServerIdleCpuTime are both 0.
 | 
	
	
		
			
				|  | @@ -176,6 +178,9 @@ static void postprocess_scenario_result(ScenarioResult* result) {
 | 
	
		
			
				|  |  |      result->mutable_summary()->set_server_cpu_usage(server_cpu_usage);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  // Calculate and populate successful request per second and failed requests
 | 
	
		
			
				|  |  | +  // per seconds to result summary.
 | 
	
		
			
				|  |  | +  auto time_estimate = average(result->client_stats(), WallTime);
 | 
	
		
			
				|  |  |    if (result->request_results_size() > 0) {
 | 
	
		
			
				|  |  |      int64_t successes = 0;
 | 
	
		
			
				|  |  |      int64_t failures = 0;
 | 
	
	
		
			
				|  | @@ -193,6 +198,9 @@ static void postprocess_scenario_result(ScenarioResult* result) {
 | 
	
		
			
				|  |  |                                                                time_estimate);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  // Fill in data for other metrics required in result summary
 | 
	
		
			
				|  |  | +  auto qps_per_server_core = qps / sum(result->server_cores(), Cores);
 | 
	
		
			
				|  |  | +  result->mutable_summary()->set_qps_per_server_core(qps_per_server_core);
 | 
	
		
			
				|  |  |    result->mutable_summary()->set_client_polls_per_request(
 | 
	
		
			
				|  |  |        sum(result->client_stats(), CliPollCount) / histogram.Count());
 | 
	
		
			
				|  |  |    result->mutable_summary()->set_server_polls_per_request(
 |