このページでは、ストリーミング リクエストとパーティション リクエストの Spanner API リクエスト レイテンシを計算する方法について説明します。
Spanner API ストリーミングとパーティションのリクエストのレイテンシは、AuditLog
の metadata
構造体オブジェクトのフィールドを使用して計算できます。メタデータの型は QueryPerformanceMetadata
です。ストリーミング リクエストとパーティション リクエストの場合、metadata
には processingSecondsDuration
フィールドは含まれません。processingSecondsDuration
を使用して他のすべてのリクエスト タイプのリクエストのレイテンシを計算する方法については、処理期間をご覧ください。
ストリーミング リクエストのリクエスト レイテンシ
クライアントがストリーミング リクエストを送信し、Spanner API が部分的な結果セットを返すと、Cloud 監査ログ最初と最後のレスポンスの監査ログを記録します。ストリーミング リクエストのリクエスト レイテンシは、Spanner API がリクエストを受信してからクライアントが最後のレスポンスを受信するまでの経過時間です。
ストリーミング リクエストの監査ログエントリを認識する
ストリーミング リクエストのリクエスト レイテンシを計算するには、リクエストに関連するログエントリを特定する必要があります。ログエントリの protoPayload.methodName
が google.spanner.v1.Spanner.ExecuteStreamingSql
または google.spanner.v1.Spanner.StreamingRead
に設定されています。ストリーミング リクエストごとに 2 つのログエントリがあり、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.id
が 15327696495839874591
であるストリーミング リクエストのログエントリを検索します。
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 は複数の監査ログを作成します。エンドツーエンドのパーティション リクエストと、パーティションに対する後続の呼び出しのリクエスト レイテンシを計算するには、親リクエストに関連付けられた監査ログを特定します。
パーティション リクエストの監査ログエントリを認識する
PartitionRead
または PartitionQuery
リクエストを行うと、PartitionResponse
に一連のパーティションが返されます。パーティションごとに Read
、ExecuteSql
、ExecuteStreaming
のいずれかを呼び出すと、Spanner によってこれらのメソッドの監査ログが記録されます。これらの各ログには、それらを一緒にグループ化する protoPayload.metadata.partitionBatchIdentifier
という識別子が含まれています。protoPayload.metadata.responseTimestamp
オブジェクトにも値が入力されます。
パーティション リクエストのリクエスト レイテンシを計算する
パーティション リクエストのリクエスト レイテンシを計算するには、監査ログを metadata.partitionBatchIdentifier
でフィルタリングします。最新の metadata.responseTimestamp
と最古の protoPayload.requestMetadata.requestAttributes.time
の差がリクエスト レイテンシです。
パーティション リクエストの監査ログの例
パーティション リクエストのすべてのログエントリを検索するには、ログ エクスプローラで次のクエリを実行します。PARTITION_BATCH_ID 変数は目的の値に置き換えます。
metadata.partitionBatchIdentifier="PARTITION_BATCH_ID"
次の例では、metadata.partitionBatchIdentifier
が 15327696495839874591
であるパーティション リクエストのログエントリを検索します。
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"
}
返された 2 番目のログ
{
"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 秒に相当します。