این راهنما جزئیات فرمت درخواست JSON برای نقطه پایانی /api/v1/generate_metrics_config از ابزار Metrics Configuration Generator (MCG) را شرح میدهد. این فرمت به شما امکان میدهد یک کمپین تلهمتری - که شامل جمعآوری دادهها، پردازش روی دستگاه و تولید گزارش است - را در یک ساختار قابل خواندن توسط انسان تعریف کنید.
ابزار MCG این شیء JSON را اعتبارسنجی میکند، مواردی مانند عدم تطابق نوع، وابستگیهای دایرهای یا ارجاعات تعریف نشده را بررسی میکند و سپس آن را در یک پیام بافر پروتکل MetricsConfig (protobuf) کامپایل میکند. این پیام MetricsConfig فرمت دودویی است که سرویس تلهمتری روی دستگاه برای اجرای کمپین اجرا میکند.
پیشنیازها: شما باید با طرحوارههای JSON، protobuf و ساختارهای داده اولیه آشنا باشید. برای مرور کلی مفهومی، به مفاهیم پیکربندی Metrics مراجعه کنید.
نحوه نوشتن توضیحات پیکربندی
برای طراحی یک کمپین جمعآوری معیارها، این روند منطقی را دنبال کنید:
- منابع داده را مشخص کنید : مشخص کنید که دادههای شما از کجا میآیند.
- تعریف منطق و پردازش : قوانینی را برای زمان جمعآوری دادهها و نحوه پردازش آنها تنظیم کنید.
- ایجاد خروجی : دادههای پردازششده را در یک پیام نهایی بستهبندی کنید.
- فیلدهای سطح بالا : فیلدهای سطح بالا مانند UUID ، تعاریف سیگنال و کنترل چرخه عمر را اضافه کنید.
مثال: گزارش سرعت متوسط
این راهنما از یک مثال برای نشان دادن نحوهی کنار هم قرار گرفتن تمام اجزا استفاده میکند. گزارشی ایجاد میکند که میانگین سرعت خودرو را در هر دقیقه محاسبه میکند. این گزارش یک منبع داده ( SpeedSource ) برای جمعآوری دادههای سرعت، تریگرها ( OnNewSpeed ، EveryMinute ) برای کنترل جریان اجرا، یک تجمیعکننده ( SpeedAggregator ) برای محاسبهی میانگین و یک پیکربندی گزارش معیارها ( MinuteReport ) برای بستهبندی نتیجه تعریف میکند. مثالهای موجود در بخشهای قابل توسعه بر اساس این سناریو ساخته میشوند.
منابع داده را مشخص کنید
تلهمتری از جمعآوری دادهها از سرویسهای SDV (از طریق میانافزار SDV) و ناشران مبتنی بر رجیستری ناشر قابل پیکربندی پشتیبانی میکند.
سرویسهای SDV (مبتنی بر کانالهای عمومی/فرعی): دادهها از کانالهای عمومی/فرعی تعریفشده در VSIDL در دسترس هستند.
سرویسهای SDV (مبتنی بر RPC): دادهها در صورتی در دسترس هستند که سرویس، RPCهای
CreateSubscriptionیاGetLatestMessageدر معرض نمایش قرار دهد.ناشران مبتنی بر رجیستری ناشر قابل تنظیم: دادهها در صورتی در دسترس هستند که برنامه خود را با استفاده از رابط
IConfigurablePublisherRegistryAndroid Binder یا کتابخانه رجیستری ناشر قابل تنظیم از Telemetry SDK ثبت کند.
برای استفاده از دادهها در SDV، یک منبع داده ( concept ) تعریف کنید و آن را به آرایه 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 ، آخرین پیام را پس از اتصال بازیابی میکند. | ||||
همه گزینهها برای همه انواع منابع داده در دسترس نیستند. برای اطلاعات دقیقتر به راهنمای ادغام منبع داده مراجعه کنید.
قالب شناسه منبع
سرویس تلهمتری چندین قالب شناسه منبع را میپذیرد. برای مرور کلی، به تعریف منبع داده در تنظیمات متریک مراجعه کنید.
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 | یک شناسه منحصر به فرد برای این تریگر در پیکربندی معیارها. |
periodicdataconditional | شما باید دقیقاً یکی از این فیلدها را برای تعریف رفتار ارائه دهید. |
ماشه داده
زمانی اتفاق میافتد که یک منبع دادهی 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_trueis_false | زمانی اتفاق میافتد که یک عبارت بولی به ترتیب به true یا false ارزیابی شود. |
rising_edge | اگر عددی باشد، وقتی مقدار آن افزایش یابد، فعال میشود. اگر عبارت بولی باشد، وقتی از میتواند شامل یک شیء |
falling_edge | اگر عددی باشد، زمانی که مقدار آن کاهش یابد، فعال میشود. اگر عبارت بولی باشد، زمانی که مقدار آن از میتواند شامل یک شیء |
all_changes | زمانی اجرا میشود که نتیجهی عبارت با مقدار قبلی آن متفاوت باشد. اگر گزینههای لبه تنظیم شده باشند، فقط از مقادیر عددی و بولی پشتیبانی میکند. میتواند شامل |
گزینههای لبه
اشیاء 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 | شیءای که نحوه محاسبه مقدار فیلد توسط سیستم را با فیلدهای زیر تعریف میکند:
| ||||||
مثال: تجمیعکننده
برای مثال، محاسبه آمار بین گزارشهای دقیقهای. این تجمیعکننده توسط 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 کافی نیست تا همه انواع پیامها را در توضیحات پیکربندی معیارها درک کند:
- خطای استنتاج نوع: همانطور که در قالب
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) برای دریافت دادههای سرعت تا یک بار در ثانیه. - یک تریگر داده (
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_namesource_name .fieldsource_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) | توابع گرد کردن | |
| ترتیب عملیات | () | گروهبندی استاندارد برای اولویت |