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일 동안만 보관해야 합니다.

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

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

제한된 로그와 제한되지 않은 로그를 병합하여 종합적으로 파악할 수 있습니다.

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

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 Logging의 분할 로그의 주요 차이점은 분할이 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 필드가 지워지고 errorResponse 필드가 설정되고 jsonPayload 내에 채워집니다.

    {
      "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)을 지정합니다.
    • 측정항목 설명을 지정합니다 (예: 청구 가능한 이동 호출 수).
    • 단위 옵션은 비워둡니다. _ 유형 옵션을 카운터로 둡니다.

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

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

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

    측정항목 보기

  6. 쿼리 빌드 아래 왼쪽 창에서 리소스 유형을 Fleet Engine으로 설정하고 billingable_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 Console의 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. 새 Datastudio 대시보드를 실행하고 데이터 연결로 BigQuery를 선택합니다.

    데이터 연결

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

    프로젝트
선택

  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의 드롭다운 목록 컨트롤을 추가할 수 있습니다.

    드롭다운 목록

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