इस गाइड में, Metrics Configuration Generator (MCG) टूल के /api/v1/generate_metrics_config एंडपॉइंट के लिए, JSON अनुरोध फ़ॉर्मैट के बारे में बताया गया है. इस फ़ॉर्मैट की मदद से, टेलीमेट्री कैंपेन को तय किया जा सकता है. जैसे, डेटा कलेक्शन, डिवाइस पर प्रोसेसिंग, और रिपोर्ट जनरेशन. यह सब, ऐसे स्ट्रक्चर में किया जा सकता है जिसे कोई भी व्यक्ति आसानी से पढ़ सकता है.
MCG टूल इस JSON ऑब्जेक्ट की पुष्टि करता है. साथ ही, टाइप के मेल न खाने, सर्कुलर डिपेंडेंसी या अपरिभाषित रेफ़रंस जैसी समस्याओं की जांच करता है. इसके बाद, इसे MetricsConfig प्रोटोकॉल बफ़र (protobuf) मैसेज में कंपाइल करता है. यह MetricsConfig मैसेज, बाइनरी फ़ॉर्मैट में होता है. इसे उपयोगकर्ता के डिवाइस पर मौजूद टेलीमेट्री सेवा, कैंपेन चलाने के लिए इस्तेमाल करती है.
ज़रूरी शर्तें: आपको JSON स्कीमा, प्रोटोबफ़, और बुनियादी डेटा स्ट्रक्चर के बारे में जानकारी होनी चाहिए. कॉन्सेप्ट के बारे में खास जानकारी के लिए, मेट्रिक कॉन्फ़िगरेशन के कॉन्सेप्ट देखें.
कॉन्फ़िगरेशन के ब्यौरे को लिखने का तरीका
मेट्रिक कलेक्शन कैंपेन डिज़ाइन करने के लिए, इस लॉजिकल फ़्लो का पालन करें:
- डेटा सोर्स तय करना: यह तय करें कि आपका डेटा कहां से आता है.
- लॉजिक और प्रोसेसिंग तय करना: डेटा इकट्ठा करने और उसे प्रोसेस करने के लिए नियम सेट अप करें.
- जवाब तैयार करना: प्रोसेस किए गए डेटा को फ़ाइनल मैसेज में पैकेज करना.
- टॉप-लेवल फ़ील्ड: यूयूआईडी, सिग्नल डेफ़िनिशन, और लाइफ़साइकल कंट्रोल जैसे टॉप-लेवल फ़ील्ड जोड़ें.
उदाहरण: औसत स्पीड की रिपोर्ट
इस गाइड में, एक उदाहरण का इस्तेमाल करके यह दिखाया गया है कि सभी कॉम्पोनेंट एक साथ कैसे काम करते हैं. यह एक ऐसी रिपोर्ट बनाता है जो हर मिनट में वाहन की औसत स्पीड का हिसाब लगाती है. यह स्पीड का डेटा इकट्ठा करने के लिए, डेटा सोर्स (SpeedSource) तय करता है. साथ ही, यह एक्ज़ीक्यूशन फ़्लो को कंट्रोल करने के लिए ट्रिगर (OnNewSpeed, EveryMinute), औसत का हिसाब लगाने के लिए एग्रीगेटर (SpeedAggregator), और नतीजे को पैकेज करने के लिए मेट्रिक रिपोर्ट कॉन्फ़िगरेशन (MinuteReport) तय करता है. एक्सपैंड किए जा सकने वाले सेक्शन में दिए गए उदाहरण, इस स्थिति पर आधारित हैं.
डेटा सोर्स तय करना
टेलीमेट्री, SDV सेवाओं (SDV मिडलवेयर के ज़रिए) और कॉन्फ़िगर किए जा सकने वाले पब्लिशर रजिस्ट्री पर आधारित पब्लिशर से डेटा इकट्ठा करने की सुविधा देती है.
SDV सेवाएं (पब्लिश/सब्सक्राइब पर आधारित): डेटा, VSIDL में तय किए गए pub/sub चैनलों से मिलता है.
एसडीवी सेवाएं (आरपीसी पर आधारित): अगर सेवा
CreateSubscriptionयाGetLatestMessageआरपीसी को दिखाती है, तो डेटा उपलब्ध होता है.कॉन्फ़िगर की जा सकने वाली पब्लिशर रजिस्ट्री पर आधारित पब्लिशर: डेटा तब उपलब्ध होता है, जब ऐप्लिकेशन Telemetry SDK से
IConfigurablePublisherRegistryAndroid Binder इंटरफ़ेस या कॉन्फ़िगर की जा सकने वाली पब्लिशर रजिस्ट्री लाइब्रेरी का इस्तेमाल करके खुद को रजिस्टर करता है.
एसडीवी में डेटा का इस्तेमाल करने के लिए, डेटा सोर्स (कॉन्सेप्ट) तय करें और उसे data_sources ऐरे में जोड़ें.
डेटा सोर्स ऑब्जेक्ट के फ़ील्ड (data_sources सूची में मौजूद आइटम) |
|||||
|---|---|---|---|---|---|
name |
यह उपयोगकर्ता की तय की गई स्ट्रिंग होती है. इससे मेट्रिक कॉन्फ़िगरेशन में इस डेटा सोर्स की पहचान की जाती है. | ||||
source_identifier |
इस आइडेंटिफ़ायर का इस्तेमाल, सेवा को खोजने के लिए किया जाता है. ज़्यादा जानकारी के लिए, source_identifier फ़ॉर्मैट देखें. |
||||
connection_type |
SUBSCRIPTION लगातार डेटा स्ट्रीम करने के लिए (डेटा ट्रिगर के लिए ज़रूरी है) या ON_DEMAND मांग पर फ़ेच करने के लिए (ज़्यादा जानकारी के लिए, डेटा सोर्स का कॉन्फ़िगरेशन देखें). |
||||
optionalconfiguration |
सिर्फ़ आरपीसी और कॉन्फ़िगर की जा सकने वाली पब्लिशर रजिस्ट्री. डेटा सोर्स को कॉन्फ़िगर करने के लिए एक ऑब्जेक्ट. इसमें ये फ़ील्ड होते हैं:
|
||||
SUBSCRIPTION कनेक्शन टाइप के लिए फ़ील्ड |
|||||
optionalsub_sampling_interval_ms |
सिर्फ़ Pub/sub के लिए. यह एक नॉन-नेगेटिव पूर्णांक (मिलीसेकंड) होता है. इसका इस्तेमाल, मैसेज की फ़्रीक्वेंसी को थ्रॉटल करने के लिए किया जाता है. इसके लिए, मैसेज के बीच कम से कम इंटरवल तय किया जाता है. | ||||
ज़रूरी नहींfetch_last_message(डिफ़ॉल्ट: false) |
सिर्फ़ Pub/Sub के लिए. बूलियन. अगर true,
कनेक्ट होने पर, सबसे नया मैसेज वापस पाता है. |
||||
सभी तरह के डेटा सोर्स के लिए, सभी विकल्प उपलब्ध नहीं होते. ज़्यादा जानकारी के लिए, डेटा सोर्स इंटिग्रेशन गाइड देखें.
source_identifier का फ़ॉर्मैट
टेलीमेट्री सेवा, सोर्स आइडेंटिफ़ायर के कई फ़ॉर्मैट स्वीकार करती है. खास जानकारी के लिए, मेट्रिक कॉन्फ़िगरेशन में डेटा सोर्स की परिभाषा देखें.
एमसीजी, source_identifier से प्रोटोटाइप मैसेज टाइप का अनुमान सिर्फ़ तब लगाता है, जब वह यूनिट टाइप नेम फ़ॉर्मैट का इस्तेमाल करता है. अगर आपने FQIN या कस्टम नाम (कॉन्फ़िगर किए जा सकने वाले पब्लिशर रजिस्टर से) का इस्तेमाल किया है, तो एमसीजी टाइप का अनुमान नहीं लगा सकता. ऐसे मामलों में, आपको data_source_message_types देना होगा. अगर टाइप आपके कैटलॉग में नहीं है, तो आपको descriptor_protos में उसकी परिभाषा भी देनी होगी.
उदाहरण: डेटा सोर्स तय करना
इस उदाहरण में, वाहन की स्पीड की जानकारी दी गई है. सबसे पहले, VSIDL कैटलॉग देखें. इससे आपको उस सेवा के बारे में पता चलेगा जो यह डेटा पब्लिश करती है.
एसडीवी कोडबेस में मौजूद सैंपल कैटलॉग का इस्तेमाल करके, काम की सेवा की पहचान करें. 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) डेटा सोर्स के इस्तेमाल किए गए प्रोटोबफ़ मैसेज की परिभाषा में मिल सकते हैं. यहां दिए गए एक्सप्रेशन से यह काम किया जा सकता है:
SpeedSource.speed:SpeedSourceडेटा सोर्स सेspeedफ़ील्ड की वैल्यू वापस लाता है.SpeedSource.speed > 27.7: अगर स्पीड 27.7 मीटर/सेकंड (करीब 100 कि॰मी॰/घंटा) से ज़्यादा है, तो इसकी वैल्यूtrueहोती है.
ट्रिगर: तय करें कि कार्रवाइयां कब होंगी
ट्रिगर से यह तय होता है कि कार्रवाइयां कब लागू होंगी: एग्रीगेटर का आकलन करना, रिपोर्ट जनरेट करना या कलेक्शन के लाइफ़साइकल को कंट्रोल करना. तय किए गए सभी ट्रिगर को टॉप-लेवल triggers ऐरे में जोड़ें.
ट्रिगर ऑब्जेक्ट के फ़ील्ड (triggers सूची में मौजूद आइटम) |
|
|---|---|
name |
मेट्रिक कॉन्फ़िगरेशन में इस ट्रिगर के लिए यूनीक आइडेंटिफ़ायर. |
periodicdataconditional |
आपको इनमें से सिर्फ़ एक फ़ील्ड की वैल्यू देनी होगी, ताकि यह तय किया जा सके कि इस सुविधा का इस्तेमाल कैसे किया जाएगा. |
डेटा ट्रिगर
यह तब ट्रिगर होता है, जब SUBSCRIPTION डेटा सोर्स कोई नया मैसेज (कॉन्सेप्ट) उपलब्ध कराता है.
ट्रिगर में मौजूद data ऑब्जेक्ट के फ़ील्ड |
|
|---|---|
source_name |
data_source का name, जिसे यह ट्रिगर सुनता है. |
उदाहरण: डेटा ट्रिगर
इस उदाहरण में, 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 |
यह एक नॉन-नेगेटिव संख्या (मिलीसेकंड में) होती है. इससे यह तय किया जाता है कि ट्रिगर के फ़ायर होने से पहले, शर्त को नई स्थिति में कितनी देर तक पूरा करना होगा. |
optionalrequire_exact |
बूलियन. अगर वैल्यू सही है, तो इस अवधि के दौरान पब्लिश की गई सभी वैल्यू एक जैसी होनी चाहिए, ताकि ट्रिगर फ़ायर हो सके. |
उदाहरण: शर्त के साथ ट्रिगर करना
यहां दिए गए ट्रिगर में एज के विकल्पों का इस्तेमाल किया गया है. अगर स्पीड 27.7 मीटर/सेकंड से ज़्यादा हो जाती है और कम से कम पांच सेकंड तक ज़्यादा रहती है, तो यह ट्रिगर होता है:
{ "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 |
एक या उससे ज़्यादा ट्रिगर के नामों की ऐसी कैटगरी जिनकी वजह से इस एग्रीगेशन का आकलन किया जाता है. |
optionalreset_on_get |
बूलियन, डिफ़ॉल्ट रूप से: `false`. अगर `true` है, तो सिस्टम, एग्रीगेशन की स्थिति को रीसेट कर देता है. ऐसा तब होता है, जब इसकी वैल्यू को किसी दूसरे एग्रीगेटर, मेट्रिक रिपोर्ट या शर्त के हिसाब से ट्रिगर होने वाले इवेंट से ऐक्सेस किया जाता है. |
message_builder |
यह पढ़ने, प्रोसेस करने, और एग्रीगेट करने के लिए डेटा तय करता है. इसके बाद, आउटपुट मैसेज के फ़ील्ड, अन्य एग्रीगेटर और रिपोर्ट के लिए डेटा सोर्स बन जाते हैं. यह field_assignments का इस्तेमाल करता है. हर असाइनमेंट, आउटपुट मैसेज में एक फ़ील्ड तय करता है. |
मैसेज बिल्डर
message_builder ऑब्जेक्ट, आउटपुट मैसेज के स्ट्रक्चर और इसके फ़ील्ड की गिनती करने के लिए इस्तेमाल किए गए एग्रीगेशन लॉजिक को तय करता है. इसका इस्तेमाल एग्रीगेटर और रिपोर्ट कॉन्फ़िगरेशन, दोनों में किया जाता है.
message_builder ऑब्जेक्ट के फ़ील्ड (एग्रीगेटर या रिपोर्ट में) |
|
|---|---|
message_type |
आउटपुट के लिए, प्रोटोबफ़ मैसेज टाइप का पूरी तरह क्वालिफ़ाइड नाम. अगर इसे शामिल नहीं किया जाता है, तो MCG, field_assignments' अनुमानित आउटपुट टाइप के आधार पर कस्टम मैसेज टाइप बनाता है. इसका इस्तेमाल सिर्फ़ तब करें, जब मैसेज बिल्डर किसी मेट्रिक रिपोर्ट का हिस्सा हो और आपकी रिपोर्ट, पहले से तय की गई किसी खास प्रोटोबफ़ मैसेज की परिभाषा से मेल खाती हो. |
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 ऐरे (कॉन्सेप्ट) में ऑब्जेक्ट जोड़ें. इन कॉन्फ़िगरेशन से यह तय होता है कि प्रोसेस किए गए डेटा को कैसे पैकेज किया जाता है और इसे कब जनरेट किया जाता है. कॉम्पोनेंट का फिर से इस्तेमाल करने के लिए, एक मेट्रिक कॉन्फ़िगरेशन में कई रिपोर्ट कॉन्फ़िगरेशन तय किए जा सकते हैं.
trigger_names फ़ील्ड का इस्तेमाल करके, रिपोर्ट जनरेट करने की सुविधा को कंट्रोल किया जा सकता है. इसके अलावा, कॉन्फ़िगरेशन चालू होने पर तुरंत रिपोर्ट जनरेट करने के लिए report_initial का इस्तेमाल किया जा सकता है. साथ ही, डेटा कलेक्शन में रुकावट आने पर फ़ाइनल रिपोर्ट जनरेट करने के लिए report_incomplete का इस्तेमाल किया जा सकता है.
ध्यान दें: प्रोसेसिंग को आउटपुट से कनेक्ट करने के लिए, none एग्रीगेशन टाइप @type: "none" का इस्तेमाल करें. इससे एग्रीगेटर से पहले से कैलकुलेट की गई वैल्यू को पढ़ा जा सकता है. रिपोर्ट आम तौर पर स्टेटलेस स्नैपशॉट होती हैं. इसलिए, यह जटिल स्टेटफ़ुल लॉजिक को एग्रीगेटर के अंदर रखता है और रिपोर्ट को फ़ॉर्मैटिंग के लिए रिज़र्व करता है.
रिपोर्ट कॉन्फ़िगरेशन ऑब्जेक्ट के फ़ील्ड (report_configs सूची में मौजूद आइटम) |
|
|---|---|
name |
रिपोर्ट के लिए यूनीक नाम. यह नाम, जनरेट की गई रिपोर्ट के मेटाडेटा में दिखता है. |
trigger_names |
ट्रिगर के नामों की एक ऐसी कैटगरी जिससे रिपोर्ट जनरेट होती है और पब्लिश होती है. |
message_builder |
ज़्यादा जानकारी के लिए, मैसेज बिल्डर देखें. इससे रिपोर्ट के कॉन्टेंट के बारे में पता चलता है. एग्रीगेशन का आकलन सिर्फ़ तब किया जाता है, जब रिपोर्ट ट्रिगर होती है. उदाहरण के लिए, वेक्टर एग्रीगेशन से हर रिपोर्ट में एक वैल्यू जुड़ती है. वहीं, गिनती वाले एग्रीगेशन से रिपोर्ट नंबर दिखता है. |
optionalreport_incomplete(डिफ़ॉल्ट: `false`) |
यह एक बूलियन है. अगर `true` है, तो सिस्टम बंद होने पर या डेटा कलेक्शन खत्म होने पर फ़ाइनल रिपोर्ट जनरेट करता है. भले ही, डेटा मौजूद न हो. |
optionalreport_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 ऐरे के अलावा, मेट्रिक कॉन्फ़िगरेशन के ब्यौरे में सिग्नल कैटलॉग का रेफ़रंस होना ज़रूरी है. किसी खास यूयूआईडी को असाइन करने और कलेक्शन के लाइफ़साइकल को मैनेज करने के लिए, वैकल्पिक फ़ील्ड भी शामिल किए जा सकते हैं.
यूयूआईडी सेट करें
हर MetricsConfig के लिए, हर जगह स्वीकार किया जाने वाला यूनीक आइडेंटिफ़ायर (यूयूआईडी) ज़रूरी है. अगर आपने existing_uuid दिया है, तो MCG इसका इस्तेमाल करता है. ऐसा न होने पर, यह कोई रैंडम आईडी बना देता है. सभी डिप्लॉयमेंट और टूल के लिए एक जैसा existing_uuid तय करें.
स्ट्रिंग, हाइफ़न वाला मान्य यूयूआईडी होना चाहिए. इसमें सिर्फ़ अंग्रेज़ी के छोटे अक्षर होने चाहिए.
"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
सिग्नल की परिभाषाएं
सिग्नल के नामों और टाइप की पुष्टि करने के लिए, एमसीजी को वाहन के सिग्नल कैटलॉग का ऐक्सेस चाहिए. यह एक प्रोटोबफ़ FileDescriptorSet है. इसमें आपके VSIDL .proto की परिभाषाएं शामिल हैं. इन्हें पैकेज करके MCG पर अपलोड किया जाता है. कैटलॉग बनाने और अपलोड करने के बारे में जानकारी के लिए, वाहन के सिग्नल कैटलॉग देखें.
JSON ऑब्जेक्ट के vs_version फ़ील्ड में, कैटलॉग का वर्शन तय करें:
"vs_version": "v1.0",
लाइफ़साइकल ट्रिगर तय करना
टेलीमेट्री कैंपेन के संदर्भ में, MetricsConfig की लाइफ़साइकल से यह तय होता है कि डेटा कब रिकॉर्ड किया जाएगा. कैंपेन मैनेजमेंट सिस्टम, डिवाइस पर कॉन्फ़िगरेशन को डिप्लॉय और चालू करता है. हालांकि, लाइफ़साइकल ट्रिगर का इस्तेमाल करके, यह सटीक तौर पर कंट्रोल किया जा सकता है कि डिप्लॉयमेंट के दौरान डेटा कब इकट्ठा किया जाएगा.
इससे, डेटा कलेक्शन को वाहन के इस्तेमाल के पैटर्न के साथ अलाइन किया जा सकता है. जैसे, कॉन्फ़िगरेशन को बंद किए बिना "यात्रा" (IgnitionOn से IgnitionOff) या "चार्जिंग सेशन".
सेशन कंट्रोल (शुरू/रोकें): डेटा कलेक्शन को कंट्रोल करने के लिए,
start_trigger_nameऔरstop_trigger_nameका इस्तेमाल करें. उदाहरण के लिए, अगर आपको सिर्फ़ वाहन चलाने के दौरान डेटा इकट्ठा करना है, तोIgnitionOnको स्टार्ट ट्रिगर औरIgnitionOffको स्टॉप ट्रिगर के तौर पर इस्तेमाल करें. कॉन्फ़िगरेशन, डिवाइस पर चालू रहता है. हालांकि, स्टॉप ट्रिगर चालू होने पर, यह "पॉज़" हो जाता है. इसका मतलब है कि यह डेटा इकट्ठा करना और उसे प्रोसेस करना बंद कर देता है. यह सिर्फ़ तब फिर से शुरू होता है, जब स्टार्ट ट्रिगर फिर से चालू होता है.अहम जानकारी: इससे सिर्फ़ डेटा कलेक्शन रुकता है. इससे लॉजिकल विंडो, अलग-अलग डेटा सेट तय नहीं होते हैं. साथ ही, इसके कोई अन्य साइड इफ़ेक्ट भी नहीं होते. डेटा कलेक्शन रुकने या फिर से शुरू होने पर, एग्रीगेटर वैल्यू रीसेट नहीं होती हैं.
एक बार पता लगाना (खत्म करें): अगर कॉन्फ़िगरेशन को सिर्फ़ एक बार चलाना है, तो
deactivate_trigger_nameका इस्तेमाल करें. उदाहरण के लिए, किसी खास गड़बड़ी कोड का पहली बार पता लगाने के लिए. इसके बाद, यह उस डिवाइस पर हमेशा के लिए बंद हो जाएगा. भले ही, कैंपेन तकनीकी तौर पर अब भी चालू हो.
अगर आपने लाइफ़साइकल के किसी भी ट्रिगर के बारे में नहीं बताया है, तो कैंपेन के कॉन्फ़िगरेशन के चालू होते ही डेटा कलेक्शन शुरू हो जाता है. यह तब तक जारी रहता है, जब तक कैंपेन खत्म नहीं हो जाता.
| लाइफ़साइकल के टॉप-लेवल फ़ील्ड (रूट ऑब्जेक्ट) | |
|---|---|
optionalstart_trigger_name |
यह उस ट्रिगर का नाम है जो कलेक्शन सेशन शुरू करता है. इसे stop_trigger_name के बिना सेट किया जा सकता है. |
optionalstop_trigger_name |
उस ट्रिगर का नाम जो कलेक्शन सेशन को रोकता है. उदाहरण के लिए, जब वाहन रुका हुआ हो. अगर इसे सेट किया जाता है, तो start_trigger_name को भी सेट करना होगा. |
optionaldeactivate_trigger_name |
यह उस ट्रिगर का नाम है जो `MetricsConfig` को पूरी तरह से बंद कर देता है. |
ऐडवांस: कस्टम प्रोटो डेफ़िनिशन
दो मुख्य मामलों में, MCG को मेट्रिक कॉन्फ़िगरेशन के ब्यौरे में मौजूद सभी तरह के मैसेज समझने के लिए, सिर्फ़ vs_version काफ़ी नहीं होता:
- टाइप का अनुमान नहीं लगाया जा सका:
source_identifierफ़ॉर्मैट में बताए गए तरीके के मुताबिक, जबsource_identifierमें FQIN या कस्टम नाम का इस्तेमाल किया जाता है, तब MCG टाइप का अनुमान नहीं लगा पाता. - कस्टम मैसेज: मेट्रिक कॉन्फ़िगरेशन के ब्यौरे में, ऐसे प्रोटोबफ़ मैसेज का इस्तेमाल किया जाता है जो
vs_versionमें दिए गए VSIDL कैटलॉग में नहीं मिलते. ऐसा तब होता है, जब कस्टम रिपोर्ट फ़ॉर्मैट के लिएmessage_builderमेंmessage_typeसेट किया जाता है.
ऐसे मामलों में, data_source_message_types का इस्तेमाल करके एमसीजी को टाइप का अनुमान लगाने में मदद करें. साथ ही, descriptor_protos का इस्तेमाल करके मैसेज की परिभाषाएं दें.
data_source_message_types
source_identifier स्ट्रिंग को उसके पूरी तरह से क्वालिफ़ाइड प्रोटोबफ़ मैसेज टाइप पर मैप करें.
data_source_message_types में मौजूद कुंजी, data_sources एंट्री में मौजूद source_identifier वैल्यू से मेल खानी चाहिए:
"data_source_message_types": {
"MyCustomSpeedService": "com.sdv.example.SampleMessage"
}
descriptor_protos
data_source_message_types या message_builder में इस्तेमाल किए गए किसी भी मैसेज टाइप की परिभाषाएं दें. ये परिभाषाएं, कॉन्फ़िगर किए गए vs_version में मौजूद नहीं होनी चाहिए.
descriptor_protos ऐरे में, base64-encoded descriptorpb.FileDescriptorSet पास करें. इसे Protobuf कंपाइलर protoc का इस्तेमाल करके, .proto फ़ाइलों से जनरेट करें.
"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" } } ] } } ] }
रेफ़रंस टेंप्लेट
एपीआई की परिभाषा के लिए, 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 |
डेटा सोर्स या एग्रीगेटर से पूरा मैसेज ऐक्सेस करना मैसेज में मौजूद किसी फ़ील्ड को ऐक्सेस करना (इसमें नेस्ट किए गए फ़ील्ड भी शामिल हैं) |
| अंकगणित | +, -, *, /, %, ** |
स्टैंडर्ड मैथ. ** घातांक है. |
| लॉजिकल | &&, ||, !, ^ |
AND, OR, NOT, XOR. |
| रिलेशनल | ==, !=, <, <=, >, >= |
== और !=, सभी टाइप पर काम करते हैं. अन्य के लिए, संख्याओं की ज़रूरत होती है. |
| सूची | contains(list, item)doesnotcontain(list, item)alleq(list, value) |
यह फ़ंक्शन, वेक्टर (ऐरे) पर काम करता है. अगर list में मौजूद सभी आइटम, value के बराबर हैं, तो alleq(list, value), true दिखाता है. |
| फ़ंक्शन | timestamp(clock_type) |
मौजूदा समय नैनोसेकंड में.clock_type: REALTIME_CLOCK याMONOTONIC_TIME_SINCE_BOOT_OR_RESUME |
abs(n) |
निरपेक्ष मान | |
floor(n), round(n), ceil(n) |
दशमलव वाली संख्या को पूर्ण संख्या में बदलने वाले फ़ंक्शन | |
| कार्रवाइयों का क्रम | () |
प्राथमिकता के लिए स्टैंडर्ड ग्रुपिंग |