คู่มือนี้จะอธิบายรายละเอียดรูปแบบคำขอ JSON สำหรับปลายทาง /api/v2/generate_metrics_config ของเครื่องมือ Metrics Configuration Generator (MCG) รูปแบบนี้ช่วยให้คุณกำหนดแคมเปญการตรวจวัดระยะไกลได้ โดยระบุการเก็บรวบรวมข้อมูล การประมวลผลในอุปกรณ์ และการสร้างรายงานในโครงสร้างที่มนุษย์อ่านได้
เครื่องมือ MCG จะตรวจสอบออบเจ็กต์ JSON นี้ โดยตรวจหาปัญหาต่างๆ เช่น ประเภทไม่ตรงกัน การขึ้นต่อกันแบบเวียนกลับ หรือการอ้างอิงที่ไม่ได้กำหนด จากนั้นจะคอมไพล์เป็นข้อความบัฟเฟอร์โปรโตคอล (protobuf) MetricsConfig ข้อความ MetricsConfig นี้เป็นรูปแบบไบนารีที่บริการ Telemetry ในอุปกรณ์ใช้เพื่อเรียกใช้แคมเปญ
ข้อกำหนดเบื้องต้น: คุณควรคุ้นเคยกับสคีมา JSON, Protobuf และโครงสร้างข้อมูลพื้นฐาน ดูภาพรวมเชิงแนวคิดได้ที่แนวคิดการกำหนดค่าเมตริก
วิธีเขียนคำอธิบายการกำหนดค่า
หากต้องการออกแบบแคมเปญการรวบรวมเมตริก ให้ทำตามขั้นตอนต่อไปนี้
- ระบุแหล่งข้อมูล: กำหนดว่าข้อมูลของคุณมาจากที่ใด
- กำหนดตรรกะและการประมวลผล: ตั้งกฎสำหรับเวลาที่จะรวบรวมข้อมูลและวิธีประมวลผลข้อมูล
- สร้างเอาต์พุต: จัดแพ็กเกจข้อมูลที่ประมวลผลแล้วเป็นข้อความสุดท้าย
- ฟิลด์ระดับบนสุด: เพิ่มฟิลด์ระดับบนสุด เช่น UUID, คำจำกัดความของสัญญาณ และการควบคุมวงจร
ตัวอย่าง: รายงานความเร็วโดยเฉลี่ย
คู่มือนี้ใช้ตัวอย่างเพื่อแสดงให้เห็นว่าคอมโพเนนต์ทั้งหมดทำงานร่วมกันอย่างไร โดยจะสร้างรายงานที่คำนวณความเร็วเฉลี่ยของยานพาหนะทุกนาที โดยจะกำหนดแหล่งข้อมูล (SpeedSource) เพื่อรวบรวมข้อมูลความเร็ว ทริกเกอร์ (OnNewSpeed, EveryMinute) เพื่อควบคุมขั้นตอนการดำเนินการ ตัวรวมข้อมูล (SpeedAggregator) เพื่อคำนวณค่าเฉลี่ย และการกำหนดค่ารายงานเมตริก (MinuteReport) เพื่อจัดแพ็กเกจผลลัพธ์ ตัวอย่างในส่วนที่ขยายได้จะอิงตามสถานการณ์นี้
ระบุแหล่งข้อมูล
การตรวจวัดระยะไกลรองรับการรวบรวมข้อมูลจากบริการ SDV (ผ่านมิดเดิลแวร์ SDV) และผู้เผยแพร่โฆษณาที่อิงตามรีจิสทรีของผู้เผยแพร่โฆษณาที่กำหนดค่าได้
บริการ SDV (อิงตาม Pub/Sub): ข้อมูลพร้อมใช้งานจากช่องทาง Pub/Sub ที่กำหนดไว้ใน VSIDL
บริการ SDV (อิงตาม RPC): ข้อมูลจะพร้อมใช้งานหากบริการแสดง RPC
CreateSubscriptionหรือGetLatestMessageผู้เผยแพร่โฆษณาที่อิงตาม Configurable Publisher Registry: ข้อมูลจะพร้อมใช้งานหากแอปพลิเคชันลงทะเบียนตัวเองโดยใช้
IConfigurablePublisherRegistryอินเทอร์เฟซ Android Binder หรือไลบรารี Configurable Publisher Registry จาก Telemetry SDK
หากต้องการใช้ข้อมูลใน SDV ให้กำหนดแหล่งข้อมูล (แนวคิด) แล้วเพิ่มลงในอาร์เรย์ data_sources
ช่องของออบเจ็กต์แหล่งข้อมูล (รายการในรายการ data_sources) |
|||||
|---|---|---|---|---|---|
name |
สตริงที่ผู้ใช้กำหนดซึ่งระบุแหล่งข้อมูลนี้ภายในการกำหนดค่าเมตริก | ||||
source_identifier |
ตัวระบุที่ใช้เพื่อค้นพบบริการ โปรดดูรายละเอียดที่หัวข้อรูปแบบ source_identifier |
||||
connection_type |
SUBSCRIPTION สำหรับสตรีมข้อมูลต่อเนื่อง (จำเป็นสำหรับทริกเกอร์ข้อมูล) หรือ ON_DEMAND สำหรับการดึงข้อมูลตามต้องการ (ดูรายละเอียดได้ที่การกำหนดค่าแหล่งข้อมูล) |
||||
ไม่บังคับconfiguration |
RPC และ Configurable Publisher Registry เท่านั้น ออบเจ็กต์สำหรับกำหนดค่าแหล่งข้อมูลด้วยช่องต่อไปนี้
|
||||
ฟิลด์สําหรับประเภทการเชื่อมต่อ SUBSCRIPTION |
|||||
ไม่บังคับsub_sampling_interval_ms |
Pub/Sub เท่านั้น จำนวนเต็มที่ไม่เป็นลบ (มิลลิวินาที) เพื่อจำกัดความถี่ของข้อความโดยระบุช่วงเวลาขั้นต่ำระหว่างข้อความ | ||||
ไม่บังคับfetch_last_message(ค่าเริ่มต้น: false) |
Pub/Sub เท่านั้น บูลีน หากเป็น true ระบบจะดึงข้อความล่าสุดเมื่อเชื่อมต่อ |
||||
ตัวเลือกบางอย่างอาจใช้ไม่ได้กับแหล่งข้อมูลบางประเภท ดูข้อมูลโดยละเอียดได้ในคู่มือการผสานรวมแหล่งข้อมูล
รูปแบบของ source_identifier
บริการ Telemetry รองรับตัวระบุแหล่งที่มาหลายรูปแบบ ดูภาพรวมได้ที่คำจำกัดความของแหล่งข้อมูลในการกำหนดค่าเมตริก
MCG จะอนุมานประเภทข้อความ protobuf จาก source_identifier เฉพาะในกรณีที่ใช้รูปแบบ Unit Type Name เท่านั้น หากคุณใช้ FQIN หรือชื่อที่กำหนดเอง (จาก Configurable Publisher Registry) MCG จะอนุมานประเภทไม่ได้ ในกรณีเหล่านี้ คุณต้องระบุ data_source_message_types หากประเภทไม่อยู่ในแคตตาล็อก คุณต้องระบุคำจำกัดความของประเภทนั้นใน descriptor_protos ด้วย
ตัวอย่าง: การกำหนดแหล่งข้อมูล
ตัวอย่างนี้จะรายงานความเร็วของรถยนต์ ก่อนอื่น ให้ดูแคตตาล็อก VSIDL เพื่อระบุบริการที่เผยแพร่ข้อมูลนี้
ระบุบริการที่เกี่ยวข้องโดยใช้แคตตาล็อกตัวอย่างในฐานของโค้ด SDV ระบุประเภทข้อความ protobuf mcg.test.subpkg.speed_msg ให้สอดคล้องกับรูปแบบของ source_identifier เนื่องจากโดยปกติแล้วจะมีการเผยแพร่ความเร็วบ่อยครั้ง ให้ใช้ sub_sampling_interval_ms เพื่อจำกัดการอัปเดตเป็น 1 ข้อความต่อวินาที ดังนี้
{ "name": "SpeedSource", "source_identifier": "mcg.test.subpkg.speed_msg", "connection_type": "SUBSCRIPTION", "sub_sampling_interval_ms": 1000 // Limit updates to 1 per second }
กำหนดตรรกะและการประมวลผล
ตรรกะจะได้รับการจัดการโดยคอมโพเนนต์ 2 รายการที่ทำงานร่วมกัน ได้แก่ ทริกเกอร์ (แนวคิด) ซึ่งกำหนดเวลาที่เหตุการณ์จะเกิดขึ้น เครื่องมือรวบรวม (แนวคิด) จะกำหนดวิธีประมวลผลข้อมูลตามทริกเกอร์เหล่านั้น เนื่องจากนิพจน์ (แนวคิด) เป็นกุญแจสำคัญของเงื่อนไขทริกเกอร์และตรรกะการรวม ส่วนนี้จะอธิบายวิธีเขียนนิพจน์ก่อน
นิพจน์
นิพจน์ช่วยให้คุณกำหนดการคำนวณและเงื่อนไขโดยใช้ไวยากรณ์ที่มนุษย์อ่านได้ MCG จะคอมไพล์สตริงเหล่านี้เป็นรูปแบบที่เรียกใช้ได้ซึ่งเพิ่มประสิทธิภาพสำหรับการประเมินในอุปกรณ์
นิพจน์สามารถแสดงการคำนวณทางคณิตศาสตร์ เงื่อนไขเชิงตรรกะ และการเปรียบเทียบข้อมูลได้ ดูไวยากรณ์ทั้งหมด รวมถึงโอเปอเรเตอร์และฟังก์ชันได้ที่ไวยากรณ์ของนิพจน์
ความใหม่ของข้อมูล: เมื่อนิพจน์เข้าถึงแหล่งข้อมูล ลักษณะการดึงข้อมูลจะขึ้นอยู่กับประเภทการเชื่อมต่อ ดังนี้
SUBSCRIPTION: ใช้ข้อความที่ได้รับล่าสุดซึ่งแคชโดยบริการ Telemetry (หมายเหตุ: หากตั้งค่าsub_sampling_interval_msไว้ ข้อความนี้อาจแตกต่างจากข้อความที่เผยแพร่ล่าสุด)ON_DEMAND: เรียกใช้การเรียกทันทีเพื่อดึงข้อความใหม่จากบริการ
ข้อจำกัดประเภท
- อาร์เรย์: ไม่รองรับการเข้าถึงดัชนีอาร์เรย์โดยตรง (เช่น
my_data_source.my_array[0]) - ความปลอดภัยในการกำหนดประเภท: ตรวจสอบว่าคุณเปรียบเทียบประเภทที่เข้ากันได้ (เช่น อย่าเปรียบเทียบช่องสตริงกับรายการจำนวนเต็ม)
ตัวอย่าง: นิพจน์
ตัวอย่างนี้ต้องดึงค่าความเร็วเพื่อคำนวณค่าเฉลี่ย นอกจากนี้ ยังต้องระบุด้วยว่ายานพาหนะขับเร็วเกินกำหนด (เกิน 100 กม./ชม.) หรือไม่สำหรับทริกเกอร์แบบมีเงื่อนไข คุณสามารถดูชื่อช่อง (ในกรณีนี้คือ speed) ได้ในคำจำกัดความของข้อความ protobuf ที่แหล่งข้อมูลใช้ นิพจน์ต่อไปนี้จะช่วยให้คุณทำเช่นนั้นได้
SpeedSource.speed: ดึงค่าของฟิลด์speedจากแหล่งข้อมูลSpeedSourceSpeedSource.speed > 27.7: ประเมินเป็นtrueหากความเร็วมากกว่า 27.7 ม./วิ (ประมาณ 100 กม./ชม.)
ทริกเกอร์: กำหนดเวลาที่การดำเนินการจะเกิดขึ้น
ทริกเกอร์จะกำหนดเวลาที่การดำเนินการจะทำงาน ซึ่งได้แก่ การประเมิน Aggregator, การสร้างรายงาน หรือการควบคุมวงจรการรวบรวมข้อมูล เพิ่มทริกเกอร์ที่กำหนดไว้ทั้งหมดลงในอาร์เรย์ triggers ระดับบนสุด
ฟิลด์ของออบเจ็กต์ทริกเกอร์ (รายการในลิสต์ triggers) |
|
|---|---|
name |
ตัวระบุที่ไม่ซ้ำกันสำหรับทริกเกอร์นี้ในการกำหนดค่าเมตริก |
periodicdataconditional |
คุณต้องระบุช่องใดช่องหนึ่งต่อไปนี้เพื่อกำหนดลักษณะการทำงาน |
ทริกเกอร์ข้อมูล
เริ่มทำงานเมื่อแหล่งข้อมูล SUBSCRIPTION ให้ข้อความใหม่ (แนวคิด)
ฟิลด์ของออบเจ็กต์ data (ในทริกเกอร์) |
|
|---|---|
source_name |
name ของ data_source ที่ทริกเกอร์นี้รอฟัง |
ตัวอย่าง: ทริกเกอร์ข้อมูล
ในตัวอย่าง ให้อัปเดตการคำนวณความเร็วเฉลี่ยทุกครั้งที่ SpeedSource เผยแพร่ข้อความใหม่ ทริกเกอร์ข้อมูลนี้จะเริ่มทำงานทุกครั้งที่เกิดเหตุการณ์ต่อไปนี้
{ "name": "OnNewSpeed", "data": { "source_name": "SpeedSource" // Reference to the defined data source } }
ทริกเกอร์เป็นระยะ
เริ่มทำงานตามช่วงเวลาปกติ (แนวคิด)
ฟิลด์ของออบเจ็กต์ periodic (ในทริกเกอร์) |
|
|---|---|
period_ms |
ตัวเลขที่ไม่เป็นค่าลบซึ่งกำหนดช่วงเวลาเป็นมิลลิวินาที |
ตัวอย่าง: ทริกเกอร์เป็นระยะ
ตัวอย่างนี้ต้องใช้รายงานทุกนาที ทริกเกอร์เป็นระยะนี้จะเริ่มทำงานทุกๆ 60,000 มิลลิวินาทีเพื่อสร้างรายงานดังกล่าว
{ "name": "EveryMinute", "periodic": { "period_ms": 60000 // 60,000 ms = 60 seconds } }
ทริกเกอร์แบบมีเงื่อนไข
เริ่มทำงานตามการประเมินนิพจน์ (แนวคิด) โดยต้องมีทริกเกอร์หลักอย่างน้อย 1 รายการเพื่อเริ่มการประเมิน ซึ่งมักจะเป็นทริกเกอร์ข้อมูลสำหรับแหล่งข้อมูลหรือตัวรวบรวมในนิพจน์ หรือทริกเกอร์เป็นระยะเพื่อสำรวจข้อมูล
ฟิลด์ของออบเจ็กต์ conditional (ในทริกเกอร์) |
|
|---|---|
triggers |
อาร์เรย์ที่มีชื่อทริกเกอร์หลักอย่างน้อย 1 ชื่อ เมื่อทริกเกอร์หลักเริ่มทำงาน ทริกเกอร์แบบมีเงื่อนไขจะประเมินนิพจน์ |
expression |
นิพจน์ที่จะประเมิน ดูนิพจน์ |
condition_type |
ระบุเวลาที่ทริกเกอร์ควรเริ่มทำงาน โดยอิงตามการประเมินนิพจน์ |
ประเภทเงื่อนไข
พจนานุกรม condition_type ต้องมีประเภทเงื่อนไขที่ใช้ได้เพียงประเภทเดียวเป็นคีย์ ดูข้อมูลเพิ่มเติมได้ที่ทริกเกอร์แบบมีเงื่อนไข
ฟิลด์ของออบเจ็กต์ condition_type (แยกกัน) |
|
|---|---|
is_trueis_false |
เริ่มทำงานเมื่อนิพจน์บูลีนประเมินเป็น true หรือ false ตามลำดับ |
rising_edge |
หากเป็นตัวเลข จะเริ่มทำงานเมื่อค่าเพิ่มขึ้น หากนิพจน์เป็นบูลีน ระบบจะเริ่มทำงานเมื่อนิพจน์เปลี่ยนจาก มีออบเจ็กต์ |
falling_edge |
หากเป็นตัวเลข ระบบจะเริ่มทำงานเมื่อค่าลดลง หากนิพจน์เป็นบูลีน ระบบจะเริ่มทำงานเมื่อนิพจน์เปลี่ยนจาก มีออบเจ็กต์ |
all_changes |
เริ่มทำงานเมื่อผลลัพธ์ของนิพจน์แตกต่างจากค่าก่อนหน้า หากตั้งค่าตัวเลือก Edge ระบบจะรองรับเฉพาะค่าตัวเลขและค่าบูลีน มี |
ตัวเลือก Edge
ออบเจ็กต์ rising_options และ falling_options มีช่องต่อไปนี้ หากระบุไว้ การเปลี่ยนที่เกี่ยวข้องต้องเป็นไปตามข้อกำหนดด้านระยะเวลา
การเปลี่ยนผ่านที่ไม่มีตัวเลือกที่ระบุจะเริ่มทำงานทันที
| ช่องสำหรับออบเจ็กต์ตัวเลือก Edge | |
|---|---|
min_duration_ms |
ตัวเลขที่ไม่เป็นค่าลบ (เป็นมิลลิวินาที) ซึ่งระบุระยะเวลาที่เงื่อนไขต้องคงอยู่ในสถานะใหม่ก่อนที่ทริกเกอร์จะเริ่มทำงาน |
ไม่บังคับrequire_exact |
บูลีน หากเป็นจริง ค่าทั้งหมดที่เผยแพร่ในช่วงระยะเวลาดังกล่าวต้องเหมือนกันเพื่อให้ทริกเกอร์เริ่มทำงาน |
ตัวอย่าง: ทริกเกอร์แบบมีเงื่อนไข
ทริกเกอร์ต่อไปนี้ใช้ตัวเลือก Edge โดยจะเริ่มทำงานหากความเร็วเกิน 27.7 ม./วินาที และยังคงสูงอยู่เป็นเวลาอย่างน้อย 5 วินาที ดังนี้
{ "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 } } } } }
Aggregator: กำหนดวิธีประมวลผลข้อมูล
ใช้ตัวรวมสำหรับการประมวลผลข้อมูลระดับกลางที่มีสถานะ (แนวคิด)
กำหนดผู้รวบรวมข้อมูลและเพิ่มลงในอาร์เรย์ aggregators
เครื่องมือรวบรวมข้อมูลจะแปลงข้อมูลและทำให้ข้อมูลพร้อมใช้งานสำหรับเครื่องมือรวบรวมข้อมูลและรายงานอื่นๆ
ช่องของผู้รวบรวมข้อมูล (รายการในลิสต์ aggregators) |
|
|---|---|
name |
สตริงที่ผู้ใช้กำหนดซึ่งระบุผู้รวบรวมข้อมูลนี้ นิพจน์สามารถอ้างอิงตัวรวมนี้ตามชื่อเพื่อเข้าถึงผลลัพธ์ได้ |
trigger_names |
อาร์เรย์ของชื่อทริกเกอร์อย่างน้อย 1 ชื่อที่ทำให้ระบบประเมินการรวมนี้ |
ไม่บังคับreset_on_get |
บูลีน ค่าเริ่มต้น: `false` หากเป็น `true` ระบบจะรีเซ็ตสถานะการรวมหลังจากที่ผู้รวบรวมข้อมูล รายงานเมตริก หรือทริกเกอร์แบบมีเงื่อนไขอื่นเข้าถึงค่าของสถานะดังกล่าว |
message_builder |
กำหนดข้อมูลที่จะอ่าน ประมวลผล และรวบรวม จากนั้นฟิลด์ของข้อความเอาต์พุตจะกลายเป็นแหล่งข้อมูลสำหรับเครื่องมือรวบรวมข้อมูลและรายงานอื่นๆ โดยใช้ field_assignments โดยการกำหนดแต่ละรายการจะกำหนดฟิลด์ในข้อความเอาต์พุต |
เครื่องมือสร้างข้อความ
ออบเจ็กต์ message_builder จะกำหนดโครงสร้างข้อความเอาต์พุตและตรรกะการรวมที่ใช้ในการคำนวณฟิลด์ โดยใช้ทั้งในเครื่องมือรวบรวมข้อมูลและการกำหนดค่ารายงาน
ฟิลด์ของออบเจ็กต์ message_builder (ในเครื่องมือรวบรวมข้อมูลหรือรายงาน) |
|
|---|---|
message_type |
ชื่อที่สมบูรณ์ในตัวเองของประเภทข้อความ protobuf สำหรับเอาต์พุต หากละเว้น MCG จะสร้างประเภทข้อความที่กำหนดเองตามประเภทเอาต์พุตที่อนุมานของ field_assignments ใช้เฉพาะในกรณีที่เครื่องมือสร้างข้อความเป็นส่วนหนึ่งของรายงานเมตริก และรายงานต้องตรงกับคําจํากัดความของข้อความ Protobuf ที่กําหนดไว้ล่วงหน้าโดยเฉพาะ |
field_assignments |
อาร์เรย์ของออบเจ็กต์การกำหนดฟิลด์ ออบเจ็กต์แต่ละรายการจะระบุฟิลด์ในข้อความเอาต์พุตและตรรกะในการคำนวณค่าของฟิลด์ |
ช่องของออบเจ็กต์การกำหนดช่อง (รายการในลิสต์ field_assignments) |
|||||||
|---|---|---|---|---|---|---|---|
field_name |
ชื่อที่ผู้ใช้กำหนดสำหรับช่อง ซึ่งจะระบุค่าที่เฉพาะเจาะจงภายในออบเจ็กต์เมื่อใช้สัญกรณ์จุดในนิพจน์ (aggregator_name.field_name) |
||||||
aggregation |
ออบเจ็กต์ที่กำหนดวิธีที่ระบบคำนวณค่าของช่องด้วยช่องต่อไปนี้
|
||||||
ตัวอย่าง: ผู้รวบรวมข้อมูล
ตัวอย่างเช่น คำนวณสถิติระหว่างรายงานแบบนาที OnNewSpeed จะทริกเกอร์ตัวรวบรวมนี้เพื่อคำนวณความเร็วเฉลี่ย (avg) นับค่าที่อ่านได้ (count) และจัดเก็บค่าความเร็ว 5 ค่าล่าสุด (vector) ตั้งค่า reset_on_get เป็น true ซึ่งจะรีเซ็ตสถิติทุกครั้งที่ MinuteReport อ่านสถิติเหล่านั้น โดยจะเริ่มกรอบเวลาการรวบรวมใหม่สำหรับ Aggregator ในนาทีถัดไป
{ "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 } } ] } }
สร้างเอาต์พุต
หากต้องการกำหนดเอาต์พุตสุดท้ายของแคมเปญการวัดและส่งข้อมูลทางไกล ให้เพิ่มออบเจ็กต์ลงในอาร์เรย์ report_configs (แนวคิด) การกำหนดค่าเหล่านี้จะกำหนดวิธีจัดแพ็กเกจข้อมูลที่ประมวลผลแล้วและเวลาที่สร้างข้อมูล คุณสามารถกำหนดการกำหนดค่ารายงานหลายรายการในการกำหนดค่าเมตริก 1 รายการเพื่อนำคอมโพเนนต์กลับมาใช้ใหม่ได้
คุณควบคุมการสร้างรายงานได้โดยใช้ช่อง trigger_names นอกจากนี้ คุณยังใช้ report_initial เพื่อสร้างรายงานทันทีเมื่อการกำหนดค่าเปิดใช้งาน และใช้ report_incomplete เพื่อสร้างรายงานขั้นสุดท้ายเมื่อการเก็บรวบรวมข้อมูลถูกขัดจังหวะได้ด้วย
หมายเหตุ: หากต้องการเชื่อมต่อการประมวลผลกับเอาต์พุต ให้ใช้ประเภทการรวม none (@type: "none") เพื่ออ่านค่าที่คำนวณไว้ล่วงหน้าจาก Aggregator เนื่องจากรายงานมักเป็นสแนปชอตแบบไม่เก็บสถานะ วิธีนี้จึงช่วยให้ตรรกะแบบเก็บสถานะที่ซับซ้อนอยู่ภายใน Aggregator และสงวนรายงานไว้สำหรับการจัดรูปแบบ
ช่องของออบเจ็กต์การกำหนดค่ารายงาน (รายการในลิสต์ report_configs) |
|
|---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับรายงาน ชื่อนี้จะปรากฏในข้อมูลเมตาของรายงานที่สร้างขึ้น |
trigger_names |
อาร์เรย์ของชื่อทริกเกอร์ที่ทำให้ระบบสร้างและเผยแพร่รายงาน |
message_builder |
ดูรายละเอียดได้ที่เครื่องมือสร้างข้อความ ซึ่งจะกำหนดเนื้อหาของรายงาน ระบบจะประเมินการรวมก็ต่อเมื่อมีการทริกเกอร์รายงานเท่านั้น เช่น การรวมเวกเตอร์จะเพิ่มค่า 1 ค่าต่อรายงาน และการรวมจำนวนจะแสดงจำนวนรายงาน |
ไม่บังคับreport_incomplete(ค่าเริ่มต้น: `false`) |
บูลีน หากเป็น `true` ระบบจะสร้างรายงานขั้นสุดท้ายเมื่อปิดเครื่องหรือเมื่อการเก็บรวบรวมข้อมูลสิ้นสุดลง แม้ว่าข้อมูลจะขาดหายไปก็ตาม |
ไม่บังคับreport_initial(ค่าเริ่มต้น: `false`) |
บูลีน หากเป็น `true` ระบบจะสร้างรายงานทันทีเมื่อเปิดใช้งานการกำหนดค่าเมตริก |
ตัวอย่าง: การกําหนดค่ารายงาน
สุดท้าย ให้กำหนดการกำหนดค่ารายงานสำหรับตัวอย่าง โดยจะทริกเกอร์ด้วย EveryMinute โดยจะอ่านความเร็วเฉลี่ยที่คำนวณได้และจำนวนการอ่านจาก SpeedAggregator โดยใช้การรวม none ซึ่งจะส่งค่าที่รวมไว้ล่วงหน้าไปยังรายงาน ดังนี้
{ "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" } } ] } }
ฟิลด์ระดับบนสุด
นอกเหนือจากอาร์เรย์ data_sources, aggregators, triggers และ report_configs แล้ว คำอธิบายของการกำหนดค่าเมตริกยังต้องมีการอ้างอิงแคตตาล็อกสัญญาณด้วย นอกจากนี้ คุณยังรวมช่องที่ไม่บังคับเพื่อกำหนด UUID ที่เฉพาะเจาะจงและจัดการวงจรของคอลเล็กชันได้ด้วย
ตั้งค่า UUID
MetricsConfig แต่ละรายการต้องมีตัวระบุสากลที่ไม่ซ้ำกัน (Universally Unique Identifier หรือ UUID) หากคุณระบุ existing_uuid ไว้ MCG จะใช้รหัสดังกล่าว ไม่เช่นนั้น ระบบจะสร้างรหัสแบบสุ่ม ระบุ existing_uuid เพื่อให้สอดคล้องกันในการติดตั้งใช้งานและเครื่องมือต่างๆ
สตริงต้องเป็น UUID ที่มีขีดกลางที่ถูกต้องซึ่งมีเฉพาะตัวอักษรพิมพ์เล็กเท่านั้น
"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
คำจำกัดความของสัญญาณ
MCG ต้องมีสิทธิ์เข้าถึง Vehicle Signal Catalog เพื่อตรวจสอบชื่อและประเภทสัญญาณ นี่คือ protobuf FileDescriptorSet ที่มีคำจำกัดความ VSIDL .proto (จัดแพ็กเกจและอัปโหลดไปยัง MCG) ดูรายละเอียดเกี่ยวกับการสร้างและอัปโหลดแคตตาล็อกได้ที่แคตตาล็อกสัญญาณยานพาหนะ
ระบุเวอร์ชันแคตตาล็อกในช่อง vs_version ของออบเจ็กต์ JSON ดังนี้
"vs_version": "v1.0",
กำหนดทริกเกอร์วงจร
ในบริบทของแคมเปญการตรวจวัดระยะไกล วงจรของ MetricsConfig จะกำหนดเวลาที่ระบบบันทึกข้อมูลจริง ขณะที่ระบบการจัดการแคมเปญติดตั้งใช้งานและเปิดใช้งานการกำหนดค่าในอุปกรณ์ คุณสามารถใช้ทริกเกอร์วงจรเพื่อควบคุมเวลาที่ระบบจะรวบรวมข้อมูลภายในการติดตั้งใช้งานนั้นได้อย่างแม่นยำ
ซึ่งจะช่วยให้คุณปรับการเก็บรวบรวมข้อมูลให้สอดคล้องกับรูปแบบการใช้งานยานพาหนะ เช่น "การเดินทาง" (IgnitionOn ถึง IgnitionOff) หรือ "เซสชันการชาร์จ" โดยไม่จำเป็นต้องปิดใช้งานการกำหนดค่า
การควบคุมเซสชัน (เริ่ม/หยุดชั่วคราว): ใช้
start_trigger_nameและstop_trigger_nameเพื่อควบคุมเวลาที่เกิดการรวบรวมข้อมูล เช่น หากต้องการรวบรวมข้อมูลเฉพาะขณะที่ยานพาหนะกำลังขับเคลื่อน ให้ใช้IgnitionOnเป็นทริกเกอร์เริ่มต้นและIgnitionOffเป็นทริกเกอร์หยุด การกำหนดค่ายังคงทำงานอยู่ในอุปกรณ์ แต่จะ "หยุดชั่วคราว" (หยุดรวบรวมและประมวลผล) อย่างมีประสิทธิภาพเมื่อทริกเกอร์การหยุดเริ่มทำงาน และจะกลับมาทำงานอีกครั้งเมื่อทริกเกอร์การเริ่มต้นเริ่มทำงานอีกครั้งเท่านั้นสำคัญ: การดำเนินการนี้จะหยุดการรวบรวมข้อมูลชั่วคราวเท่านั้น แต่ไม่ได้กำหนดหน้าต่างเชิงตรรกะ ชุดข้อมูลแยกต่างหาก หรือมีผลข้างเคียงอื่นๆ ค่าของ Aggregator จะไม่รีเซ็ตเมื่อการรวบรวมหยุดชั่วคราวหรือกลับมาทำงานอีกครั้ง
การตรวจจับแบบครั้งเดียว (เสร็จสิ้น): ใช้
deactivate_trigger_nameหากการกำหนดค่าควรทำงานเพียงครั้งเดียว (เช่น เพื่อตรวจจับการเกิดรหัสข้อผิดพลาดที่เฉพาะเจาะจงเป็นครั้งแรก) แล้วปิดใช้งานตัวเองอย่างถาวรในอุปกรณ์นั้น แม้ว่าในทางเทคนิคแล้วแคมเปญจะยังทำงานอยู่ก็ตาม
หากคุณไม่ได้ระบุทริกเกอร์วงจร การเก็บรวบรวมข้อมูลจะเริ่มทันทีเมื่อแคมเปญเปิดใช้งานการกำหนดค่า และจะดำเนินต่อไปอย่างต่อเนื่องจนกว่าแคมเปญจะสิ้นสุด
| ฟิลด์วงจรระดับบนสุด (ออบเจ็กต์รูท) | |
|---|---|
ไม่บังคับstart_trigger_name |
ชื่อทริกเกอร์ที่เริ่มเซสชันการรวบรวม ตั้งค่าได้โดยไม่ต้องใช้ stop_trigger_name |
ไม่บังคับstop_trigger_name |
ชื่อทริกเกอร์ที่หยุดเซสชันการรวบรวมชั่วคราว (เช่น เมื่อยานพาหนะจอดอยู่กับที่) หากตั้งค่าไว้ คุณต้องตั้งค่า start_trigger_name ด้วย |
ไม่บังคับdeactivate_trigger_name |
ชื่อของทริกเกอร์ที่สรุปและปิดใช้งาน `MetricsConfig` ทั้งหมด |
ขั้นสูง: คำจำกัดความของโปรโตที่กำหนดเอง
ใน 2 กรณีหลักๆ vs_version เพียงอย่างเดียวไม่เพียงพอที่จะทำให้ MCG เข้าใจข้อความทุกประเภทในคำอธิบายของการกำหนดค่าเมตริก
- การอนุมานประเภทไม่สำเร็จ: ตามที่อธิบายไว้ในรูปแบบ
source_identifierMCG จะอนุมานประเภทไม่ได้เมื่อsource_identifierใช้ FQIN หรือชื่อที่กำหนดเอง - ข้อความที่กำหนดเอง: คำอธิบายการกำหนดค่าเมตริกใช้ข้อความ protobuf ที่ไม่พบในแคตตาล็อก VSIDL ที่ระบุใน
vs_versionกรณีนี้จะเกิดขึ้นเมื่อตั้งค่าmessage_typeในmessage_builderสำหรับรูปแบบรายงานที่กำหนดเอง
ในกรณีเหล่านี้ ให้ใช้ data_source_message_types เพื่อช่วยให้ MCG อนุมานประเภท และใช้ descriptor_protos เพื่อระบุคำจำกัดความของข้อความ
data_source_message_types
แมปสตริง source_identifier กับประเภทข้อความ protobuf ที่สมบูรณ์ในตัวเอง
คีย์ใน data_source_message_types ต้องตรงกับค่า source_identifier จากรายการ data_sources ดังนี้
"data_source_message_types": {
"MyCustomSpeedService": "com.sdv.example.SampleMessage"
}
descriptor_protos
ระบุคำจำกัดความสำหรับประเภทข้อความที่ใช้ใน data_source_message_types หรือ message_builder ซึ่งไม่ได้อยู่ใน vs_version ที่กำหนดค่าไว้
ส่ง descriptorpb.FileDescriptorSet ที่เข้ารหัส Base64 ในอาร์เรย์ descriptor_protos สร้างไฟล์นี้จากไฟล์ .proto โดยใช้คอมไพเลอร์ Protobuf protoc
"descriptor_protos": [
"Cu8BCiZtY2cvdGVzdGRhdGEvbWF4YXZnY3..." // Base64 string
]
ตัวอย่าง: คำอธิบายการกำหนดค่าที่สมบูรณ์
ส่วนก่อนหน้านี้จะกำหนดองค์ประกอบทั้งหมดสำหรับตัวอย่าง ซึ่งก็คือการสร้างรายงานทุกนาทีพร้อมความเร็วเฉลี่ยของยานพาหนะที่สังเกตได้ในนาทีนั้น
โดยมีองค์ประกอบดังนี้
- แหล่งข้อมูล (
SpeedSource) เพื่อรับข้อมูลความเร็วสูงสุด 1 ครั้งต่อวินาที - ทริกเกอร์ข้อมูล (
OnNewSpeed) ที่เริ่มทำงานเมื่อSpeedSourceส่งข้อมูล - ทริกเกอร์เป็นระยะ (
EveryMinute) ที่เริ่มทำงานทุก 60 วินาที - เครื่องมือรวบรวมข้อมูล (
SpeedAggregator) ที่ใช้OnNewSpeedเพื่อคำนวณความเร็วเฉลี่ย นับค่าที่อ่านได้ และจัดเก็บค่าล่าสุด โดยจะรีเซ็ตเมื่อมีการอ่านค่า - การกำหนดค่ารายงาน (
MinuteReport) ที่ใช้EveryMinuteเพื่อทริกเกอร์รายงานที่มีความเร็วและจำนวนเฉลี่ยจากSpeedAggregator - ฟิลด์ระดับบนสุด (
existing_uuid,vs_version) เพื่อระบุการกำหนดค่าเมตริกและระบุแคตตาล็อก VSIDL ที่จะใช้สำหรับคำจำกัดความของสัญญาณ
เมื่อรวมกันแล้ว ส่วนประกอบเหล่านี้จะสร้างคำอธิบายที่สมบูรณ์ของการกำหนดค่าเมตริก ดังนี้
{ "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" } } ] } } ] }
เทมเพลตอ้างอิง
ดูคำจำกัดความของ API ได้ที่เอกสารอ้างอิง MCG API
ส่วนต่อไปนี้จะแสดงข้อมูลอ้างอิงที่สมบูรณ์ของคำอธิบายการกำหนดค่าเมตริก ใช้เป็นแนวทางในการสร้างคำอธิบายการกำหนดค่าเมตริกของคุณเอง
ฟิลด์ระดับบนสุด
{
"existing_uuid": "1cbec8e6-46f5-4649-9fa2-09f81bc93f8b", // 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
}
อินพุต: แหล่งข้อมูลและผู้รวบรวมข้อมูล
{
"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
}
}
]
}
}
]
}
ตรรกะและการประมวลผล: ทริกเกอร์
{
"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 }
}
}
}
}
]
}
เอาต์พุต: การกำหนดค่ารายงาน
{
"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"
}
}
]
}
}
]
}
ไวยากรณ์ของนิพจน์
| หมวดหมู่ | ไวยากรณ์ | คำอธิบาย |
|---|---|---|
| การเข้าถึงข้อมูล | source_namesource_name.fieldsource_name.field.subfield |
เข้าถึงข้อความแบบเต็มจากแหล่งข้อมูลหรือผู้รวบรวมข้อมูล เข้าถึงฟิลด์ที่เฉพาะเจาะจงในข้อความ (รวมถึงฟิลด์ที่ฝัง) |
| เลขคณิต | +, -, *, /, %, ** |
คณิตศาสตร์มาตรฐาน ** คือการยกกำลัง |
| ตรรกะ | &&, ||, !, ^ |
AND, OR, NOT, XOR |
| เชิงความสัมพันธ์ | ==, !=, <, <=, >, >= |
== และ != ใช้ได้กับทุกประเภท ส่วนบางรายการต้องใช้ตัวเลข |
| List | contains(list, item)doesnotcontain(list, item)alleq(list, value) |
ดำเนินการกับเวกเตอร์ (อาร์เรย์) alleq(list, value) จะแสดงผล true หากรายการทั้งหมดใน list เท่ากับ value |
| ฟังก์ชัน | timestamp(clock_type) |
เวลาปัจจุบันในหน่วยไมโครวินาทีclock_type: REALTIME_CLOCK หรือMONOTONIC_TIME_SINCE_BOOT_OR_RESUME |
abs(n) |
ค่าสัมบูรณ์ | |
floor(n), round(n), ceil(n) |
ฟังก์ชันการปัดเศษ | |
| ลำดับการดำเนินการ | () |
การจัดกลุ่มมาตรฐานสำหรับลำดับความสำคัญ |