คู่มือนี้จะอธิบายรูปแบบคำขอ JSON สำหรับ
ปลายทาง /api/v1/generate_metrics_config ของเครื่องมือตัวสร้างการกำหนดค่าเมตริก (MCG)
รูปแบบนี้ช่วยให้คุณกำหนดแคมเปญการวัดและส่งข้อมูล
ได้ โดยระบุการเก็บรวบรวมข้อมูล การประมวลผลในอุปกรณ์ และการสร้างรายงาน
ในโครงสร้างที่มนุษย์อ่านได้
เครื่องมือ MCG จะตรวจสอบออบเจ็กต์ JSON นี้ โดยตรวจหาปัญหาต่างๆ เช่น ประเภทไม่ตรงกัน การขึ้นต่อกันแบบเวียนกลับ หรือการอ้างอิงที่ไม่ได้กำหนด จากนั้นจะคอมไพล์ออบเจ็กต์เป็นข้อความ MetricsConfig บัฟเฟอร์โปรโตคอล (protobuf) MetricsConfig
ข้อความนี้เป็นรูปแบบไบนารีที่บริการการวัดและส่งข้อมูลทางไกลในอุปกรณ์ดำเนินการ
เพื่อเรียกใช้แคมเปญ
ข้อกำหนดเบื้องต้น: คุณควรคุ้นเคยกับสคีมา JSON, protobuf และโครงสร้างข้อมูลพื้นฐาน ดูภาพรวมเชิงแนวคิดได้ที่แนวคิดการกำหนดค่าเมตริก
วิธีการเขียนคำอธิบายการกำหนดค่า
หากต้องการออกแบบแคมเปญการรวบรวมเมตริก ให้ทําตามขั้นตอนต่อไปนี้
- ระบุแหล่งข้อมูล: กำหนดว่าข้อมูลมาจากไหน
- กำหนดตรรกะและการประมวลผล: ตั้งค่ากฎสำหรับเวลาที่ควรรวบรวมข้อมูลและวิธีประมวลผล
- สร้างเอาต์พุต: จัดแพ็กเกจข้อมูลที่ประมวลผลแล้วเป็นข้อความสุดท้าย
- ฟิลด์ระดับบนสุด: เพิ่มฟิลด์ระดับบนสุด เช่น UUID, signal definitions และlifecycle control
ตัวอย่าง: รายงานความเร็วเฉลี่ย
คู่มือนี้ใช้ตัวอย่างเพื่อแสดงให้เห็นว่าคอมโพเนนต์ทั้งหมดทำงานร่วมกันอย่างไร โดยจะสร้างรายงานที่คำนวณความเร็วเฉลี่ยของยานพาหนะทุกนาที โดยจะกำหนดแหล่งข้อมูล (SpeedSource) เพื่อรวบรวมข้อมูลความเร็ว ทริกเกอร์ (OnNewSpeed, EveryMinute) เพื่อควบคุมโฟลว์การดำเนินการ ตัวรวบรวม (SpeedAggregator) เพื่อคำนวณค่าเฉลี่ย และการกำหนดค่ารายงานเมตริก (MinuteReport) เพื่อจัดแพ็กเกจผลลัพธ์ ตัวอย่างในส่วนที่ขยายได้
จะอิงตามสถานการณ์นี้
ระบุแหล่งข้อมูล
การวัดและส่งข้อมูลทางไกลรองรับการรวบรวมข้อมูลจากบริการ SDV (ผ่านมิดเดิลแวร์ SDV) และผู้เผยแพร่โฆษณาที่อิงตามรีจิสทรีของผู้เผยแพร่โฆษณาที่กำหนดค่าได้
บริการ SDV (อิงตาม Pub/Sub): ข้อมูลจะพร้อมใช้งานจากแชแนล Pub/Sub ที่กำหนดไว้ใน VSIDL
บริการ SDV (อิงตาม RPC): ข้อมูลจะพร้อมใช้งานหากบริการแสดง
CreateSubscriptionหรือGetLatestMessageRPCผู้เผยแพร่โฆษณาที่อิงตามรีจิสทรีของผู้เผยแพร่โฆษณาที่กำหนดค่าได้: ข้อมูลจะพร้อมใช้งานหากแอปพลิเคชันลงทะเบียนตัวเองโดยใช้
IConfigurablePublisherRegistryอินเทอร์เฟซ Android Binder หรือไลบรารีรีจิสทรีของผู้เผยแพร่โฆษณาที่กำหนดค่าได้จาก Telemetry SDK
หากต้องการใช้ข้อมูลใน SDV ให้กำหนดแหล่งข้อมูล (แนวคิด) แล้วเพิ่มลงในอาร์เรย์
data_sources
ฟิลด์ของออบเจ็กต์แหล่งข้อมูล (รายการในdata_sourcesรายการ) |
|||||
|---|---|---|---|---|---|
name |
สตริงที่ผู้ใช้กำหนดซึ่งระบุแหล่งข้อมูลนี้ในการกำหนดค่าเมตริก | ||||
source_identifier |
ตัวระบุที่ใช้ในการค้นพบบริการ ดูรายละเอียดได้ที่รูปแบบ source_identifier |
||||
connection_type |
SUBSCRIPTION สำหรับสตรีมข้อมูลต่อเนื่อง (ต้องใช้สำหรับทริกเกอร์ข้อมูล) หรือ ON_DEMAND สำหรับ
การดึงข้อมูลตามต้องการ (ดูรายละเอียดได้ที่การกำหนดค่าแหล่งข้อมูล) |
||||
ไม่บังคับconfiguration |
RPC และรีจิสทรีของผู้เผยแพร่โฆษณาที่กำหนดค่าได้เท่านั้น ออบเจ็กต์สําหรับกําหนดค่าแหล่งข้อมูลที่มีช่องต่อไปนี้
|
||||
ฟิลด์สำหรับประเภทการเชื่อมต่อ SUBSCRIPTION |
|||||
ไม่บังคับsub_sampling_interval_ms |
Pub/sub เท่านั้น จำนวนเต็มที่ไม่ใช่ค่าลบ (มิลลิวินาที) เพื่อควบคุมความถี่ของข้อความ โดยการระบุช่วงเวลาขั้นต่ำระหว่างข้อความ | ||||
ไม่บังคับfetch_last_message(ค่าเริ่มต้น: false) |
Pub/Sub เท่านั้น บูลีน หาก true
ดึงข้อความล่าสุดเมื่อเชื่อมต่อ |
||||
ตัวเลือกบางอย่างอาจไม่พร้อมใช้งานสำหรับแหล่งข้อมูลบางประเภท ดูข้อมูลโดยละเอียดได้ที่คำแนะนำการผสานรวมแหล่งข้อมูล
รูปแบบของ source_identifier
บริการการวัดและส่งข้อมูลยอมรับรูปแบบตัวระบุแหล่งที่มาหลายรูปแบบ ดูภาพรวมได้ที่คำจำกัดความแหล่งข้อมูลในการกำหนดค่าเมตริก
MCG จะอนุมานประเภทข้อความ protobuf จาก source_identifier ก็ต่อเมื่อใช้รูปแบบชื่อประเภทหน่วยเท่านั้น หากคุณใช้ 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: ใช้ข้อความที่ได้รับล่าสุดซึ่งแคชโดยบริการการวัดและส่งข้อมูลทางไกล (หมายเหตุ: หากตั้งค่า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 กม./ชม.)
ทริกเกอร์: กำหนดเวลาที่การดำเนินการจะเกิดขึ้น
ทริกเกอร์จะกําหนดเวลาที่การดําเนินการทํางาน ได้แก่ การประเมินเครื่องมือรวบรวม การสร้างรายงาน หรือการควบคุมวงจรการรวบรวม เพิ่มทริกเกอร์ที่กําหนดทั้งหมดลงในอาร์เรย์ 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 พจนานุกรมต้องมีประเภทเงื่อนไขที่ใช้ได้ 1 ประเภทเป็นคีย์ ดูข้อมูลเพิ่มเติมได้ที่ทริกเกอร์แบบมีเงื่อนไข
ฟิลด์ของออบเจ็กต์ condition_type (เป็นข้อมูลแยกกัน) |
|
|---|---|
is_trueis_false |
ทริกเกอร์เมื่อนิพจน์บูลีนประเมินค่าเป็น true หรือ false ตามลำดับ |
rising_edge |
หากเป็นตัวเลข จะทริกเกอร์เมื่อค่าเพิ่มขึ้น หากนิพจน์เป็น
บูลีน จะทริกเกอร์เมื่อเปลี่ยนจาก อาจมีออบเจ็กต์ |
falling_edge |
หากเป็นตัวเลข จะทริกเกอร์เมื่อค่าลดลง หากนิพจน์เป็น
บูลีน จะทริกเกอร์เมื่อเปลี่ยนจาก อาจมีออบเจ็กต์ |
all_changes |
ทริกเกอร์เมื่อผลลัพธ์ของนิพจน์แตกต่างจากค่าก่อนหน้า หากตั้งค่าตัวเลือกขอบไว้ ระบบจะรองรับเฉพาะค่าตัวเลขและค่าบูลีน มี |
ตัวเลือกขอบ
ออบเจ็กต์ rising_options และ falling_options มีฟิลด์ต่อไปนี้ หากระบุไว้ การเปลี่ยนที่เกี่ยวข้องต้องเป็นไปตามข้อกำหนดด้านระยะเวลา
การเปลี่ยนฉากที่ไม่มีตัวเลือกที่ระบุจะเริ่มทำงานทันที
| ฟิลด์สำหรับออบเจ็กต์ตัวเลือก Edge | |
|---|---|
min_duration_ms |
ตัวเลขที่ไม่ใช่ค่าลบ (เป็นมิลลิวินาที) ที่ระบุระยะเวลา ที่เงื่อนไขต้องคงอยู่ในสถานะใหม่ก่อนที่ทริกเกอร์จะเริ่มทำงาน |
ไม่บังคับrequire_exact |
บูลีน หากเป็นจริง ค่าทั้งหมดที่เผยแพร่ในระยะเวลาดังกล่าวต้อง เหมือนกันเพื่อให้ทริกเกอร์เริ่มทำงาน |
ตัวอย่าง: ทริกเกอร์แบบมีเงื่อนไข
ทริกเกอร์ต่อไปนี้ใช้ตัวเลือกขอบ โดยจะทำงานหากความเร็วเกิน 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 } } } } }
ผู้รวบรวม: กำหนดวิธีประมวลผลข้อมูล
ใช้ตัวรวบรวมสำหรับการประมวลผลข้อมูลระดับกลางแบบมีสถานะ (แนวคิด)
กำหนดตัวรวบรวมและเพิ่มลงในอาร์เรย์ aggregators
ผู้รวบรวมจะแปลงข้อมูลและทำให้ข้อมูลพร้อมใช้งานสำหรับผู้รวบรวมและรายงานอื่นๆ
ฟิลด์ของผู้รวบรวมข้อมูล (รายการในรายการ aggregators) |
|
|---|---|
name |
สตริงที่ผู้ใช้กำหนดซึ่งระบุผู้รวบรวมข้อมูลนี้ นิพจน์ สามารถอ้างอิงตัวรวบรวมนี้ตามชื่อเพื่อเข้าถึงผลลัพธ์ |
trigger_names |
อาร์เรย์ของชื่อทริกเกอร์อย่างน้อย 1 ชื่อที่ทำให้ระบบประเมินการรวบรวมนี้ |
ไม่บังคับreset_on_get |
บูลีน ค่าเริ่มต้นคือ `false` หากเป็น `true` ระบบ จะรีเซ็ตสถานะการรวมหลังจากที่ผู้รวบรวมข้อมูลอื่น รายงานเมตริก หรือทริกเกอร์แบบมีเงื่อนไขเข้าถึงค่า |
message_builder |
กำหนดข้อมูลที่จะอ่าน ประมวลผล และรวบรวม จากนั้นฟิลด์ของ
ข้อความเอาต์พุตจะกลายเป็นแหล่งข้อมูลสำหรับผู้รวบรวมข้อมูลและรายงานอื่นๆ
โดยใช้ field_assignments และการกำหนดแต่ละรายการ
จะกำหนดฟิลด์ในข้อความเอาต์พุต |
เครื่องมือสร้างข้อความ
ออบเจ็กต์ message_builder จะกําหนดโครงสร้างข้อความเอาต์พุตและตรรกะการรวบรวมที่ใช้ในการคํานวณฟิลด์ของออบเจ็กต์ดังกล่าว โดยจะใช้ทั้งใน Aggregators
และ Report Configurations
ฟิลด์ของออบเจ็กต์ message_builder (ในเครื่องมือรวบรวมข้อมูลหรือรายงาน) |
|
|---|---|
message_type |
ชื่อที่สมบูรณ์ในตัวเองของประเภทข้อความ Protobuf สำหรับเอาต์พุต หากไม่ได้ระบุ MCG จะสร้างประเภทข้อความที่กำหนดเองตาม
field_assignments' ประเภทเอาต์พุตที่อนุมาน ใช้เฉพาะในกรณีที่เครื่องมือสร้างข้อความเป็นส่วนหนึ่งของรายงานเมตริก และรายงานต้องตรงกับคำจำกัดความของข้อความ Protobuf ที่กำหนดไว้ล่วงหน้าโดยเฉพาะ |
field_assignments |
อาร์เรย์ของออบเจ็กต์คำจำกัดความของฟิลด์ ออบเจ็กต์แต่ละรายการจะระบุฟิลด์ใน ข้อความเอาต์พุตและตรรกะในการคำนวณค่า |
ฟิลด์ของออบเจ็กต์การกำหนดฟิลด์ (รายการในfield_assignments list) |
|||||||
|---|---|---|---|---|---|---|---|
field_name |
ชื่อที่ผู้ใช้กำหนดสำหรับฟิลด์ ระบุค่าที่เฉพาะเจาะจง
ภายในออบเจ็กต์เมื่อใช้นิพจน์แบบจุด
(aggregator_name.field_name) |
||||||
aggregation |
ออบเจ็กต์ที่กำหนดวิธีที่ระบบคำนวณค่าของฟิลด์โดยมีฟิลด์ต่อไปนี้
|
||||||
ตัวอย่าง: ผู้รวบรวม
สำหรับตัวอย่าง ให้คำนวณสถิติระหว่างรายงานรายนาที OnNewSpeed จะทริกเกอร์ตัวรวบรวมข้อมูลนี้เพื่อคำนวณความเร็วเฉลี่ย (avg) นับค่าที่อ่านได้ (count) และจัดเก็บค่าความเร็ว 5 ค่าล่าสุด (vector) ตั้งค่า reset_on_get เป็น true ซึ่งจะรีเซ็ตสถิติทุกครั้งที่ MinuteReport
อ่านข้อมูล โดยจะเริ่มช่วงการรวบรวมใหม่สำหรับผู้รวบรวมในนาทีถัดไป
{ "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 (แนวคิด) การกำหนดค่าเหล่านี้จะกำหนดวิธีแพ็กเกจข้อมูลที่ประมวลผลแล้วและเวลาที่สร้างข้อมูล คุณสามารถกำหนดค่ารายงานหลายรายการในการกำหนดค่าเมตริกเดียวเพื่อนำคอมโพเนนต์กลับมาใช้ใหม่ได้
คุณควบคุมการสร้างรายงานได้โดยใช้ฟิลด์ trigger_names นอกจากนี้ คุณยังใช้ report_initial เพื่อสร้างรายงานทันทีเมื่อการกำหนดค่า
เปิดใช้งาน และ report_incomplete เพื่อสร้างรายงานสุดท้ายเมื่อการรวบรวมข้อมูล
ถูกขัดจังหวะ
หมายเหตุ: หากต้องการเชื่อมต่อการประมวลผลกับเอาต์พุต ให้ใช้noneประเภทการรวบรวม
(@type: "none") เพื่ออ่านค่าที่คำนวณไว้ล่วงหน้าจาก 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 แต่ละรายการต้องมีตัวระบุที่ไม่ซ้ำกับผู้อื่น (UUID) หากคุณระบุ existing_uuid MCG จะใช้ existing_uuid ดังกล่าว ไม่เช่นนั้น ระบบจะสร้างรหัสแบบสุ่ม ระบุ existing_uuid เพื่อให้การติดตั้งใช้งานและเครื่องมือต่างๆ สอดคล้องกัน
สตริงต้องเป็น UUID ที่มีขีดกลางที่ถูกต้องซึ่งมีเฉพาะตัวอักษรพิมพ์เล็ก
"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
คำจำกัดความของสัญญาณ
หากต้องการตรวจสอบชื่อและประเภทสัญญาณ MCG ต้องมีสิทธิ์เข้าถึงแคตตาล็อกสัญญาณยานพาหนะ
ซึ่งเป็น Protobuf FileDescriptorSet ที่มีคำจำกัดความ VSIDL .proto (แพ็กเกจและอัปโหลดไปยัง MCG) ดูรายละเอียดเกี่ยวกับการสร้างและ
อัปโหลดแคตตาล็อกได้ที่แคตตาล็อกสัญญาณยานพาหนะ
ระบุเวอร์ชันแคตตาล็อกในฟิลด์ vs_version ของออบเจ็กต์ JSON ดังนี้
"vs_version": "v1.0",
กำหนดทริกเกอร์วงจรลูกค้า
ในบริบทของแคมเปญการวัดและส่งข้อมูล วงจรของMetricsConfig
จะเป็นตัวกำหนดเวลาที่บันทึกข้อมูลจริง ขณะที่ระบบการจัดการแคมเปญ
กําลังติดตั้งใช้งานและเปิดใช้งานการกําหนดค่าในอุปกรณ์ คุณสามารถใช้ทริกเกอร์วงจร
เพื่อควบคุมเวลาที่เก็บรวบรวมข้อมูลในการติดตั้งใช้งานนั้นได้อย่างแม่นยำ
ซึ่งช่วยให้คุณปรับการเก็บรวบรวมข้อมูลให้สอดคล้องกับรูปแบบการใช้งานยานพาหนะ เช่น "การเดินทาง" (IgnitionOn ถึง IgnitionOff) หรือ "เซสชันการชาร์จ" โดยไม่ต้อง
ปิดใช้งานการกำหนดค่า
การควบคุมเซสชัน (เริ่ม/หยุดชั่วคราว): ใช้
start_trigger_nameและstop_trigger_nameเพื่อควบคุมเวลาที่เกิดการรวบรวม เช่น หากต้องการ รวบรวมข้อมูลขณะที่ยานพาหนะกำลังขับเท่านั้น ให้ใช้IgnitionOnเป็นทริกเกอร์เริ่มต้นและIgnitionOffเป็นทริกเกอร์หยุด การกำหนดค่าจะยังคงใช้งานได้ในอุปกรณ์ แต่จะ "หยุดชั่วคราว" (หยุดรวบรวมและประมวลผล) เมื่อทริกเกอร์หยุดทำงาน และจะกลับมาทำงานอีกครั้งเมื่อทริกเกอร์เริ่มทำงานอีกครั้งสำคัญ: การดำเนินการนี้จะหยุดการเก็บรวบรวมชั่วคราวเท่านั้น แต่ไม่ได้กำหนด กรอบเวลาเชิงตรรกะ ชุดข้อมูลแยกต่างหาก หรือมีผลข้างเคียงอื่นๆ ระบบไม่รีเซ็ตค่าตัวรวบรวมเมื่อหยุดชั่วคราวหรือกลับมาดำเนินการรวบรวมต่อ
การตรวจจับแบบครั้งเดียว (เสร็จสิ้น): ใช้
deactivate_trigger_nameหากการกำหนดค่าควรทำงานเพียงครั้งเดียว (เช่น เพื่อตรวจหาการเกิดรหัสข้อบกพร่องที่เฉพาะเจาะจงเป็นครั้งแรก) แล้วปิดใช้งานตัวเองอย่างถาวรในอุปกรณ์นั้น แม้ว่าในทางเทคนิคแล้วแคมเปญจะยังคงใช้งานอยู่ก็ตาม
หากคุณไม่ได้ระบุทริกเกอร์วงจรลูกค้า การเก็บรวบรวมข้อมูลจะเริ่มทันที เมื่อแคมเปญเปิดใช้งานการกำหนดค่า และจะดำเนินการอย่างต่อเนื่อง จนกว่าแคมเปญจะสิ้นสุด
| ฟิลด์วงจรระดับบนสุด (ออบเจ็กต์รูท) | |
|---|---|
ไม่บังคับstart_trigger_name |
ชื่อของทริกเกอร์ที่เริ่มเซสชันการรวบรวม ตั้งค่าได้
โดยไม่ต้องใช้ stop_trigger_name |
ไม่บังคับstop_trigger_name |
ชื่อของทริกเกอร์ที่หยุดเซสชันการรวบรวมชั่วคราว (เช่น เมื่อยานพาหนะจอดอยู่) หากตั้งค่าไว้
ต้องตั้งค่า start_trigger_name ด้วย |
ไม่บังคับdeactivate_trigger_name |
ชื่อของทริกเกอร์ที่ทำให้ `MetricsConfig` เสร็จสมบูรณ์และปิดใช้งานโดยสมบูรณ์ |
ขั้นสูง: คำจำกัดความของโปรโตคอลที่กำหนดเอง
ใน 2 กรณีหลัก vs_version เพียงอย่างเดียวไม่เพียงพอให้ MCG เข้าใจข้อความทุกประเภทในคำอธิบายของการกำหนดค่าเมตริก
- การอนุมานประเภทล้มเหลว: ดังที่อธิบายไว้ใน
source_identifierรูปแบบ MCG จะอนุมานประเภทไม่ได้เมื่อ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": "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
}
อินพุต: แหล่งข้อมูลและผู้รวบรวมข้อมูล
{
"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) |
ฟังก์ชันการปัดเศษ | |
| ลำดับการดำเนินการ | () |
การจัดกลุ่มมาตรฐานสำหรับลำดับความสำคัญ |