Panduan ini menjelaskan format permintaan JSON untuk endpoint /api/v1/generate_metrics_config alat Pembuat Konfigurasi Metrik (MCG). Format ini memungkinkan Anda menentukan kampanye telemetri—dengan menentukan pengumpulan data, pemrosesan di perangkat, dan pembuatan laporan—dalam struktur yang dapat dibaca manusia.
Alat MCG memvalidasi objek JSON ini, memeriksa masalah seperti ketidakcocokan jenis, dependensi melingkar, atau referensi yang tidak ditentukan, lalu mengompilasinya menjadi pesan buffer protokol (protobuf) MetricsConfig. Pesan MetricsConfig
ini adalah format biner yang dijalankan oleh layanan Telemetri di perangkat
untuk menjalankan kampanye.
Prasyarat: Anda harus memahami skema JSON, protobuf, dan struktur data dasar. Untuk ringkasan konseptual, lihat Konsep konfigurasi metrik.
Cara menulis deskripsi konfigurasi
Untuk mendesain kampanye pengumpulan metrik, ikuti alur logis berikut:
- Tentukan sumber data: Tentukan asal data Anda.
- Tentukan logika dan pemrosesan: Siapkan aturan untuk waktu pengumpulan data dan cara memprosesnya.
- Buat output: Mengemas data yang diproses ke dalam pesan akhir.
- Kolom tingkat teratas: Tambahkan kolom tingkat teratas seperti UUID, definisi sinyal, dan kontrol siklus proses.
Contoh: Laporan kecepatan rata-rata
Panduan ini menggunakan contoh untuk menunjukkan cara semua komponen berinteraksi. Panduan ini membuat laporan yang menghitung kecepatan rata-rata kendaraan setiap menit. Panduan ini menentukan Sumber Data (SpeedSource) untuk mengumpulkan data kecepatan, Pemicu (OnNewSpeed, EveryMinute) untuk mengontrol alur eksekusi, Penggabung (SpeedAggregator) untuk menghitung rata-rata, dan Konfigurasi Laporan Metrik (MinuteReport) untuk mengemas hasil. Contoh di bagian yang dapat diluaskan dibuat berdasarkan skenario ini.
Menentukan sumber data
Telemetri mendukung pengumpulan data dari Layanan SDV (melalui Middleware SDV) dan penayang berbasis Configurable Publisher Registry.
Layanan SDV (berbasis pub/sub): Data tersedia dari channel pub/sub yang ditentukan dalam VSIDL.
Layanan SDV (berbasis RPC): Data tersedia jika layanan mengekspos RPC
CreateSubscriptionatauGetLatestMessage.Penayang berbasis Publisher Registry yang Dapat Dikonfigurasi: Data tersedia jika aplikasi mendaftarkan dirinya menggunakan
IConfigurablePublisherRegistryantarmuka Binder Android atau library Publisher Registry yang Dapat Dikonfigurasi dari Telemetry SDK.
Untuk menggunakan data di SDV, tentukan sumber data (konsep) dan tambahkan ke array
data_sources.
Kolom objek sumber data (item dalam daftar data_sources) |
|||||
|---|---|---|---|---|---|
name |
String yang ditentukan pengguna yang mengidentifikasi sumber data ini dalam konfigurasi metrik. | ||||
source_identifier |
ID yang digunakan untuk menemukan layanan. Untuk mengetahui detailnya,
lihat format source_identifier. |
||||
connection_type |
SUBSCRIPTION untuk aliran data berkelanjutan (diperlukan untuk
pemicu data), atau ON_DEMAND untuk
pengambilan data sesuai permintaan (untuk mengetahui detailnya, lihat konfigurasi sumber data). |
||||
opsionalconfiguration |
Hanya RPC dan Publisher Registry yang Dapat Dikonfigurasi. Objek untuk mengonfigurasi sumber data dengan kolom berikut:
|
||||
Kolom untuk jenis koneksi SUBSCRIPTION |
|||||
opsionalsub_sampling_interval_ms |
Pub/sub saja. Bilangan bulat non-negatif (milidetik) untuk membatasi frekuensi pesan dengan menentukan interval minimum antar-pesan. | ||||
opsionalfetch_last_message(default: false) |
Pub/sub saja. Boolean. Jika true,
mengambil pesan terbaru saat terhubung. |
||||
Tidak semua opsi tersedia untuk semua jenis sumber data. Lihat panduan integrasi sumber data untuk mengetahui informasi mendetail.
Format source_identifier
Layanan Telemetri menerima beberapa format ID sumber. Lihat Definisi sumber data dalam konfigurasi metrik untuk mengetahui ringkasannya.
MCG menyimpulkan jenis pesan protobuf dari source_identifier hanya jika
menggunakan format Nama Jenis Unit. Jika Anda menggunakan FQIN atau nama kustom (dari
Configurable Publisher Registry), MCG tidak dapat menyimpulkan jenisnya. Dalam kasus ini, Anda
harus memberikan data_source_message_types. Jika jenis tidak ada dalam katalog Anda, Anda juga harus memberikan definisinya di descriptor_protos.
Contoh: Menentukan sumber data
Contoh ini melaporkan kecepatan kendaraan. Pertama, lihat katalog VSIDL untuk mengidentifikasi layanan yang memublikasikan data ini.
Dengan menggunakan katalog contoh di codebase SDV, identifikasi layanan yang relevan. Sesuai dengan Format
source_identifier, tentukan jenis pesan protobuf
mcg.test.subpkg.speed_msg. Karena kecepatan biasanya dipublikasikan secara sering, gunakan
sub_sampling_interval_ms untuk membatasi pembaruan menjadi satu pesan per
detik:
{ "name": "SpeedSource", "source_identifier": "mcg.test.subpkg.speed_msg", "connection_type": "SUBSCRIPTION", "sub_sampling_interval_ms": 1000 // Limit updates to 1 per second }
Menentukan logika dan pemrosesan
Logika ditangani oleh dua komponen yang bekerja sama: Pemicu (konsep) menentukan kapan sesuatu terjadi. Pengagregasi (konsep) menentukan cara data diproses berdasarkan pemicu tersebut. Karena ekspresi (konsep) adalah kunci untuk memicu kondisi dan logika agregasi, bagian ini pertama-tama menjelaskan cara menulisnya.
Ekspresi
Ekspresi memungkinkan Anda menentukan perhitungan dan kondisi menggunakan sintaksis yang mudah dibaca. MCG mengompilasi string ini ke dalam format yang dapat dieksekusi dan dioptimalkan untuk evaluasi di perangkat.
Ekspresi dapat menyatakan penghitungan aritmetika, kondisi logis, dan perbandingan data. Untuk mengetahui sintaksis lengkap, termasuk operator dan fungsi, lihat Sintaksis ekspresi.
Keaktualan data: Saat ekspresi mengakses sumber data, perilaku pengambilan bergantung pada jenis koneksi:
SUBSCRIPTION: Menggunakan pesan yang terakhir diterima yang di-cache oleh layanan Telemetri. (Catatan: Jikasub_sampling_interval_msdisetel, ini mungkin berbeda dengan pesan terbaru yang dipublikasikan.)ON_DEMAND: Memicu panggilan langsung untuk mengambil pesan baru dari layanan.
Batasan jenis
- Array: Akses indeks array langsung (misalnya,
my_data_source.my_array[0]) tidak didukung. - Keamanan jenis: Pastikan Anda membandingkan jenis yang kompatibel (misalnya, jangan membandingkan kolom string dengan daftar bilangan bulat).
Contoh: Ekspresi
Contoh ini perlu mengekstrak nilai kecepatan untuk menghitung
rata-ratanya. Aplikasi ini juga perlu menentukan apakah kendaraan melaju terlalu cepat (lebih dari 100
km/j) untuk pemicu bersyarat. Anda dapat menemukan nama kolom (dalam hal ini
speed) dalam definisi pesan protobuf yang digunakan oleh
sumber data. Ekspresi berikut akan mencapai hal ini:
SpeedSource.speed: Mengambil nilai kolomspeeddari sumber dataSpeedSource.SpeedSource.speed > 27.7: Dievaluasi menjaditruejika kecepatan lebih besar dari 27,7 m/s (sekitar 100 km/j).
Pemicu: Menentukan kapan tindakan terjadi
Pemicu menentukan kapan tindakan dijalankan: mengevaluasi penggabung, membuat laporan, atau mengontrol siklus proses pengumpulan. Tambahkan semua pemicu yang ditentukan ke array
triggers tingkat teratas.
Kolom objek pemicu (item dalam daftar triggers) |
|
|---|---|
name |
ID unik untuk pemicu ini dalam konfigurasi metrik. |
periodicdataconditional |
Anda harus memberikan tepat satu kolom ini untuk menentukan perilaku. |
Pemicu data
Diaktifkan saat sumber data SUBSCRIPTION memberikan pesan baru (konsep).
Kolom objek data (dalam pemicu) |
|
|---|---|
source_name |
name dari data_source yang diproses pemicu ini. |
Contoh: Pemicu data
Dalam contoh, perbarui penghitungan kecepatan rata-rata setiap kali
SpeedSource memublikasikan pesan baru. Pemicu data ini diaktifkan setiap kali
hal itu terjadi:
{ "name": "OnNewSpeed", "data": { "source_name": "SpeedSource" // Reference to the defined data source } }
Pemicu berkala
Diaktifkan pada interval reguler (concept).
Kolom objek periodic (dalam pemicu) |
|
|---|---|
period_ms |
Angka non-negatif yang menentukan interval dalam milidetik. |
Contoh: Pemicu berkala
Contoh ini memerlukan laporan setiap menit. Pemicu berkala ini diaktifkan setiap 60.000 md untuk membuat laporan tersebut:
{ "name": "EveryMinute", "periodic": { "period_ms": 60000 // 60,000 ms = 60 seconds } }
Pemicu bersyarat
Dipicu berdasarkan evaluasi ekspresi (konsep). Pemicu ini memerlukan satu atau beberapa pemicu induk untuk memulai evaluasinya. Pemicu ini sering kali berupa pemicu data untuk sumber data atau pengagregasi dalam ekspresi, atau pemicu berkala untuk melakukan polling data.
Kolom objek conditional (dalam pemicu) |
|
|---|---|
triggers |
Array dengan setidaknya satu nama pemicu induk. Saat pemicu induk diaktifkan, pemicu bersyarat akan mengevaluasi ekspresi. |
expression |
Ekspresi yang akan dievaluasi. Lihat Ekspresi. |
condition_type |
Menentukan kapan pemicu harus diaktifkan, berdasarkan evaluasi ekspresi. |
Jenis kondisi
Kamus condition_type harus berisi tepat satu jenis kondisi yang tersedia sebagai kunci. Untuk mengetahui informasi selengkapnya, lihat Pemicu bersyarat.
Kolom objek condition_type (saling eksklusif) |
|
|---|---|
is_trueis_false |
Diaktifkan saat ekspresi boolean bernilai true atau
false. |
rising_edge |
Jika numerik, dipicu saat nilainya bertambah. Jika ekspresinya adalah
boolean, dipicu saat berubah dari Dapat berisi objek |
falling_edge |
Jika numerik, akan diaktifkan saat nilainya berkurang. Jika ekspresinya
boolean, akan diaktifkan saat berubah dari Dapat berisi objek |
all_changes |
Dipicu saat hasil ekspresi berbeda dari nilai sebelumnya. Jika opsi tepi ditetapkan, opsi ini hanya mendukung nilai numerik dan boolean. Dapat berisi |
Opsi tepi
Objek rising_options dan falling_options memiliki kolom berikut. Jika
disediakan, transisi yang sesuai harus memenuhi persyaratan durasi.
Transisi tanpa opsi yang ditentukan akan langsung diaktifkan.
| Kolom untuk objek opsi tepi | |
|---|---|
min_duration_ms |
Angka non-negatif (dalam milidetik) yang menentukan durasi kondisi harus tetap dalam status baru sebelum pemicu diaktifkan. |
opsionalrequire_exact |
Boolean. Jika benar, semua nilai yang dipublikasikan selama durasi harus sama agar pemicu diaktifkan. |
Contoh: Pemicu bersyarat
Pemicu berikut menggunakan opsi tepi. Alarm akan berbunyi jika kecepatan melebihi 27,7 m/s dan tetap tinggi selama minimal 5 detik:
{ "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 } } } } }
Penggabung: Menentukan cara data diproses
Gunakan penggabung untuk pemrosesan data sementara yang memiliki status (konsep).
Tentukan penggabung dan tambahkan ke array aggregators.
Agregator mengubah data dan menyediakannya untuk agregator dan laporan lainnya.
Kolom agregator (item dalam daftar aggregators) |
|
|---|---|
name |
String yang ditentukan pengguna yang mengidentifikasi pengagregat ini. Ekspresi dapat mereferensikan pengagregat ini berdasarkan nama untuk mengakses hasilnya. |
trigger_names |
Array yang berisi satu atau beberapa nama pemicu yang menyebabkan agregasi ini dievaluasi. |
opsionalreset_on_get |
Boolean, default: `false`. Jika `true`, sistem akan mereset status agregasi setelah nilainya diakses oleh agregator, laporan metrik, atau pemicu bersyarat lain. |
message_builder |
Menentukan data yang akan dibaca, diproses, dan digabungkan. Kolom pesan output kemudian menjadi sumber data untuk agregator dan laporan lainnya. Fungsi ini menggunakan field_assignments, dengan setiap penetapan
menentukan kolom dalam pesan output. |
Pembuat pesan
Objek message_builder menentukan struktur pesan output dan logika agregasi yang digunakan untuk menghitung kolomnya. Sumber data ini digunakan dalam Agregator
dan Konfigurasi Laporan.
Kolom objek message_builder (dalam penggabung atau laporan) |
|
|---|---|
message_type |
Nama yang sepenuhnya memenuhi syarat dari jenis pesan protobuf untuk output. Jika
dihilangkan, MCG akan membuat jenis pesan kustom berdasarkan
field_assignments' jenis output yang disimpulkan. Gunakan hanya jika
pembangun pesan adalah bagian dari laporan metrik dan laporan Anda harus cocok dengan
definisi pesan protobuf tertentu yang telah ditentukan sebelumnya. |
field_assignments |
Array objek definisi kolom. Setiap objek menentukan kolom dalam pesan output dan logika untuk menghitung nilainya. |
Kolom objek penetapan kolom (item dalam daftar field_assignments) |
|||||||
|---|---|---|---|---|---|---|---|
field_name |
Nama yang ditentukan pengguna untuk kolom. Mengidentifikasi nilai tertentu
dalam objek saat menggunakan notasi titik dalam ekspresi
(aggregator_name.field_name). |
||||||
aggregation |
Objek yang menentukan cara sistem menghitung nilai kolom dengan kolom berikut:
|
||||||
Contoh: Agregator
Untuk contoh, hitung statistik antara laporan per menit. Penggabung
ini dipicu oleh OnNewSpeed untuk menghitung kecepatan rata-rata
(avg), menghitung pembacaan (count), dan menyimpan 5
nilai kecepatan terakhir (vector). Tetapkan reset_on_get ke
true. Hal ini akan mereset statistik setiap kali MinuteReport
membacanya, sehingga memulai jendela pengumpulan baru untuk penggabung pada menit berikutnya:
{ "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 } } ] } }
Buat output
Untuk menentukan output akhir kampanye telemetri, tambahkan objek ke array
report_configs (konsep). Konfigurasi ini menentukan cara data yang diproses dikemas dan kapan data tersebut dibuat. Anda dapat menentukan beberapa konfigurasi laporan dalam satu konfigurasi metrik untuk menggunakan kembali komponen.
Anda mengontrol pembuatan laporan menggunakan kolom trigger_names. Selain itu, Anda dapat menggunakan report_initial untuk langsung membuat laporan saat konfigurasi diaktifkan, dan report_incomplete untuk membuat laporan akhir saat pengumpulan data terganggu.
Catatan: Untuk menghubungkan pemrosesan ke output, gunakan jenis agregasi none
(@type: "none") untuk membaca nilai yang telah dihitung sebelumnya dari Agregator. Karena laporan biasanya merupakan snapshot tanpa status, hal ini menjaga logika kompleks dengan status dalam agregator dan mencadangkan laporan untuk pemformatan.
Kolom objek konfigurasi laporan (item dalam daftar report_configs) |
|
|---|---|
name |
Nama unik untuk laporan. Nama ini muncul di metadata laporan yang dihasilkan. |
trigger_names |
Array nama pemicu yang menyebabkan laporan dibuat dan dipublikasikan. |
message_builder |
Lihat Pembuat pesan untuk mengetahui detailnya. Ini menentukan konten laporan. Agregasi dievaluasi hanya saat laporan dipicu. Misalnya, agregasi vektor menambahkan satu nilai per laporan, dan agregasi jumlah mencerminkan jumlah laporan. |
opsionalreport_incomplete(default: `false`) |
Boolean. Jika `true`, sistem membuat laporan akhir saat penonaktifan atau saat pengumpulan data berakhir, meskipun data tidak ada. |
opsionalreport_initial(default: `false`) |
Nilai boolean. Jika `true`, sistem langsung membuat laporan saat konfigurasi metrik diaktifkan. |
Contoh: Konfigurasi laporan
Terakhir, tentukan konfigurasi laporan untuk contoh. Fitur ini dipicu oleh EveryMinute. Metode ini membaca kecepatan rata-rata yang dihitung dan jumlah pembacaan dari SpeedAggregator menggunakan agregasi none, yang meneruskan nilai yang telah diagregasi sebelumnya ke laporan:
{ "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" } } ] } }
Kolom tingkat teratas
Selain array data_sources, aggregators, triggers, dan report_configs, deskripsi konfigurasi metrik memerlukan referensi ke katalog sinyal. Anda juga dapat menyertakan kolom opsional untuk menetapkan UUID tertentu dan mengelola siklus proses pengumpulan.
Setel UUID
Setiap MetricsConfig memerlukan ID Unik Universal (UUID). Jika Anda
memberikan existing_uuid, MCG akan menggunakannya. Jika tidak, ID acak akan dibuat. Untuk
konsistensi di seluruh deployment dan alat, tentukan existing_uuid.
String harus berupa UUID bergaris hubung yang valid dan hanya berisi huruf kecil.
"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
Definisi sinyal
Untuk memvalidasi nama dan jenis sinyal, MCG memerlukan akses ke Katalog Sinyal Kendaraan. Ini adalah protobuf FileDescriptorSet yang berisi definisi VSIDL .proto
Anda (dikemas dan diupload ke MCG). Untuk mengetahui detail tentang cara membuat dan mengupload katalog, lihat Katalog Sinyal Kendaraan.
Tentukan versi katalog di kolom vs_version objek JSON:
"vs_version": "v1.0",
Menentukan pemicu siklus proses
Dalam konteks kampanye telemetri, siklus proses MetricsConfig
menentukan kapan data benar-benar direkam. Saat sistem pengelolaan kampanye men-deploy dan mengaktifkan konfigurasi di perangkat, Anda dapat menggunakan pemicu siklus proses untuk mengontrol secara tepat kapan data dikumpulkan dalam deployment tersebut.
Hal ini memungkinkan Anda menyelaraskan pengumpulan data dengan pola penggunaan kendaraan, seperti
"Perjalanan" (IgnitionOn hingga IgnitionOff) atau "Sesi Pengisian Daya", tanpa perlu
menonaktifkan konfigurasi.
Kontrol Sesi (Mulai/Jeda): Gunakan
start_trigger_namedanstop_trigger_nameuntuk mengontrol kapan pengumpulan data terjadi. Misalnya, untuk mengumpulkan data hanya saat kendaraan sedang dikemudikan, gunakanIgnitionOnsebagai pemicu mulai danIgnitionOffsebagai pemicu berhenti. Konfigurasi tetap aktif di perangkat, tetapi secara efektif "dijeda" (berhenti mengumpulkan dan memproses) saat pemicu berhenti diaktifkan, dan dilanjutkan hanya saat pemicu mulai diaktifkan lagi.Penting: Tindakan ini hanya menjeda pengumpulan. Hal ini tidak menentukan jendela logis, memisahkan set data, atau memiliki efek samping lainnya. Nilai penggabung tidak direset saat pengumpulan dijeda atau dilanjutkan.
Deteksi Sekali (Selesai): Gunakan
deactivate_trigger_namejika konfigurasi hanya boleh dijalankan satu kali (misalnya, untuk mendeteksi kemunculan pertama kode kesalahan tertentu), lalu dinonaktifkan secara permanen di perangkat tersebut, meskipun kampanye secara teknis masih aktif.
Jika Anda tidak menentukan pemicu siklus proses, pengumpulan data akan segera dimulai saat konfigurasi diaktifkan oleh kampanye dan berlanjut secara terus-menerus hingga kampanye berakhir.
| Kolom siklus proses tingkat teratas (objek root) | |
|---|---|
opsionalstart_trigger_name |
Nama pemicu yang memulai sesi pengumpulan. Dapat disetel
tanpa stop_trigger_name. |
opsionalstop_trigger_name |
Nama pemicu yang menjeda sesi pengumpulan (misalnya, saat kendaraan tidak bergerak). Jika ditetapkan, start_trigger_name juga harus ditetapkan. |
opsionaldeactivate_trigger_name |
Nama pemicu yang menyelesaikan dan menonaktifkan `MetricsConfig` sepenuhnya. |
Lanjutan: Definisi proto kustom
Dalam dua kasus utama, vs_version saja tidak cukup bagi MCG untuk memahami semua jenis pesan dalam deskripsi konfigurasi metrik:
- Kegagalan inferensi jenis: Seperti yang dijelaskan dalam format
source_identifier, MCG tidak dapat menyimpulkan jenis saatsource_identifiermenggunakan FQIN atau nama kustom. - Pesan kustom: Deskripsi konfigurasi metrik menggunakan pesan protobuf yang tidak ditemukan dalam katalog VSIDL yang ditentukan dalam
vs_version. Hal ini terjadi saat menyetelmessage_typedimessage_builderuntuk format laporan kustom.
Dalam kasus ini, gunakan data_source_message_types untuk membantu MCG menyimpulkan jenis dan
descriptor_protos untuk memberikan definisi pesan.
data_source_message_types
Petakan string source_identifier ke jenis pesan protobuf yang sepenuhnya memenuhi syarat.
Kunci di data_source_message_types harus cocok dengan nilai source_identifier
dari entri data_sources:
"data_source_message_types": {
"MyCustomSpeedService": "com.sdv.example.SampleMessage"
}
descriptor_protos
Berikan definisi untuk semua jenis pesan yang digunakan dalam data_source_message_types atau
message_builder yang tidak ada dalam vs_version yang dikonfigurasi.
Teruskan descriptorpb.FileDescriptorSet berenkode base64 dalam array
descriptor_protos. Buat ini dari file .proto menggunakan compiler Protobuf protoc.
"descriptor_protos": [
"Cu8BCiZtY2cvdGVzdGRhdGEvbWF4YXZnY3..." // Base64 string
]
Contoh: Deskripsi konfigurasi lengkap
Bagian sebelumnya menentukan semua komponen untuk contoh: membuat laporan setiap menit dengan kecepatan rata-rata kendaraan yang diamati selama satu menit tersebut.
Komponennya adalah:
- Sumber data (
SpeedSource) untuk mendapatkan data kecepatan hingga sekali per detik. - Pemicu data (
OnNewSpeed) yang diaktifkan saatSpeedSourcemengirim data. - Pemicu berkala (
EveryMinute) yang diaktifkan setiap 60 detik. - Agregator (
SpeedAggregator) yang menggunakanOnNewSpeeduntuk menghitung kecepatan rata-rata, menghitung pembacaan, dan menyimpan nilai terbaru, yang direset saat dibaca. - Konfigurasi laporan (
MinuteReport) yang menggunakanEveryMinuteuntuk memicu laporan yang berisi kecepatan dan jumlah rata-rata dariSpeedAggregator. - Kolom tingkat teratas (
existing_uuid,vs_version) untuk mengidentifikasi konfigurasi metrik dan menentukan katalog VSIDL yang akan digunakan untuk definisi sinyal.
Jika digabungkan, bagian-bagian ini membentuk deskripsi lengkap konfigurasi metrik:
{ "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" } } ] } } ] }
Template referensi
Untuk definisi API, lihat referensi API MCG.
Bagian berikut memberikan referensi lengkap deskripsi konfigurasi metrik. Gunakan sebagai panduan untuk membuat deskripsi konfigurasi metrik Anda sendiri.
Kolom tingkat teratas
{
"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
}
Input: sumber data dan penggabung
{
"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
}
}
]
}
}
]
}
Logika dan pemrosesan: pemicu
{
"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 }
}
}
}
}
]
}
Output: konfigurasi laporan
{
"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"
}
}
]
}
}
]
}
Sintaksis ekspresi
| Kategori | Sintaksis | Deskripsi |
|---|---|---|
| Akses data | source_namesource_name.fieldsource_name.field.subfield |
Mengakses pesan lengkap dari sumber data atau penggabung Mengakses kolom tertentu dalam pesan (termasuk kolom bertingkat) |
| Aritmetika | +, -, *, /, %, ** |
Matematika standar. ** adalah eksponensiasi. |
| Logika | &&, ||, !, ^ |
AND, OR, NOT, XOR. |
| Relasional | ==, !=, <, <=, >, >= |
== dan != berfungsi pada semua jenis. Lainnya memerlukan angka. |
| Daftar | contains(list, item)doesnotcontain(list, item)alleq(list, value) |
Beroperasi pada vektor (array). alleq(list, value) menampilkan true jika semua item dalam list sama dengan value. |
| Fungsi | timestamp(clock_type) |
Waktu saat ini dalam nanodetik.clock_type: REALTIME_CLOCK atauMONOTONIC_TIME_SINCE_BOOT_OR_RESUME |
abs(n) |
Nilai absolut | |
floor(n), round(n), ceil(n) |
Fungsi pembulatan | |
| Urutan operasi | () |
Pengelompokan standar untuk prioritas |