รูปแบบ JSON ของคำขอสร้างการกำหนดค่าเมตริก

คู่มือนี้จะอธิบายรูปแบบคำขอ JSON สำหรับ ปลายทาง /api/v1/generate_metrics_config ของเครื่องมือตัวสร้างการกำหนดค่าเมตริก (MCG) รูปแบบนี้ช่วยให้คุณกำหนดแคมเปญการวัดและส่งข้อมูล ได้ โดยระบุการเก็บรวบรวมข้อมูล การประมวลผลในอุปกรณ์ และการสร้างรายงาน ในโครงสร้างที่มนุษย์อ่านได้

เครื่องมือ MCG จะตรวจสอบออบเจ็กต์ JSON นี้ โดยตรวจหาปัญหาต่างๆ เช่น ประเภทไม่ตรงกัน การขึ้นต่อกันแบบเวียนกลับ หรือการอ้างอิงที่ไม่ได้กำหนด จากนั้นจะคอมไพล์ออบเจ็กต์เป็นข้อความ MetricsConfig บัฟเฟอร์โปรโตคอล (protobuf) MetricsConfig ข้อความนี้เป็นรูปแบบไบนารีที่บริการการวัดและส่งข้อมูลทางไกลในอุปกรณ์ดำเนินการ เพื่อเรียกใช้แคมเปญ

ข้อกำหนดเบื้องต้น: คุณควรคุ้นเคยกับสคีมา JSON, protobuf และโครงสร้างข้อมูลพื้นฐาน ดูภาพรวมเชิงแนวคิดได้ที่แนวคิดการกำหนดค่าเมตริก

วิธีการเขียนคำอธิบายการกำหนดค่า

หากต้องการออกแบบแคมเปญการรวบรวมเมตริก ให้ทําตามขั้นตอนต่อไปนี้

  1. ระบุแหล่งข้อมูล: กำหนดว่าข้อมูลมาจากไหน
  2. กำหนดตรรกะและการประมวลผล: ตั้งค่ากฎสำหรับเวลาที่ควรรวบรวมข้อมูลและวิธีประมวลผล
  3. สร้างเอาต์พุต: จัดแพ็กเกจข้อมูลที่ประมวลผลแล้วเป็นข้อความสุดท้าย
  4. ฟิลด์ระดับบนสุด: เพิ่มฟิลด์ระดับบนสุด เช่น UUID, signal definitions และlifecycle control

ตัวอย่าง: รายงานความเร็วเฉลี่ย

คู่มือนี้ใช้ตัวอย่างเพื่อแสดงให้เห็นว่าคอมโพเนนต์ทั้งหมดทำงานร่วมกันอย่างไร โดยจะสร้างรายงานที่คำนวณความเร็วเฉลี่ยของยานพาหนะทุกนาที โดยจะกำหนดแหล่งข้อมูล (SpeedSource) เพื่อรวบรวมข้อมูลความเร็ว ทริกเกอร์ (OnNewSpeed, EveryMinute) เพื่อควบคุมโฟลว์การดำเนินการ ตัวรวบรวม (SpeedAggregator) เพื่อคำนวณค่าเฉลี่ย และการกำหนดค่ารายงานเมตริก (MinuteReport) เพื่อจัดแพ็กเกจผลลัพธ์ ตัวอย่างในส่วนที่ขยายได้ จะอิงตามสถานการณ์นี้

ระบุแหล่งข้อมูล

การวัดและส่งข้อมูลทางไกลรองรับการรวบรวมข้อมูลจากบริการ SDV (ผ่านมิดเดิลแวร์ SDV) และผู้เผยแพร่โฆษณาที่อิงตามรีจิสทรีของผู้เผยแพร่โฆษณาที่กำหนดค่าได้

หากต้องการใช้ข้อมูลใน SDV ให้กำหนดแหล่งข้อมูล (แนวคิด) แล้วเพิ่มลงในอาร์เรย์ data_sources

ฟิลด์ของออบเจ็กต์แหล่งข้อมูล (รายการในdata_sourcesรายการ)
name สตริงที่ผู้ใช้กำหนดซึ่งระบุแหล่งข้อมูลนี้ในการกำหนดค่าเมตริก
source_identifier ตัวระบุที่ใช้ในการค้นพบบริการ ดูรายละเอียดได้ที่รูปแบบ source_identifier
connection_type SUBSCRIPTION สำหรับสตรีมข้อมูลต่อเนื่อง (ต้องใช้สำหรับทริกเกอร์ข้อมูล) หรือ ON_DEMAND สำหรับ การดึงข้อมูลตามต้องการ (ดูรายละเอียดได้ที่การกำหนดค่าแหล่งข้อมูล)
ไม่บังคับ
configuration

RPC และรีจิสทรีของผู้เผยแพร่โฆษณาที่กำหนดค่าได้เท่านั้น ออบเจ็กต์สําหรับกําหนดค่าแหล่งข้อมูลที่มีช่องต่อไปนี้

type_url FQN ของข้อความ Protobuf ของการกำหนดค่า
value_json,
value_textproto,
หรือ value
เพย์โหลดในรูปแบบ JSON, Textproto หรือ Base64
ฟิลด์สำหรับประเภทการเชื่อมต่อ 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 จากแหล่งข้อมูล SpeedSource
  • SpeedSource.speed > 27.7: ประเมินเป็น true หากความเร็วมากกว่า 27.7 ม./วินาที (ประมาณ 100 กม./ชม.)

ทริกเกอร์: กำหนดเวลาที่การดำเนินการจะเกิดขึ้น

ทริกเกอร์จะกําหนดเวลาที่การดําเนินการทํางาน ได้แก่ การประเมินเครื่องมือรวบรวม การสร้างรายงาน หรือการควบคุมวงจรการรวบรวม เพิ่มทริกเกอร์ที่กําหนดทั้งหมดลงในอาร์เรย์ triggers ระดับบนสุด

ฟิลด์ของออบเจ็กต์ทริกเกอร์ (รายการในลิสต์ triggers)
name ตัวระบุที่ไม่ซ้ำกันสำหรับทริกเกอร์นี้ในการกำหนดค่าเมตริก
periodic
data
conditional
คุณต้องระบุฟิลด์เหล่านี้อย่างใดอย่างหนึ่งเท่านั้นเพื่อกำหนดลักษณะการทำงาน

ทริกเกอร์ข้อมูล

ทริกเกอร์จะทำงานเมื่อ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_true

is_false
ทริกเกอร์เมื่อนิพจน์บูลีนประเมินค่าเป็น true หรือ false ตามลำดับ
rising_edge

หากเป็นตัวเลข จะทริกเกอร์เมื่อค่าเพิ่มขึ้น หากนิพจน์เป็น บูลีน จะทริกเกอร์เมื่อเปลี่ยนจาก false เป็น true

อาจมีออบเจ็กต์ rising_options (ดูตัวเลือกขอบ)

falling_edge

หากเป็นตัวเลข จะทริกเกอร์เมื่อค่าลดลง หากนิพจน์เป็น บูลีน จะทริกเกอร์เมื่อเปลี่ยนจาก true เป็น false

อาจมีออบเจ็กต์ falling_options (ดูตัวเลือกขอบ)

all_changes

ทริกเกอร์เมื่อผลลัพธ์ของนิพจน์แตกต่างจากค่าก่อนหน้า หากตั้งค่าตัวเลือกขอบไว้ ระบบจะรองรับเฉพาะค่าตัวเลขและค่าบูลีน

มี rising_options, falling_options หรือทั้ง 2 อย่างได้ (ดูตัวเลือก Edge)

ตัวเลือกขอบ

ออบเจ็กต์ 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

ออบเจ็กต์ที่กำหนดวิธีที่ระบบคำนวณค่าของฟิลด์โดยมีฟิลด์ต่อไปนี้

@type ฟังก์ชันการรวมข้อมูล

  • avg, min, max, sum, stddev: สถิติทางคณิตศาสตร์มาตรฐาน
  • count: นับจำนวนครั้งที่มีการทริกเกอร์ตัวรวบรวมนี้
  • delta: ความแตกต่างระหว่างค่าปัจจุบันกับค่าก่อนหน้า
  • vector: สร้างรายการค่า (บัฟเฟอร์แบบวงกลม)
  • none: ส่งค่าดิบผ่าน
expression นิพจน์อินพุตสำหรับการรวม ต้องระบุสำหรับ การรวมข้อมูลทุกประเภท ยกเว้น count
max_length สำหรับ @type: "vector" เท่านั้น จำนวนเต็มที่ไม่บังคับซึ่ง จำกัดขนาดเวกเตอร์เพื่อสร้างบัฟเฟอร์แบบวงกลม

ตัวอย่าง: ผู้รวบรวม

สำหรับตัวอย่าง ให้คำนวณสถิติระหว่างรายงานรายนาที 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 เข้าใจข้อความทุกประเภทในคำอธิบายของการกำหนดค่าเมตริก

  1. การอนุมานประเภทล้มเหลว: ดังที่อธิบายไว้ในsource_identifier รูปแบบ MCG จะอนุมานประเภทไม่ได้เมื่อ source_identifier ใช้ FQIN หรือชื่อที่กำหนดเอง
  2. ข้อความที่กำหนดเอง: คำอธิบายการกำหนดค่าเมตริกใช้ข้อความ 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_name
source_name.field
source_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) ฟังก์ชันการปัดเศษ
ลำดับการดำเนินการ () การจัดกลุ่มมาตรฐานสำหรับลำดับความสำคัญ