xref: /aosp_15_r20/external/grpc-grpc/src/php/tests/qps/client.php (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker<?php
2*cc02d7e2SAndroid Build Coastguard Worker/*
3*cc02d7e2SAndroid Build Coastguard Worker *
4*cc02d7e2SAndroid Build Coastguard Worker * Copyright 2017 gRPC authors.
5*cc02d7e2SAndroid Build Coastguard Worker *
6*cc02d7e2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
7*cc02d7e2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
8*cc02d7e2SAndroid Build Coastguard Worker * You may obtain a copy of the License at
9*cc02d7e2SAndroid Build Coastguard Worker *
10*cc02d7e2SAndroid Build Coastguard Worker *     http://www.apache.org/licenses/LICENSE-2.0
11*cc02d7e2SAndroid Build Coastguard Worker *
12*cc02d7e2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
13*cc02d7e2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
14*cc02d7e2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*cc02d7e2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
16*cc02d7e2SAndroid Build Coastguard Worker * limitations under the License.
17*cc02d7e2SAndroid Build Coastguard Worker *
18*cc02d7e2SAndroid Build Coastguard Worker */
19*cc02d7e2SAndroid Build Coastguard Worker
20*cc02d7e2SAndroid Build Coastguard Worker/*
21*cc02d7e2SAndroid Build Coastguard Worker * PHP client for QPS testing works as follows:
22*cc02d7e2SAndroid Build Coastguard Worker * 1. Gets initiated by a call from a proxy that implements the worker service. The
23*cc02d7e2SAndroid Build Coastguard Worker *    argument to this client is the proxy connection information
24*cc02d7e2SAndroid Build Coastguard Worker * 2. Initiate an RPC to the proxy to get ClientConfig
25*cc02d7e2SAndroid Build Coastguard Worker * 3. Initiate a client-side telemetry RPC to the proxy
26*cc02d7e2SAndroid Build Coastguard Worker * 4. Parse the client config, which includes server target information and then start
27*cc02d7e2SAndroid Build Coastguard Worker *    a unary or streaming test as appropriate.
28*cc02d7e2SAndroid Build Coastguard Worker * 5. After each completed RPC, send its timing to the proxy. The proxy does all histogramming
29*cc02d7e2SAndroid Build Coastguard Worker * 6. Proxy will respond on the timing channel when it's time to complete. Our
30*cc02d7e2SAndroid Build Coastguard Worker *    next timing write will fail and we know that it's time to stop
31*cc02d7e2SAndroid Build Coastguard Worker * The above complex dance is since threading and async are not idiomatic and we
32*cc02d7e2SAndroid Build Coastguard Worker * shouldn't ever be waiting to read a mark
33*cc02d7e2SAndroid Build Coastguard Worker *
34*cc02d7e2SAndroid Build Coastguard Worker * This test only supports a single channel since threading/async is not idiomatic
35*cc02d7e2SAndroid Build Coastguard Worker * This test supports unary or streaming ping-pongs, as well as open-loop
36*cc02d7e2SAndroid Build Coastguard Worker *
37*cc02d7e2SAndroid Build Coastguard Worker */
38*cc02d7e2SAndroid Build Coastguard Worker
39*cc02d7e2SAndroid Build Coastguard Workerrequire dirname(__FILE__).'/vendor/autoload.php';
40*cc02d7e2SAndroid Build Coastguard Workerrequire dirname(__FILE__).'/histogram.php';
41*cc02d7e2SAndroid Build Coastguard Worker
42*cc02d7e2SAndroid Build Coastguard Worker/**
43*cc02d7e2SAndroid Build Coastguard Worker * Assertion function that always exits with an error code if the assertion is
44*cc02d7e2SAndroid Build Coastguard Worker * falsy.
45*cc02d7e2SAndroid Build Coastguard Worker *
46*cc02d7e2SAndroid Build Coastguard Worker * @param $value Assertion value. Should be true.
47*cc02d7e2SAndroid Build Coastguard Worker * @param $error_message Message to display if the assertion is false
48*cc02d7e2SAndroid Build Coastguard Worker */
49*cc02d7e2SAndroid Build Coastguard Workerfunction hardAssert($value, $error_message)
50*cc02d7e2SAndroid Build Coastguard Worker{
51*cc02d7e2SAndroid Build Coastguard Worker    if (!$value) {
52*cc02d7e2SAndroid Build Coastguard Worker        echo $error_message."\n";
53*cc02d7e2SAndroid Build Coastguard Worker        exit(1);
54*cc02d7e2SAndroid Build Coastguard Worker    }
55*cc02d7e2SAndroid Build Coastguard Worker}
56*cc02d7e2SAndroid Build Coastguard Worker
57*cc02d7e2SAndroid Build Coastguard Workerfunction hardAssertIfStatusOk($status)
58*cc02d7e2SAndroid Build Coastguard Worker{
59*cc02d7e2SAndroid Build Coastguard Worker    if ($status->code !== Grpc\STATUS_OK) {
60*cc02d7e2SAndroid Build Coastguard Worker        echo "Call did not complete successfully. Status object:\n";
61*cc02d7e2SAndroid Build Coastguard Worker        var_dump($status);
62*cc02d7e2SAndroid Build Coastguard Worker        exit(1);
63*cc02d7e2SAndroid Build Coastguard Worker    }
64*cc02d7e2SAndroid Build Coastguard Worker}
65*cc02d7e2SAndroid Build Coastguard Worker
66*cc02d7e2SAndroid Build Coastguard Worker/* Start the actual client */
67*cc02d7e2SAndroid Build Coastguard Workerfunction qps_client_main($proxy_address, $server_ind) {
68*cc02d7e2SAndroid Build Coastguard Worker    echo "[php-client] Initiating php client\n";
69*cc02d7e2SAndroid Build Coastguard Worker
70*cc02d7e2SAndroid Build Coastguard Worker    $proxystubopts = [];
71*cc02d7e2SAndroid Build Coastguard Worker    $proxystubopts['credentials'] = Grpc\ChannelCredentials::createInsecure();
72*cc02d7e2SAndroid Build Coastguard Worker    $proxystub = new Grpc\Testing\ProxyClientServiceClient($proxy_address, $proxystubopts);
73*cc02d7e2SAndroid Build Coastguard Worker    list($config, $status) = $proxystub->GetConfig(new Grpc\Testing\PBVoid())->wait();
74*cc02d7e2SAndroid Build Coastguard Worker    hardAssertIfStatusOk($status);
75*cc02d7e2SAndroid Build Coastguard Worker    hardAssert($config->getOutstandingRpcsPerChannel() == 1, "Only 1 outstanding RPC supported");
76*cc02d7e2SAndroid Build Coastguard Worker
77*cc02d7e2SAndroid Build Coastguard Worker    echo "[php-client] Got configuration from proxy, target is '$server_ind'th server" . $config->getServerTargets()[$server_ind] . "\n";
78*cc02d7e2SAndroid Build Coastguard Worker    $histres = $config->getHistogramParams()->getResolution();
79*cc02d7e2SAndroid Build Coastguard Worker    $histmax = $config->getHistogramParams()->getMaxPossible();
80*cc02d7e2SAndroid Build Coastguard Worker
81*cc02d7e2SAndroid Build Coastguard Worker    $stubopts = [];
82*cc02d7e2SAndroid Build Coastguard Worker    if ($config->getSecurityParams()) {
83*cc02d7e2SAndroid Build Coastguard Worker        if ($config->getSecurityParams()->getUseTestCa()) {
84*cc02d7e2SAndroid Build Coastguard Worker            $stubopts['credentials'] = Grpc\ChannelCredentials::createSsl(
85*cc02d7e2SAndroid Build Coastguard Worker                file_get_contents(dirname(__FILE__).'/../data/ca.pem'));
86*cc02d7e2SAndroid Build Coastguard Worker        } else {
87*cc02d7e2SAndroid Build Coastguard Worker            $stubopts['credentials'] = Grpc\ChannelCredentials::createSsl(null);
88*cc02d7e2SAndroid Build Coastguard Worker        }
89*cc02d7e2SAndroid Build Coastguard Worker        $override = $config->getSecurityParams()->getServerHostOverride();
90*cc02d7e2SAndroid Build Coastguard Worker        if ($override) {
91*cc02d7e2SAndroid Build Coastguard Worker            $stubopts['grpc.ssl_target_name_override'] = $override;
92*cc02d7e2SAndroid Build Coastguard Worker            $stubopts['grpc.default_authority'] = $override;
93*cc02d7e2SAndroid Build Coastguard Worker        }
94*cc02d7e2SAndroid Build Coastguard Worker    } else {
95*cc02d7e2SAndroid Build Coastguard Worker        $stubopts['credentials'] = Grpc\ChannelCredentials::createInsecure();
96*cc02d7e2SAndroid Build Coastguard Worker    }
97*cc02d7e2SAndroid Build Coastguard Worker    echo "[php-client] Initiating php benchmarking client\n";
98*cc02d7e2SAndroid Build Coastguard Worker
99*cc02d7e2SAndroid Build Coastguard Worker    $stub = new Grpc\Testing\BenchmarkServiceClient(
100*cc02d7e2SAndroid Build Coastguard Worker        $config->getServerTargets()[$server_ind], $stubopts);
101*cc02d7e2SAndroid Build Coastguard Worker    $req = new Grpc\Testing\SimpleRequest();
102*cc02d7e2SAndroid Build Coastguard Worker
103*cc02d7e2SAndroid Build Coastguard Worker    $req->setResponseType(Grpc\Testing\PayloadType::COMPRESSABLE);
104*cc02d7e2SAndroid Build Coastguard Worker    $req->setResponseSize($config->getPayloadConfig()->getSimpleParams()->getRespSize());
105*cc02d7e2SAndroid Build Coastguard Worker    $payload = new Grpc\Testing\Payload();
106*cc02d7e2SAndroid Build Coastguard Worker    $payload->setType(Grpc\Testing\PayloadType::COMPRESSABLE);
107*cc02d7e2SAndroid Build Coastguard Worker    $payload->setBody(str_repeat("\0", $config->getPayloadConfig()->getSimpleParams()->getReqSize()));
108*cc02d7e2SAndroid Build Coastguard Worker    $req->setPayload($payload);
109*cc02d7e2SAndroid Build Coastguard Worker
110*cc02d7e2SAndroid Build Coastguard Worker    /* TODO(stanley-cheung): Enable the following by removing the 0&& once protobuf
111*cc02d7e2SAndroid Build Coastguard Worker     * properly supports oneof in PHP */
112*cc02d7e2SAndroid Build Coastguard Worker    if (0 && $config->getLoadParams()->getLoad() == "poisson") {
113*cc02d7e2SAndroid Build Coastguard Worker        $poisson = true;
114*cc02d7e2SAndroid Build Coastguard Worker        $lamrecip = 1.0/($config->getLoadParams()->getPoisson()->getOfferedLoad());
115*cc02d7e2SAndroid Build Coastguard Worker        $issue = microtime(true) + $lamrecip * -log(1.0-rand()/(getrandmax()+1));
116*cc02d7e2SAndroid Build Coastguard Worker    } else {
117*cc02d7e2SAndroid Build Coastguard Worker        $poisson = false;
118*cc02d7e2SAndroid Build Coastguard Worker    }
119*cc02d7e2SAndroid Build Coastguard Worker    $histogram = new Histogram($histres, $histmax);
120*cc02d7e2SAndroid Build Coastguard Worker    $histogram->clean();
121*cc02d7e2SAndroid Build Coastguard Worker    $count = 0;
122*cc02d7e2SAndroid Build Coastguard Worker    $histogram_result = new Grpc\Testing\HistogramData;
123*cc02d7e2SAndroid Build Coastguard Worker    $telehist = $proxystub->ReportHist();
124*cc02d7e2SAndroid Build Coastguard Worker    if ($config->getRpcType() == Grpc\Testing\RpcType::UNARY) {
125*cc02d7e2SAndroid Build Coastguard Worker        while (1) {
126*cc02d7e2SAndroid Build Coastguard Worker            if ($poisson) {
127*cc02d7e2SAndroid Build Coastguard Worker                time_sleep_until($issue);
128*cc02d7e2SAndroid Build Coastguard Worker                $issue = $issue + $lamrecip * -log(1.0-rand()/(getrandmax()+1));
129*cc02d7e2SAndroid Build Coastguard Worker            }
130*cc02d7e2SAndroid Build Coastguard Worker            $startreq = microtime(true);
131*cc02d7e2SAndroid Build Coastguard Worker            list($resp,$status) = $stub->UnaryCall($req)->wait();
132*cc02d7e2SAndroid Build Coastguard Worker            hardAssertIfStatusOk($status);
133*cc02d7e2SAndroid Build Coastguard Worker            $histogram->add((microtime(true)-$startreq)*1e9);
134*cc02d7e2SAndroid Build Coastguard Worker            $count += 1;
135*cc02d7e2SAndroid Build Coastguard Worker            if ($count == 2000) {
136*cc02d7e2SAndroid Build Coastguard Worker              $contents = $histogram->contents();
137*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setBucket($contents);
138*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setMinSeen($histogram->minimum());
139*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setMaxSeen($histogram->maximum());
140*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setSum($histogram->sum());
141*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setSumOfSquares($histogram->sum_of_squares());
142*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setCount($histogram->count());
143*cc02d7e2SAndroid Build Coastguard Worker              $telehist->write($histogram_result);
144*cc02d7e2SAndroid Build Coastguard Worker              $histogram->clean();
145*cc02d7e2SAndroid Build Coastguard Worker              $count = 0;
146*cc02d7e2SAndroid Build Coastguard Worker            }
147*cc02d7e2SAndroid Build Coastguard Worker        }
148*cc02d7e2SAndroid Build Coastguard Worker    } else {
149*cc02d7e2SAndroid Build Coastguard Worker        $stream = $stub->StreamingCall();
150*cc02d7e2SAndroid Build Coastguard Worker        while (1) {
151*cc02d7e2SAndroid Build Coastguard Worker            if ($poisson) {
152*cc02d7e2SAndroid Build Coastguard Worker                time_sleep_until($issue);
153*cc02d7e2SAndroid Build Coastguard Worker                $issue = $issue + $lamrecip * -log(1.0-rand()/(getrandmax()+1));
154*cc02d7e2SAndroid Build Coastguard Worker            }
155*cc02d7e2SAndroid Build Coastguard Worker            $startreq = microtime(true);
156*cc02d7e2SAndroid Build Coastguard Worker            $stream->write($req);
157*cc02d7e2SAndroid Build Coastguard Worker            $resp = $stream->read();
158*cc02d7e2SAndroid Build Coastguard Worker            $histogram->add((microtime(true)-$startreq)*1e9);
159*cc02d7e2SAndroid Build Coastguard Worker            $count += 1;
160*cc02d7e2SAndroid Build Coastguard Worker            if ($count == 2000) {
161*cc02d7e2SAndroid Build Coastguard Worker              $contents = $histogram->contents();
162*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setBucket($contents);
163*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setMinSeen($histogram->minimum());
164*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setMaxSeen($histogram->maximum());
165*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setSum($histogram->sum());
166*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setSumOfSquares($histogram->sum_of_squares());
167*cc02d7e2SAndroid Build Coastguard Worker              $histogram_result->setCount($histogram->count());
168*cc02d7e2SAndroid Build Coastguard Worker              $telehist->write($histogram_result);
169*cc02d7e2SAndroid Build Coastguard Worker              $histogram->clean();
170*cc02d7e2SAndroid Build Coastguard Worker              $count = 0;
171*cc02d7e2SAndroid Build Coastguard Worker          }
172*cc02d7e2SAndroid Build Coastguard Worker        }
173*cc02d7e2SAndroid Build Coastguard Worker    }
174*cc02d7e2SAndroid Build Coastguard Worker}
175*cc02d7e2SAndroid Build Coastguard Worker
176*cc02d7e2SAndroid Build Coastguard Workerini_set('display_startup_errors', 1);
177*cc02d7e2SAndroid Build Coastguard Workerini_set('display_errors', 1);
178*cc02d7e2SAndroid Build Coastguard Workererror_reporting(-1);
179*cc02d7e2SAndroid Build Coastguard Workerqps_client_main($argv[1], $argv[2]);
180