ロギング

Fleet Engine には、API リクエストとレスポンスのペイロードを保存できるシンプルなロギング サービスが用意されています。これらのログを使用して、統合のデバッグ、モニタリング指標の作成、トラフィック パターンの分析を行うことができます。

Fleet Engine は、ログをプラットフォーム ログとして Cloud Logging に送信します。これにより、Cloud Logging ツールを使用してログにアクセスできます。

Fleet Engine が記録する内容

Fleet Engine は、次のような複数の情報を Cloud Logging に送信します。

  • すべての認証済み REST および gRPC リクエストとレスポンス
  • Error responses(エラー応答)
  • Driver SDK から Fleet Engine に対して開始された呼び出しのリクエスト、レスポンス、エラー メッセージ。
  • サポートされているログタイプのログを分割します。

利用可能なログメッセージとスキーマについては、Logging リファレンスのドキュメントをご覧ください。

制限付きのログバケットとデフォルトのログバケットを使用してデータ保持ポリシーに準拠する

「restricted」バケットと「default」バケットを使用すると、データ使用量の制限と制限なしを明確に把握できます。Fleet Engine から Google Maps Platform に送信されるログデータの一部は、モビリティ サービス固有の利用規約に従い、限られた期間しか保持されない場合があります。制限されたデータを保持する期間を限定するには、このようなデータに TOS_RESTRICTED というラベルを付け(Fleet Engine はすでにこの処理を行っています)、制限ありという専用バケットにログを記録する必要があります。

Cloud Logging の設定を使用して、ログの保持期間を制御し、期限が切れたときに自動的にパージできます。たとえば、使用制限付きログの保持期間は 30 日間とします。

残りの制限されていないデータはすべて「デフォルト」バケットに記録します。このバケットでは、モビリティ サービス固有の規約で定義されているように、より長い期間(通常は 1 年間)保持できます。「制限付き」バケットと「デフォルト」バケットを使用すると、制限付きおよび制限なしのデータ使用量を明確に把握できます。

制限付きのログと制限なしのログを結合して全体像を把握

使用制限のログには、使用制限のデータとデフォルトログへの参照が含まれているため、これらを一緒に検討できます。使用制限付きログでは、parent_insert_id フィールドに参照としてデフォルトのログの insertId が含まれています。このフィールドを使用して両方のログのデータを結合し、全体像を把握できます。

利用可能なすべてのログメッセージとスキーマについては、Logging リファレンスのドキュメントをご覧ください。

Cloud Logging の有効化

Fleet Engine は、2022 年 2 月 10 日に作成されたプロジェクトから、モビリティの新規のお客様に対してデフォルトのログを自動的に有効にします。ロギングが有効になっているかどうかは、ログ エクスプローラで次のクエリを使用して確認できます。

resource.type:"fleetengine.googleapis.com/DeliveryFleet"

そのクエリのログが表示されない場合は、プロジェクトで Cloud Logging が有効になっていない可能性があります。この機能を有効にする場合は、サポートにお問い合わせください。

使用制限付きログを有効にする

使用制限のログは、リクエストに応じて有効化されます。Google Cloud プロジェクトでこれらのログを有効にするには、次の手順を完了します。

使用制限のあるログを受信するようにプロジェクトを準備する

  1. Google Cloud コンソールで、[ログルーター] ページを開きます。
  2. _Default ロギング バケットを更新して、使用制限付きログを除外します。
    1. [_Default] ロギング バケットを選択し、[シンクを編集] を選択します。
    2. [シンクに含めないログの選択] セクションで、[除外を追加] ボタンをクリックします。
      1. 除外フィルタ名: ExcludeRestrictedLogs
      2. 除外フィルタ: labels.restriction="TOS_RESTRICTED"
    3. [シンクを更新] をクリックします。
  3. 制限付きロギング バケットを更新して、制限付きの使用ログを保存します。
    1. [ログルーター] ページで [シンクを作成] を選択します。
    2. 次の設定でシンクを作成します。
      1. シンクの詳細:
        1. 名前: RestrictedLogs
        2. 説明: Routes Fleet Engine の制限付きログ
      2. シンクの宛先:
        1. シンクサービス: Logging バケット
        2. ログバケットの選択: 新しいログバケットを作成する
          1. 名前: 制限付き
          2. 説明: Fleet Engine の制限付きログが含まれます
        3. 保持期間: 30 日
          1. 注: 保持期間は 30 日以下にする必要があります。
      3. シンクに含めるログ: 空白のままにします
      4. シンクに含めないログ: [除外を追加] をクリックします。
        1. 除外フィルタ名: ExcludeNonRestrictedLogs
        2. 除外フィルタ: NOT (resource.type = "fleetengine.googleapis.com/Fleet" OR resource.type = "fleetengine.googleapis.com/DeliveryFleet") NOT (labels.restriction = "TOS_RESTRICTED")
      5. [シンクを作成] をクリックします

使用制限付きログを有効にするには、サポートにお問い合わせください

その後、サポートにお問い合わせのうえ、サポート リクエストに次の情報を記載してください。

  1. 有効にするプロジェクト ID:
  2. 変更をリクエストしている方のメールアドレス:
    1. 注: このユーザーには、リスト内の Google Cloud プロジェクトに対する編集権限が必要です。
  3. Cloud Logging で使用制限のある Google マップ コンテンツを有効にすると、Google Maps Platform の利用規約モビリティ サービス固有の利用規約(Google マップ コンテンツに関連するキャッシュ保存や許容される使用要件など)を遵守することに同意したものとみなされます。○ / ×

サポートチームがリクエストを受信すると、プロジェクトでロギングが有効になっていることの確認が送信されます。

Cloud ログを分割

Cloud Logging では、受信ログのサイズが 256 KB に制限されています。そのしきい値を超えたログは破棄されます。Cloud Logging が大きなログを保持するように、Fleet Engine は 256 KB のしきい値未満で一連のログに分割できます。このようなログには共通の insertId 接頭辞があり、サービスが元のサイズ超過のログから小さいログを分割する順序を示します。その後、insertId に基づいて再結合できます。

元の分割されていないログにアクセスするには、Cloud ログエントリのインデックスで示されているように、分割された元のログを insertId で結合します。

分割ログの構造は、Cloud Audit Logs の分割監査ログエントリのガイドで説明されている構造と同じです。フリート ロギングの分割ログの主な違いは、分割が protoPayload フィールドではなく jsonPayload フィールドで行われることです。次のセクションで示す分割例をご覧ください。

サポートされているログタイプ

Fleet Engine では、ログサイズが 256 KB を超える次のログタイプに対してのみ、ログ分割がサポートされます。

分割ログの構造の例

// First Split Log
{
  // insertId appended with an increasing number
  "insertId": "ABCDE-1",
  "jsonPayload": {
    "request": {
      "filter": "tracking_id=tracking-test-splitting-task"
    },
    "@type": "type.googleapis.com/maps.fleetengine.delivery.log.v1.ListTasksLog",
    "response": {
      "tasks": [
        {
          "name": "providers/providers-123/tasks/test-splitting-task-id-0",
          // ...
        },
        {
          "name": "providers/providers-123/tasks/test-splitting-task-id-1",
          // ...
        },
        {
          "name": "providers/providers-123/tasks/test-splitting-task-id-2"
          // ...
        },
        {
          "name": "providers/providers-123/tasks/test-splitting-task-id-3",
          // ...
        },
      ]
    },
    "header": {}
  },
  "resource": {
    "type": "fleetengine.googleapis.com/DeliveryFleet",
    "labels": {
      "resource_container": "projects/providers-123",
      "location": "global"
    }
  },
  // Same timestamp
  "timestamp": "2024-01-29T23:35:58.076515Z",
  "labels": {
  },
  "logName": "projects/providers-123/logs/fleetengine.googleapis.com%2Flist_tasks",
  "receiveTimestamp": "2024-01-29T23:35:59.278858322Z",
  "split": {
    // UID for this logical log entry (same across splits)
    "uid": "ABCDE",
    "totalSplits": 2
  }
}
// Second Split Log
{
  // insertId appended with an increasing number
  "insertId": "ABCDE-2",
  "jsonPayload": {
    "request": {
      "filter": "tracking_id=tracking-test-splitting-task"
    },
    "@type": "type.googleapis.com/maps.fleetengine.delivery.log.v1.ListTasksLog",
    "response": {
      "tasks": [
         // Previous tasks appear as empty objects in subsequent splits
        {}, {}, {}, {},
        {
          "name": "providers/providers-123/tasks/test-splitting-task-id-4",
          // ...
        }
      ]
    },
    "header": {}
  },
  "resource": {
    "type": "fleetengine.googleapis.com/DeliveryFleet",
    "labels": {
      "resource_container": "projects/providers-123",
      "location": "global"
    }
  },
  // Same timestamp
  "timestamp": "2024-01-29T23:35:58.076515Z",
  "labels": {
  },
  "logName": "projects/providers-123/logs/fleetengine.googleapis.com%2Flist_tasks",
  "receiveTimestamp": "2024-01-29T23:35:59.278858322Z",
  "split": {
    // UID for this logical log entry (same across splits)
    "uid": "ABCDE",
    // Subsequent logs after the original will have a zero based index
    "index": 1,
    "totalSplits": 2
  }
}

ログにアクセスする

Cloud ログは LogEntry 形式を中心に構成されています。Fleet Engine は、LogEntry の resource.typefleetengine.googleapis.com に設定して Cloud Logging にログを送信します。ログ エクスプローラを使用して、ログを表示するためのクエリを作成できます。

たとえば、エラーを返した Fleet Engine への RPC をすべて表示するには、次のログ エクスプローラ クエリを使用します。

resource.type:"fleetengine.googleapis.com/DeliveryFleet"
severity=ERROR

プロジェクト example-project-id の UpdateDeliveryVehicle メソッドに対して行われた RPC のログを表示するには、次のログ エクスプローラ クエリを使用します。

logName="projects/project-id/logs/fleetengine.googleapis.com%2Fupdate_delivery_vehicle"

次の例は、UpdateDeliveryVehicle ログの LogEntry を示しています。RPC リクエストとレスポンスは、jsonPayload フィールド内にあります。

    {
      "insertId": "c6b85fbc927343fc8a85338c57a65733",
      "jsonPayload": {
        "request": {
          "header": {4},
          "updateMask": "deviceSettings",
          "vehicleId": "uniqueVehicleId",
          "vehicle": {2}
        },
        "response": {
          "name": "providers/example-project-id/vehicles/uniqueVehicleId",
          "availableCapacity": 2,
          "state": "VEHICLE_STATE_OFFLINE",
          "maximumCapacity": 2,
          "vehicleType": {1},
          "supportedTrips": {1}
        },
        "@type": "type.googleapis.com/maps.fleetengine.v1.UpdateDeliveryVehicleLog"
      },
      "resource": {
        "type": "fleetengine.googleapis.com/DeliveryFleet",
        "labels": {2}
      },
      "timestamp": "2021-01-01T00:00:00.000000000Z",
      "labels": {2},
      "logName": "projects/example-project-id/logs/fleetengine.googleapis.com%2Fupdate_delivery_vehicle",
      "receiveTimestamp": "2021-01-01T00:00:00.000000000Z"
    }

RPC エラーが返されると、responseDeliveryVehicle フィールドがクリアされ、jsonPayload 内に errorResponse フィールドが設定され、値が代入されます。

    {
      "insertId": "2ead60bdec561836a1bb84a90e9915cd",
      "jsonPayload": {
        "@type": "type.googleapis.com/maps.fleetengine.delivery.log.v1.UpdateDeliveryVehicleLog",
        "header": {
          "languageCode": "en",
          "osVersion": "11",
          "platform": "PLATFORM_LOG_ANDROID",
          "regionCode": "US",
          "sdkType": "SDK_TYPE_LOG_DRIVER",
          "sdkVersion": "4.4.3"
        },
        "request": {
          "deliveryVehicle": {4},
          "deliveryVehicleId": "uniqueDeliveryVehicleId",
          "updateMask": "lastLocation"
        },
        "response": {
          "lastLocation": {14},
          "name": "providers/example-project-id/deliveryVehicles/uniqueDeliveryVehicleId",
          "navigationStatus": "NAVIGATION_STATUS_ARRIVED_AT_DESTINATION",
          "remainingDistanceMeters": "430",
          "remainingDuration": "10s"
        }
      },
      "labels": {
        "delivery_vehicle_id": "uniqueDeliveryVehicleId"
      },
      "logName": "projects/example-project-id/logs/fleetengine.googleapis.com%2Fupdate_delivery_vehicle",
      "receiveTimestamp": "2023-07-14T22:57:51.156515110Z",
      "resource": {
        "labels": {2},
        "type": "fleetengine.googleapis.com/DeliveryFleet"
      },
      "timestamp": "2023-07-14T22:57:51.018045Z"
    }

ロギングクエリ言語の詳細については、Logging のクエリ言語をご覧ください。ログを使用して指標を作成する方法については、ログベースの指標の概要をご覧ください。

Logging の費用を管理する

ロギングを有効にしたら、ログの転送、保存、保持の方法を設定する必要があります。料金なしの使用量と保持の上限を超えると、ログの取り込みと保持に対して追加の Google Cloud 料金が発生することがあります。ただし、次のいずれかの方法でロギングの費用を制御できます。

ロギングの使用量を減らす

特定のログエントリを除外することで、ログデータの取り込み量を制限できます。

ログをエクスポートまたはルーティングする

デフォルトの取り込み費用と保存費用を回避するために、ログを他の Google Cloud または外部の宛先にルーティングできます。取り込みコストが発生しないように、次のセクションで説明するように、ログの取り込みをオフにしてください。

ログ取り込みを無効にして料金が発生しないようにする

ログの取り込みをオフにするよりも、ロギングの使用量を減らすか、ログをエクスポートまたはルーティングすることをおすすめします。ただし、Fleet Engine ログを使用しない場合は、取り込みをオフにすることで Cloud Logging の料金が発生しないようにできます。デフォルトでは、Fleet Engine のログは _Default ログバケットにルーティングされます。

次のコマンドは、Fleet Engine ログを取り込まないように _Default ロギング バケットを更新します。

gcloud logging sinks update _Default \
--log-filter='NOT LOG_ID("cloudaudit.googleapis.com/activity") \
AND NOT LOG_ID("externalaudit.googleapis.com/activity") \
AND NOT LOG_ID("cloudaudit.googleapis.com/system_event") \
AND NOT LOG_ID("externalaudit.googleapis.com/system_event") \
AND NOT LOG_ID("  cloudaudit.googleapis.com/access_transparency") \
AND NOT LOG_ID("externalaudit.googleapis.com/access_transparency") \
AND NOT resource.type:"fleetengine.googleapis.com"''

詳細については、Cloud Logging の除外ログの除外をご覧ください。Cloud Logging のエクスポートログのエクスポート

ログ エクスプローラを使用する

ログ エクスプローラを使用するには、Cloud コンソールを開き、[ロギング]、[ログ エクスプローラ] の順に選択します。使用可能なすべての Fleet Engine ログのリストを表示するには、[Fleet Engine] リソースタイプをクリックします。一部の Delivery API ログには、タスク ID と Delivery Vehicle ID のラベルが付けられています。これらのラベルを使用して、関心のあるタスクや車両のログを選択できます。

ログラベル

配送車両 ID でログをフィルタ

ログ エクスプローラでは、次のクエリを使用して、ログを特定の車両に制限できます。

    resource.type="fleetengine.googleapis.com/DeliveryFleet"
    labels.delivery_vehicle_id="delivery_vehicle_id"

車両をフィルタ

タスク ID でログをフィルタする

ログ エクスプローラで、次のクエリを使用して、ログを特定のタスクに制限できます。

    resource.type="fleetengine.googleapis.com/DeliveryFleet"
    labels.task_id=~"task_id"

特定の期間に車両のログをフィルタリングする

ログ エクスプローラでは、次のクエリを使用して、特定の期間の車両のログを限定できます。

    resource.type="fleetengine.googleapis.com/DeliveryFleet"
    labels.delivery_vehicle_id="delivery_vehicle_id"
    timestamp>="2020-09-24T20:00:00.000Z"
    timestamp<"2020-09-24T21:00:00.000Z"

ログベースの指標の例

次の例は、ログベースの指標を使用して、作成されたタスクの数を経時的に追跡する方法を示しています。

  1. Cloud コンソールで [ロギング]、[ログ エクスプローラ] の順に選択して、ログ エクスプローラを開きます。次に、次のフィルタを適用します。

    resource.type="fleetengine.googleapis.com/DeliveryFleet" resource.labels.location="global"
    logName="projects/ProjectID/logs/fleetengine.googleapis.com%2Fupdate_task"
    jsonPayload.request.task.taskOutcome="TASK_OUTCOME_LOG_SUCCEEDED"
    jsonPayload.request.updateMask="taskOutcome"
    jsonPayload.response.type= ("TASK_TYPE_LOG_PICKUP" OR "TASK_TYPE_LOG_DELIVERY")
    
  2. [クエリ結果] ペインで、[アクション] プルダウンを選択し、[指標を作成] を選択します。

    指標を作成

  3. [指標エディタ] ダイアログで、次の操作を行います。

    • 指標名(billable_tasks など)を指定します。
    • 指標の説明を指定します(例: 課金対象タスクの数)。
    • [単位] オプションは空白のままにします。_ [タイプ] オプションは [カウンタ] のままにします。

    次に、[指標を作成] ボタンを選択します。

  4. [ログベースの指標] ページに、指標が正常に作成されたことを確認するメッセージが表示され、[ユーザー定義の指標] セクションに新しい指標が表示されます。一致するログが生成されると、指標が入力されます。

  5. 新しい指標の右側にある垂直のプルダウンを選択し、[Metrics Explorer で表示する] を選択します。

    指標を表示

  6. 左側のペインの [クエリの作成] で、[Resource Type] を [Fleet Engine] に設定し、billingable_tasks 指標を検索します。

    指標を検索

    右側のグラフは、billingable_tasks 呼び出しの割合を示しています。

BigQuery の使用

BigQuery は分析を実行するための強力なツールです。長期ログの保存や、データに対して SQL のようなアドホックなクエリを実行するために使用できます。

BigQuery にログを転送する

BigQuery を活用するには、次のようにログを BigQuery データストアに転送する必要があります。

  1. Cloud コンソールで、[ロギング]、[ログ エクスプローラ] の順に選択します。

  2. Fleet Engine のログを分離するフィルタを作成する。ログ フィールド エクスプローラで、Fleetengine.googleapis.com/DeliveryFleet リソースタイプを選択します。

    フィルタの作成

  3. [クエリ結果] ペインで [操作] プルダウンをクリックし、[シンクを作成] を選択します。

    シンクの作成

  4. [シンクサービスの選択] ダイアログで、[BigQuery データセット] を選択します。

    シンクの選択

  5. [シンクの編集] ダイアログで、次のオプションを指定します。

    • シンク名を指定します(例: FleetEngineLogsSink)。
    • シンクサービスは BigQuery のままにします。
    • [パーティション分割テーブルを使用] オプションを選択します。これにより、クエリのパフォーマンスが向上します。
    • [シンクの宛先] で [新しい BigQuery データセットを作成] を選択し、BigQuery データセット名(FleetEngineLogs など)を指定します。
    • [シンクを作成] ボタンをクリックします。

    シンクの編集

これで、BigQuery データセットへのログの入力が開始されるはずです。Cloud コンソールの [BigQuery] セクションでデータを確認できます。

BigQuery セクション

FleetEngineLogs データセットの下に、ログタイプごとに 1 つずつ、自動的にデータが入力されます。

  • CreateDeliveryVehicle
  • GetDeliveryVehicle
  • ListDeliveryVehicle
  • UpdateDeliveryVehicle
  • CreateTask
  • GetTask
  • UpdateTask
  • ListTasks
  • SearchTasks

テーブル名には次のパターンを使用します。

project_id.data_set.log_name

たとえば、プロジェクトの名前が test_project で、データセットの名前が FleetEngineLogs の場合、CreateTask テーブルの名前は次のようになります。

test_project.FleetEngineLogs.fleetengine_googleapis_com_create_task

クエリの例

このセクションでは、作成できるクエリの例を示します。

1 時間あたりのタスク作成数

次のクエリは、CreateTasks ログの数をカウントし、時間ごとにグループ化します。

    SELECT TIMESTAMP_TRUNC(timestamp, HOUR) as hour,
           count(*) as num_tasks_created
    FROM
    `ProjectId.FleetEngineLogs.fleetengine_googleapis_com_create_task`
    GROUP BY hour
    ORDER by hour

1 時間あたりの車両 1 台あたりの停車回数

次のクエリは、車両が運行した停車地の数を 1 時間ごとに生成します。

たとえば、このクエリは過去 1 時間について、次のような状況を示します。

  • 車両 A は 12 時間で 10 駅を経由し、13 時間で 8 か所の停車を完了しました。
  • 車両 B は 11 時間で 5 か所の経由地を完了し、12 時間で 7 か所の経由地を完了しました。
  • 車両 C は 13 時間で 12 駅 / 停留所を、14 時間で 9 駅 / 停留所を完了しました。

    SELECT
      jsonpayload_v1_updatedeliveryvehiclelog.request.deliveryvehicleid AS vehicle,
      TIMESTAMP_TRUNC(timestamp, HOUR) AS hour,
      COUNT(*) AS num_stops
    FROM
      `ProjectId.FleetEngineLogs.fleetengine_googleapis_com_update_delivery_vehicle`
    WHERE
    ARRAY_LENGTH(jsonpayload_v1_updatedeliveryvehiclelog.request.deliveryvehicle.remainingvehiclejourneysegments) > 0
    AND jsonpayload_v1_updatedeliveryvehiclelog.request.deliveryvehicle.remainingvehiclejourneysegments[
    OFFSET
    (0)].stop.state = 'VEHICLE_STOP_STATE_LOG_ARRIVED'
    GROUP BY
    1,
    2
    ORDER BY
    2
    

初回配信成功率

最初の配信試行率の成功率を表示する次のクエリ。

    SELECT
     vehicle_id,
     COUNTIF(outcome = "TASK_OUTCOME_LOG_SUCCEEDED") AS num_success,
     COUNT(*) AS total_deliveries,
     COUNTIF(outcome = "TASK_OUTCOME_LOG_SUCCEEDED") * 100/ COUNT(*) AS success_rate
    FROM (
     SELECT
       labels.delivery_vehicle_id AS vehicle_id,
       jsonpayload_v1_updatetasklog.response.trackingid AS trackingid,
       ARRAY_AGG(jsonpayload_v1_updatetasklog.response.taskoutcome
       ORDER BY
         timestamp ASC)[ORDINAL(1)] AS outcome,
     FROM
     `ProjectId.FleetEngineLogsfleetengine_googleapis_com_update_task`
     WHERE
      jsonpayload_v1_updatetasklog.response.type = "TASK_TYPE_LOG_DELIVERY"
     GROUP BY 1, 2
     ORDER BY 1, 2)
    GROUP BY 1
    ORDER BY 1

データポータルのダッシュボード

BigQuery はビジネス インテリジェンス ツールと統合でき、ビジネス分析用にダッシュボードを作成できます。

次の例は、タスクと車両の動きを地図上で可視化できるダッシュボードを作成する方法を示しています。

  1. 新しいデータポータル ダッシュボードを起動し、データ接続として BigQuery を選択します。

    データ接続

  2. [カスタムクエリ] を選択し、請求先の Cloud プロジェクトを選択します。

    プロジェクトを選択

  3. クエリボックスに次のクエリを入力します。

    クエリを入力

    SELECT
     timestamp,
     labels.delivery_vehicle_id,
    jsonpayload_v1_updatedeliveryvehiclelog.response.lastlocation.rawlocation.latitude AS lat,
    jsonpayload_v1_updatedeliveryvehiclelog.response.lastlocation.rawlocation.longitude AS lng
    FROM
    `ProjectId.FleetEngineLogs.fleetengine_googleapis_com_update_delivery_vehicle`
  1. [グラフの種類] で [バブルマップ] を選択し、場所フィールドを選択します。

    グラフの種類

  2. [フィールドを作成] を選択します。

    フィールドの作成

  3. フィールドに名前を付け、数式 CONCAT(lat, ",", lng) を追加します。

    次に、[タイプ] を [地域] -> [緯度, 経度] に設定します。

    タイプの設定

  4. ダッシュボードにコントロールを追加して、データをフィルタできます。たとえば、[期間] フィルタを選択します。

    コントロールを追加する

  5. 期間ボックスを編集して、デフォルトの期間を選択します。

    期間

  6. Delivery_vehicle_id にプルダウン リスト コントロールを追加できます。

    プルダウン リスト

これらのコントロールを使用すると、車両の動きや配達内の動きを可視化できます。