يوضّح هذا الدليل بالتفصيل تنسيق طلب JSON لنقطة النهاية /api/v1/generate_metrics_config الخاصة بأداة Metrics Configuration Generator (MCG). يتيح لك هذا التنسيق تحديد حملة قياس عن بُعد، وتحديد جمع البيانات ومعالجتها على الجهاز وإنشاء التقارير، وذلك في بنية يمكن قراءتها.
تتحقّق أداة MCG من صحة كائن JSON هذا، وتبحث عن مشاكل مثل عدم تطابق الأنواع أو التبعيات الدائرية أو المراجع غير المحدّدة، ثم تجمّعه في رسالة MetricsConfig Protocol Buffers (protobuf). هذه MetricsConfig
الرسالة هي التنسيق الثنائي الذي تنفّذه خدمة القياس عن بُعد على الجهاز
لتشغيل الحملة.
المتطلبات الأساسية: يجب أن تكون على دراية بمخططات JSON وprotobuf وبنى البيانات الأساسية. للحصول على نظرة عامة مفاهيمية، يُرجى الاطّلاع على مفاهيم إعداد المقاييس.
كيفية كتابة وصف إعدادات
لتصميم حملة لجمع المقاييس، اتّبِع التسلسل المنطقي التالي:
- تحديد مصادر البيانات: حدِّد مصدر بياناتك.
- تحديد المنطق والمعالجة: يمكنك إعداد قواعد تحدّد متى يتم جمع البيانات وكيفية معالجتها.
- إنشاء الناتج: يتم تجميع البيانات المعالَجة في رسالة نهائية.
- الحقول ذات المستوى الأعلى: أضِف حقولاً ذات مستوى أعلى، مثل المعرّف الفريد العالمي (UUID) وتعريفات الإشارات وعنصر التحكّم في مراحل النشاط.
مثال: تقرير متوسط السرعة
يستخدم هذا الدليل مثالاً لتوضيح كيفية عمل جميع المكوّنات معًا. ويتم إنشاء تقرير يحتسب متوسط سرعة المركبة كل دقيقة. يحدّد هذا المخطّط مصدر بيانات (SpeedSource) لجمع بيانات السرعة، وعوامل تشغيل (OnNewSpeed وEveryMinute) للتحكّم في مسار التنفيذ، ومجمّع (SpeedAggregator) لاحتساب المتوسط، وإعدادات تقرير المقاييس (MinuteReport) لتجميع النتيجة. تستند الأمثلة في الأقسام القابلة للتوسيع إلى هذا السيناريو.
تحديد مصادر البيانات
تتيح القياس عن بُعد جمع البيانات من "خدمات القيمة المضافة" (عبر "برنامج الوسيط لخدمات القيمة المضافة") والناشرين المستندين إلى "سجلّ الناشرين القابل للإعداد".
خدمات SDV (استنادًا إلى النشر/الاشتراك): تتوفّر البيانات من قنوات النشر/الاشتراك المحدّدة في VSIDL.
خدمات SDV (استنادًا إلى RPC): تتوفّر البيانات إذا كانت الخدمة تعرض
CreateSubscriptionأوGetLatestMessageRPC.الناشرون المستندون إلى "سجلّ الناشرين القابل للضبط": تتوفّر البيانات إذا سجّل التطبيق نفسه باستخدام
IConfigurablePublisherRegistryواجهة Android Binder أو مكتبة "سجلّ الناشرين القابل للضبط" من حزمة تطوير البرامج (SDK) الخاصة بخدمة القياس عن بُعد.
لاستخدام البيانات في SDV، حدِّد مصدر بيانات (مفهوم) وأضِفه إلى مصفوفة data_sources.
حقول عنصر مصدر البيانات (عنصر في القائمة data_sources) |
|||||
|---|---|---|---|---|---|
name |
سلسلة يحدّدها المستخدم وتعرّف مصدر البيانات هذا ضمن إعدادات المقاييس. | ||||
source_identifier |
المعرّف المستخدَم للعثور على الخدمة. لمزيد من التفاصيل، راجِع تنسيق source_identifier. |
||||
connection_type |
SUBSCRIPTION لمصدر بيانات مستمر (مطلوب لمشغّلات البيانات)، أو ON_DEMAND لجلب البيانات عند الطلب (للحصول على التفاصيل، راجِع إعداد مصادر البيانات). |
||||
اختياريconfiguration |
RPC وConfigurable Publisher Registry فقط: عنصر لضبط مصدر البيانات باستخدام الحقول التالية:
|
||||
حقول نوع الاتصال 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، حدِّد الخدمة ذات الصلة. بما يتوافق مع تنسيق
source_identifier، حدِّد نوع رسالة protobuf
mcg.test.subpkg.speed_msg. بما أنّ السرعة يتم نشرها عادةً بشكل متكرّر، استخدِم
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 }
تحديد المنطق والمعالجة
تتم معالجة المنطق من خلال مكوّنَين يعملان معًا: تحدّد المشغّلات (المفهوم) متى يحدث شيء ما، بينما تحدّد أدوات التجميع (المفهوم) كيفية معالجة البيانات استنادًا إلى هذه المشغّلات. وبما أنّ التعبيرات (المفهوم) هي مفتاح شروط المشغّل ومنطق التجميع، يوضّح هذا القسم أولاً كيفية كتابتها.
التعبيرات
تتيح لك التعبيرات تحديد العمليات الحسابية والشروط باستخدام صيغة يمكن لشخص عادي قراءتها. وتعمل واجهة برمجة التطبيقات 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 |
معرّف فريد لهذا المشغّل في إعدادات المقاييس. |
periodicdataconditional |
يجب تقديم حقل واحد فقط من هذه الحقول لتحديد السلوك. |
مشغّل البيانات
يتم تشغيله عندما يقدّم مصدر بيانات SUBSCRIPTION رسالة جديدة (مفهوم).
حقول عنصر data (في مشغّل) |
|
|---|---|
source_name |
تمثّل هذه السمة name data_source الذي تستمع إليه قائمة المشغّلات هذه. |
مثال: مشغّل البيانات
في المثال، عدِّل عملية احتساب متوسط السرعة في كل مرة تنشر فيها SpeedSource رسالة جديدة. يتم تشغيل مشغّل البيانات هذا في كل مرة يحدث فيها ذلك:
{ "name": "OnNewSpeed", "data": { "source_name": "SpeedSource" // Reference to the defined data source } }
المشغّل الدوري
يتم تنشيطه على فترات منتظمة (المفهوم).
حقول عنصر periodic (في مشغّل) |
|
|---|---|
period_ms |
رقم غير سالب يحدّد الفاصل الزمني بالملي ثانية. |
مثال: مشغّل دوري
يتطلّب المثال تقريرًا كل دقيقة. يتم تشغيل هذا المشغّل الدوري كل 60,000 مللي ثانية لإنشاء هذا التقرير:
{ "name": "EveryMinute", "periodic": { "period_ms": 60000 // 60,000 ms = 60 seconds } }
المشغّل الشرطي
يتم تفعيلها استنادًا إلى تقييم تعبير (مفهوم). ويتطلّب ذلك مشغّلاً واحدًا أو أكثر من المشغّلات الرئيسية لبدء التقييم. وغالبًا ما يكون ذلك مشغّلاً للبيانات لمصادر البيانات أو أدوات التجميع في التعبير، أو مشغّلاً دوريًا لطلب البيانات.
حقول عنصر conditional (في مشغّل) |
|
|---|---|
triggers |
مصفوفة تتضمّن اسم مشغّل رئيسي واحدًا على الأقل. عندما يتم تشغيل مشغّل رئيسي، يقيّم المشغّل الشرطي التعبير. |
expression |
التعبير المطلوب تقييمه. اطّلِع على العبارات. |
condition_type |
تحدّد هذه السمة الوقت الذي يجب فيه تشغيل المشغّل، استنادًا إلى تقييم التعبير. |
أنواع الشروط
يجب أن يحتوي قاموس condition_type على نوع واحد فقط من أنواع الشروط المتاحة كمفتاح. لمزيد من المعلومات، اطّلِع على عوامل التشغيل الشرطية.
حقول العنصر condition_type (يستبعد كلّ منها الآخر) |
|
|---|---|
is_trueis_false |
يتم تشغيل هذا المشغّل عندما يتم تقييم تعبير منطقي على أنّه true أو false على التوالي. |
rising_edge |
إذا كانت القيمة عددية، يتم تنشيطها عند زيادة قيمتها. وإذا كان التعبير منطقيًا، يتم تنشيطه عند تغييره من يمكن أن يحتوي على عنصر |
falling_edge |
إذا كانت القيمة عددية، يتم تشغيلها عندما تنخفض قيمتها. وإذا كان التعبير منطقيًا، يتم تشغيله عندما تتغير قيمته من يمكن أن يحتوي على عنصر |
all_changes |
يتم تشغيلها عندما تختلف نتيجة التعبير عن قيمته السابقة. إذا تم ضبط خيارات الحافة، لا يمكن استخدام سوى القيم الرقمية والقيم المنطقية. يمكن أن يحتوي على |
خيارات الحافة
يحتوي العنصران rising_options وfalling_options على الحقول التالية. في حال توفيرها، يجب أن تستوفي عملية الانتقال المقابلة شرط المدة.
يتم تشغيل عمليات الانتقال بدون خيارات محدّدة على الفور.
| حقول لكائنات خيار الحافة | |
|---|---|
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 |
مصفوفة تتضمّن اسمًا واحدًا أو أكثر من أسماء المشغّلات التي تؤدي إلى تقييم عملية التجميع هذه. |
اختياري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 |
كائن يحدّد طريقة احتساب النظام لقيمة الحقل، ويتضمّن الحقول التالية:
|
||||||
مثال: خدمة تجميع المحتوى
بالنسبة إلى المثال، احسب الإحصاءات بين التقارير الدقيقة. يتم تشغيل أداة التجميع هذه من خلال 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") لقراءة القيم المحسوبة مسبقًا من أداة تجميع. وبما أنّ التقارير عادةً ما تكون لقطات بدون حالة، فإنّ هذا الإجراء يحافظ على المنطق المعقّد ذي الحالة ضمن أدوات التجميع ويحجز التقارير للتنسيق.
حقول كائن إعداد التقرير (عنصر في القائمة 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) محدّد وإدارة دورة حياة المجموعة.
ضبط المعرّف الفريد العالمي
يتطلّب كل MetricsConfig معرّفًا فريدًا عالميًا (UUID). إذا قدّمت existing_uuid، ستستخدمها "مجموعة إعلانات العملاء". وإلا، سيتم إنشاء رمز عشوائي. للحفاظ على الاتساق في عمليات النشر والأدوات، حدِّد existing_uuid.
يجب أن تكون السلسلة معرّفًا فريدًا عالميًا صالحًا يتضمّن واصلات ويحتوي على أحرف صغيرة فقط.
"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
تعريفات الإشارات
للتحقّق من صحة أسماء الإشارات وأنواعها، يتطلّب "مركز بيانات المركبات" إذن الوصول إلى "كتالوج إشارات المركبات". هذا هو ملف protobuf FileDescriptorSet يحتوي على تعريفات .proto VSIDL (يتم تجميعها وتحميلها إلى 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 وحدها كافية لكي تفهم أداة "مقارنة المقاييس" جميع أنواع الرسائل في وصف إعدادات المقاييس:
- تعذُّر استنتاج النوع: كما هو موضّح في تنسيق
source_identifier، لا يمكن لـ MCG استنتاج النوع عندما يستخدمsource_identifierFQIN أو اسمًا مخصّصًا. - الرسائل المخصّصة: يستخدم وصف إعدادات المقاييس رسائل 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) يتم تشغيله كل 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" } } ] } } ] }
نموذج المرجع
للاطّلاع على تعريف واجهة برمجة التطبيقات، يُرجى الرجوع إلى مرجع واجهة برمجة التطبيقات "برنامج الشركاء التجاريين في Google".
تقدّم الأقسام التالية مرجعًا كاملاً لوصف إعدادات المقاييس، ويمكنك استخدامها كدليل لإنشاء وصف خاص بك لإعدادات المقاييس.
الحقول ذات المستوى الأعلى
{
"existing_uuid": "00000000-0000-0000-0000-000000000000", // Optional
"vs_version": "example_version", // Optional
"descriptor_protos": ["..."], // Optional. Base64 encoded FileDescriptorSet
"data_source_message_types": {
"ExampleServiceName": "com.example.ProtoMessage"
}, // Optional
"start_trigger_name": "DataTriggerExample", // Optional
"stop_trigger_name": "ConditionalTriggerExample", // Optional
"deactivate_trigger_name": "PeriodicTriggerExample" // Optional
}
الإدخال: مصادر البيانات ومجمّعاتها
{
"data_sources": [
{
"name": "SubscriptionExample",
"source_identifier": "com.example.sdv.ExampleMessage|example-unit",
"connection_type": "SUBSCRIPTION", // Options: SUBSCRIPTION (default), ON_DEMAND
"sub_sampling_interval_ms": 100, // Optional
"fetch_last_message": false // Optional. Default: false
},
{
"name": "RegistryExample",
// Configurable Publisher Registry-based publisher (matches data_source_message_types)
"source_identifier": "ExampleServiceName",
"connection_type": "SUBSCRIPTION"
},
{
"name": "GetterExample",
"source_identifier": "com.example.sdv.ExampleConfig|example-unit",
"connection_type": "ON_DEMAND",
"configuration": {
"type_url": "type.googleapis.com/example.Config",
"value_json": {} // Or value_textproto, value (base64)
}
}
],
"aggregators": [
{
"name": "AggregatorExample",
"trigger_names": ["DataTriggerExample"],
"reset_on_get": false, // Optional. Default: false. If true, resets state after it's read
"message_builder": {
"message_type": "com.example.AggregatedMessage", // Optional
"field_assignments": [
{
"field_name": "avg_example",
"aggregation": {
// Options: avg, count, min, max, sum, stddev, delta, vector, none
"@type": "avg",
"expression": "SubscriptionExample.value"
}
},
{
"field_name": "count_example",
"aggregation": {
"@type": "count" // Counts number of evaluations. No expression needed
}
},
{
"field_name": "vector_example",
"aggregation": {
"@type": "vector",
"expression": "SubscriptionExample.value",
"max_length": 10 // Optional. If set, creates a ring buffer
}
}
]
}
}
]
}
المنطق والمعالجة: المشغّلات
{
"triggers": [
{
"name": "PeriodicTriggerExample",
"periodic": { "period_ms": 1000 }
},
{
"name": "DataTriggerExample",
"data": { "source_name": "SubscriptionExample" }
},
{
"name": "ConditionalTriggerExample",
"conditional": {
"triggers": ["PeriodicTriggerExample"],
"expression": "SubscriptionExample.value > 0",
"condition_type": {
// Options: is_true, is_false, rising_edge, falling_edge, all_changes
"rising_edge": {
"rising_options": { "min_duration_ms": 0, "require_exact": false }
}
}
}
}
]
}
الناتج: إعدادات التقارير
{
"report_configs": [
{
"name": "ReportExample",
"trigger_names": ["PeriodicTriggerExample"],
"report_incomplete": false, // Optional. Default: false
"report_initial": false, // Optional. Default: false
"message_builder": {
"message_type": "com.example.ReportMessage", // Optional. Must be defined in VSIDL catalog or descriptor_protos. Message type will be inferred if not provided
"field_assignments": [
{
"field_name": "avg_example",
"aggregation": {
"@type": "none", // Passthrough since aggregation is done in AggregatorExample
"expression": "AggregatorExample.avg_example"
}
}
]
}
}
]
}
بنية التعبيرات
| الفئة | البنية | الوصف |
|---|---|---|
| الوصول إلى البيانات | source_namesource_name.fieldsource_name.field.subfield |
الوصول إلى الرسالة الكاملة من مصدر بيانات أو أداة تجميع الوصول إلى حقل محدّد في الرسالة (بما في ذلك الحقول المتداخلة) |
| الحساب | +، -، *، /، %، ** |
الرياضيات العادية ** هي عملية رفع العدد إلى الأس. |
| منطقي | && و|| و! و^ |
AND وOR وNOT وXOR |
| علائقية | ==، !=، <، <=، >، >= |
تعمل == و!= مع جميع الأنواع، بينما تتطلّب الأنواع الأخرى أرقامًا. |
| القائمة | 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) |
دوال التقريب | |
| ترتيب العمليات | () |
التجميع العادي للأسبقية |