code !== Grpc\STATUS_OK) { echo "Call did not complete successfully. Status object:\n"; var_dump($status); exit(1); } } function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } /* Probes to test session related grpc call from Spanner stub. Includes tests against CreateSession, GetSession, ListSessions, and DeleteSession of Spanner stub. Args: stub: An object of SpannerStub. metrics: A list of metrics. */ function sessionManagement($client, &$metrics){ global $_DATABASE; $createSessionRequest = new Google\Cloud\Spanner\V1\CreateSessionRequest(); $createSessionRequest->setDatabase($_DATABASE); #Create Session test #Create $time_start = microtime_float(); list($session, $status) = $client->CreateSession($createSessionRequest)->wait(); hardAssertIfStatusOk($status); hardAssert($session !== null, 'Call completed with a null response'); $lantency = (microtime_float()- $time_start) * 1000; $metrics['create_session_latency_ms'] = $lantency; #Get Session $getSessionRequest = new Google\Cloud\Spanner\V1\GetSessionRequest(); $getSessionRequest->setName($session->getName()); $time_start = microtime_float(); $response = $client->GetSession($getSessionRequest); $response->wait(); $lantency = (microtime_float() - $time_start) * 1000; $metrics['get_session_latency_ms'] = $lantency; #List session $listSessionsRequest = new Google\Cloud\Spanner\V1\ListSessionsRequest(); $listSessionsRequest->setDatabase($_DATABASE); $time_start = microtime_float(); $response = $client->ListSessions($listSessionsRequest); $lantency = (microtime_float() - $time_start) * 1000; $metrics['list_sessions_latency_ms'] = $lantency; #Delete session $deleteSessionRequest = new Google\Cloud\Spanner\V1\DeleteSessionRequest(); $deleteSessionRequest->setName($session->getName()); $time_start = microtime_float(); $client->deleteSession($deleteSessionRequest); $lantency = (microtime_float() - $time_start) * 1000; $metrics['delete_session_latency_ms'] = $lantency; } /* Probes to test ExecuteSql and ExecuteStreamingSql call from Spanner stub. Args: stub: An object of SpannerStub. metrics: A list of metrics. */ function executeSql($client, &$metrics){ global $_DATABASE; $createSessionRequest = new Google\Cloud\Spanner\V1\CreateSessionRequest(); $createSessionRequest->setDatabase($_DATABASE); list($session, $status) = $client->CreateSession($createSessionRequest)->wait(); hardAssertIfStatusOk($status); hardAssert($session !== null, 'Call completed with a null response'); # Probing ExecuteSql call $time_start = microtime_float(); $executeSqlRequest = new Google\Cloud\Spanner\V1\ExecuteSqlRequest(); $executeSqlRequest->setSession($session->getName()); $executeSqlRequest->setSql('select * FROM users'); $result_set = $client->ExecuteSql($executeSqlRequest); $lantency = (microtime_float() - $time_start) * 1000; $metrics['execute_sql_latency_ms'] = $lantency; // TODO: Error check result_set # Probing ExecuteStreamingSql call $partial_result_set = $client->ExecuteStreamingSql($executeSqlRequest); $time_start = microtime_float(); $first_result = array_values($partial_result_set->getMetadata())[0]; $lantency = (microtime_float() - $time_start) * 1000; $metrics['execute_streaming_sql_latency_ms'] = $lantency; // TODO: Error Check for sreaming sql first result $deleteSessionRequest = new Google\Cloud\Spanner\V1\DeleteSessionRequest(); $deleteSessionRequest->setName($session->getName()); $client->deleteSession($deleteSessionRequest); } /* Probe to test Read and StreamingRead grpc call from Spanner stub. Args: stub: An object of SpannerStub. metrics: A list of metrics. */ function read($client, &$metrics){ global $_DATABASE; $createSessionRequest = new Google\Cloud\Spanner\V1\CreateSessionRequest(); $createSessionRequest->setDatabase($_DATABASE); list($session, $status) = $client->CreateSession($createSessionRequest)->wait(); hardAssertIfStatusOk($status); hardAssert($session !== null, 'Call completed with a null response'); # Probing Read call $time_start = microtime_float(); $readRequest = new Google\Cloud\Spanner\V1\ReadRequest(); $readRequest->setSession($session->getName()); $readRequest->setTable('users'); $readRequest->setColumns(['username', 'firstname', 'lastname']); $keyset = new Google\Cloud\Spanner\V1\KeySet(); $keyset->setAll(True); $readRequest->setKeySet($keyset); $result_set = $client->Read($readRequest); $lantency = (microtime_float() - $time_start) * 1000; $metrics['read_latency_ms'] = $lantency; // TODO: Error Check for result_set # Probing StreamingRead call $partial_result_set = $client->StreamingRead($readRequest); $time_start = microtime_float(); $first_result = array_values($partial_result_set->getMetadata())[0]; $lantency = (microtime_float() - $time_start) * 1000; $metrics['streaming_read_latency_ms'] = $lantency; //TODO: Error Check for streaming read first result $deleteSessionRequest = new Google\Cloud\Spanner\V1\DeleteSessionRequest(); $deleteSessionRequest->setName($session->getName()); $client->deleteSession($deleteSessionRequest); } /* Probe to test BeginTransaction, Commit and Rollback grpc from Spanner stub. Args: stub: An object of SpannerStub. metrics: A list of metrics. */ function transaction($client, &$metrics){ global $_DATABASE; $createSessionRequest = new Google\Cloud\Spanner\V1\CreateSessionRequest(); $createSessionRequest->setDatabase($_DATABASE); list($session, $status) = $client->CreateSession($createSessionRequest)->wait(); hardAssertIfStatusOk($status); hardAssert($session !== null, 'Call completed with a null response'); $txn_options = new Google\Cloud\Spanner\V1\TransactionOptions(); $rw = new Google\Cloud\Spanner\V1\TransactionOptions\ReadWrite(); $txn_options->setReadWrite($rw); $txn_request = new Google\Cloud\Spanner\V1\BeginTransactionRequest(); $txn_request->setSession($session->getName()); $txn_request->setOptions($txn_options); # Probing BeginTransaction call $time_start = microtime_float(); list($txn, $status) = $client->BeginTransaction($txn_request)->wait(); $lantency = (microtime_float() - $time_start) * 1000; $metrics['begin_transaction_latency_ms'] = $lantency; hardAssertIfStatusOk($status); hardAssert($txn !== null, 'Call completed with a null response'); # Probing Commit Call $commit_request = new Google\Cloud\Spanner\V1\CommitRequest(); $commit_request->setSession($session->getName()); $commit_request->setTransactionId($txn->getId()); $time_start = microtime_float(); $client->Commit($commit_request); $latency = (microtime_float() - $time_start) * 1000; $metrics['commit_latency_ms'] = $lantency; # Probing Rollback call list($txn, $status) = $client->BeginTransaction($txn_request)->wait(); $rollback_request = new Google\Cloud\Spanner\V1\RollbackRequest(); $rollback_request->setSession($session->getName()); $rollback_request->setTransactionId($txn->getId()); hardAssertIfStatusOk($status); hardAssert($txn !== null, 'Call completed with a null response'); $time_start = microtime_float(); $client->Rollback($rollback_request); $latency = (microtime_float() - $time_start) * 1000; $metrics['rollback_latency_ms'] = $latency; $deleteSessionRequest = new Google\Cloud\Spanner\V1\DeleteSessionRequest(); $deleteSessionRequest->setName($session->getName()); $client->deleteSession($deleteSessionRequest); } /* Probe to test PartitionQuery and PartitionRead grpc call from Spanner stub. Args: stub: An object of SpannerStub. metrics: A list of metrics. */ function partition($client, &$metrics){ global $_DATABASE; global $_TEST_USERNAME; $createSessionRequest = new Google\Cloud\Spanner\V1\CreateSessionRequest(); $createSessionRequest->setDatabase($_DATABASE); list($session, $status) = $client->CreateSession($createSessionRequest)->wait(); hardAssertIfStatusOk($status); hardAssert($session !== null, 'Call completed with a null response'); $txn_options = new Google\Cloud\Spanner\V1\TransactionOptions(); $ro = new Google\Cloud\Spanner\V1\TransactionOptions\ReadOnly(); $txn_options->setReadOnly($ro); $txn_selector = new Google\Cloud\Spanner\V1\TransactionSelector(); $txn_selector->setBegin($txn_options); #Probing PartitionQuery call $ptn_query_request = new Google\Cloud\Spanner\V1\PartitionQueryRequest(); $ptn_query_request->setSession($session->getName()); $ptn_query_request->setSql('select * FROM users'); $ptn_query_request->setTransaction($txn_selector); $time_start = microtime_float(); $client->PartitionQuery($ptn_query_request); $lantency = (microtime_float() - $time_start) * 1000; $metrics['partition_query_latency_ms'] = $lantency; #Probing PartitionRead call $ptn_read_request = new Google\Cloud\Spanner\V1\PartitionReadRequest(); $ptn_read_request->setSession($session->getName()); $ptn_read_request->setTable('users'); $ptn_read_request->setTransaction($txn_selector); $keyset = new Google\Cloud\Spanner\V1\KeySet(); $keyset->setAll(True); $ptn_read_request->setKeySet($keyset); $ptn_read_request->setColumns(['username', 'firstname', 'lastname']); $time_start = microtime_float(); $client->PartitionRead($ptn_read_request); $latency = (microtime_float() - $time_start) * 1000; $metrics['partition_read_latency_ms'] = $latency; # Delete Session $deleteSessionRequest = new Google\Cloud\Spanner\V1\DeleteSessionRequest(); $deleteSessionRequest->setName($session->getName()); $client->deleteSession($deleteSessionRequest); } $PROBE_FUNCTIONS = [ 'session_management' => 'sessionManagement', 'execute_sql' => 'executeSql', 'read' => 'read', 'transaction' => 'transaction', 'partition' => 'partition' ]; return $PROBE_FUNCTIONS;