En esta página se describe cómo puede calcular la latencia de las solicitudes de la API de Spanner de streaming y de partición.
Puede calcular las latencias de las solicitudes de streaming y de partición de la API Spanner con los campos del objeto struct metadata
de un AuditLog
. Los metadatos son de tipo QueryPerformanceMetadata
.
En las solicitudes de streaming y partición, metadata
no contiene el campo processingSecondsDuration
. Para obtener información sobre cómo usar processingSecondsDuration
para calcular las latencias de las solicitudes de todos los demás tipos de solicitudes, consulta Duración del procesamiento.
Latencias de solicitudes de streaming
Cuando un cliente envía una solicitud de streaming y la API de Spanner devuelve conjuntos de resultados parciales, Registros de auditoría de Cloud registra los registros de auditoría de la primera y la última respuesta. La latencia de solicitud de una solicitud de streaming es el tiempo transcurrido entre el momento en que la API de Spanner recibe la solicitud y el momento en que el cliente recibe la última respuesta.
Reconocer las entradas del registro de auditoría de solicitudes de streaming
Para calcular la latencia de una solicitud de streaming, debe identificar las entradas de registro relacionadas con la solicitud. Las entradas de registro tienen el valor protoPayload.methodName
definido como google.spanner.v1.Spanner.ExecuteStreamingSql
o google.spanner.v1.Spanner.StreamingRead
. Por cada solicitud de streaming, hay dos entradas de registro, que se agrupan por operation.id
. La primera entrada tiene el valor operation.first
definido como true
y la última entrada tiene el valor operation.last
definido como true
. El objeto protoPayload.metadata.responseTimestamp
también se rellena.
Calcula la latencia de las solicitudes de streaming
Para calcular la latencia de solicitud de una solicitud de streaming, filtra los registros de auditoría por operation.id
. La diferencia entre la más reciente
protoPayload.metadata.responseTimestamp
y la más antigua
protoPayload.requestMetadata.requestAttributes.time
es la latencia de la solicitud.
Registros de auditoría de ejemplo de solicitudes de streaming
Para encontrar todas las entradas de registro de una solicitud de streaming, ejecuta la siguiente consulta en el Explorador de registros y sustituye la variable OPERATION_ID por el valor que quieras:
operation.id="OPERATION_ID"
En el siguiente ejemplo se buscan entradas de registro de una solicitud de streaming con el operation.id
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"
}
Devuelve el último registro.
{
"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"
}
La latencia de la solicitud es la última metadata.responseTimestamp
menos la primera requestAttributes.time
. El resultado es
2023-02-27T16:57:40.556138125Z-2023-02 - 2023-02-27T16:57:40.552952297Z, que
equivale a 0,003185828 segundos.
Latencias de solicitudes de partición
Cuando un cliente envía una solicitud particionada, Spanner crea varios registros de auditoría. Para calcular la latencia de solicitud de una solicitud de partición de extremo a extremo y las llamadas posteriores a las particiones, identifica los registros de auditoría asociados a la solicitud principal.
Reconocer las entradas del registro de auditoría de solicitudes de partición
Cuando haces una solicitud PartitionRead
o PartitionQuery
, se devuelve un conjunto de particiones en PartitionResponse
. Cuando haces llamadas Read
, ExecuteSql
o ExecuteStreaming
respectivamente para cada partición, Spanner registra los registros de auditoría de estos métodos. Cada uno de estos registros contiene un identificador para agruparlos, llamado protoPayload.metadata.partitionBatchIdentifier
. También se rellena el objeto protoPayload.metadata.responseTimestamp
.
Calcula la latencia de las solicitudes de partición
Para calcular la latencia de solicitud de una partición, puedes filtrar los registros de auditoría por metadata.partitionBatchIdentifier
. La diferencia entre la metadata.responseTimestamp
más reciente y la protoPayload.requestMetadata.requestAttributes.time
más antigua es la latencia de la solicitud.
Registros de auditoría de ejemplo de solicitudes de partición
Para encontrar todas las entradas de registro de una solicitud de partición, ejecuta la siguiente consulta en el Explorador de registros y sustituye la variable PARTITION_BATCH_ID por el valor que quieras:
metadata.partitionBatchIdentifier="PARTITION_BATCH_ID"
En el siguiente ejemplo se buscan entradas de registro de una solicitud de partición con el valor metadata.partitionBatchIdentifier
de 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"
}
Se ha devuelto el segundo registro
{
"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"
}
En función del número de particiones, es posible que Spanner registre más registros que en este ejemplo.
Devuelve el último registro.
{
"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"
}
La latencia de la solicitud es la última metadata.responseTimestamp
menos la primera requestAttributes.time
. El resultado es 2023-02-15T18:13:39.441692339Z
- 2023-02-15T18:13:39.341584693Z, que equivale a 0,100107646 segundos.