درخواست تولید پیکربندی معیارها با فرمت JSON

این راهنما جزئیات فرمت درخواست JSON برای نقطه پایانی /api/v1/generate_metrics_config از ابزار Metrics Configuration Generator (MCG) را شرح می‌دهد. این فرمت به شما امکان می‌دهد یک کمپین تله‌متری - که شامل جمع‌آوری داده‌ها، پردازش روی دستگاه و تولید گزارش است - را در یک ساختار قابل خواندن توسط انسان تعریف کنید.

ابزار MCG این شیء JSON را اعتبارسنجی می‌کند، مواردی مانند عدم تطابق نوع، وابستگی‌های دایره‌ای یا ارجاعات تعریف نشده را بررسی می‌کند و سپس آن را در یک پیام بافر پروتکل MetricsConfig (protobuf) کامپایل می‌کند. این پیام MetricsConfig فرمت دودویی است که سرویس تله‌متری روی دستگاه برای اجرای کمپین اجرا می‌کند.

پیش‌نیازها: شما باید با طرحواره‌های JSON، protobuf و ساختارهای داده اولیه آشنا باشید. برای مرور کلی مفهومی، به مفاهیم پیکربندی Metrics مراجعه کنید.

نحوه نوشتن توضیحات پیکربندی

برای طراحی یک کمپین جمع‌آوری معیارها، این روند منطقی را دنبال کنید:

  1. منابع داده را مشخص کنید : مشخص کنید که داده‌های شما از کجا می‌آیند.
  2. تعریف منطق و پردازش : قوانینی را برای زمان جمع‌آوری داده‌ها و نحوه پردازش آنها تنظیم کنید.
  3. ایجاد خروجی : داده‌های پردازش‌شده را در یک پیام نهایی بسته‌بندی کنید.
  4. فیلدهای سطح بالا : فیلدهای سطح بالا مانند UUID ، تعاریف سیگنال و کنترل چرخه عمر را اضافه کنید.

مثال: گزارش سرعت متوسط

این راهنما از یک مثال برای نشان دادن نحوه‌ی کنار هم قرار گرفتن تمام اجزا استفاده می‌کند. گزارشی ایجاد می‌کند که میانگین سرعت خودرو را در هر دقیقه محاسبه می‌کند. این گزارش یک منبع داده ( SpeedSource ) برای جمع‌آوری داده‌های سرعت، تریگرها ( OnNewSpeed ، EveryMinute ) برای کنترل جریان اجرا، یک تجمیع‌کننده ( SpeedAggregator ) برای محاسبه‌ی میانگین و یک پیکربندی گزارش معیارها ( MinuteReport ) برای بسته‌بندی نتیجه تعریف می‌کند. مثال‌های موجود در بخش‌های قابل توسعه بر اساس این سناریو ساخته می‌شوند.

منابع داده را مشخص کنید

تله‌متری از جمع‌آوری داده‌ها از سرویس‌های SDV (از طریق میان‌افزار SDV) و ناشران مبتنی بر رجیستری ناشر قابل پیکربندی پشتیبانی می‌کند.

برای استفاده از داده‌ها در SDV، یک منبع داده ( concept ) تعریف کنید و آن را به آرایه 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 ، آخرین پیام را پس از اتصال بازیابی می‌کند.

همه گزینه‌ها برای همه انواع منابع داده در دسترس نیستند. برای اطلاعات دقیق‌تر به راهنمای ادغام منبع داده مراجعه کنید.

قالب شناسه منبع

سرویس تله‌متری چندین قالب شناسه منبع را می‌پذیرد. برای مرور کلی، به تعریف منبع داده در تنظیمات متریک مراجعه کنید.

MCG فقط در صورتی نوع پیام protobuf را از source_identifier استنباط می‌کند که از قالب نام نوع واحد استفاده کند. اگر از FQIN یا یک نام سفارشی (از Configurable Publisher Registry) استفاده کنید، MCG نمی‌تواند نوع را استنباط کند. در این موارد، باید data_source_message_types ارائه دهید. اگر نوع در کاتالوگ شما نیست، باید تعریف آن را نیز در descriptor_protos ارائه دهید.

مثال: تعریف منبع داده

این مثال سرعت خودرو را گزارش می‌دهد. ابتدا، برای شناسایی سرویسی که این داده‌ها را منتشر می‌کند، به کاتالوگ VSIDL مراجعه کنید.

با استفاده از کاتالوگ نمونه در کدبیس SDV، سرویس مربوطه را شناسایی کنید. مطابق با قالب source_identifier ، نوع پیام protobuf را mcg.test.subpkg.speed_msg مشخص کنید. از آنجا که speed معمولاً به طور مکرر منتشر می‌شود، sub_sampling_interval_ms برای محدود کردن به‌روزرسانی‌ها به یک پیام در ثانیه استفاده کنید:

{
  "name": "SpeedSource",
  "source_identifier": "mcg.test.subpkg.speed_msg",
  "connection_type": "SUBSCRIPTION",
  "sub_sampling_interval_ms": 1000 // Limit updates to 1 per second
}

تعریف منطق و پردازش

منطق توسط دو مؤلفه که با هم کار می‌کنند، مدیریت می‌شود: محرک‌ها ( concept ) تعریف می‌کنند که چه زمانی اتفاقی می‌افتد. تجمیع‌کننده‌ها ( concept ) نحوه پردازش داده‌ها بر اساس آن محرک‌ها را تعریف می‌کنند. از آنجا که عبارات ( concept ) کلید ایجاد شرایط و منطق تجمیع هستند، این بخش ابتدا نحوه نوشتن آنها را شرح می‌دهد.

عبارات

عبارات به شما امکان می‌دهند محاسبات و شرایط را با استفاده از یک سینتکس قابل خواندن توسط انسان تعریف کنید. MCG این رشته‌ها را به یک فرمت اجرایی بهینه شده برای ارزیابی روی دستگاه کامپایل می‌کند.

عبارات می‌توانند محاسبات حسابی، شرایط منطقی و مقایسه داده‌ها را بیان کنند. برای مشاهده‌ی سینتکس کامل، شامل عملگرها و توابع، به بخش سینتکس عبارات مراجعه کنید.

تازگی داده‌ها: وقتی یک عبارت به منبع داده دسترسی پیدا می‌کند، رفتار بازیابی به نوع اتصال بستگی دارد:

  • SUBSCRIPTION : از آخرین پیام دریافتی ذخیره شده توسط سرویس تله‌متری استفاده می‌کند. (توجه: اگر sub_sampling_interval_ms تنظیم شده باشد، ممکن است با آخرین پیام منتشر شده متفاوت باشد.)
  • ON_DEMAND : یک فراخوانی فوری برای دریافت پیام جدید از سرویس را فعال می‌کند.

محدودیت‌های نوع

  • آرایه‌ها: دسترسی مستقیم به اندیس آرایه (برای مثال، my_data_source.my_array[0] ) پشتیبانی نمی‌شود.
  • ایمنی نوع: مطمئن شوید که انواع سازگار را مقایسه می‌کنید (برای مثال، یک فیلد رشته‌ای را با لیستی از اعداد صحیح مقایسه نکنید).

مثال: عبارات

این مثال برای محاسبه میانگین سرعت، نیاز به استخراج مقدار سرعت دارد. همچنین باید مشخص کند که آیا وسیله نقلیه با سرعت (بیش از ۱۰۰ کیلومتر در ساعت) در حال حرکت است یا خیر. می‌توانید نام فیلدها (در این مورد speed ) را در تعریف پیام protobuf که توسط منبع داده استفاده می‌شود، پیدا کنید. عبارات زیر این کار را انجام می‌دهند:

  • SpeedSource.speed : مقدار فیلد speed را از منبع داده SpeedSource بازیابی می‌کند.
  • SpeedSource.speed > 27.7 : اگر سرعت بیشتر از ۲۷.۷ متر بر ثانیه (تقریباً ۱۰۰ کیلومتر بر ساعت) باشد، مقدار true را برمی‌گرداند.

محرک‌ها: تعریف کنید که چه زمانی اقدامات رخ می‌دهند

تریگرها زمان اجرای اقدامات را تعریف می‌کنند: ارزیابی یک تجمیع‌کننده، تولید گزارش یا کنترل چرخه حیات مجموعه. تمام تریگرهای تعریف‌شده را به آرایه triggers سطح بالا اضافه کنید.

فیلدهای یک شیء تریگر (مورد در لیست triggers )
name یک شناسه منحصر به فرد برای این تریگر در پیکربندی معیارها.
periodic
data
conditional
شما باید دقیقاً یکی از این فیلدها را برای تعریف رفتار ارائه دهید.

ماشه داده

زمانی اتفاق می‌افتد که یک منبع داده‌ی SUBSCRIPTION یک پیام ( concept ) جدید ارائه دهد.

فیلدهای شیء 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
  }
}

ماشه شرطی

بر اساس ارزیابی یک عبارت ( مفهوم ) اجرا می‌شود. برای شروع ارزیابی خود به یک یا چند محرک والد نیاز دارد. این اغلب یک محرک داده برای منابع داده یا تجمیع‌کننده‌های موجود در عبارت یا یک محرک دوره‌ای برای نظرسنجی از داده‌ها است.

فیلدهای شیء conditional (در یک تریگر)
triggers آرایه‌ای با حداقل یک نام تریگر والد. وقتی یک تریگر والد فعال می‌شود، تریگر شرطی عبارت را ارزیابی می‌کند.
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

زمانی اجرا می‌شود که نتیجه‌ی عبارت با مقدار قبلی آن متفاوت باشد. اگر گزینه‌های لبه تنظیم شده باشند، فقط از مقادیر عددی و بولی پشتیبانی می‌کند.

می‌تواند شامل rising_options ، falling_options یا هر دو باشد (به گزینه‌های Edge مراجعه کنید).

گزینه‌های لبه

اشیاء rising_options و falling_options فیلدهای زیر را دارند. در صورت وجود، transition مربوطه باید الزام مدت زمان را برآورده کند. transitionهای بدون گزینه‌های مشخص شده بلافاصله اجرا می‌شوند.

فیلدهای مربوط به اشیاء گزینه‌های لبه
min_duration_ms یک عدد غیر منفی (برحسب میلی‌ثانیه) که مشخص می‌کند شرط قبل از فعال شدن تریگر، چه مدت باید در حالت جدید باقی بماند.
اختیاری
require_exact
بولی. اگر درست باشد، تمام مقادیر منتشر شده در طول مدت باید برای فعال شدن تریگر یکسان باشند.

مثال: تریگر شرطی

ماشه زیر از گزینه‌های لبه استفاده می‌کند. اگر سرعت از ۲۷.۷ متر بر ثانیه بیشتر شود و حداقل ۵ ثانیه در حالت بالا باقی بماند، فعال می‌شود:

{
  "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 آرایه‌ای از یک یا چند نام محرک که باعث ارزیابی این تجمیع می‌شوند.
اختیاری
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 )
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 ) را محاسبه کند و ۵ مقدار سرعت آخر ( 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 ( concept ) اضافه کنید. این پیکربندی‌ها نحوه بسته‌بندی داده‌های پردازش‌شده و زمان تولید آن‌ها را تعیین می‌کنند. می‌توانید چندین پیکربندی گزارش را در یک پیکربندی معیارها تعریف کنید تا از اجزا دوباره استفاده شود.

شما با استفاده از فیلد trigger_names تولید گزارش را کنترل می‌کنید. علاوه بر این، می‌توانید report_initial برای تولید گزارش بلافاصله پس از فعال شدن پیکربندی و report_incomplete برای تولید گزارش نهایی پس از قطع جمع‌آوری داده‌ها استفاده کنید.

نکته: برای اتصال پردازش به خروجی، از نوع تجمیع none ( @type: "none" ) برای خواندن مقادیر از پیش محاسبه شده از یک تجمیع کننده استفاده کنید. از آنجایی که گزارش‌ها معمولاً عکس‌های فوری بدون وضعیت هستند، این امر منطق پیچیده و دارای وضعیت را در تجمیع کننده‌ها حفظ می‌کند و گزارش‌ها را برای قالب‌بندی ذخیره می‌کند.

فیلدهای شیء پیکربندی گزارش (مورد موجود در لیست report_configs )
name یک نام منحصر به فرد برای گزارش. این نام در فراداده گزارش تولید شده نمایش داده می‌شود.
trigger_names آرایه‌ای از نام‌های محرک که باعث تولید و انتشار گزارش می‌شوند.
message_builder برای جزئیات بیشتر به سازنده پیام مراجعه کنید. این بخش، محتوای گزارش را تعریف می‌کند. تجمیع‌ها فقط زمانی ارزیابی می‌شوند که گزارش آغاز شده باشد. برای مثال، تجمیع برداری به ازای هر گزارش یک مقدار اضافه می‌کند و تجمیع شمارشی، شماره گزارش را منعکس می‌کند.
اختیاری
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 مشخص کنید.

رشته باید یک 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» را به‌طور کامل نهایی و غیرفعال می‌کند.

پیشرفته: تعاریف پروتو سفارشی

در دو مورد اصلی، 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 ) برای دریافت داده‌های سرعت تا یک بار در ثانیه.
  • یک تریگر داده ( OnNewSpeed ) که هنگام ارسال داده توسط SpeedSource فعال می‌شود.
  • یک ماشه دوره‌ای ( EveryMinute ) که هر ۶۰ ثانیه یکبار فعال می‌شود.
  • یک تجمیع‌کننده ( 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
دسترسی به کل پیام از یک منبع داده یا تجمیع‌کننده
دسترسی به فیلد خاص در پیام (از جمله فیلدهای تو در تو)
حساب + ، - ، * ، / ، % ، ** ریاضی استاندارد. ** توان است.
منطقی && ، || ، ! ، ^ و، یا، نه، ضربدر.
رابطه‌ای == ، != ، < ، <= ، > ، >= == و != روی همه نوع‌ها کار می‌کنند. برخی دیگر به اعداد نیاز دارند.
فهرست contains(list, item)
doesnotcontain(list, item)
alleq(list, value)
روی بردارها (آرایه‌ها) عمل می‌کند. alleq(list, value) اگر همه عناصر موجود در list برابر با value باشند، true را برمی‌گرداند.
توابع timestamp(clock_type) زمان فعلی بر حسب نانوثانیه.
clock_type : REALTIME_CLOCK یا
MONOTONIC_TIME_SINCE_BOOT_OR_RESUME
abs(n) ارزش مطلق
floor(n) ، round(n) ، ceil(n) توابع گرد کردن
ترتیب عملیات () گروه‌بندی استاندارد برای اولویت