মেট্রিক্স কনফিগারেশন জেনারেশন অনুরোধ JSON ফর্ম্যাট

এই নির্দেশিকায় মেট্রিক্স কনফিগারেশন জেনারেটর (MCG) টুলের /api/v1/generate_metrics_config এন্ডপয়েন্টের জন্য JSON রিকোয়েস্ট ফরম্যাটের বিস্তারিত বর্ণনা দেওয়া হয়েছে। এই ফরম্যাটটি আপনাকে একটি সহজে পাঠযোগ্য কাঠামোতে টেলিমেট্রি ক্যাম্পেইন নির্ধারণ করতে দেয়—যেখানে ডেটা সংগ্রহ, ডিভাইসে প্রসেসিং এবং রিপোর্ট তৈরি করার বিষয়গুলো উল্লেখ করা থাকে।

MCG টুলটি এই JSON অবজেক্টটিকে যাচাই করে, টাইপ অমিল, চক্রাকার নির্ভরতা বা অনির্ধারিত রেফারেন্সের মতো সমস্যাগুলো পরীক্ষা করে এবং তারপর এটিকে একটি MetricsConfig প্রোটোকল বাফার (প্রোটোবাফ) মেসেজে কম্পাইল করে। এই MetricsConfig মেসেজটি হলো সেই বাইনারি ফরম্যাট যা ডিভাইসের টেলিমেট্রি সার্ভিসটি ক্যাম্পেইনটি চালানোর জন্য এক্সিকিউট করে।

পূর্বশর্ত: আপনার JSON স্কিমা, প্রোটোবাফ এবং মৌলিক ডেটা স্ট্রাকচার সম্পর্কে ধারণা থাকা উচিত। একটি ধারণাগত সংক্ষিপ্ত বিবরণের জন্য, মেট্রিক্স কনফিগারেশন ধারণাগুলি দেখুন।

কনফিগারেশন বর্ণনা লেখার পদ্ধতি

মেট্রিক্স সংগ্রহ প্রচারাভিযান ডিজাইন করতে, এই যৌক্তিক প্রবাহটি অনুসরণ করুন:

  1. ডেটার উৎস নির্দিষ্ট করুন : আপনার ডেটা কোথা থেকে আসবে তা নির্ধারণ করুন।
  2. যুক্তি ও প্রক্রিয়াকরণ নির্ধারণ করুন : কখন ডেটা সংগ্রহ করতে হবে এবং কীভাবে তা প্রক্রিয়াকরণ করতে হবে, তার জন্য নিয়মকানুন তৈরি করুন।
  3. আউটপুট তৈরি করুন : প্রক্রিয়াকৃত ডেটাগুলোকে একটি চূড়ান্ত বার্তায় প্যাকেজ করুন।
  4. শীর্ষ-স্তরের ফিল্ড : UUID , সিগন্যাল ডেফিনিশন এবং লাইফসাইকেল কন্ট্রোলের মতো শীর্ষ-স্তরের ফিল্ড যোগ করুন।

উদাহরণ: গড় গতির প্রতিবেদন

এই নির্দেশিকাটি একটি উদাহরণের মাধ্যমে দেখায় যে কীভাবে সমস্ত উপাদান একসাথে কাজ করে। এটি এমন একটি রিপোর্ট তৈরি করে যা প্রতি মিনিটে গাড়ির গড় গতি গণনা করে। এটি গতির ডেটা সংগ্রহ করার জন্য একটি ডেটা সোর্স ( SpeedSource ), কার্যপ্রবাহ নিয়ন্ত্রণ করার জন্য ট্রিগার ( OnNewSpeed , EveryMinute ), গড় গণনা করার জন্য একটি অ্যাগ্রিগেটর ( SpeedAggregator ), এবং ফলাফল প্যাকেজ করার জন্য একটি মেট্রিক্স রিপোর্ট কনফিগারেশন ( MinuteReport ) সংজ্ঞায়িত করে। সম্প্রসারণযোগ্য বিভাগগুলিতে থাকা উদাহরণগুলি এই পরিস্থিতির উপর ভিত্তি করে তৈরি।

ডেটা উৎস নির্দিষ্ট করুন

টেলিমেট্রি এসডিভি সার্ভিসেস (এসডিভি মিডলওয়্যারের মাধ্যমে) এবং কনফিগারযোগ্য পাবলিশার রেজিস্ট্রি-ভিত্তিক পাবলিশারদের থেকে ডেটা সংগ্রহ সমর্থন করে।

SDV-তে ডেটা ব্যবহার করতে, একটি ডেটা সোর্স ( কনসেপ্ট ) সংজ্ঞায়িত করুন এবং এটিকে data_sources অ্যারেতে যুক্ত করুন।

ডেটা সোর্স অবজেক্টের ফিল্ডসমূহ ( data_sources তালিকার আইটেম)
name একটি ব্যবহারকারী-সংজ্ঞায়িত স্ট্রিং যা মেট্রিক্স কনফিগারেশনের মধ্যে এই ডেটা উৎসটিকে শনাক্ত করে।
source_identifier পরিষেবাটি খুঁজে বের করতে ব্যবহৃত শনাক্তকারী। বিস্তারিত জানতে, source_identifier format দেখুন।
connection_type নিরবচ্ছিন্ন ডেটা প্রবাহের জন্য SUBSCRIPTION ( ডেটা ট্রিগারের জন্য আবশ্যক), অথবা চাহিদা অনুযায়ী ডেটা সংগ্রহের জন্য ON_DEMAND -ডিমান্ড (বিস্তারিত জানতে, ডেটা সোর্সের কনফিগারেশন দেখুন)।
ঐচ্ছিক
configuration

শুধুমাত্র RPC এবং কনফিগারযোগ্য পাবলিশার রেজিস্ট্রি-এর জন্য। ডেটা সোর্স কনফিগার করার জন্য একটি অবজেক্ট, যাতে নিম্নলিখিত ফিল্ডগুলো রয়েছে:

type_url কনফিগারেশনের প্রোটোবাফ মেসেজের FQN।
value_json ,
value_textproto ,
অথবা value
পেলোডটি JSON, textproto বা base64 ফরম্যাটে থাকবে।
SUBSCRIPTION সংযোগ প্রকারের জন্য ক্ষেত্রসমূহ
ঐচ্ছিক
sub_sampling_interval_ms
শুধুমাত্র পাব/সাব। মেসেজগুলোর মধ্যে সর্বনিম্ন ব্যবধান নির্দিষ্ট করে মেসেজের ফ্রিকোয়েন্সি নিয়ন্ত্রণ করার জন্য একটি অঋণাত্মক পূর্ণসংখ্যা (মিলিসেকেন্ড)।
ঐচ্ছিক
fetch_last_message
(ডিফল্ট: false )
শুধুমাত্র পাব/সাব এর জন্য। বুলিয়ান। যদি true , তাহলে সংযোগ স্থাপনের পর সর্বশেষ বার্তাটি গ্রহণ করা হবে।

সব ধরনের ডেটা সোর্সের জন্য সব অপশন উপলব্ধ নয়। বিস্তারিত তথ্যের জন্য ডেটা সোর্স ইন্টিগ্রেশন গাইড দেখুন।

উৎস_শনাক্তকারীর বিন্যাস

টেলিমেট্রি পরিষেবা একাধিক উৎস শনাক্তকারী ফরম্যাট গ্রহণ করে। একটি সার্বিক ধারণা পেতে মেট্রিক্স কনফিগারেশনে ডেটা উৎস সংজ্ঞা দেখুন।

MCG শুধুমাত্র তখনই source_identifier থেকে প্রোটোবাফ মেসেজ টাইপ অনুমান করে, যদি এটি Unit Type Name ফরম্যাট ব্যবহার করে। আপনি যদি FQIN বা কোনো কাস্টম নাম (Configurable Publisher Registry থেকে) ব্যবহার করেন, তাহলে MCG টাইপটি অনুমান করতে পারে না। এই ক্ষেত্রে, আপনাকে অবশ্যই data_source_message_types প্রদান করতে হবে। যদি টাইপটি আপনার ক্যাটালগে না থাকে, তাহলে আপনাকে অবশ্যই descriptor_protos এ এর সংজ্ঞাও প্রদান করতে হবে।

উদাহরণ: ডেটা উৎস নির্ধারণ করা

এই উদাহরণটি গাড়ির গতি নির্দেশ করে। প্রথমে, এই ডেটা প্রকাশকারী পরিষেবাটি শনাক্ত করতে VSIDL ক্যাটালগটি দেখুন।

SDV কোডবেসে থাকা স্যাম্পল ক্যাটালগ ব্যবহার করে প্রাসঙ্গিক সার্ভিসটি শনাক্ত করুন। source_identifier এর ফরম্যাট অনুযায়ী, 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] ) সমর্থিত নয়।
  • টাইপ সেফটি: নিশ্চিত করুন যে আপনি সামঞ্জস্যপূর্ণ টাইপের তুলনা করছেন (উদাহরণস্বরূপ, একটি স্ট্রিং ফিল্ডের সাথে পূর্ণসংখ্যার তালিকার তুলনা করবেন না)।

উদাহরণ: অভিব্যক্তি

উদাহরণটির গড় হিসাব করার জন্য গতির মানটি বের করতে হবে। শর্তসাপেক্ষ ট্রিগারের জন্য গাড়িটি নির্ধারিত গতিতে (ঘণ্টায় ১০০ কিমি-এর বেশি) চলছে কিনা, তাও নির্ধারণ করতে হবে। ডেটা সোর্স দ্বারা ব্যবহৃত প্রোটোবাফ মেসেজ ডেফিনিশনে আপনি ফিল্ডের নামগুলো (এই ক্ষেত্রে speed ') খুঁজে পাবেন। নিম্নলিখিত এক্সপ্রেশনগুলো এই কাজটি সম্পন্ন করে:

  • SpeedSource.speed : SpeedSource ডেটা সোর্স থেকে speed ফিল্ডের মান পুনরুদ্ধার করে।
  • SpeedSource.speed > 27.7 : যদি গতিবেগ ২৭.৭ মি/সে (প্রায় ১০০ কিমি/ঘণ্টা) এর চেয়ে বেশি হয়, তবে এটি true বলে গণ্য হবে।

ট্রিগার: কখন ক্রিয়া সংঘটিত হবে তা নির্ধারণ করুন

ট্রিগারগুলি নির্ধারণ করে কখন অ্যাকশনগুলি সম্পাদিত হবে: যেমন একটি অ্যাগ্রিগেটর মূল্যায়ন করা, একটি রিপোর্ট তৈরি করা, বা সংগ্রহের জীবনচক্র নিয়ন্ত্রণ করা। সমস্ত সংজ্ঞায়িত ট্রিগারকে শীর্ষ-স্তরের triggers অ্যারেতে যুক্ত করুন।

ট্রিগার অবজেক্টের ফিল্ডসমূহ ( triggers তালিকার আইটেম)
name মেট্রিক্স কনফিগারেশনে এই ট্রিগারের জন্য একটি অনন্য শনাক্তকারী।
periodic
data
conditional
আচরণটি নির্ধারণ করার জন্য আপনাকে অবশ্যই এই ক্ষেত্রগুলির মধ্যে ঠিক একটি প্রদান করতে হবে।

ডেটা ট্রিগার

যখন কোনো SUBSCRIPTION ডেটা সোর্স একটি নতুন বার্তা ( ধারণা ) প্রদান করে তখন এটি সক্রিয় হয়।

data অবজেক্টের ফিল্ডসমূহ (একটি ট্রিগারের মধ্যে)
source_name এই ট্রিগারটি যে data_source শোনে, তার name

উদাহরণ: ডেটা ট্রিগার

উদাহরণটিতে, SpeedSource যখনই একটি নতুন বার্তা প্রকাশ করে, তখন গড় গতির হিসাবটি আপডেট করুন। প্রতিবার এমনটা ঘটলে এই ডেটা ট্রিগারটি সক্রিয় হয়:

{
  "name": "OnNewSpeed",
  "data": {
    "source_name": "SpeedSource" // Reference to the defined data source
  }
}

পর্যায়ক্রমিক ট্রিগার

নিয়মিত বিরতিতে গুলি ছোড়ে ( ধারণা )।

periodic বস্তুর ক্ষেত্রসমূহ (একটি ট্রিগারে)
period_ms একটি অঋণাত্মক সংখ্যা যা মিলিসেকেন্ডে ব্যবধানটি নির্ধারণ করে।

উদাহরণ: পর্যায়ক্রমিক ট্রিগার

উদাহরণটির জন্য প্রতি মিনিটে একটি রিপোর্ট প্রয়োজন। এই পর্যায়ক্রমিক ট্রিগারটি সেই রিপোর্টটি তৈরি করার জন্য প্রতি ৬০,০০০ মিলিসেকেন্ডে সক্রিয় হয়:

{
  "name": "EveryMinute",
  "periodic": {
    "period_ms": 60000 // 60,000 ms = 60 seconds
  }
}

শর্তসাপেক্ষ ট্রিগার

কোনো এক্সপ্রেশন ( কনসেপ্ট )-এর মূল্যায়নের উপর ভিত্তি করে এটি সক্রিয় হয়। এর মূল্যায়ন শুরু করার জন্য এক বা একাধিক প্যারেন্ট ট্রিগারের প্রয়োজন হয়। এটি প্রায়শই এক্সপ্রেশনটিতে থাকা ডেটা সোর্স বা অ্যাগ্রিগেটরগুলোর জন্য একটি ডেটা ট্রিগার, অথবা ডেটার জন্য পোল করার একটি পর্যায়ক্রমিক ট্রিগার হয়ে থাকে।

conditional অবজেক্টের ক্ষেত্রসমূহ (একটি ট্রিগারের মধ্যে)
triggers একটি অ্যারে যাতে অন্তত একটি প্যারেন্ট ট্রিগারের নাম থাকে। যখন কোনো প্যারেন্ট ট্রিগার সক্রিয় হয়, তখন কন্ডিশনাল ট্রিগারটি এক্সপ্রেশনটি মূল্যায়ন করে।
expression যে এক্সপ্রেশনটির মূল্যায়ন করতে হবে। এক্সপ্রেশনসমূহ দেখুন।
condition_type এক্সপ্রেশনটির মূল্যায়নের উপর ভিত্তি করে ট্রিগারটি কখন সক্রিয় হবে তা নির্দিষ্ট করে।
অবস্থার প্রকারভেদ

condition_type ডিকশনারিটিতে কী (key) হিসেবে উপলব্ধ কন্ডিশন টাইপগুলোর মধ্যে ঠিক একটি অবশ্যই থাকতে হবে। আরও তথ্যের জন্য, কন্ডিশনাল ট্রিগার (Conditional triggers ) দেখুন।

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 অথবা উভয়ই থাকতে পারে ( Edge options দেখুন)।

এজ বিকল্পগুলি

rising_options এবং falling_options অবজেক্টগুলোতে নিম্নলিখিত ফিল্ডগুলো রয়েছে। যদি এগুলো প্রদান করা হয়, তবে সংশ্লিষ্ট ট্রানজিশনটিকে অবশ্যই সময়কালের শর্ত পূরণ করতে হবে। নির্দিষ্ট অপশন ছাড়া ট্রানজিশনগুলো অবিলম্বে কার্যকর হয়।

এজ অপশন অবজেক্টের জন্য ক্ষেত্রসমূহ
min_duration_ms একটি অঋণাত্মক সংখ্যা (মিলিসেকেন্ডে), যা নির্দেশ করে ট্রিগারটি সক্রিয় হওয়ার আগে শর্তটি নতুন অবস্থায় কতক্ষণ বজায় থাকতে হবে।
ঐচ্ছিক
require_exact
বুলিয়ান। যদি 'true' হয়, তাহলে ট্রিগারটি সক্রিয় হওয়ার জন্য নির্দিষ্ট সময়কালে প্রকাশিত সমস্ত মান অবশ্যই একই হতে হবে।

উদাহরণ: শর্তসাপেক্ষ ট্রিগার

নিম্নলিখিত ট্রিগারটি এজ অপশন ব্যবহার করে। যদি গতিবেগ ২৭.৭ মি/সে অতিক্রম করে এবং কমপক্ষে ৫ সেকেন্ড ধরে বেশি থাকে, তবে এটি সক্রিয় হয়:

{
  "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 আউটপুটের জন্য প্রোটোবাফ মেসেজ টাইপের সম্পূর্ণ নাম। এটি বাদ দিলে, MCG ' field_assignments এর অনুমানকৃত আউটপুট টাইপের উপর ভিত্তি করে একটি কাস্টম মেসেজ টাইপ তৈরি করে। শুধুমাত্র তখনই এটি ব্যবহার করুন, যখন মেসেজ বিল্ডারটি কোনো মেট্রিক্স রিপোর্টের অংশ হয় এবং আপনার রিপোর্টটিকে একটি নির্দিষ্ট, পূর্বনির্ধারিত প্রোটোবাফ মেসেজ ডেফিনিশনের সাথে অবশ্যই মিলতে হয়।
field_assignments ফিল্ড ডেফিনিশন অবজেক্টের একটি অ্যারে। প্রতিটি অবজেক্ট আউটপুট মেসেজের একটি ফিল্ড এবং তার মান গণনা করার লজিক নির্দিষ্ট করে।
ফিল্ড অ্যাসাইনমেন্ট অবজেক্টের ফিল্ডসমূহ ( field_assignments তালিকার আইটেম)
field_name ফিল্ডটির জন্য একটি ব্যবহারকারী-নির্ধারিত নাম। এক্সপ্রেশনে ডট নোটেশন ( aggregator_name.field_name ) ব্যবহার করার সময় এটি অবজেক্টের মধ্যে নির্দিষ্ট মানটিকে শনাক্ত করে।
aggregation

একটি অবজেক্ট যা নিম্নলিখিত ফিল্ডগুলির সাহায্যে সিস্টেম কীভাবে ফিল্ডের মান গণনা করে তা সংজ্ঞায়িত করে:

@type সমষ্টিগত ফাংশন।

  • avg , min , max , sum , stddev : সাধারণ গাণিতিক পরিসংখ্যান।
  • count : এই অ্যাগ্রিগেটরটি কতবার ট্রিগার হয়েছে তা গণনা করে।
  • delta : বর্তমান ও পূর্ববর্তী মানের মধ্যে পার্থক্য।
  • vector : মানগুলির একটি তালিকা (রিং বাফার) তৈরি করে।
  • none : সরাসরি কাঁচা মানটি প্রেরণ করে।
expression অ্যাগ্রিগেশনের জন্য ইনপুট এক্সপ্রেশন। count ছাড়া অন্য সব ধরনের অ্যাগ্রিগেশনের জন্য এটি আবশ্যক।
max_length শুধুমাত্র @type: "vector" এর জন্য। একটি ঐচ্ছিক পূর্ণসংখ্যা যা ভেক্টরের আকার সীমিত করে একটি রিং বাফার তৈরি করে।

উদাহরণ: অ্যাগ্রিগেটর

উদাহরণস্বরূপ, মিনিট রিপোর্টগুলোর মধ্যে পরিসংখ্যান গণনা করুন। এই অ্যাগ্রিগেটরটি OnNewSpeed ​​দ্বারা ট্রিগার হয়ে গড় গতি ( avg ), রিডিংয়ের সংখ্যা ( count ) গণনা করে এবং শেষ ৫টি গতির মান ( vector ) সংরক্ষণ করে। reset_on_get true তে সেট করুন। এটি প্রতিবার MinuteReport পরিসংখ্যান পড়ার সময় সেগুলোকে রিসেট করে দেয় এবং পরবর্তী মিনিটের জন্য অ্যাগ্রিগেটরের একটি নতুন কালেকশন উইন্ডো শুরু করে।

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

আউটপুট তৈরি করুন

আপনার টেলিমেট্রি ক্যাম্পেইনের চূড়ান্ত আউটপুট নির্ধারণ করতে, report_configs অ্যারেতে ( concept ) অবজেক্ট যোগ করুন। এই কনফিগারেশনগুলো নির্ধারণ করে যে প্রক্রিয়াকৃত ডেটা কীভাবে প্যাকেজ করা হবে এবং কখন তা তৈরি হবে। কম্পোনেন্টগুলো পুনরায় ব্যবহার করার জন্য আপনি একটি মেট্রিক্স কনফিগারেশনের মধ্যেই একাধিক রিপোর্ট কনফিগারেশন সংজ্ঞায়িত করতে পারেন।

আপনি trigger_names ফিল্ড ব্যবহার করে রিপোর্ট তৈরি নিয়ন্ত্রণ করেন। এছাড়াও, কনফিগারেশন সক্রিয় হওয়ার সাথে সাথে একটি রিপোর্ট তৈরি করতে আপনি report_initial ব্যবহার করতে পারেন, এবং ডেটা সংগ্রহে বাধা পড়লে একটি চূড়ান্ত রিপোর্ট তৈরি করতে report_incomplete ব্যবহার করতে পারেন।

দ্রষ্টব্য: প্রসেসিংকে আউটপুটের সাথে সংযুক্ত করতে, একটি অ্যাগ্রিগেটর থেকে পূর্ব-গণনাকৃত মানগুলি পড়ার জন্য none ' অ্যাগ্রিগেশন টাইপ ( @type: "none" ) ব্যবহার করুন। যেহেতু রিপোর্টগুলি সাধারণত স্টেটলেস স্ন্যাপশট হয়, তাই এটি জটিল স্টেটফুল লজিককে অ্যাগ্রিগেটরের মধ্যে রাখে এবং ফরম্যাটিংয়ের জন্য রিপোর্টকে সংরক্ষিত রাখে।

রিপোর্ট কনফিগারেশন অবজেক্টের ফিল্ডসমূহ ( report_configs তালিকার আইটেম)
name রিপোর্টটির জন্য একটি অনন্য নাম। এই নামটি তৈরি হওয়া রিপোর্টের মেটাডেটাতে প্রদর্শিত হয়।
trigger_names ট্রিগার নামগুলির একটি অ্যারে, যেগুলি রিপোর্টটি তৈরি ও প্রকাশ করে।
message_builder বিস্তারিত জানতে মেসেজ বিল্ডার দেখুন। এটি রিপোর্টের বিষয়বস্তু নির্ধারণ করে। অ্যাগ্রিগেশনগুলো শুধুমাত্র রিপোর্টটি ট্রিগার করার সময়ই মূল্যায়ন করা হয়। উদাহরণস্বরূপ, একটি ভেক্টর অ্যাগ্রিগেশন প্রতি রিপোর্টে একটি করে মান যোগ করে, এবং একটি কাউন্ট অ্যাগ্রিগেশন রিপোর্ট নম্বরটিকে প্রতিফলিত করে।
ঐচ্ছিক
report_incomplete
(ডিফল্ট: `ফলস`)
এটি একটি বুলিয়ান। এর মান `true` হলে, ডেটা অনুপস্থিত থাকলেও সিস্টেমটি শাটডাউনের সময় বা ডেটা সংগ্রহ শেষ হলে একটি চূড়ান্ত প্রতিবেদন তৈরি করে।
ঐচ্ছিক
report_initial
(ডিফল্ট: `ফলস`)
একটি বুলিয়ান। এর মান `true` হলে, মেট্রিক্স কনফিগারেশন সক্রিয় হওয়ার সাথে সাথেই সিস্টেম একটি রিপোর্ট তৈরি করে।

উদাহরণ: রিপোর্ট কনফিগারেশন

অবশেষে, উদাহরণটির জন্য রিপোর্ট কনফিগারেশন নির্ধারণ করুন। এটি EveryMinute দ্বারা ট্রিগার হয়। এটি একটি none অ্যাগ্রিগেশন ব্যবহার করে SpeedAggregator থেকে গণনা করা গড় গতি এবং রিডিং সংখ্যা পড়ে, যা প্রি-অ্যাগ্রিগেটেড মানটি রিপোর্টে প্রেরণ করে:

{
  "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 জন্য একটি Universally Unique Identifier (UUID) প্রয়োজন। আপনি যদি একটি existing_uuid প্রদান করেন, MCG সেটি ব্যবহার করে। অন্যথায়, এটি এলোমেলোভাবে একটি তৈরি করে। বিভিন্ন ডেপ্লয়মেন্ট এবং টুলের মধ্যে সামঞ্জস্য বজায় রাখার জন্য, একটি existing_uuid নির্দিষ্ট করে দিন।

স্ট্রিংটি অবশ্যই একটি বৈধ হাইফেনযুক্ত UUID হতে হবে এবং এতে শুধুমাত্র ছোট হাতের অক্ষর থাকতে হবে।

"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",

সংকেত সংজ্ঞা

সিগন্যালের নাম এবং প্রকার যাচাই করার জন্য, MCG-এর একটি ভেহিকেল সিগন্যাল ক্যাটালগে অ্যাক্সেস প্রয়োজন। এটি একটি প্রোটোবাফ 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 ব্যবহার করুন যদি কনফিগারেশনটি শুধুমাত্র একবার চালানো হয় (উদাহরণস্বরূপ, একটি নির্দিষ্ট ফল্ট কোডের প্রথম উপস্থিতি সনাক্ত করতে) এবং তারপর সেই ডিভাইসে নিজেকে স্থায়ীভাবে নিষ্ক্রিয় করে দেওয়া হয়, এমনকি যদি ক্যাম্পেইনটি প্রযুক্তিগতভাবে তখনও সক্রিয় থাকে।

আপনি যদি কোনো লাইফসাইকেল ট্রিগার নির্দিষ্ট না করেন, তাহলে ক্যাম্পেইন দ্বারা কনফিগারেশনটি সক্রিয় হওয়ার সাথে সাথেই ডেটা সংগ্রহ শুরু হয় এবং ক্যাম্পেইন শেষ না হওয়া পর্যন্ত তা অবিচ্ছিন্নভাবে চলতে থাকে।

শীর্ষ-স্তরের লাইফসাইকেল ফিল্ড (রুট অবজেক্ট)
ঐচ্ছিক
start_trigger_name
যে ট্রিগারটি ডেটা সংগ্রহের সেশন শুরু করে, তার নাম। এটি stop_trigger_name ছাড়াই সেট করা যায়।
ঐচ্ছিক
stop_trigger_name
এমন একটি ট্রিগারের নাম যা ডেটা সংগ্রহের সেশনটি থামিয়ে দেয় (উদাহরণস্বরূপ, যখন যানবাহনটি স্থির থাকে)। যদি এটি সেট করা থাকে, তাহলে start_trigger_name ও অবশ্যই সেট করতে হবে।
ঐচ্ছিক
deactivate_trigger_name
এমন একটি ট্রিগারের নাম যা `MetricsConfig`-কে সম্পূর্ণরূপে চূড়ান্ত ও নিষ্ক্রিয় করে।

উন্নত: কাস্টম প্রোটো সংজ্ঞা

দুটি প্রধান ক্ষেত্রে, একটি মেট্রিক্স কনফিগারেশনের বিবরণে থাকা সমস্ত মেসেজ টাইপ বোঝার জন্য MCG-এর পক্ষে শুধুমাত্র vs_version যথেষ্ট নয়:

  1. টাইপ ইনফারেন্স ব্যর্থতা: source_identifier ফরম্যাটে যেমন ব্যাখ্যা করা হয়েছে, যখন source_identifier FQIN বা একটি কাস্টম নাম ব্যবহার করে, তখন MCG টাইপটি ইনফার করতে পারে না।
  2. কাস্টম মেসেজ: মেট্রিক্স কনফিগারেশন বর্ণনায় এমন প্রোটোবাফ মেসেজ ব্যবহার করা হয় যা vs_version এ নির্দিষ্ট করা VSIDL ক্যাটালগে পাওয়া যায় না। একটি কাস্টম রিপোর্ট ফরম্যাটের জন্য message_buildermessage_type সেট করার সময় এটি ঘটে।

এইসব ক্ষেত্রে, MCG-কে টাইপ অনুমান করতে সাহায্য করার জন্য 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-এনকোডেড descriptorpb.FileDescriptorSet পাস করুন। Protobuf কম্পাইলার protoc ব্যবহার করে .proto ফাইলগুলো থেকে এটি তৈরি করুন।

"descriptor_protos": [
  "Cu8BCiZtY2cvdGVzdGRhdGEvbWF4YXZnY3..." // Base64 string
]

উদাহরণ: সম্পূর্ণ কনফিগারেশন বিবরণ

পূর্ববর্তী বিভাগগুলিতে উদাহরণটির সমস্ত উপাদান সংজ্ঞায়িত করা হয়েছে: প্রতি মিনিটে পর্যবেক্ষণ করা গড় গাড়ির গতিবেগ সহ একটি প্রতিবেদন তৈরি করা।

উপাদানগুলো হলো:

  • প্রতি সেকেন্ডে একবার পর্যন্ত গতির ডেটা পাওয়ার জন্য একটি ডেটা উৎস ( SpeedSource )।
  • একটি ডেটা ট্রিগার ( OnNewSpeed ) যা SpeedSource ডেটা পাঠালে সক্রিয় হয়।
  • একটি পর্যায়ক্রমিক ট্রিগার ( EveryMinute ) যা প্রতি ৬০ সেকেন্ড পর পর সক্রিয় হয়।
  • একটি অ্যাগ্রিগেটর ( SpeedAggregator ) যা OnNewSpeed ) ব্যবহার করে গড় গতি গণনা করে, রিডিং সংখ্যা গোনে এবং সাম্প্রতিক মানগুলো সংরক্ষণ করে, যা পড়ার পর রিসেট হয়ে যায়।
  • একটি রিপোর্ট কনফিগারেশন ( MinuteReport ) যা EveryMinute ব্যবহার করে SpeedAggregator থেকে গড় গতি ও সংখ্যা সম্বলিত একটি রিপোর্ট ট্রিগার করে।
  • মেট্রিক্স কনফিগারেশন শনাক্ত করতে এবং সিগন্যাল সংজ্ঞার জন্য কোন VSIDL ক্যাটালগ ব্যবহার করতে হবে তা নির্দিষ্ট করার জন্য শীর্ষ-স্তরের ফিল্ড ( existing_uuid , vs_version ) ব্যবহৃত হয়।

একত্রিত করলে, এই অংশগুলো একটি মেট্রিক্স কনফিগারেশনের সম্পূর্ণ বিবরণ তৈরি করে:

{
  "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"
            }
          }
        ]
      }
    }
  ]
}

রেফারেন্স টেমপ্লেট

এপিআই সংজ্ঞার জন্য, এমসিজি এপিআই রেফারেন্স দেখুন।

নিম্নলিখিত বিভাগগুলিতে একটি মেট্রিক্স কনফিগারেশনের বিবরণের সম্পূর্ণ রেফারেন্স দেওয়া হয়েছে। আপনার নিজস্ব মেট্রিক্স কনফিগারেশনের বিবরণ তৈরি করতে এটিকে একটি নির্দেশিকা হিসাবে ব্যবহার করুন।

শীর্ষ-স্তরের ক্ষেত্রগুলি

{
  "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) রাউন্ডিং ফাংশন
কার্যক্রমের ক্রম () অগ্রাধিকারের জন্য আদর্শ শ্রেণিবিন্যাস