Định dạng JSON của yêu cầu tạo cấu hình chỉ số

Hướng dẫn này trình bày chi tiết định dạng yêu cầu JSON cho điểm cuối /api/v1/generate_metrics_config của công cụ Trình tạo cấu hình chỉ số (MCG). Định dạng này cho phép bạn xác định một chiến dịch đo từ xa (chỉ định việc thu thập dữ liệu, xử lý trên thiết bị và tạo báo cáo) trong một cấu trúc mà con người có thể đọc được.

Công cụ MCG xác thực đối tượng JSON này, kiểm tra các vấn đề như không khớp loại, các phần phụ thuộc theo chu kỳ hoặc các tham chiếu không xác định, sau đó biên dịch đối tượng này thành thông báo vùng đệm giao thức (protobuf) MetricsConfig. Thông báo MetricsConfig này là định dạng nhị phân mà dịch vụ Đo từ xa trên thiết bị thực thi để chạy chiến dịch.

Điều kiện tiên quyết: Bạn nên nắm rõ các lược đồ JSON, protobuf và cấu trúc dữ liệu cơ bản. Để biết thông tin tổng quan về khái niệm, hãy xem phần Các khái niệm về cấu hình chỉ số.

Cách viết nội dung mô tả cấu hình

Để thiết kế một chiến dịch thu thập chỉ số, hãy làm theo quy trình logic này:

  1. Chỉ định nguồn dữ liệu: Xác định nguồn gốc của dữ liệu.
  2. Xác định logic và quy trình xử lý: Thiết lập các quy tắc về thời điểm thu thập dữ liệu và cách xử lý dữ liệu.
  3. Tạo đầu ra: Đóng gói dữ liệu đã xử lý thành một thông báo cuối cùng.
  4. Các trường cấp cao nhất: Thêm các trường cấp cao nhất như UUID, định nghĩa tín hiệukiểm soát vòng đời.

Ví dụ: Báo cáo tốc độ trung bình

Hướng dẫn này sử dụng một ví dụ để minh hoạ cách tất cả các thành phần kết hợp với nhau. Thao tác này sẽ tạo một báo cáo tính toán tốc độ trung bình của xe mỗi phút. Nó xác định một Nguồn dữ liệu (SpeedSource) để thu thập dữ liệu tốc độ, Trình kích hoạt (OnNewSpeed, EveryMinute) để kiểm soát luồng thực thi, một Trình tổng hợp (SpeedAggregator) để tính giá trị trung bình và một Cấu hình Báo cáo chỉ số (MinuteReport) để đóng gói kết quả. Các ví dụ trong phần có thể mở rộng sẽ dựa trên trường hợp này.

Chỉ định nguồn dữ liệu

Dữ liệu đo từ xa hỗ trợ việc thu thập dữ liệu từ các Dịch vụ SDV (thông qua SDV Middleware) và các nhà xuất bản dựa trên Configurable Publisher Registry.

Để sử dụng dữ liệu trong SDV, hãy xác định một nguồn dữ liệu (khái niệm) rồi thêm nguồn dữ liệu đó vào mảng data_sources.

Các trường của đối tượng nguồn dữ liệu (mục trong danh sách data_sources)
name Một chuỗi do người dùng xác định, dùng để xác định nguồn dữ liệu này trong cấu hình chỉ số.
source_identifier Giá trị nhận dạng dùng để khám phá dịch vụ. Để biết thông tin chi tiết, hãy xem định dạng source_identifier.
connection_type SUBSCRIPTION cho luồng dữ liệu liên tục (bắt buộc đối với điều kiện kích hoạt dữ liệu) hoặc ON_DEMAND để tìm nạp theo yêu cầu (để biết thông tin chi tiết, hãy xem cấu hình nguồn dữ liệu).
không bắt buộc
configuration

Chỉ RPC và Sổ đăng ký nhà xuất bản có thể định cấu hình. Một đối tượng để định cấu hình nguồn dữ liệu bằng các trường sau:

type_url FQN của thông báo protobuf trong cấu hình.
value_json,
value_textproto,
hoặc value
Tải trọng ở định dạng JSON, textproto hoặc base64.
Các trường cho loại kết nối SUBSCRIPTION
không bắt buộc
sub_sampling_interval_ms
Chỉ dành cho Pub/Sub. Một số nguyên không âm (mili giây) để điều tiết tần suất gửi thông báo bằng cách chỉ định khoảng thời gian tối thiểu giữa các thông báo.
không bắt buộc
fetch_last_message
(mặc định: false)
Chỉ Pub/Sub. Boolean. Nếu true, hãy truy xuất thông báo mới nhất khi kết nối.

Không phải tất cả các lựa chọn đều có sẵn cho mọi loại nguồn dữ liệu. Hãy xem hướng dẫn tích hợp nguồn dữ liệu để biết thông tin chi tiết.

Định dạng của source_identifier

Dịch vụ Đo từ xa chấp nhận nhiều định dạng mã nhận dạng nguồn. Hãy xem Định nghĩa nguồn dữ liệu trong cấu hình chỉ số để biết thông tin tổng quan.

MCG chỉ suy ra loại thông báo protobuf từ source_identifier nếu thông báo đó sử dụng định dạng Tên loại đơn vị. Nếu bạn sử dụng FQIN hoặc tên tuỳ chỉnh (từ Sổ đăng ký nhà xuất bản có thể định cấu hình), MCG sẽ không thể suy ra loại. Trong những trường hợp này, bạn phải cung cấp data_source_message_types. Nếu loại không có trong danh mục của bạn, bạn cũng phải cung cấp định nghĩa của loại đó trong descriptor_protos.

Ví dụ: Xác định nguồn dữ liệu

Ví dụ này báo cáo tốc độ xe. Trước tiên, hãy tham khảo danh mục VSIDL để xác định dịch vụ xuất bản dữ liệu này.

Sử dụng danh mục mẫu trong cơ sở mã SDV, hãy xác định dịch vụ có liên quan. Nhất quán với Định dạng của source_identifier, hãy chỉ định loại thông báo protobuf mcg.test.subpkg.speed_msg. Vì tốc độ thường được xuất bản thường xuyên, hãy sử dụng sub_sampling_interval_ms để giới hạn số lần cập nhật thành một thông báo mỗi giây:

{
  "name": "SpeedSource",
  "source_identifier": "mcg.test.subpkg.speed_msg",
  "connection_type": "SUBSCRIPTION",
  "sub_sampling_interval_ms": 1000 // Limit updates to 1 per second
}

Xác định logic và quy trình xử lý

Logic được xử lý bởi hai thành phần hoạt động cùng nhau: Trình kích hoạt (khái niệm) xác định thời điểm xảy ra một sự kiện. Trình tổng hợp (khái niệm) xác định cách xử lý dữ liệu dựa trên các trình kích hoạt đó. Vì biểu thức (khái niệm) là chìa khoá cho các điều kiện kích hoạt và logic tổng hợp, nên phần này trước tiên mô tả cách viết các biểu thức.

Cụm từ

Biểu thức cho phép bạn xác định các phép tính và điều kiện bằng cách sử dụng cú pháp mà người dùng có thể đọc được. MCG biên dịch các chuỗi này thành một định dạng thực thi được tối ưu hoá để đánh giá trên thiết bị.

Biểu thức có thể thể hiện các phép tính số học, điều kiện logic và so sánh dữ liệu. Để biết cú pháp đầy đủ, bao gồm cả toán tử và hàm, hãy xem Cú pháp biểu thức.

Độ mới của dữ liệu: Khi một biểu thức truy cập vào một nguồn dữ liệu, hành vi truy xuất sẽ phụ thuộc vào loại kết nối:

  • SUBSCRIPTION: Sử dụng thông báo nhận được gần đây nhất do dịch vụ Đo từ xa lưu vào bộ nhớ đệm. (Lưu ý: Nếu bạn đặt sub_sampling_interval_ms, thì thông báo này có thể khác với thông báo mới nhất tuyệt đối đã xuất bản.)
  • ON_DEMAND: Kích hoạt lệnh gọi ngay lập tức để tìm nạp thông báo mới nhất từ dịch vụ.

Hạn chế về loại

  • Mảng: Không hỗ trợ quyền truy cập trực tiếp vào chỉ mục mảng (ví dụ: my_data_source.my_array[0]).
  • An toàn về kiểu: Đảm bảo bạn so sánh các kiểu tương thích (ví dụ: không so sánh một trường chuỗi với danh sách số nguyên).

Ví dụ: Biểu thức

Ví dụ này cần trích xuất giá trị tốc độ để tính giá trị trung bình. Ngoài ra, bạn cũng cần xác định xem xe có đang chạy quá tốc độ (trên 100 km/h) hay không để kích hoạt có điều kiện. Bạn có thể tìm thấy tên trường (trong trường hợp này là speed) trong định nghĩa thông báo protobuf mà nguồn dữ liệu sử dụng. Các biểu thức sau đây sẽ đạt được mục tiêu này:

  • SpeedSource.speed: Truy xuất giá trị của trường speed từ nguồn dữ liệu SpeedSource.
  • SpeedSource.speed > 27.7: Đánh giá thành true nếu tốc độ lớn hơn 27,7 m/s (khoảng 100 km/h).

Điều kiện kích hoạt: Xác định thời điểm xảy ra hành động

Điều kiện kích hoạt xác định thời điểm thực hiện các thao tác: đánh giá một trình tổng hợp, tạo báo cáo hoặc kiểm soát vòng đời thu thập. Thêm tất cả các điều kiện kích hoạt đã xác định vào mảng triggers cấp cao nhất.

Các trường của đối tượng điều kiện kích hoạt (mục trong danh sách triggers)
name Giá trị nhận dạng riêng biệt của điều kiện kích hoạt này trong cấu hình chỉ số.
periodic
data
conditional
Bạn phải cung cấp đúng một trong các trường này để xác định hành vi.

Trình kích hoạt dữ liệu

Kích hoạt khi nguồn dữ liệu SUBSCRIPTION cung cấp một thông báo mới (khái niệm).

Các trường của đối tượng data (trong điều kiện kích hoạt)
source_name name của data_source mà sự kiện kích hoạt này lắng nghe.

Ví dụ: Điều kiện kích hoạt dữ liệu

Trong ví dụ này, hãy cập nhật tính toán tốc độ trung bình mỗi khi SpeedSource xuất bản một thông báo mới. Trình kích hoạt dữ liệu này sẽ kích hoạt mỗi khi xảy ra những trường hợp sau:

{
  "name": "OnNewSpeed",
  "data": {
    "source_name": "SpeedSource" // Reference to the defined data source
  }
}

Điều kiện kích hoạt định kỳ

Phát ra lửa theo một khoảng thời gian đều đặn (khái niệm).

Các trường của đối tượng periodic (trong điều kiện kích hoạt)
period_ms Một số không âm xác định khoảng thời gian tính bằng mili giây.

Ví dụ: Điều kiện kích hoạt định kỳ

Ví dụ này yêu cầu báo cáo mỗi phút. Trình kích hoạt định kỳ này sẽ kích hoạt sau mỗi 60.000 mili giây để tạo báo cáo đó:

{
  "name": "EveryMinute",
  "periodic": {
    "period_ms": 60000 // 60,000 ms = 60 seconds
  }
}

Điều kiện kích hoạt

Kích hoạt dựa trên việc đánh giá một biểu thức (khái niệm). Bạn cần có một hoặc nhiều điều kiện kích hoạt cấp trên để bắt đầu đánh giá. Đây thường là một trình kích hoạt dữ liệu cho các nguồn dữ liệu hoặc trình tổng hợp trong biểu thức, hoặc một trình kích hoạt định kỳ để thăm dò dữ liệu.

Các trường của đối tượng conditional (trong điều kiện kích hoạt)
triggers Một mảng có ít nhất một tên điều kiện kích hoạt gốc. Khi điều kiện kích hoạt gốc kích hoạt, điều kiện kích hoạt có điều kiện sẽ đánh giá biểu thức.
expression Biểu thức cần đánh giá. Xem phần Biểu thức.
condition_type Chỉ định thời điểm trình kích hoạt sẽ kích hoạt, dựa trên việc đánh giá biểu thức.
Loại tình trạng

Từ điển condition_type phải chứa chính xác một trong các loại điều kiện có sẵn dưới dạng khoá. Để biết thêm thông tin, hãy xem phần Điều kiện kích hoạt.

Các trường của đối tượng condition_type (loại trừ lẫn nhau)
is_true

is_false
Kích hoạt khi biểu thức boolean đánh giá lần lượt là true hoặc false.
rising_edge

Nếu là số, điều kiện sẽ kích hoạt khi giá trị tăng. Nếu biểu thức là boolean, điều kiện sẽ kích hoạt khi giá trị thay đổi từ false thành true.

Có thể chứa một đối tượng rising_options (xem Các lựa chọn về cạnh).

falling_edge

Nếu là số, sự kiện sẽ kích hoạt khi giá trị giảm. Nếu biểu thức là boolean, sự kiện sẽ kích hoạt khi giá trị thay đổi từ true thành false.

Có thể chứa một đối tượng falling_options (xem Các lựa chọn về cạnh).

all_changes

Kích hoạt khi kết quả của biểu thức khác với giá trị trước đó. Nếu bạn đặt các lựa chọn về cạnh, thì chỉ có thể dùng giá trị số và giá trị boolean.

Có thể chứa rising_options, falling_options hoặc cả hai (xem Các lựa chọn về cạnh).

Lựa chọn về viền

Các đối tượng rising_optionsfalling_options có các trường sau. Nếu được cung cấp, quá trình chuyển đổi tương ứng phải đáp ứng yêu cầu về thời lượng. Các hiệu ứng chuyển đổi không có lựa chọn được chỉ định sẽ kích hoạt ngay lập tức.

Các trường cho đối tượng lựa chọn cạnh
min_duration_ms Một số không âm (tính bằng mili giây) chỉ định khoảng thời gian mà điều kiện phải duy trì ở trạng thái mới trước khi điều kiện kích hoạt kích hoạt.
không bắt buộc
require_exact
Boolean. Nếu đúng, tất cả các giá trị được xuất bản trong thời gian này phải giống nhau để điều kiện kích hoạt hoạt động.

Ví dụ: Điều kiện kích hoạt có điều kiện

Điều kiện kích hoạt sau đây sử dụng các lựa chọn về cạnh. Cảnh báo này sẽ kích hoạt nếu tốc độ vượt quá 27,7 m/s và duy trì ở mức cao trong ít nhất 5 giây:

{
  "name": "SpeedingFor5Seconds",
  "conditional": {
    "triggers": ["OnNewSpeed"],
    "expression": "SpeedSource.speed > 27.7",
    "condition_type": {
      "rising_edge": {
        "rising_options": {
          "min_duration_ms": 5000 // Condition must hold for 5s in new state
        }
      }
    }
  }
}

Trình tổng hợp: Xác định cách xử lý dữ liệu

Sử dụng một trình tổng hợp để xử lý dữ liệu trung gian có trạng thái (khái niệm). Xác định một trình tổng hợp và thêm trình tổng hợp đó vào mảng aggregators.

Trình tổng hợp sẽ chuyển đổi dữ liệu và cung cấp dữ liệu đó cho các trình tổng hợp và báo cáo khác.

Các trường của một đơn vị tập hợp (mục trong danh sách aggregators)
name Một chuỗi do người dùng xác định để xác định công cụ tổng hợp này. Các biểu thức có thể tham chiếu công cụ tổng hợp này theo tên để truy cập vào kết quả của công cụ đó.
trigger_names Một mảng gồm một hoặc nhiều tên trình kích hoạt khiến quá trình tổng hợp này được đánh giá.
không bắt buộc
reset_on_get
Boolean, mặc định: "false". Nếu là "true", hệ thống sẽ đặt lại trạng thái tổng hợp sau khi giá trị của trạng thái này được một trình tổng hợp, báo cáo chỉ số hoặc điều kiện kích hoạt khác truy cập.
message_builder Xác định dữ liệu cần đọc, xử lý và tổng hợp. Sau đó, các trường của thông báo đầu ra sẽ trở thành nguồn dữ liệu cho các trình tổng hợp và báo cáo khác. Nó dùng field_assignments, với mỗi phép gán xác định một trường trong thông báo đầu ra.

Trình tạo thông báo

Đối tượng message_builder xác định cấu trúc thông báo đầu ra và logic tổng hợp dùng để tính toán các trường của đối tượng. Đối tượng này được dùng trong cả Trình tổng hợp và Cấu hình báo cáo.

Các trường của đối tượng message_builder (trong trình tổng hợp hoặc báo cáo)
message_type Tên đủ điều kiện của loại thông báo protobuf cho đầu ra. Nếu bị bỏ qua, MCG sẽ tạo một loại thông báo tuỳ chỉnh dựa trên field_assignments' các loại đầu ra được suy luận. Chỉ sử dụng tham số này nếu trình tạo thông báo nằm trong báo cáo chỉ số và báo cáo của bạn phải khớp với một định nghĩa thông báo protobuf cụ thể, được xác định trước.
field_assignments Một mảng gồm các đối tượng định nghĩa trường. Mỗi đối tượng chỉ định một trường trong thông báo đầu ra và logic để tính toán giá trị của trường đó.
Các trường của đối tượng chỉ định trường (mục trong danh sách field_assignments)
field_name Tên do người dùng xác định cho trường. Tham số này xác định giá trị cụ thể trong đối tượng khi sử dụng ký hiệu dấu chấm trong biểu thức (aggregator_name.field_name).
aggregation

Một đối tượng xác định cách hệ thống tính toán giá trị của trường bằng các trường sau:

@type Hàm tổng hợp.

  • avg, min, max, sum, stddev: Số liệu thống kê toán học tiêu chuẩn.
  • count: Đếm số lần bộ tổng hợp này được kích hoạt.
  • delta: Mức chênh lệch giữa giá trị hiện tại và giá trị trước đó.
  • vector: Tạo danh sách giá trị (vùng đệm vòng).
  • none: Truyền giá trị thô qua.
expression Biểu thức đầu vào cho quá trình tổng hợp. Bắt buộc đối với tất cả các loại tổng hợp, ngoại trừ count.
max_length Chỉ dành cho @type: "vector". Một số nguyên không bắt buộc giúp giới hạn kích thước vectơ, tạo vùng đệm vòng.

Ví dụ: Trang web tổng hợp

Đối với ví dụ này, hãy tính toán số liệu thống kê giữa các báo cáo theo phút. Trình tổng hợp này được kích hoạt bởi OnNewSpeed để tính tốc độ trung bình (avg), số lần đọc (count) và lưu trữ 5 giá trị tốc độ gần đây nhất (vector). Đặt reset_on_get thành true. Thao tác này sẽ đặt lại số liệu thống kê mỗi khi MinuteReport đọc các số liệu đó, bắt đầu một cửa sổ thu thập mới cho trình tổng hợp trong phút tiếp theo:

{
  "name": "SpeedAggregator",
  "trigger_names": ["OnNewSpeed"], // Update aggregation on new speed data
  "reset_on_get": true, // Reset stats after they are read by the report configuration
  "message_builder": {
    "field_assignments": [
      {
        "field_name": "average_speed",
        "aggregation": {
          "@type": "avg",
          "expression": "SpeedSource.speed"
        }
      },
      {
        "field_name": "speed_reading_count",
        "aggregation": {
          "@type": "count" // Counts triggers (that is, processed speed readings) since last reset
        }
      },
      {
        "field_name": "speed_history_last5",
        "aggregation": {
          "@type": "vector",
          "expression": "SpeedSource.speed",
          "max_length": 5 // Keep last 5 readings
        }
      }
    ]
  }
}

Tạo đầu ra

Để xác định đầu ra cuối cùng của chiến dịch đo từ xa, hãy thêm các đối tượng vào mảng report_configs (khái niệm). Các cấu hình này xác định cách đóng gói dữ liệu đã xử lý và thời điểm dữ liệu được tạo. Bạn có thể xác định nhiều cấu hình báo cáo trong một cấu hình chỉ số để sử dụng lại các thành phần.

Bạn kiểm soát việc tạo báo cáo bằng cách sử dụng trường trigger_names. Ngoài ra, bạn có thể dùng report_initial để tạo báo cáo ngay khi cấu hình kích hoạt và report_incomplete để tạo báo cáo cuối cùng khi quá trình thu thập dữ liệu bị gián đoạn.

Lưu ý: Để kết nối quá trình xử lý với đầu ra, hãy sử dụng loại tổng hợp none (@type: "none") để đọc các giá trị được tính toán trước từ một Trình tổng hợp. Vì báo cáo thường là ảnh chụp nhanh không trạng thái, nên điều này giúp duy trì logic phức tạp có trạng thái trong các trình tổng hợp và dành riêng báo cáo cho việc định dạng.

Các trường của đối tượng cấu hình báo cáo (mục trong danh sách report_configs)
name Tên riêng biệt cho báo cáo. Tên này xuất hiện trong siêu dữ liệu báo cáo được tạo.
trigger_names Một mảng tên sự kiện kích hoạt khiến báo cáo được tạo và xuất bản.
message_builder Hãy xem phần Trình tạo thông báo để biết thông tin chi tiết. Thẻ này xác định nội dung của báo cáo. Các hàm tổng hợp chỉ được đánh giá khi báo cáo được kích hoạt. Ví dụ: một phép tổng hợp vectơ sẽ thêm một giá trị cho mỗi báo cáo và một phép tổng hợp số lượng sẽ phản ánh số báo cáo.
không bắt buộc
report_incomplete
(mặc định: "false")
Một giá trị boolean. Nếu là "true", hệ thống sẽ tạo báo cáo cuối cùng khi tắt hoặc khi quá trình thu thập dữ liệu kết thúc, ngay cả khi dữ liệu bị thiếu.
không bắt buộc
report_initial
(mặc định: "false")
Một giá trị boolean. Nếu là "true", hệ thống sẽ tạo báo cáo ngay khi cấu hình chỉ số được kích hoạt.

Ví dụ: Cấu hình báo cáo

Cuối cùng, hãy xác định cấu hình báo cáo cho ví dụ. Sự kiện này được kích hoạt bởi EveryMinute. Thao tác này đọc tốc độ trung bình đã tính và số lần đọc từ SpeedAggregator bằng cách sử dụng một phép tổng hợp none, phép tổng hợp này sẽ truyền giá trị được tổng hợp trước đến báo cáo:

{
  "name": "MinuteReport",
  "trigger_names": ["EveryMinute"], // Generate report every minute
  "message_builder": {
    "field_assignments": [
      {
        "field_name": "average_speed",
        "aggregation": {
          "@type": "none", // Read the value directly from the aggregator
          "expression": "SpeedAggregator.average_speed"
        }
      },
      {
        "field_name": "reading_count",
        "aggregation": {
          "@type": "none",
          "expression": "SpeedAggregator.speed_reading_count"
        }
      }
    ]
  }
}

Trường cấp cao nhất

Ngoài các mảng data_sources, aggregators, triggersreport_configs, nội dung mô tả về cấu hình chỉ số cần có một thông tin tham chiếu đến danh mục tín hiệu. Bạn cũng có thể thêm các trường không bắt buộc để chỉ định một UUID cụ thể và quản lý vòng đời của bộ sưu tập.

Đặt UUID

Mỗi MetricsConfig đều yêu cầu một Giá trị nhận dạng duy nhất trên toàn cầu (UUID). Nếu bạn cung cấp một existing_uuid, MCG sẽ sử dụng giá trị đó. Nếu không, MCG sẽ tạo một giá trị ngẫu nhiên. Để đảm bảo tính nhất quán trên các hoạt động triển khai và công cụ, hãy chỉ định một existing_uuid.

Chuỗi này phải là một UUID hợp lệ có dấu gạch ngang và chỉ chứa chữ cái viết thường.

"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",

Định nghĩa về tín hiệu

Để xác thực tên và loại tín hiệu, MCG cần có quyền truy cập vào Danh mục tín hiệu xe. Đây là một protobuf FileDescriptorSet chứa các định nghĩa VSIDL .proto của bạn (được đóng gói và tải lên MCG). Để biết thông tin chi tiết về cách tạo và tải danh mục lên, hãy xem phần Danh mục tín hiệu xe.

Chỉ định phiên bản danh mục trong trường vs_version của đối tượng JSON:

"vs_version": "v1.0",

Xác định các điều kiện kích hoạt trong vòng đời

Trong bối cảnh của một chiến dịch đo từ xa, vòng đời của MetricsConfig sẽ xác định thời điểm dữ liệu thực sự được ghi lại. Trong khi hệ thống quản lý chiến dịch triển khai và kích hoạt cấu hình trên thiết bị, bạn có thể dùng các trình kích hoạt vòng đời để kiểm soát chính xác thời điểm dữ liệu được thu thập trong quá trình triển khai đó.

Điều này cho phép bạn điều chỉnh việc thu thập dữ liệu theo các kiểu sử dụng xe, chẳng hạn như "Chuyến đi" (IgnitionOn đến IgnitionOff) hoặc "Phiên sạc", mà không cần phải huỷ kích hoạt cấu hình.

  • Kiểm soát phiên (Bắt đầu/Tạm dừng): Sử dụng start_trigger_namestop_trigger_name để kiểm soát thời điểm thu thập dữ liệu. Ví dụ: để chỉ thu thập dữ liệu trong khi xe đang lái, hãy sử dụng IgnitionOn làm điều kiện kích hoạt bắt đầu và IgnitionOff làm điều kiện kích hoạt dừng. Cấu hình vẫn hoạt động trên thiết bị nhưng sẽ "tạm dừng" (ngừng thu thập và xử lý) một cách hiệu quả khi điều kiện dừng kích hoạt, chỉ tiếp tục khi điều kiện bắt đầu kích hoạt lại.

    Lưu ý quan trọng: Thao tác này chỉ tạm dừng việc thu thập. Thao tác này không xác định các cửa sổ logic, tách biệt các tập dữ liệu hoặc có bất kỳ tác dụng phụ nào khác. Giá trị của đối tượng tổng hợp không được đặt lại khi quá trình thu thập tạm dừng hoặc tiếp tục.

  • Phát hiện một lần (Kết thúc): Sử dụng deactivate_trigger_name nếu cấu hình chỉ chạy một lần (ví dụ: để phát hiện lần xuất hiện đầu tiên của một mã lỗi cụ thể) rồi tự động tắt vĩnh viễn trên thiết bị đó, ngay cả khi chiến dịch vẫn đang hoạt động về mặt kỹ thuật.

Nếu bạn không chỉ định bất kỳ điều kiện kích hoạt vòng đời nào, thì quá trình thu thập dữ liệu sẽ bắt đầu ngay lập tức khi chiến dịch kích hoạt cấu hình và tiếp tục liên tục cho đến khi chiến dịch kết thúc.

Các trường vòng đời cấp cao nhất (đối tượng gốc)
không bắt buộc
start_trigger_name
Tên của một điều kiện kích hoạt bắt đầu phiên thu thập. Có thể đặt mà không cần stop_trigger_name.
không bắt buộc
stop_trigger_name
Tên của một điều kiện kích hoạt tạm dừng phiên thu thập (ví dụ: khi xe đứng yên). Nếu được đặt, bạn cũng phải đặt start_trigger_name.
không bắt buộc
deactivate_trigger_name
Tên của một trình kích hoạt hoàn tất và huỷ kích hoạt hoàn toàn `MetricsConfig`.

Nâng cao: Định nghĩa proto tuỳ chỉnh

Trong 2 trường hợp chính, chỉ vs_version là không đủ để MCG hiểu tất cả các loại thông báo trong phần mô tả của một cấu hình chỉ số:

  1. Lỗi suy luận theo kiểu: Như đã giải thích trong định dạng source_identifier, MCG không thể suy luận theo kiểu khi source_identifier sử dụng FQIN hoặc tên tuỳ chỉnh.
  2. Thông báo tuỳ chỉnh: Nội dung mô tả cấu hình chỉ số sử dụng các thông báo protobuf không có trong danh mục VSIDL được chỉ định trong vs_version. Điều này xảy ra khi bạn đặt message_type trong message_builder cho định dạng báo cáo tuỳ chỉnh.

Trong những trường hợp này, hãy sử dụng data_source_message_types để giúp MCG suy luận các loại và descriptor_protos để cung cấp định nghĩa về thông báo.

data_source_message_types

Ánh xạ chuỗi source_identifier đến loại thông báo protobuf đủ điều kiện. Khoá trong data_source_message_types phải khớp với giá trị source_identifier trong mục data_sources:

"data_source_message_types": {
  "MyCustomSpeedService": "com.sdv.example.SampleMessage"
}

descriptor_protos

Cung cấp định nghĩa cho mọi loại thông báo được dùng trong data_source_message_types hoặc message_builder không có trong vs_version đã định cấu hình.

Truyền descriptorpb.FileDescriptorSet được mã hoá base64 trong mảng descriptor_protos. Tạo mảng này từ các tệp .proto bằng trình biên dịch Protobuf protoc.

"descriptor_protos": [
  "Cu8BCiZtY2cvdGVzdGRhdGEvbWF4YXZnY3..." // Base64 string
]

Ví dụ: Nội dung mô tả đầy đủ về cấu hình

Các phần trước xác định tất cả các thành phần cho ví dụ: tạo báo cáo mỗi phút với tốc độ trung bình của xe được quan sát trong phút đó.

Các thành phần này là:

  • Một nguồn dữ liệu (SpeedSource) để nhận dữ liệu tốc độ tối đa một lần mỗi giây.
  • Một trình kích hoạt dữ liệu (OnNewSpeed) sẽ kích hoạt khi SpeedSource gửi dữ liệu.
  • Một trình kích hoạt định kỳ (EveryMinute) kích hoạt sau mỗi 60 giây.
  • Một đối tượng tổng hợp (SpeedAggregator) sử dụng OnNewSpeed để tính tốc độ trung bình, số lượng chỉ số và lưu trữ các giá trị gần đây, đặt lại khi đọc.
  • Một cấu hình báo cáo (MinuteReport) sử dụng EveryMinute để kích hoạt một báo cáo chứa tốc độ trung bình và số lượng từ SpeedAggregator.
  • Các trường cấp cao nhất (existing_uuid, vs_version) để xác định cấu hình chỉ số và chỉ định danh mục VSIDL cần dùng cho các định nghĩa tín hiệu.

Khi kết hợp, các phần này tạo thành nội dung mô tả đầy đủ về cấu hình chỉ số:

{
  "existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", // Unique identifier for the configuration
  "vs_version": "example_version", // Version of the VSIDL catalog to use
  "data_sources": [
    {
      "name": "SpeedSource",
      "source_identifier": "mcg.test.subpkg.speed_msg",
      "connection_type": "SUBSCRIPTION",
      "sub_sampling_interval_ms": 1000
    }
  ],
  "aggregators": [
    {
      "name": "SpeedAggregator",
      "trigger_names": ["OnNewSpeed"],
      "reset_on_get": true,
      "message_builder": {
        "field_assignments": [
          {
            "field_name": "average_speed",
            "aggregation": {
              "@type": "avg",
              "expression": "SpeedSource.speed"
            }
          },
          {
            "field_name": "speed_reading_count",
            "aggregation": { "@type": "count" }
          },
          {
            "field_name": "speed_history_last5",
            "aggregation": {
              "@type": "vector",
              "expression": "SpeedSource.speed",
              "max_length": 5
            }
          }
        ]
      }
    }
  ],
  "triggers": [
    {
      "name": "OnNewSpeed",
      "data": { "source_name": "SpeedSource" }
    },
    {
      "name": "EveryMinute",
      "periodic": { "period_ms": 60000 }
    }
  ],
  "report_configs": [
    {
      "name": "MinuteReport",
      "trigger_names": ["EveryMinute"],
      "message_builder": {
        "field_assignments": [
          {
            "field_name": "average_speed",
            "aggregation": {
              "@type": "none",
              "expression": "SpeedAggregator.average_speed"
            }
          },
          {
            "field_name": "reading_count",
            "aggregation": {
              "@type": "none",
              "expression": "SpeedAggregator.speed_reading_count"
            }
          }
        ]
      }
    }
  ]
}

Mẫu tham chiếu

Để biết định nghĩa API, hãy xem Tài liệu tham khảo API MCG.

Các phần sau đây cung cấp thông tin tham khảo đầy đủ về nội dung mô tả của một cấu hình chỉ số. Hãy sử dụng thông tin này làm hướng dẫn để tạo nội dung mô tả của riêng bạn về một cấu hình chỉ số.

Trường cấp cao nhất

{
  "existing_uuid": "00000000-0000-0000-0000-000000000000", // Optional
  "vs_version": "example_version", // Optional
  "descriptor_protos": ["..."], // Optional. Base64 encoded FileDescriptorSet
  "data_source_message_types": {
    "ExampleServiceName": "com.example.ProtoMessage"
  }, // Optional
  "start_trigger_name": "DataTriggerExample", // Optional
  "stop_trigger_name": "ConditionalTriggerExample", // Optional
  "deactivate_trigger_name": "PeriodicTriggerExample" // Optional
}

Đầu vào: nguồn dữ liệu và công cụ tổng hợp

{
  "data_sources": [
    {
      "name": "SubscriptionExample",
      "source_identifier": "com.example.sdv.ExampleMessage|example-unit",
      "connection_type": "SUBSCRIPTION", // Options: SUBSCRIPTION (default), ON_DEMAND
      "sub_sampling_interval_ms": 100, // Optional
      "fetch_last_message": false // Optional. Default: false
    },
    {
      "name": "RegistryExample",
      // Configurable Publisher Registry-based publisher (matches data_source_message_types)
      "source_identifier": "ExampleServiceName",
      "connection_type": "SUBSCRIPTION"
    },
    {
      "name": "GetterExample",
      "source_identifier": "com.example.sdv.ExampleConfig|example-unit",
      "connection_type": "ON_DEMAND",
      "configuration": {
        "type_url": "type.googleapis.com/example.Config",
        "value_json": {} // Or value_textproto, value (base64)
      }
    }
  ],
  "aggregators": [
    {
      "name": "AggregatorExample",
      "trigger_names": ["DataTriggerExample"],
      "reset_on_get": false, // Optional. Default: false. If true, resets state after it's read
      "message_builder": {
        "message_type": "com.example.AggregatedMessage", // Optional
        "field_assignments": [
          {
            "field_name": "avg_example",
            "aggregation": {
              // Options: avg, count, min, max, sum, stddev, delta, vector, none
              "@type": "avg",
              "expression": "SubscriptionExample.value"
            }
          },
          {
            "field_name": "count_example",
            "aggregation": {
              "@type": "count" // Counts number of evaluations. No expression needed
            }
          },
          {
            "field_name": "vector_example",
            "aggregation": {
              "@type": "vector",
              "expression": "SubscriptionExample.value",
              "max_length": 10 // Optional. If set, creates a ring buffer
            }
          }
        ]
      }
    }
  ]
}

Logic và xử lý: điều kiện kích hoạt

{
  "triggers": [
    {
      "name": "PeriodicTriggerExample",
      "periodic": { "period_ms": 1000 }
    },
    {
      "name": "DataTriggerExample",
      "data": { "source_name": "SubscriptionExample" }
    },
    {
      "name": "ConditionalTriggerExample",
      "conditional": {
        "triggers": ["PeriodicTriggerExample"],
        "expression": "SubscriptionExample.value > 0",
        "condition_type": {
          // Options: is_true, is_false, rising_edge, falling_edge, all_changes
          "rising_edge": {
            "rising_options": { "min_duration_ms": 0, "require_exact": false }
          }
        }
      }
    }
  ]
}

Đầu ra: cấu hình báo cáo

{
  "report_configs": [
    {
      "name": "ReportExample",
      "trigger_names": ["PeriodicTriggerExample"],
      "report_incomplete": false, // Optional. Default: false
      "report_initial": false, // Optional. Default: false
      "message_builder": {
        "message_type": "com.example.ReportMessage", // Optional. Must be defined in VSIDL catalog or descriptor_protos. Message type will be inferred if not provided
        "field_assignments": [
          {
            "field_name": "avg_example",
            "aggregation": {
              "@type": "none", // Passthrough since aggregation is done in AggregatorExample
              "expression": "AggregatorExample.avg_example"
            }
          }
        ]
      }
    }
  ]
}

Cú pháp biểu thức

Danh mục Cú pháp Mô tả
Quyền truy cập dữ liệu source_name
source_name.field
source_name.field.subfield
Truy cập vào toàn bộ thông báo từ một nguồn dữ liệu hoặc trình tổng hợp
Truy cập vào trường cụ thể trong thông báo (bao gồm cả các trường lồng nhau)
Số học +, -, *, /, %, ** Toán học chuẩn. ** là phép luỹ thừa.
Logic &&, ||, !, ^ AND, OR, NOT, XOR.
Relational ==, !=, <, <=, >, >= ==!= hoạt động trên mọi loại. Một số thiết bị khác yêu cầu nhập số.
List (Danh sách) contains(list, item)
doesnotcontain(list, item)
alleq(list, value)
Hoạt động trên vectơ (mảng). alleq(list, value) trả về true nếu tất cả các mục trong list đều bằng value.
Hàm timestamp(clock_type) Thời gian hiện tại tính bằng nano giây.
clock_type: REALTIME_CLOCK hoặc
MONOTONIC_TIME_SINCE_BOOT_OR_RESUME
abs(n) Giá trị tuyệt đối
floor(n), round(n), ceil(n) Hàm làm tròn
Độ ưu tiên của toán tử () Nhóm tiêu chuẩn cho mức độ ưu tiên