計算 Spanner 串流和分區要求的延遲時間

本頁說明如何計算串流和區隔要求的 Spanner API 要求延遲時間。

您可以使用 AuditLogmetadata 結構體物件中的欄位,計算 Spanner API 串流和分區要求的延遲時間。中繼資料的類型為 QueryPerformanceMetadata。對於串流和分區要求,metadata 不包含 processingSecondsDuration 欄位。如要瞭解如何使用 processingSecondsDuration 計算所有其他要求類型的要求延遲時間,請參閱「處理時間」。

要求串流要求的延遲時間

當用戶端傳送串流要求,並且 Spanner API 傳回部分結果集時,Cloud 稽核記錄會記錄第一個和最後一個回應的稽核記錄。串流要求的延遲時間,是指 Spanner API 收到要求與用戶端收到最後回應之間的時間間隔。

辨識串流要求稽核記錄項目

如要計算串流要求的要求延遲時間,您必須找出與要求相關的記錄項目。記錄項目的 protoPayload.methodName 已設為 google.spanner.v1.Spanner.ExecuteStreamingSqlgoogle.spanner.v1.Spanner.StreamingRead。每個串流要求都有兩個記錄項目,並按 operation.id 分組。第一個項目將 operation.first 設為 true,最後一個項目將 operation.last 設為 true。系統也會填入 protoPayload.metadata.responseTimestamp 物件。

計算串流要求的延遲時間

如要計算串流要求的延遲時間,請依 operation.id 篩選稽核記錄。最新的 protoPayload.metadata.responseTimestamp 和最早的 protoPayload.requestMetadata.requestAttributes.time 之間的差異就是要求延遲時間。

串流要求的稽核記錄範例

如要查看串流要求的所有記錄項目,請在記錄檔探索工具中執行以下查詢,並將 OPERATION_ID 變數替換為所需的值:

operation.id="OPERATION_ID"

以下範例會尋找串流要求的記錄項目,該要求的 operation.id15327696495839874591

operation.id="15327696495839874591"

已傳回第一個記錄

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

傳回上次記錄

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

要求延遲時間是最新的 metadata.responseTimestamp 減去最早的 requestAttributes.time。結果為 2023-02-27T16:57:40.556138125Z-2023-02 - 2023-02-27T16:57:40.552952297Z,等於 0.003185828 秒。

分區要求的請求延遲時間

當用戶端傳送分割要求時,Spanner 會建立多個稽核記錄。如要計算端對端分區要求和後續對分區的呼叫的請求延遲時間,請找出與父項要求相關聯的稽核記錄。

辨識分區要求稽核記錄項目

您發出 PartitionReadPartitionQuery 要求時,系統會在 PartitionResponse 中傳回一組區隔。當您分別為每個分區發出 ReadExecuteSqlExecuteStreaming 呼叫時,Spanner 會記錄這些方法的稽核記錄。每個記錄都包含一個 ID,用於將記錄分組,稱為 protoPayload.metadata.partitionBatchIdentifier。系統也會填入 protoPayload.metadata.responseTimestamp 物件。

計算分區要求的請求延遲時間

如要計算分區要求的請求延遲時間,您可以依 metadata.partitionBatchIdentifier 篩選稽核記錄。最新的 metadata.responseTimestamp 和最早的 protoPayload.requestMetadata.requestAttributes.time 之間的差異就是要求延遲時間。

分割區要求的稽核記錄範例

如要查看分割區要求的所有記錄項目,請在記錄檔探索工具中執行以下查詢,並將 PARTITION_BATCH_ID 變數替換為所需的值:

metadata.partitionBatchIdentifier="PARTITION_BATCH_ID"

以下範例會尋找分區要求的記錄項目,metadata.partitionBatchIdentifier15327696495839874591

metadata.partitionBatchIdentifier="15327696495839874591"

已傳回第一個記錄

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

傳回的第二個記錄

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

視分區數量而定,Spanner 記錄的記錄檔可能會比本範例多。

傳回上次記錄

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

要求延遲時間是最新的 metadata.responseTimestamp 減去最早的 requestAttributes.time。結果為 2023-02-15T18:13:39.441692339Z - 2023-02-15T18:13:39.341584693Z,等於 0.100107646 秒。