This page describes how you can calculate the Spanner API request latency of streaming and partition requests.
You can calculate Spanner API streaming and partition request
latencies with the fields in the metadata struct object of an
AuditLog. The metadata is of type QueryPerformanceMetadata.
For streaming and partition requests, the metadata does not contain a
processingSecondsDuration field. For information on how to use
processingSecondsDuration to calculate request latencies for all other
request types, see Processing duration.
Request latencies for streaming requests
When a client sends a streaming request and as the Spanner API returns partial result sets, Cloud Audit Logs records audit logs for the first and last responses. The request latency for a streaming request is the time elapsed between when the Spanner API receives the request and when the client receives the last response.
Recognize streaming requests audit log entries
To calculate the request latency of a streaming request, you need to identify
the log entries related to the request. The log entries have the
protoPayload.methodName set to either
google.spanner.v1.Spanner.ExecuteStreamingSql or
google.spanner.v1.Spanner.StreamingRead. For each streaming request, there are
two log entries, which are grouped by operation.id. The first entry has
operation.first set to true and the last entry has operation.last set to
true. The protoPayload.metadata.responseTimestamp object is also populated.
Calculate request latency for streaming requests
To calculate the request latency of a streaming request, filter the audit logs
by operation.id. The difference between the latest
protoPayload.metadata.responseTimestamp and the earliest
protoPayload.requestMetadata.requestAttributes.time is the request latency.
Sample audit logs for streaming requests
To find all log entries for a streaming request, run the following query in the Logs Explorer, replacing the OPERATION_ID variable with the desired value:
operation.id="OPERATION_ID"
The following example finds log entries for a streaming request with the
operation.id of 15327696495839874591:
operation.id="15327696495839874591"
Returned first log
{
"protoPayload": {
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"authenticationInfo": {...},
"requestMetadata": {
"requestAttributes": {
"time": "2023-02-27T16:57:40.552952297Z",
},
"destinationAttributes": {}
},
"serviceName": "spanner.googleapis.com",
"methodName": "google.spanner.v1.Spanner.ExecuteStreamingSql",
"authorizationInfo": [{...}],
"resourceName": "projects/example-project/instances/example-instance/databases/example-database/sessions/example-session",
"request": {
"session": "projects/example-project/instances/example-instance/databases/example-database/sessions/example-session",
"requestOptions": {},
"sql": "SELECT COUNT(*) as count FROM Example_table WHERE Example_Column > @timestamp",
"@type": "type.googleapis.com/google.spanner.v1.ExecuteSqlRequest",
"queryOptions": {}
},
"metadata": {
"@type": "type.googleapis.com/spanner.cloud.instance_v1.QueryPerformanceMetadata",
"responseTimestamp": "2023-02-27T16:57:40.555730699Z"
}
},
"insertId": "h7fj0jei6597",
"resource": {...},
"timestamp": "2023-02-27T16:57:40.552391554Z",
"severity": "INFO",
"logName": "projects/example-project/logs/cloudaudit.googleapis.com%2Fdata_access",
"operation": {
"id": "15327696495839874591",
"producer": "spanner.googleapis.com",
"first": true
},
"receiveTimestamp": "2023-02-27T16:57:41.507770020Z"
}
Returned last log
{
"protoPayload": {
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"authenticationInfo": {...},
"requestMetadata": {
"requestAttributes": {
"time": "2023-02-27T16:57:40.552952297Z",
},
"destinationAttributes": {}
},
"serviceName": "spanner.googleapis.com",
"methodName": "google.spanner.v1.Spanner.ExecuteStreamingSql",
"authorizationInfo": [{...}],
"resourceName": "projects/example-project/instances/example-instance/databases/example-database/sessions/example-session",
"metadata": {
"responseTimestamp": "2023-02-27T16:57:40.556138125Z",
"@type": "type.googleapis.com/spanner.cloud.instance_v1.QueryPerformanceMetadata"
}
},
"insertId": "h7fj0jei6598",
"resource": {...},
"timestamp": "2023-02-27T16:57:40.552391554Z",
"severity": "INFO",
"logName": "projects/example-project/logs/cloudaudit.googleapis.com%2Fdata_access",
"operation": {
"id": "15327696495839874591",
"producer": "spanner.googleapis.com",
"last": true
},
"receiveTimestamp": "2023-02-27T16:57:41.507770020Z"
}
The request latency is the latest metadata.responseTimestamp minus the
earliest requestAttributes.time. The result is
2023-02-27T16:57:40.556138125Z-2023-02 - 2023-02-27T16:57:40.552952297Z, which
equals 0.003185828 seconds.
Request latencies for partition requests
When a client sends a partitioned request, Spanner creates multiple audit logs. To calculate the request latency of an end-to-end partition request and subsequent calls to the partitions, identify the audit logs associated with the parent request.
Recognize partition requests audit log entries
When you make a PartitionRead or a PartitionQuery request, a set of
partitions are returned in the
PartitionResponse. As you
make Read, ExecuteSql or ExecuteStreaming calls respectively for each
partition, Spanner records audit logs for these methods. Each of
these logs contains an identifier to group them together, called
protoPayload.metadata.partitionBatchIdentifier. The
protoPayload.metadata.responseTimestamp object is also populated.
Calculate request latency for partition requests
To calculate the request latency of a partition request, you can filter the
audit logs by metadata.partitionBatchIdentifier. The difference between the
latest metadata.responseTimestamp and the earliest
protoPayload.requestMetadata.requestAttributes.time is the request latency.
Sample audit logs for partition requests
To find all log entries for a partition request, run the following query in the Logs Explorer, replacing the PARTITION_BATCH_ID variable with the desired value:
metadata.partitionBatchIdentifier="PARTITION_BATCH_ID"
The following example finds log entries for a partition request with the
metadata.partitionBatchIdentifier of 15327696495839874591:
metadata.partitionBatchIdentifier="15327696495839874591"
Returned first log
{
"protoPayload": {
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"authenticationInfo": {...},
"requestMetadata": {
"requestAttributes": {
"time": "2023-02-15T18:13:39.341584693Z",
},
},
"serviceName": "spanner.googleapis.com",
"methodName": "google.spanner.v1.Spanner.ExecuteStreamingSql",
"authorizationInfo": [{...}],
"resourceName": "projects/example-project/instances/example-instance/databases/example-db/sessions/example-session",
"request": {...},
"metadata": {
"@type": "type.googleapis.com/spanner.cloud.instance_v1.QueryPerformanceMetadata",
"partitionBatchIdentifier": "4841471066190013455",
"responseTimestamp": "2023-02-15T18:13:39.343693061Z"
}
},
"insertId": "4fug42dqke5",
"resource": {...},
"timestamp": "2023-02-15T18:13:39.341069413Z",
"severity": "INFO",
"logName": "projects/example-project/logs/cloudaudit.googleapis.com%2Fdata_access",
"operation": {...},
"receiveTimestamp": "2023-02-15T18:13:39.983812511Z"
}
Returned second log
{
"protoPayload": {
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"authenticationInfo": {...},
"requestMetadata": {
"requestAttributes": {
"time": "2023-02-15T18:13:39.341584693Z",
},
},
"serviceName": "spanner.googleapis.com",
"methodName": "google.spanner.v1.Spanner.ExecuteStreamingSql",
"authorizationInfo": [{...}],
"resourceName": "projects/example-project/instances/example-instance/databases/example-db/sessions/example-session",
"metadata": {
"responseTimestamp": "2023-02-15T18:13:39.344256101Z",
"partitionBatchIdentifier": "4841471066190013455",
"@type": "type.googleapis.com/spanner.cloud.instance_v1.QueryPerformanceMetadata"
}
},
"insertId": "4fug42dqke6",
"resource": {...},
"timestamp": "2023-02-15T18:13:39.341069413Z",
"severity": "INFO",
"logName": "projects/example-project/logs/cloudaudit.googleapis.com%2Fdata_access",
"operation": {...},
"receiveTimestamp": "2023-02-15T18:13:39.983812511Z"
}
Depending on the number of partitions, Spanner might record more logs than in this example.
Returned last log
{
"protoPayload": {
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"authenticationInfo": {...},
"requestMetadata": {
"requestAttributes": {
"time": "2023-02-15T18:13:39.439207331Z",
},
},
"serviceName": "spanner.googleapis.com",
"methodName": "google.spanner.v1.Spanner.ExecuteStreamingSql",
"authorizationInfo": [{...}],
"resourceName": "projects/example-project/instances/example-instance/databases/example-db/sessions/example-session",
"metadata": {
"partitionBatchIdentifier": "4841471066190013455",
"@type": "type.googleapis.com/spanner.cloud.instance_v1.QueryPerformanceMetadata",
"responseTimestamp": "2023-02-15T18:13:39.441692339Z"
}
},
"insertId": "4fug42dqkec",
"resource": {...},
"timestamp": "2023-02-15T18:13:39.438607931Z",
"severity": "INFO",
"logName": "projects/example-project/logs/cloudaudit.googleapis.com%2Fdata_access",
"operation": {...},
"receiveTimestamp": "2023-02-15T18:13:39.983812511Z"
}
The request latency is the latest metadata.responseTimestamp minus the
earliest requestAttributes.time. The result is 2023-02-15T18:13:39.441692339Z
- 2023-02-15T18:13:39.341584693Z, which equals 0.100107646 seconds.