1*cc02d7e2SAndroid Build Coastguard Worker// Copyright 2015 gRPC authors. 2*cc02d7e2SAndroid Build Coastguard Worker// 3*cc02d7e2SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*cc02d7e2SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*cc02d7e2SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*cc02d7e2SAndroid Build Coastguard Worker// 7*cc02d7e2SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*cc02d7e2SAndroid Build Coastguard Worker// 9*cc02d7e2SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*cc02d7e2SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*cc02d7e2SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*cc02d7e2SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*cc02d7e2SAndroid Build Coastguard Worker// limitations under the License. 14*cc02d7e2SAndroid Build Coastguard Worker 15*cc02d7e2SAndroid Build Coastguard Workersyntax = "proto3"; 16*cc02d7e2SAndroid Build Coastguard Worker 17*cc02d7e2SAndroid Build Coastguard Workerimport "src/proto/grpc/testing/payloads.proto"; 18*cc02d7e2SAndroid Build Coastguard Workerimport "src/proto/grpc/testing/stats.proto"; 19*cc02d7e2SAndroid Build Coastguard Workerimport "google/protobuf/timestamp.proto"; 20*cc02d7e2SAndroid Build Coastguard Worker 21*cc02d7e2SAndroid Build Coastguard Workerpackage grpc.testing; 22*cc02d7e2SAndroid Build Coastguard Worker 23*cc02d7e2SAndroid Build Coastguard Workerenum ClientType { 24*cc02d7e2SAndroid Build Coastguard Worker // Many languages support a basic distinction between using 25*cc02d7e2SAndroid Build Coastguard Worker // sync or async client, and this allows the specification 26*cc02d7e2SAndroid Build Coastguard Worker SYNC_CLIENT = 0; 27*cc02d7e2SAndroid Build Coastguard Worker ASYNC_CLIENT = 1; 28*cc02d7e2SAndroid Build Coastguard Worker OTHER_CLIENT = 2; // used for some language-specific variants 29*cc02d7e2SAndroid Build Coastguard Worker CALLBACK_CLIENT = 3; 30*cc02d7e2SAndroid Build Coastguard Worker} 31*cc02d7e2SAndroid Build Coastguard Worker 32*cc02d7e2SAndroid Build Coastguard Workerenum ServerType { 33*cc02d7e2SAndroid Build Coastguard Worker SYNC_SERVER = 0; 34*cc02d7e2SAndroid Build Coastguard Worker ASYNC_SERVER = 1; 35*cc02d7e2SAndroid Build Coastguard Worker ASYNC_GENERIC_SERVER = 2; 36*cc02d7e2SAndroid Build Coastguard Worker OTHER_SERVER = 3; // used for some language-specific variants 37*cc02d7e2SAndroid Build Coastguard Worker CALLBACK_SERVER = 4; 38*cc02d7e2SAndroid Build Coastguard Worker} 39*cc02d7e2SAndroid Build Coastguard Worker 40*cc02d7e2SAndroid Build Coastguard Workerenum RpcType { 41*cc02d7e2SAndroid Build Coastguard Worker UNARY = 0; 42*cc02d7e2SAndroid Build Coastguard Worker STREAMING = 1; 43*cc02d7e2SAndroid Build Coastguard Worker STREAMING_FROM_CLIENT = 2; 44*cc02d7e2SAndroid Build Coastguard Worker STREAMING_FROM_SERVER = 3; 45*cc02d7e2SAndroid Build Coastguard Worker STREAMING_BOTH_WAYS = 4; 46*cc02d7e2SAndroid Build Coastguard Worker} 47*cc02d7e2SAndroid Build Coastguard Worker 48*cc02d7e2SAndroid Build Coastguard Worker// Parameters of poisson process distribution, which is a good representation 49*cc02d7e2SAndroid Build Coastguard Worker// of activity coming in from independent identical stationary sources. 50*cc02d7e2SAndroid Build Coastguard Workermessage PoissonParams { 51*cc02d7e2SAndroid Build Coastguard Worker // The rate of arrivals (a.k.a. lambda parameter of the exp distribution). 52*cc02d7e2SAndroid Build Coastguard Worker double offered_load = 1; 53*cc02d7e2SAndroid Build Coastguard Worker} 54*cc02d7e2SAndroid Build Coastguard Worker 55*cc02d7e2SAndroid Build Coastguard Worker// Once an RPC finishes, immediately start a new one. 56*cc02d7e2SAndroid Build Coastguard Worker// No configuration parameters needed. 57*cc02d7e2SAndroid Build Coastguard Workermessage ClosedLoopParams {} 58*cc02d7e2SAndroid Build Coastguard Worker 59*cc02d7e2SAndroid Build Coastguard Workermessage LoadParams { 60*cc02d7e2SAndroid Build Coastguard Worker oneof load { 61*cc02d7e2SAndroid Build Coastguard Worker ClosedLoopParams closed_loop = 1; 62*cc02d7e2SAndroid Build Coastguard Worker PoissonParams poisson = 2; 63*cc02d7e2SAndroid Build Coastguard Worker }; 64*cc02d7e2SAndroid Build Coastguard Worker} 65*cc02d7e2SAndroid Build Coastguard Worker 66*cc02d7e2SAndroid Build Coastguard Worker// presence of SecurityParams implies use of TLS 67*cc02d7e2SAndroid Build Coastguard Workermessage SecurityParams { 68*cc02d7e2SAndroid Build Coastguard Worker bool use_test_ca = 1; 69*cc02d7e2SAndroid Build Coastguard Worker string server_host_override = 2; 70*cc02d7e2SAndroid Build Coastguard Worker string cred_type = 3; 71*cc02d7e2SAndroid Build Coastguard Worker} 72*cc02d7e2SAndroid Build Coastguard Worker 73*cc02d7e2SAndroid Build Coastguard Workermessage ChannelArg { 74*cc02d7e2SAndroid Build Coastguard Worker string name = 1; 75*cc02d7e2SAndroid Build Coastguard Worker oneof value { 76*cc02d7e2SAndroid Build Coastguard Worker string str_value = 2; 77*cc02d7e2SAndroid Build Coastguard Worker int32 int_value = 3; 78*cc02d7e2SAndroid Build Coastguard Worker } 79*cc02d7e2SAndroid Build Coastguard Worker} 80*cc02d7e2SAndroid Build Coastguard Worker 81*cc02d7e2SAndroid Build Coastguard Workermessage ClientConfig { 82*cc02d7e2SAndroid Build Coastguard Worker // List of targets to connect to. At least one target needs to be specified. 83*cc02d7e2SAndroid Build Coastguard Worker repeated string server_targets = 1; 84*cc02d7e2SAndroid Build Coastguard Worker ClientType client_type = 2; 85*cc02d7e2SAndroid Build Coastguard Worker SecurityParams security_params = 3; 86*cc02d7e2SAndroid Build Coastguard Worker // How many concurrent RPCs to start for each channel. 87*cc02d7e2SAndroid Build Coastguard Worker // For synchronous client, use a separate thread for each outstanding RPC. 88*cc02d7e2SAndroid Build Coastguard Worker int32 outstanding_rpcs_per_channel = 4; 89*cc02d7e2SAndroid Build Coastguard Worker // Number of independent client channels to create. 90*cc02d7e2SAndroid Build Coastguard Worker // i-th channel will connect to server_target[i % server_targets.size()] 91*cc02d7e2SAndroid Build Coastguard Worker int32 client_channels = 5; 92*cc02d7e2SAndroid Build Coastguard Worker // Only for async client. Number of threads to use to start/manage RPCs. 93*cc02d7e2SAndroid Build Coastguard Worker int32 async_client_threads = 7; 94*cc02d7e2SAndroid Build Coastguard Worker RpcType rpc_type = 8; 95*cc02d7e2SAndroid Build Coastguard Worker // The requested load for the entire client (aggregated over all the threads). 96*cc02d7e2SAndroid Build Coastguard Worker LoadParams load_params = 10; 97*cc02d7e2SAndroid Build Coastguard Worker PayloadConfig payload_config = 11; 98*cc02d7e2SAndroid Build Coastguard Worker HistogramParams histogram_params = 12; 99*cc02d7e2SAndroid Build Coastguard Worker 100*cc02d7e2SAndroid Build Coastguard Worker // Specify the cores we should run the client on, if desired 101*cc02d7e2SAndroid Build Coastguard Worker repeated int32 core_list = 13; 102*cc02d7e2SAndroid Build Coastguard Worker int32 core_limit = 14; 103*cc02d7e2SAndroid Build Coastguard Worker 104*cc02d7e2SAndroid Build Coastguard Worker // If we use an OTHER_CLIENT client_type, this string gives more detail 105*cc02d7e2SAndroid Build Coastguard Worker string other_client_api = 15; 106*cc02d7e2SAndroid Build Coastguard Worker 107*cc02d7e2SAndroid Build Coastguard Worker repeated ChannelArg channel_args = 16; 108*cc02d7e2SAndroid Build Coastguard Worker 109*cc02d7e2SAndroid Build Coastguard Worker // Number of threads that share each completion queue 110*cc02d7e2SAndroid Build Coastguard Worker int32 threads_per_cq = 17; 111*cc02d7e2SAndroid Build Coastguard Worker 112*cc02d7e2SAndroid Build Coastguard Worker // Number of messages on a stream before it gets finished/restarted 113*cc02d7e2SAndroid Build Coastguard Worker int32 messages_per_stream = 18; 114*cc02d7e2SAndroid Build Coastguard Worker 115*cc02d7e2SAndroid Build Coastguard Worker // Use coalescing API when possible. 116*cc02d7e2SAndroid Build Coastguard Worker bool use_coalesce_api = 19; 117*cc02d7e2SAndroid Build Coastguard Worker 118*cc02d7e2SAndroid Build Coastguard Worker // If 0, disabled. Else, specifies the period between gathering latency 119*cc02d7e2SAndroid Build Coastguard Worker // medians in milliseconds. 120*cc02d7e2SAndroid Build Coastguard Worker int32 median_latency_collection_interval_millis = 20; 121*cc02d7e2SAndroid Build Coastguard Worker 122*cc02d7e2SAndroid Build Coastguard Worker // Number of client processes. 0 indicates no restriction. 123*cc02d7e2SAndroid Build Coastguard Worker int32 client_processes = 21; 124*cc02d7e2SAndroid Build Coastguard Worker} 125*cc02d7e2SAndroid Build Coastguard Worker 126*cc02d7e2SAndroid Build Coastguard Workermessage ClientStatus { ClientStats stats = 1; } 127*cc02d7e2SAndroid Build Coastguard Worker 128*cc02d7e2SAndroid Build Coastguard Worker// Request current stats 129*cc02d7e2SAndroid Build Coastguard Workermessage Mark { 130*cc02d7e2SAndroid Build Coastguard Worker // if true, the stats will be reset after taking their snapshot. 131*cc02d7e2SAndroid Build Coastguard Worker bool reset = 1; 132*cc02d7e2SAndroid Build Coastguard Worker} 133*cc02d7e2SAndroid Build Coastguard Worker 134*cc02d7e2SAndroid Build Coastguard Workermessage ClientArgs { 135*cc02d7e2SAndroid Build Coastguard Worker oneof argtype { 136*cc02d7e2SAndroid Build Coastguard Worker ClientConfig setup = 1; 137*cc02d7e2SAndroid Build Coastguard Worker Mark mark = 2; 138*cc02d7e2SAndroid Build Coastguard Worker } 139*cc02d7e2SAndroid Build Coastguard Worker} 140*cc02d7e2SAndroid Build Coastguard Worker 141*cc02d7e2SAndroid Build Coastguard Workermessage ServerConfig { 142*cc02d7e2SAndroid Build Coastguard Worker ServerType server_type = 1; 143*cc02d7e2SAndroid Build Coastguard Worker SecurityParams security_params = 2; 144*cc02d7e2SAndroid Build Coastguard Worker // Port on which to listen. Zero means pick unused port. 145*cc02d7e2SAndroid Build Coastguard Worker int32 port = 4; 146*cc02d7e2SAndroid Build Coastguard Worker // Only for async server. Number of threads used to serve the requests. 147*cc02d7e2SAndroid Build Coastguard Worker int32 async_server_threads = 7; 148*cc02d7e2SAndroid Build Coastguard Worker // Specify the number of cores to limit server to, if desired 149*cc02d7e2SAndroid Build Coastguard Worker int32 core_limit = 8; 150*cc02d7e2SAndroid Build Coastguard Worker // payload config, used in generic server. 151*cc02d7e2SAndroid Build Coastguard Worker // Note this must NOT be used in proto (non-generic) servers. For proto servers, 152*cc02d7e2SAndroid Build Coastguard Worker // 'response sizes' must be configured from the 'response_size' field of the 153*cc02d7e2SAndroid Build Coastguard Worker // 'SimpleRequest' objects in RPC requests. 154*cc02d7e2SAndroid Build Coastguard Worker PayloadConfig payload_config = 9; 155*cc02d7e2SAndroid Build Coastguard Worker 156*cc02d7e2SAndroid Build Coastguard Worker // Specify the cores we should run the server on, if desired 157*cc02d7e2SAndroid Build Coastguard Worker repeated int32 core_list = 10; 158*cc02d7e2SAndroid Build Coastguard Worker 159*cc02d7e2SAndroid Build Coastguard Worker // If we use an OTHER_SERVER client_type, this string gives more detail 160*cc02d7e2SAndroid Build Coastguard Worker string other_server_api = 11; 161*cc02d7e2SAndroid Build Coastguard Worker 162*cc02d7e2SAndroid Build Coastguard Worker // Number of threads that share each completion queue 163*cc02d7e2SAndroid Build Coastguard Worker int32 threads_per_cq = 12; 164*cc02d7e2SAndroid Build Coastguard Worker 165*cc02d7e2SAndroid Build Coastguard Worker // c++-only options (for now) -------------------------------- 166*cc02d7e2SAndroid Build Coastguard Worker 167*cc02d7e2SAndroid Build Coastguard Worker // Buffer pool size (no buffer pool specified if unset) 168*cc02d7e2SAndroid Build Coastguard Worker int32 resource_quota_size = 1001; 169*cc02d7e2SAndroid Build Coastguard Worker repeated ChannelArg channel_args = 1002; 170*cc02d7e2SAndroid Build Coastguard Worker 171*cc02d7e2SAndroid Build Coastguard Worker // Number of server processes. 0 indicates no restriction. 172*cc02d7e2SAndroid Build Coastguard Worker int32 server_processes = 21; 173*cc02d7e2SAndroid Build Coastguard Worker} 174*cc02d7e2SAndroid Build Coastguard Worker 175*cc02d7e2SAndroid Build Coastguard Workermessage ServerArgs { 176*cc02d7e2SAndroid Build Coastguard Worker oneof argtype { 177*cc02d7e2SAndroid Build Coastguard Worker ServerConfig setup = 1; 178*cc02d7e2SAndroid Build Coastguard Worker Mark mark = 2; 179*cc02d7e2SAndroid Build Coastguard Worker } 180*cc02d7e2SAndroid Build Coastguard Worker} 181*cc02d7e2SAndroid Build Coastguard Worker 182*cc02d7e2SAndroid Build Coastguard Workermessage ServerStatus { 183*cc02d7e2SAndroid Build Coastguard Worker ServerStats stats = 1; 184*cc02d7e2SAndroid Build Coastguard Worker // the port bound by the server 185*cc02d7e2SAndroid Build Coastguard Worker int32 port = 2; 186*cc02d7e2SAndroid Build Coastguard Worker // Number of cores available to the server 187*cc02d7e2SAndroid Build Coastguard Worker int32 cores = 3; 188*cc02d7e2SAndroid Build Coastguard Worker} 189*cc02d7e2SAndroid Build Coastguard Worker 190*cc02d7e2SAndroid Build Coastguard Workermessage CoreRequest { 191*cc02d7e2SAndroid Build Coastguard Worker} 192*cc02d7e2SAndroid Build Coastguard Worker 193*cc02d7e2SAndroid Build Coastguard Workermessage CoreResponse { 194*cc02d7e2SAndroid Build Coastguard Worker // Number of cores available on the server 195*cc02d7e2SAndroid Build Coastguard Worker int32 cores = 1; 196*cc02d7e2SAndroid Build Coastguard Worker} 197*cc02d7e2SAndroid Build Coastguard Worker 198*cc02d7e2SAndroid Build Coastguard Workermessage Void { 199*cc02d7e2SAndroid Build Coastguard Worker} 200*cc02d7e2SAndroid Build Coastguard Worker 201*cc02d7e2SAndroid Build Coastguard Worker// A single performance scenario: input to qps_json_driver 202*cc02d7e2SAndroid Build Coastguard Workermessage Scenario { 203*cc02d7e2SAndroid Build Coastguard Worker // Human readable name for this scenario 204*cc02d7e2SAndroid Build Coastguard Worker string name = 1; 205*cc02d7e2SAndroid Build Coastguard Worker // Client configuration 206*cc02d7e2SAndroid Build Coastguard Worker ClientConfig client_config = 2; 207*cc02d7e2SAndroid Build Coastguard Worker // Number of clients to start for the test 208*cc02d7e2SAndroid Build Coastguard Worker int32 num_clients = 3; 209*cc02d7e2SAndroid Build Coastguard Worker // Server configuration 210*cc02d7e2SAndroid Build Coastguard Worker ServerConfig server_config = 4; 211*cc02d7e2SAndroid Build Coastguard Worker // Number of servers to start for the test 212*cc02d7e2SAndroid Build Coastguard Worker int32 num_servers = 5; 213*cc02d7e2SAndroid Build Coastguard Worker // Warmup period, in seconds 214*cc02d7e2SAndroid Build Coastguard Worker int32 warmup_seconds = 6; 215*cc02d7e2SAndroid Build Coastguard Worker // Benchmark time, in seconds 216*cc02d7e2SAndroid Build Coastguard Worker int32 benchmark_seconds = 7; 217*cc02d7e2SAndroid Build Coastguard Worker // Number of workers to spawn locally (usually zero) 218*cc02d7e2SAndroid Build Coastguard Worker int32 spawn_local_worker_count = 8; 219*cc02d7e2SAndroid Build Coastguard Worker} 220*cc02d7e2SAndroid Build Coastguard Worker 221*cc02d7e2SAndroid Build Coastguard Worker// A set of scenarios to be run with qps_json_driver 222*cc02d7e2SAndroid Build Coastguard Workermessage Scenarios { 223*cc02d7e2SAndroid Build Coastguard Worker repeated Scenario scenarios = 1; 224*cc02d7e2SAndroid Build Coastguard Worker} 225*cc02d7e2SAndroid Build Coastguard Worker 226*cc02d7e2SAndroid Build Coastguard Worker// Basic summary that can be computed from ClientStats and ServerStats 227*cc02d7e2SAndroid Build Coastguard Worker// once the scenario has finished. 228*cc02d7e2SAndroid Build Coastguard Workermessage ScenarioResultSummary 229*cc02d7e2SAndroid Build Coastguard Worker{ 230*cc02d7e2SAndroid Build Coastguard Worker // Total number of operations per second over all clients. What is counted as 1 'operation' depends on the benchmark scenarios: 231*cc02d7e2SAndroid Build Coastguard Worker // For unary benchmarks, an operation is processing of a single unary RPC. 232*cc02d7e2SAndroid Build Coastguard Worker // For streaming benchmarks, an operation is processing of a single ping pong of request and response. 233*cc02d7e2SAndroid Build Coastguard Worker double qps = 1; 234*cc02d7e2SAndroid Build Coastguard Worker // QPS per server core. 235*cc02d7e2SAndroid Build Coastguard Worker double qps_per_server_core = 2; 236*cc02d7e2SAndroid Build Coastguard Worker // The total server cpu load based on system time across all server processes, expressed as percentage of a single cpu core. 237*cc02d7e2SAndroid Build Coastguard Worker // For example, 85 implies 85% of a cpu core, 125 implies 125% of a cpu core. Since we are accumulating the cpu load across all the server 238*cc02d7e2SAndroid Build Coastguard Worker // processes, the value could > 100 when there are multiple servers or a single server using multiple threads and cores. 239*cc02d7e2SAndroid Build Coastguard Worker // Same explanation for the total client cpu load below. 240*cc02d7e2SAndroid Build Coastguard Worker double server_system_time = 3; 241*cc02d7e2SAndroid Build Coastguard Worker // The total server cpu load based on user time across all server processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) 242*cc02d7e2SAndroid Build Coastguard Worker double server_user_time = 4; 243*cc02d7e2SAndroid Build Coastguard Worker // The total client cpu load based on system time across all client processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) 244*cc02d7e2SAndroid Build Coastguard Worker double client_system_time = 5; 245*cc02d7e2SAndroid Build Coastguard Worker // The total client cpu load based on user time across all client processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) 246*cc02d7e2SAndroid Build Coastguard Worker double client_user_time = 6; 247*cc02d7e2SAndroid Build Coastguard Worker 248*cc02d7e2SAndroid Build Coastguard Worker // X% latency percentiles (in nanoseconds) 249*cc02d7e2SAndroid Build Coastguard Worker double latency_50 = 7; 250*cc02d7e2SAndroid Build Coastguard Worker double latency_90 = 8; 251*cc02d7e2SAndroid Build Coastguard Worker double latency_95 = 9; 252*cc02d7e2SAndroid Build Coastguard Worker double latency_99 = 10; 253*cc02d7e2SAndroid Build Coastguard Worker double latency_999 = 11; 254*cc02d7e2SAndroid Build Coastguard Worker 255*cc02d7e2SAndroid Build Coastguard Worker // server cpu usage percentage 256*cc02d7e2SAndroid Build Coastguard Worker double server_cpu_usage = 12; 257*cc02d7e2SAndroid Build Coastguard Worker 258*cc02d7e2SAndroid Build Coastguard Worker // Number of requests that succeeded/failed 259*cc02d7e2SAndroid Build Coastguard Worker double successful_requests_per_second = 13; 260*cc02d7e2SAndroid Build Coastguard Worker double failed_requests_per_second = 14; 261*cc02d7e2SAndroid Build Coastguard Worker 262*cc02d7e2SAndroid Build Coastguard Worker // Number of polls called inside completion queue per request 263*cc02d7e2SAndroid Build Coastguard Worker double client_polls_per_request = 15; 264*cc02d7e2SAndroid Build Coastguard Worker double server_polls_per_request = 16; 265*cc02d7e2SAndroid Build Coastguard Worker 266*cc02d7e2SAndroid Build Coastguard Worker // Queries per CPU-sec over all servers or clients 267*cc02d7e2SAndroid Build Coastguard Worker double server_queries_per_cpu_sec = 17; 268*cc02d7e2SAndroid Build Coastguard Worker double client_queries_per_cpu_sec = 18; 269*cc02d7e2SAndroid Build Coastguard Worker 270*cc02d7e2SAndroid Build Coastguard Worker 271*cc02d7e2SAndroid Build Coastguard Worker // Start and end time for the test scenario 272*cc02d7e2SAndroid Build Coastguard Worker google.protobuf.Timestamp start_time = 19; 273*cc02d7e2SAndroid Build Coastguard Worker google.protobuf.Timestamp end_time =20; 274*cc02d7e2SAndroid Build Coastguard Worker} 275*cc02d7e2SAndroid Build Coastguard Worker 276*cc02d7e2SAndroid Build Coastguard Worker// Results of a single benchmark scenario. 277*cc02d7e2SAndroid Build Coastguard Workermessage ScenarioResult { 278*cc02d7e2SAndroid Build Coastguard Worker // Inputs used to run the scenario. 279*cc02d7e2SAndroid Build Coastguard Worker Scenario scenario = 1; 280*cc02d7e2SAndroid Build Coastguard Worker // Histograms from all clients merged into one histogram. 281*cc02d7e2SAndroid Build Coastguard Worker HistogramData latencies = 2; 282*cc02d7e2SAndroid Build Coastguard Worker // Client stats for each client 283*cc02d7e2SAndroid Build Coastguard Worker repeated ClientStats client_stats = 3; 284*cc02d7e2SAndroid Build Coastguard Worker // Server stats for each server 285*cc02d7e2SAndroid Build Coastguard Worker repeated ServerStats server_stats = 4; 286*cc02d7e2SAndroid Build Coastguard Worker // Number of cores available to each server 287*cc02d7e2SAndroid Build Coastguard Worker repeated int32 server_cores = 5; 288*cc02d7e2SAndroid Build Coastguard Worker // An after-the-fact computed summary 289*cc02d7e2SAndroid Build Coastguard Worker ScenarioResultSummary summary = 6; 290*cc02d7e2SAndroid Build Coastguard Worker // Information on success or failure of each worker 291*cc02d7e2SAndroid Build Coastguard Worker repeated bool client_success = 7; 292*cc02d7e2SAndroid Build Coastguard Worker repeated bool server_success = 8; 293*cc02d7e2SAndroid Build Coastguard Worker // Number of failed requests (one row per status code seen) 294*cc02d7e2SAndroid Build Coastguard Worker repeated RequestResultCount request_results = 9; 295*cc02d7e2SAndroid Build Coastguard Worker} 296