Calculer la latence des requêtes de streaming et de partition Spanner

Cette page explique comment calculer la latence des requêtes API Spanner des requêtes de streaming et de partition.

Vous pouvez calculer la latence des requêtes de streaming et de partition de l'API Spanner à l'aide des champs de l'objet struct metadata d'un AuditLog. Les métadonnées sont de type QueryPerformanceMetadata. Pour les requêtes de streaming et de partition, metadata ne contient pas de champ processingSecondsDuration. Pour savoir comment utiliser processingSecondsDuration afin de calculer la latence des requêtes pour tous les autres types de requêtes, consultez la section Durée de traitement.

Latences des requêtes en flux continu

Lorsqu'un client envoie une requête de streaming et que l'API Spanner renvoie des ensembles de résultats partiels, Cloud Audit Logs enregistre des journaux d'audit pour la première et la dernière réponse. La latence d'une requête de streaming correspond au temps écoulé entre le moment où l'API Spanner reçoit la requête et le moment où le client reçoit la dernière réponse.

Reconnaître les entrées du journal d'audit des requêtes en flux continu

Pour calculer la latence d'une requête en streaming, vous devez identifier les entrées de journal associées à la requête. protoPayload.methodName est défini sur google.spanner.v1.Spanner.ExecuteStreamingSql ou google.spanner.v1.Spanner.StreamingRead pour les entrées de journal. Pour chaque requête en flux continu, il existe deux entrées de journal, regroupées par operation.id. La première entrée a le paramètre operation.first défini sur true et la dernière entrée a operation.last défini sur true. L'objet protoPayload.metadata.responseTimestamp est également renseigné.

Calculer la latence des requêtes en flux continu

Pour calculer la latence d'une requête en flux continu, filtrez les journaux d'audit par operation.id. La différence entre la valeur protoPayload.metadata.responseTimestamp la plus récente et la plus ancienne protoPayload.requestMetadata.requestAttributes.time réside dans la latence de la requête.

Exemples de journaux d'audit pour les requêtes en flux continu

Pour rechercher toutes les entrées de journal d'une requête en flux continu, exécutez la requête suivante dans l'explorateur de journaux, en remplaçant la variable OPERATION_ID par la valeur souhaitée:

operation.id="OPERATION_ID"

L'exemple suivant trouve des entrées de journal pour une requête en flux continu avec le operation.id de 15327696495839874591:

operation.id="15327696495839874591"

Premier journal renvoyé

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

Dernier journal renvoyé

{
  "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 latence des requêtes correspond à la valeur metadata.responseTimestamp la plus récente moins la valeur requestAttributes.time la plus proche. Le résultat est 2023-02-27T16:57:40.556138125Z-2023-02 - 2023-02-27T16:57:40.552952297Z, soit 0,003185828 secondes.

Latences des requêtes de partition

Lorsqu'un client envoie une requête partitionnée, Spanner crée plusieurs journaux d'audit. Pour calculer la latence d'une requête de partition de bout en bout et des appels suivants aux partitions, identifiez les journaux d'audit associés à la requête parente.

Reconnaître les entrées du journal d'audit des requêtes de partitionnement

Lorsque vous effectuez une requête PartitionRead ou PartitionQuery, un ensemble de partitions est renvoyé dans PartitionResponse. Lorsque vous effectuez des appels Read, ExecuteSql ou ExecuteStreaming respectivement pour chaque partition, Spanner enregistre les journaux d'audit pour ces méthodes. Chacun de ces journaux contient un identifiant appelé protoPayload.metadata.partitionBatchIdentifier permettant de les regrouper. L'objet protoPayload.metadata.responseTimestamp est également renseigné.

Calculer la latence des requêtes pour les partitions

Pour calculer la latence d'une requête de partition, vous pouvez filtrer les journaux d'audit par metadata.partitionBatchIdentifier. La différence entre la valeur metadata.responseTimestamp la plus récente et la valeur protoPayload.requestMetadata.requestAttributes.time la plus ancienne réside dans la latence de la requête.

Exemples de journaux d'audit pour les requêtes de partition

Pour rechercher toutes les entrées de journal d'une requête de partition, exécutez la requête suivante dans l'explorateur de journaux, en remplaçant la variable PARTITION_BATCH_ID par la valeur souhaitée:

metadata.partitionBatchIdentifier="PARTITION_BATCH_ID"

L'exemple suivant trouve les entrées de journal pour une requête de partition dont le metadata.partitionBatchIdentifier est 15327696495839874591:

metadata.partitionBatchIdentifier="15327696495839874591"

Premier journal renvoyé

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

Deuxième journal renvoyé

{
  "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 fonction du nombre de partitions, Spanner peut enregistrer plus de journaux que dans cet exemple.

Dernier journal renvoyé

{
  "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 latence des requêtes correspond à la valeur metadata.responseTimestamp la plus récente moins la valeur requestAttributes.time la plus proche. Le résultat est 2023-02-15T18:13:39.441692339Z - 2023-02-15T18:13:39.341584693Z, soit 0,100107646 secondes.