تنسيق JSON لطلب إنشاء إعدادات المقاييس

يوضّح هذا الدليل بالتفصيل تنسيق طلب JSON لنقطة النهاية /api/v1/generate_metrics_config الخاصة بأداة Metrics Configuration Generator (MCG). يتيح لك هذا التنسيق تحديد حملة قياس عن بُعد، وتحديد جمع البيانات ومعالجتها على الجهاز وإنشاء التقارير، وذلك في بنية يمكن قراءتها.

تتحقّق أداة MCG من صحة كائن JSON هذا، وتبحث عن مشاكل مثل عدم تطابق الأنواع أو التبعيات الدائرية أو المراجع غير المحدّدة، ثم تجمّعه في رسالة MetricsConfig Protocol Buffers (protobuf). هذه MetricsConfig الرسالة هي التنسيق الثنائي الذي تنفّذه خدمة القياس عن بُعد على الجهاز لتشغيل الحملة.

المتطلبات الأساسية: يجب أن تكون على دراية بمخططات JSON وprotobuf وبنى البيانات الأساسية. للحصول على نظرة عامة مفاهيمية، يُرجى الاطّلاع على مفاهيم إعداد المقاييس.

كيفية كتابة وصف إعدادات

لتصميم حملة لجمع المقاييس، اتّبِع التسلسل المنطقي التالي:

  1. تحديد مصادر البيانات: حدِّد مصدر بياناتك.
  2. تحديد المنطق والمعالجة: يمكنك إعداد قواعد تحدّد متى يتم جمع البيانات وكيفية معالجتها.
  3. إنشاء الناتج: يتم تجميع البيانات المعالَجة في رسالة نهائية.
  4. الحقول ذات المستوى الأعلى: أضِف حقولاً ذات مستوى أعلى، مثل المعرّف الفريد العالمي (UUID) وتعريفات الإشارات وعنصر التحكّم في مراحل النشاط.

مثال: تقرير متوسط السرعة

يستخدم هذا الدليل مثالاً لتوضيح كيفية عمل جميع المكوّنات معًا. ويتم إنشاء تقرير يحتسب متوسط سرعة المركبة كل دقيقة. يحدّد هذا المخطّط مصدر بيانات (SpeedSource) لجمع بيانات السرعة، وعوامل تشغيل (OnNewSpeed وEveryMinute) للتحكّم في مسار التنفيذ، ومجمّع (SpeedAggregator) لاحتساب المتوسط، وإعدادات تقرير المقاييس (MinuteReport) لتجميع النتيجة. تستند الأمثلة في الأقسام القابلة للتوسيع إلى هذا السيناريو.

تحديد مصادر البيانات

تتيح القياس عن بُعد جمع البيانات من "خدمات القيمة المضافة" (عبر "برنامج الوسيط لخدمات القيمة المضافة") والناشرين المستندين إلى "سجلّ الناشرين القابل للإعداد".

لاستخدام البيانات في SDV، حدِّد مصدر بيانات (مفهوم) وأضِفه إلى مصفوفة data_sources.

حقول عنصر مصدر البيانات (عنصر في القائمة data_sources)
name سلسلة يحدّدها المستخدم وتعرّف مصدر البيانات هذا ضمن إعدادات المقاييس.
source_identifier المعرّف المستخدَم للعثور على الخدمة. لمزيد من التفاصيل، راجِع تنسيق source_identifier.
connection_type SUBSCRIPTION لمصدر بيانات مستمر (مطلوب لمشغّلات البيانات)، أو ON_DEMAND لجلب البيانات عند الطلب (للحصول على التفاصيل، راجِع إعداد مصادر البيانات).
اختياري
configuration

RPC وConfigurable Publisher Registry فقط: عنصر لضبط مصدر البيانات باستخدام الحقول التالية:

type_url الاسم المؤهَّل بالكامل لرسالة protobuf الخاصة بالإعداد.
value_json أو
أو value_textproto أو
أو value
الحمولة بتنسيق JSON أو textproto أو base64
حقول نوع الاتصال SUBSCRIPTION
اختياري
sub_sampling_interval_ms
‫Pub/sub فقط عدد صحيح غير سالب (بالمللي ثانية) لتحديد الحدّ الأدنى للفاصل الزمني بين الرسائل من أجل الحدّ من معدّل تكرارها.
اختياري
fetch_last_message
(القيمة التلقائية: false)
‫Pub/sub فقط منطقي. إذا كان true يسترد أحدث رسالة عند الربط

لا تتوفّر جميع الخيارات لجميع أنواع مصادر البيانات. يمكنك الاطّلاع على دليل دمج مصادر البيانات للحصول على معلومات مفصّلة.

تنسيق source_identifier

تقبل خدمة القياس عن بُعد عدة تنسيقات لمعرّفات المصادر. للحصول على نظرة عامة، اطّلِع على تعريف مصدر البيانات في إعدادات المقاييس.

يستنتج MCG نوع رسالة protobuf من source_identifier فقط إذا كان يستخدم تنسيق اسم نوع الوحدة. إذا كنت تستخدم FQIN أو اسمًا مخصّصًا (من Configurable Publisher Registry)، لا يمكن لـ MCG استنتاج النوع. في هذه الحالات، عليك تقديم data_source_message_types. إذا لم يكن النوع متوفّرًا في الكتالوج، يجب أيضًا تقديم تعريفه في descriptor_protos.

مثال: تحديد مصدر بيانات

يعرض هذا المثال سرعة المركبة. أولاً، راجِع فهرس VSIDL لتحديد الخدمة التي تنشر هذه البيانات.

باستخدام نموذج الفهرس في قاعدة رموز SDV، حدِّد الخدمة ذات الصلة. بما يتوافق مع تنسيق 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 معرّف فريد لهذا المشغّل في إعدادات المقاييس.
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
  }
}

المشغّل الشرطي

يتم تفعيلها استنادًا إلى تقييم تعبير (مفهوم). ويتطلّب ذلك مشغّلاً واحدًا أو أكثر من المشغّلات الرئيسية لبدء التقييم. وغالبًا ما يكون ذلك مشغّلاً للبيانات لمصادر البيانات أو أدوات التجميع في التعبير، أو مشغّلاً دوريًا لطلب البيانات.

حقول عنصر conditional (في مشغّل)
triggers مصفوفة تتضمّن اسم مشغّل رئيسي واحدًا على الأقل. عندما يتم تشغيل مشغّل رئيسي، يقيّم المشغّل الشرطي التعبير.
expression التعبير المطلوب تقييمه. اطّلِع على العبارات.
condition_type تحدّد هذه السمة الوقت الذي يجب فيه تشغيل المشغّل، استنادًا إلى تقييم التعبير.
أنواع الشروط

يجب أن يحتوي قاموس condition_type على نوع واحد فقط من أنواع الشروط المتاحة كمفتاح. لمزيد من المعلومات، اطّلِع على عوامل التشغيل الشرطية.

حقول العنصر condition_type (يستبعد كلّ منها الآخر)
is_true

is_false
يتم تشغيل هذا المشغّل عندما يتم تقييم تعبير منطقي على أنّه true أو false على التوالي.
rising_edge

إذا كانت القيمة عددية، يتم تنشيطها عند زيادة قيمتها. وإذا كان التعبير منطقيًا، يتم تنشيطه عند تغييره من false إلى true.

يمكن أن يحتوي على عنصر rising_options (راجِع خيارات الحافة).

falling_edge

إذا كانت القيمة عددية، يتم تشغيلها عندما تنخفض قيمتها. وإذا كان التعبير منطقيًا، يتم تشغيله عندما تتغير قيمته من true إلى false.

يمكن أن يحتوي على عنصر falling_options (راجِع خيارات الحافة).

all_changes

يتم تشغيلها عندما تختلف نتيجة التعبير عن قيمته السابقة. إذا تم ضبط خيارات الحافة، لا يمكن استخدام سوى القيم الرقمية والقيم المنطقية.

يمكن أن يحتوي على rising_options أو falling_options أو كليهما (راجِع خيارات الحافة).

خيارات الحافة

يحتوي العنصران 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

كائن يحدّد طريقة احتساب النظام لقيمة الحقل، ويتضمّن الحقول التالية:

@type دالة التجميع.

  • avg وmin وmax وsum وstddev: إحصاءات رياضية عادية
  • count: يحسب عدد المرات التي تم فيها تشغيل هذا المجمّع.
  • delta: الفرق بين القيمة الحالية والقيمة السابقة
  • vector: تنشئ قائمة بالقيم (مخزن مؤقت حلقي).
  • none: تمرير القيمة الأساسية
expression تمثّل هذه السمة تعبير الإدخال الخاص بالتجميع، وهي مطلوبة لجميع أنواع التجميع باستثناء count.
max_length يُستخدَم مع @type: "vector" فقط. وهو عدد صحيح اختياري يحدّ من حجم المتّجه، ما يؤدي إلى إنشاء مخزن مؤقت حلقي.

مثال: خدمة تجميع المحتوى

بالنسبة إلى المثال، احسب الإحصاءات بين التقارير الدقيقة. يتم تشغيل أداة التجميع هذه من خلال OnNewSpeed لحساب متوسط السرعة (avg) وعدد القراءات (count) وتخزين آخر 5 قيم للسرعة (vector). اضبط reset_on_get على true. تؤدي هذه العملية إلى إعادة ضبط الإحصاءات في كل مرة يقرأها فيها MinuteReport، ما يؤدي إلى بدء فترة تجميع جديدة للمجمّع لمدة دقيقة واحدة:

{
  "name": "SpeedAggregator",
  "trigger_names": ["OnNewSpeed"], // Update aggregation on new speed data
  "reset_on_get": true, // Reset stats after they are read by the report configuration
  "message_builder": {
    "field_assignments": [
      {
        "field_name": "average_speed",
        "aggregation": {
          "@type": "avg",
          "expression": "SpeedSource.speed"
        }
      },
      {
        "field_name": "speed_reading_count",
        "aggregation": {
          "@type": "count" // Counts triggers (that is, processed speed readings) since last reset
        }
      },
      {
        "field_name": "speed_history_last5",
        "aggregation": {
          "@type": "vector",
          "expression": "SpeedSource.speed",
          "max_length": 5 // Keep last 5 readings
        }
      }
    ]
  }
}

إنشاء ناتج

لتحديد الناتج النهائي لحملة قياس استخدام المنتج، أضِف عناصر إلى مصفوفة report_configs (المفهوم). تحدّد هذه الإعدادات طريقة تجميع البيانات المعالَجة ووقت إنشائها. يمكنك تحديد إعدادات تقارير متعددة في إعدادات مقاييس واحدة لإعادة استخدام المكوّنات.

يمكنك التحكّم في إنشاء التقارير باستخدام الحقل trigger_names. بالإضافة إلى ذلك، يمكنك استخدام report_initial لإنشاء تقرير فورًا عند تفعيل الإعداد، وreport_incomplete لإنشاء تقرير نهائي عند توقّف عملية جمع البيانات.

ملاحظة: لربط المعالجة بالناتج، استخدِم نوع التجميع none (@type: "none") لقراءة القيم المحسوبة مسبقًا من أداة تجميع. وبما أنّ التقارير عادةً ما تكون لقطات بدون حالة، فإنّ هذا الإجراء يحافظ على المنطق المعقّد ذي الحالة ضمن أدوات التجميع ويحجز التقارير للتنسيق.

حقول كائن إعداد التقرير (عنصر في القائمة 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 وحدها كافية لكي تفهم أداة "مقارنة المقاييس" جميع أنواع الرسائل في وصف إعدادات المقاييس:

  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) يتم تشغيله كل 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_name
source_name.field
source_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) دوال التقريب
ترتيب العمليات () التجميع العادي للأسبقية