API 요청 및 응답 로깅

Fleet Engine은 API 요청 및 응답 페이로드를 저장할 수 있는 간단한 로깅 서비스를 제공합니다. 이러한 로그를 사용하여 통합을 디버그하고 모니터링 측정항목을 만들고 트래픽 패턴을 분석할 수 있습니다.

Fleet Engine은 로그를 플랫폼 로그Cloud Logging에 전송하므로 Cloud Logging 도구를 사용하여 로그에 액세스할 수 있습니다.

Fleet Engine 로그

Fleet Engine은 다음과 같은 여러 정보를 Cloud Logging으로 전송합니다.

  • 인증된 모든 REST 및 gRPC 요청 및 응답
  • 오류 응답
  • Driver SDK에서 시작한 호출에서 Fleet Engine으로 보낸 요청, 응답, 오류 메시지
  • 지원되는 로그 유형의 분할 로그:

Logging 참조에서 사용 가능한 로그 메시지 및 스키마 문서를 참조하세요.

제한된 로그 버킷 및 기본 로그 버킷을 사용하여 데이터 보관 정책 준수

'제한됨' 및 '기본' 버킷을 사용하면 제한된 데이터 사용량과 제한되지 않은 데이터 사용량을 명확하게 파악할 수 있습니다. Fleet Engine에서 Google Maps Platform으로 전송하는 로그 데이터 중 일부는 모바일 서비스별 약관에 따라 제한된 기간 동안만 보관될 수 있습니다. 제한된 데이터를 허용된 시간 동안만 보관하려면 이러한 데이터에 TOS_RESTRICTED 라벨을 지정하고 (Fleet Engine에서 이미 이를 수행함) '제한됨'이라는 전용 버킷에 로깅해야 합니다.

여기에서 Cloud Logging 설정을 사용하여 보관 기간을 제어하고 만료 시 자동으로 삭제할 수 있습니다. 예를 들어 제한된 사용 로그는 30일 동안만 보관해야 합니다.

제한되지 않은 나머지 모든 데이터를 'default' 버킷에 로깅합니다. 이 버킷에는 모빌리티 서비스별 약관에 정의된 대로 더 오래 보관할 수 있습니다(일반적으로 1년). '제한됨' 및 '기본' 버킷을 사용하면 제한된 데이터 사용량과 제한되지 않은 데이터 사용량을 명확하게 파악할 수 있습니다.

제한되지 않은 나머지 모든 로그 데이터를 '기본' 버킷으로 전송합니다. 이 버킷은 무기한으로 유지될 수 있습니다.

제한된 로그와 제한되지 않은 로그를 병합하여 전체적인 뷰를 확인하세요.

제한된 사용 로그에는 함께 고려할 수 있도록 제한된 사용 데이터와 기본 로그에 대한 참조가 포함됩니다. 사용이 제한된 로그에는 기본 로그의 insertId가 parent_insert_id 필드의 참조로 포함됩니다. 이 필드를 사용하여 두 로그의 데이터를 조인하여 완전한 정보를 얻을 수 있습니다.

Logging 참조에서 사용 가능한 모든 로그 메시지와 스키마 문서를 참조하세요.

Cloud Logging 사용 설정

Fleet Engine은 2022년 2월 10일에 생성된 프로젝트를 시작으로 신규 Mobility 고객을 위해 기본 로그를 자동으로 사용 설정합니다. 로그 탐색기에서 다음 쿼리를 사용하여 로깅이 사용 설정되었는지 확인할 수 있습니다.

resource.type:"fleetengine.googleapis.com"

이 쿼리의 로그가 보이지 않으면 프로젝트에 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. 설명: 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 지도 콘텐츠와 관련된 캐싱 및 허용 사용 요건을 포함하여 Google Maps Platform 약관모빌리티 서비스별 약관을 준수하는 데 동의하는 것으로 간주됩니다. 예/아니요

지원팀은 요청을 받으면 프로젝트에 로깅이 사용 설정되었다는 확인을 전송합니다.

클라우드 로그 분할

Cloud Logging은 수신 로그의 크기를 256KB로 제한합니다. 서비스는 이 임곗값을 초과하는 로그를 삭제합니다. Cloud Logging이 대용량 로그를 보존하도록 Fleet Engine은 로그를 256KB 기준 미만의 일련의 로그로 분할할 수 있습니다. 이러한 로그에는 서비스가 크기가 큰 원래 로그에서 작은 로그를 분할하는 순서를 나타내는 공통 insertId 프리픽스가 있습니다. 그런 다음 insertId를 기준으로 두 객체를 다시 조인할 수 있습니다.

원래의 분할되지 않은 로그에 액세스하려면 클라우드 로그 항목에 색인이 표시되어 있는 대로 분할 로그를 원래 분할된 순서대로 insertId별로 병합합니다.

분할 로그 구조는 Cloud 감사 로그의 감사 로그 항목 분할 가이드에 언급된 구조와 동일합니다. Fleet 로깅에서 분할 로그의 주요 차이점은 분할이 protoPayload 필드가 아닌 jsonPayload 필드에서 발생한다는 것입니다. 다음 섹션에 표시된 분할 예를 참고하세요.

지원되는 로그 유형

Fleet Engine은 로그 크기가 256KB를 초과하는 다음 로그 유형에 대해서만 로그 분할을 지원합니다.

분할 로그 구조 예시

// First Split Log
{
  // insertId appended with an increasing number
  "insertId": "ABCDE-1",
  "jsonPayload": {
    "response": {
      "matches": [
        {
          // ...
          "vehicle": {
            "name": "providers/test-123/vehicles/test-vehicle-0",
            // ...
          }
        },
        {
          // ...
          "vehicle": {
            "name": "providers/test-123/vehicles/test-vehicle-1",
            // ...
            }
        }
      ]
    },
    "@type": "type.googleapis.com/maps.fleetengine.v1.SearchVehiclesLog",
    "request": {
      "searchTripTypes": [
        "EXCLUSIVE_TRIP"
      ],
      "pickupPoint": {},
      "count": 50,
      "pickupRadiusMeters": 400,
      "minimumCapacity": 1,
      "matchOrderBy": "PICKUP_POINT_ETA",
      "vehicleTypes": [
        {
          "vehicleCategory": "TAXI"
        }
      ]
    }
  },
  "resource": {
    "type": "fleetengine.googleapis.com/Fleet",
    "labels": {
      "resource_container": "projects/test-123",
      "location": "global"
    }
  },
  // Same timestamp
  "timestamp": "2024-02-06T22:48:50.620713Z",
  "logName": "projects/test-123/logs/fleetengine.googleapis.com%2Fsearch_vehicles",
  "receiveTimestamp": "2024-02-06T22:48:52.006308491Z",
  "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": {
    "response": {
      "matches": [
        {},{} // Previous matches appear as empty objects
        {
          // ...
          "vehicle": {
            "name": "providers/test-123/vehicles/test-vehicle-2",
            // ...
          },
        }
      ]
    },
    "@type": "type.googleapis.com/maps.fleetengine.v1.SearchVehiclesLog",
    "request": {
      "searchTripTypes": [
        "EXCLUSIVE_TRIP"
      ],
      "pickupPoint": {},
      "count": 50,
      "pickupRadiusMeters": 400,
      "minimumCapacity": 1,
      "matchOrderBy": "PICKUP_POINT_ETA",
      "vehicleTypes": [
        {
          "vehicleCategory": "TAXI"
        }
      ]
    }
  },
  "resource": {
    "type": "fleetengine.googleapis.com/Fleet",
    "labels": {
      "resource_container": "projects/test-123",
      "location": "global"
    }
  },
  // Same timestamp
  "timestamp": "2024-02-06T22:48:50.620713Z",
  "logName": "projects/test-123/logs/fleetengine.googleapis.com%2Fsearch_vehicles",
  "receiveTimestamp": "2024-02-06T22:48:52.006308491Z",
  "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"
severity=ERROR

example-project-id 프로젝트의 UpdateVehicle 메서드에 대한 RPC 로그를 보려면 다음 로그 탐색기 쿼리를 사용합니다.

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

다음 예시는 UpdateVehicle 로그의 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.UpdateVehicleLog"
      },
      "resource": {
        "type": "fleetengine.googleapis.com/Fleet",
        "labels": {2}
      },
      "timestamp": "2021-01-01T00:00:00.000000000Z",
      "labels": {2},
      "logName": "projects/example-project-id/logs/fleetengine.googleapis.com%2Fupdate_vehicle",
      "receiveTimestamp": "2021-01-01T00:00:00.000000000Z"
    }

RPC 오류가 반환되면 responseVehicle 필드가 지워지고 jsonPayload 내에 errorResponse 필드가 설정 및 채워집니다.

    {
      "insertId": "c6b85fbc927343fc8a85338c57a65733",
      "jsonPayload": {
        "errorResponse": {
          "httpStatusCode": 404,
          "code": "NOT_FOUND",
          "message": "No entity with id invalidVehicleId exists"
        },
        "@type": "type.googleapis.com/maps.fleetengine.v1.UpdateVehicleLog",
        "request": {
          "vehicle": {3},
          "updateMask": "deviceSettings",
          "vehicleId": "fakeVehicleId",
          "header": {4}
        }
      },
      "resource": {
        "type": "fleetengine.googleapis.com/Fleet",
        "labels": {2}
      },
      "timestamp": "2021-01-01T00:00:00.000000000Z",
      "severity": "ERROR",
      "labels": {2}
      "logName": "projects/example-project-id/logs/fleetengine.googleapis.com%2Fupdate_vehicle",
      "receiveTimestamp": "2021-01-01T00:00:00.000000000Z"
    }

로깅 쿼리 언어에 대한 자세한 내용은 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 콘솔을 열고 Logging을 선택한 다음 로그 탐색기를 선택합니다. 사용 가능한 모든 Fleet Engine 로그 목록을 보려면 Fleet Engine 리소스 유형을 클릭하세요. 일부 API 로그에는 이동 ID와 차량 ID로 라벨이 지정됩니다. 이러한 라벨을 사용하여 관심 있는 여정 또는 차량에 대한 로그를 선택할 수 있습니다.

로그 라벨

차량 ID로 로그 필터링

로그 탐색기에서 다음 쿼리를 사용하여 로그를 특정 차량으로 제한할 수 있습니다.

    resource.type="fleetengine.googleapis.com/Fleet"
    labels.vehicle_id="vehicle_id"

차량 필터링

여행 ID로 로그 필터링

로그 탐색기에서 다음 쿼리를 사용하여 로그를 특정 이동으로 제한할 수 있습니다.

    resource.type="fleetengine.googleapis.com/Fleet"
    labels.trip_id=~"trip_id"

특정 기간 동안의 차량 로그 필터링

로그 탐색기에서 다음 쿼리를 사용하여 특정 기간 동안의 차량 로그로 제한할 수 있습니다.

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

로그 기반 측정항목 예시

다음 예는 로그 기반 측정항목을 사용하여 시간 경과에 따라 생성된 이동 수를 추적하는 방법을 보여줍니다.

  1. Cloud Console에서 Logging을 선택한 다음 로그 탐색기를 선택하여 로그 탐색기를 엽니다. 그런 다음 아래 필터를 적용합니다.

    resource.type="audited_resource"
    resource.labels.method="maps.fleetengine.v1.TripService.ReportBillableTrip"
    
  2. 쿼리 결과 창에서 작업 드롭다운을 선택한 후 측정항목 만들기를 선택합니다.

    측정항목 만들기

  3. 측정항목 편집기 대화상자에서 다음을 수행합니다.

    • 측정항목 이름 (예: billable_trips)을 지정합니다.
    • 측정항목 설명을 지정합니다 (예: 청구 가능한 이동 호출 수).
    • Units(단위) 옵션은 비워 둡니다. _ 유형 옵션을 카운터로 둡니다.

    그런 다음 측정항목 만들기 버튼을 선택합니다.

  4. 로그 기반 측정항목 페이지에서 측정항목이 성공적으로 생성되었음을 확인하는 메시지가 표시되고 사용자 정의 측정항목 섹션에 새 측정항목이 표시되어야 합니다. 이제 일치하는 로그가 생성되면 측정항목이 채워집니다.

  5. 새 측정항목의 오른쪽에 있는 세로 드롭다운을 선택한 후 측정항목 탐색기에서 보기를 선택합니다.

    측정항목 보기

  6. 쿼리 빌드 아래 왼쪽 창에서 리소스 유형을 Fleet Engine으로 설정하고 billing_trips 측정항목을 검색합니다.

    검색 측정항목

    오른쪽 그래프는 Billingable_trips 호출 비율을 보여줍니다.

BigQuery 사용

BigQuery는 분석을 수행할 수 있는 강력한 도구입니다. 장기 로그를 저장하고 데이터에 대해 임시 SQL과 유사한 쿼리를 수행하는 데 사용할 수 있습니다.

BigQuery로 로그 라우팅

BigQuery를 활용하려면 다음과 같이 로그를 BigQuery Datastore로 라우팅해야 합니다.

  1. Cloud 콘솔에서 Logging을 선택한 다음 로그 탐색기를 선택합니다.

  2. Fleet Engine 로그를 격리하는 필터를 만듭니다. 로그 필드 탐색기에서 Fleetengine.googleapis.com/Fleet 리소스 유형을 선택합니다.

    필터
만들기

  3. 쿼리 결과 창에서 작업 드롭다운을 클릭하고 싱크 만들기를 선택합니다.

    싱크 만들기

  4. 싱크 서비스 선택 대화상자에서 BigQuery 데이터 세트를 선택합니다.

    싱크 선택

  5. 싱크 수정 대화상자에서 다음 옵션을 지정합니다.

    • 싱크 이름을 지정합니다 (예: FleetEngineLogsSink).
    • 싱크 서비스는 BigQuery로 그대로 둡니다.
    • 파티션을 나눈 테이블 사용 옵션을 선택합니다. 그러면 쿼리 성능이 향상됩니다.
    • 싱크 대상에서 새 BigQuery 데이터 세트 만들기를 선택한 후 BigQuery 데이터 세트 이름 (예: FleetEngineLogs)을 지정합니다.
    • 싱크 만들기 버튼을 클릭합니다.

    싱크 수정

이제 로그가 BigQuery 데이터 세트를 채우기 시작합니다. Cloud 콘솔의 BigQuery 섹션에서 데이터를 볼 수 있습니다.

BigQuery 섹션

FleetEngineLogs 데이터 세트 아래에 있는 여러 테이블이 로그 유형마다 하나씩 자동으로 채워집니다.

  • CreateVehicle
  • GetVehicle
  • ListVehicles
  • SearchVehicles
  • UpdateVehicle
  • CreateTrip
  • GetTrip
  • UpdateTrip
  • ListTrips

테이블 이름에는 다음 패턴이 사용됩니다.

project_id.data_set.log_name

예를 들어 프로젝트 이름이 test_project이고 데이터 세트 이름이 FleetEngineLogs인 경우 CreateTrip 테이블의 이름은 다음과 같습니다.

test_project.FleetEngineLogs.fleetengine_googleapis_com_create_trip

쿼리 예

이 섹션에서는 만들 수 있는 쿼리의 예를 보여줍니다.

시간당 생성되는 경로

다음 쿼리는 CreateTrips 로그 수를 계산하고 시간별로 그룹화합니다.

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

차량 1대당 시간당 정류장 수

다음 쿼리는 차량이 운행한 정류장 수를 시간별로 분류하여 생성합니다.

예를 들어, 다음 쿼리를 통해 최근 1시간 동안의 다음과 같은 정보를 알 수 있습니다.

  • 차량 A는 12시간에 10번 정차를 완료했고 13시간에 8번 정류장을 완료했습니다.
  • 차량 B는 11시간에 5개의 정류장을, 12시간에 7개의 정류장을 완료했습니다.
  • 차량 C는 13시간에 12번 정차를 완료했고 14시간에 9번 정차를 완료했습니다.

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

데이터 스튜디오 대시보드

BigQuery는 비즈니스 인텔리전스 도구와 통합할 수 있으며 비즈니스 분석을 위한 대시보드를 만들 수 있습니다.

다음 예는 지도에서 트립 및 차량 움직임을 시각화할 수 있는 대시보드를 빌드하는 방법을 보여줍니다.

  1. 새 데이터 스튜디오 대시보드를 실행하고 BigQuery를 데이터 연결로 선택합니다.

    데이터
연결

  2. 커스텀 쿼리를 선택하고 요금이 청구될 Cloud 프로젝트를 선택합니다.

    프로젝트 선택

  3. 쿼리 상자에 다음 쿼리를 입력합니다.

    쿼리 입력

    SELECT
     timestamp,
     labels.vehicle_id,
    jsonpayload_v1_updatevehiclelog.response.lastlocation.location.latitude AS lat,
    jsonpayload_v1_updatevehiclelog.response.lastlocation.location.longitude AS lng
    FROM
    `ProjectId.FleetEngineLogs.fleetengine_googleapis_com_update_vehicle`
    
  4. 차트 유형을 풍선 지도로 선택한 다음 위치 필드를 선택합니다.

    차트 유형

  5. 필드 만들기를 선택합니다.

    필드 만들기

  6. 필드 이름을 지정하고 CONCAT(lat, ",", lng) 수식을 추가합니다.

    그런 다음 유형을 지역->위도, 경도로 설정합니다.

    세트 유형

  7. 대시보드에 컨트롤을 추가하여 데이터를 필터링할 수 있습니다. 예를 들어 '기간' 필터를 선택합니다.

    컨트롤 추가

  8. 기간 상자를 수정하여 기본 기간을 선택합니다.

    기간

  9. 차량_id에 대한 드롭다운 목록 컨트롤을 추가할 수 있습니다.

    드롭다운 목록

이러한 컨트롤을 사용하면 차량의 움직임이나 이동 중의 움직임을 시각화할 수 있습니다.