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

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

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

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

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

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

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

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

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

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

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

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

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

RPC และ Configurable Publisher Registry เท่านั้น ออบเจ็กต์สำหรับกำหนดค่าแหล่งข้อมูลด้วยช่องต่อไปนี้

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

บริการ 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 จากแหล่งข้อมูล SpeedSource
  • SpeedSource.speed > 27.7: ประเมินเป็น true หากความเร็วมากกว่า 27.7 ม./วิ (ประมาณ 100 กม./ชม.)

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

ทริกเกอร์จะกำหนดเวลาที่การดำเนินการจะทำงาน ซึ่งได้แก่ การประเมิน Aggregator, การสร้างรายงาน หรือการควบคุมวงจรการรวบรวมข้อมูล เพิ่มทริกเกอร์ที่กำหนดไว้ทั้งหมดลงในอาร์เรย์ 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 ต้องมีประเภทเงื่อนไขที่ใช้ได้เพียงประเภทเดียวเป็นคีย์ ดูข้อมูลเพิ่มเติมได้ที่ทริกเกอร์แบบมีเงื่อนไข

ฟิลด์ของออบเจ็กต์ condition_type (แยกกัน)
is_true

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

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

มีออบเจ็กต์ rising_options ได้ (ดูตัวเลือก Edge)

falling_edge

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

มีออบเจ็กต์ falling_options ได้ (ดูตัวเลือก Edge)

all_changes

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

มี rising_options, falling_options หรือทั้ง 2 อย่างได้ (ดูตัวเลือก 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

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

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

  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": "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_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) ฟังก์ชันการปัดเศษ
ลำดับการดำเนินการ () การจัดกลุ่มมาตรฐานสำหรับลำดับความสำคัญ