Calcolare la latenza di flussi di dati e richieste di partizione di Spanner

Questa pagina descrive come calcolare la latenza delle richieste API Spanner delle richieste di flussi di dati e di partizione.

Puoi calcolare le latenze delle richieste di partizionamento e dei flussi di dati dell'API Spanner con i campi nell'oggetto struct metadata di un AuditLog. I metadati sono di tipo QueryPerformanceMetadata. Per le richieste di flussi di dati e di partizione, metadata non contiene un campo processingSecondsDuration. Per informazioni su come utilizzare processingSecondsDuration per calcolare le latenze delle richieste per tutti gli altri tipi di richieste, consulta Durata di elaborazione.

Latenze di richiesta per le richieste di flussi di dati

Quando un client invia una richiesta di flusso e quando l'API Spanner restituisce set di risultati parziali, Cloud Audit Logs registra gli audit log per la prima e l'ultima risposta. La latenza di richiesta per una richiesta di inserimento di flussi è il tempo trascorso tra il momento in cui l'API Spanner riceve la richiesta e il momento in cui il client riceve l'ultima risposta.

Riconoscimento delle voci degli audit log delle richieste di flussi di dati

Per calcolare la latenza di una richiesta in modalità flusso, devi identificare le voci di log relative alla richiesta. Le voci di log hanno protoPayload.methodName impostato su google.spanner.v1.Spanner.ExecuteStreamingSql o google.spanner.v1.Spanner.StreamingRead. Per ogni richiesta di flusso sono presenti due voci di log, raggruppate per operation.id. La prima voce operation.first è stata impostata su true e l'ultima ha operation.last impostato su true. Viene compilato anche l'oggetto protoPayload.metadata.responseTimestamp.

Calcolare la latenza delle richieste per le richieste di flussi di dati

Per calcolare la latenza di richiesta di una richiesta di flussi di dati, filtra gli audit log per operation.id. La differenza tra le versioni più recenti di protoPayload.metadata.responseTimestamp e protoPayload.requestMetadata.requestAttributes.time è la latenza della richiesta.

Audit log di esempio per richieste di flussi di dati

Per trovare tutte le voci di log per una richiesta di inserimento di flussi, esegui la seguente query in Esplora log, sostituendo la variabile OPERATION_ID con il valore desiderato:

operation.id="OPERATION_ID"

L'esempio seguente trova le voci di log per una richiesta di flussi di dati con operation.id di 15327696495839874591:

operation.id="15327696495839874591"

Primo log restituito

{
  "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"
}

Ultimo log restituito

{
  "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 latenza delle richieste è il più recente (metadata.responseTimestamp) meno il requestAttributes.time più recente. Il risultato è 2023-02-27T16:57:40.556138125Z-2023-02 - 2023-02-27T16:57:40.552952297Z, che equivale a 0,003185828 secondi.

Latenze di richiesta per le richieste di partizione

Quando un client invia una richiesta partizionata, Spanner crea più audit log. Per calcolare la latenza della richiesta di una richiesta di partizione end-to-end e delle chiamate successive alle partizioni, identifica gli audit log associati alla richiesta padre.

Riconoscere le voci degli audit log delle richieste di partizione

Quando effettui una richiesta PartitionRead o PartitionQuery, viene restituito un insieme di partizioni nella PartitionResponse. Quando effettui rispettivamente le chiamate Read, ExecuteSql o ExecuteStreaming per ogni partizione, Spanner registra gli audit log per questi metodi. Ciascuno di questi log contiene un identificatore che li raggruppa, chiamato protoPayload.metadata.partitionBatchIdentifier. Viene compilato anche l'oggetto protoPayload.metadata.responseTimestamp.

Calcolare la latenza delle richieste di partizione

Per calcolare la latenza di una richiesta di partizione, puoi filtrare gli audit log in base a metadata.partitionBatchIdentifier. La differenza tra il metadata.responseTimestamp più recente e il più recente protoPayload.requestMetadata.requestAttributes.time è la latenza della richiesta.

Audit log di esempio per le richieste di partizione

Per trovare tutte le voci di log per una richiesta di partizione, esegui la seguente query in Esplora log, sostituendo la variabile PARTITION_BATCH_ID con il valore desiderato:

metadata.partitionBatchIdentifier="PARTITION_BATCH_ID"

L'esempio seguente trova le voci di log per una richiesta di partizione con metadata.partitionBatchIdentifier di 15327696495839874591:

metadata.partitionBatchIdentifier="15327696495839874591"

Primo log restituito

{
  "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"
}

Secondo log restituito

{
  "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"
}

A seconda del numero di partizioni, Spanner potrebbe registrare più log rispetto a questo esempio.

Ultimo log restituito

{
  "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 latenza delle richieste è il più recente (metadata.responseTimestamp) meno il requestAttributes.time più recente. Il risultato è 2023-02-15T18:13:39.441692339Z - 2023-02-15T18:13:39.341584693Z, che equivale a 0,100107646 secondi.