মেসেজ ডেলিভারি সম্পর্কে বোঝা

মেসেজ ডেলিভারি না হওয়ার সমস্যা সমাধান করতে, FCM সমস্যার সমাধানকারী ব্যবহার করুন এবং ব্লগ পোস্ট দেখুন যাতে আপনি মেসেজ না দেখতে পাওয়ার বিভিন্ন কারণ বুঝতে পারেন। এছাড়াও, আপনি FCM স্ট্যাটাস ড্যাশবোর্ড দেখতে পারেন যাতে FCM-কে প্রভাবিত করে এমন কোনও পরিষেবা বিঘ্নিত হওয়ার ঘটনা চলছে কিনা তা শনাক্ত করতে পারেন।

এছাড়াও, FCM তিনটি টুল সেট প্রদান করে যা আপনাকে মেসেজিংয়ের সাফল্য এবং কৌশলের বিস্তৃত মূল্যায়নের বিষয়ে ইনসাইট পেতে সাহায্য করে:

  • Firebaseটি কনসোল মেসেজ ডেলিভারি রিপোর্ট
  • Firebase Cloud Messaging Data API থেকে এগ্রিগেট করা Android SDK ডেলিভারি মেট্রিক্স
  • Google BigQuery-তে বিস্তারিত ডেটা এক্সপোর্ট করা

Firebase কনসোলে BigQuery-এ ডেটা এক্সপোর্ট করা এবং রিপোর্ট ট্যাব, দুটি ক্ষেত্রেই কাজ করার জন্য Google Analytics প্রয়োজন। আপনি Firebase কনসোলের সেটিংস > ইন্টিগ্রেশন ট্যাব থেকে Google Analytics চালু করতে পারবেন। অ্যাগ্রিগেটেড ডেলিভারি ডেটা কাজ করার জন্য Google Analytics-এর প্রয়োজন নেই।

মনে রাখবেন, এই পৃষ্ঠায় দেখানো অনেক পরিসংখ্যানের রিপোর্টিং, অ্যানালিটিক্স ডেটার ব্যাচিংয়ের কারণে ২৪ ঘণ্টা পর্যন্ত দেরি হতে পারে।

মেসেজ ডেলিভারি রিপোর্ট

Firebase কনসোলে, DevOps ও এনগেজমেন্ট > মেসেজিং > রিপোর্ট ট্যাবে যান এবং Android বা Apple প্ল্যাটফর্ম FCM SDK-তে পাঠানো মেসেজের জন্য নিম্নলিখিত ডেটা দেখুন, এর মধ্যে বিজ্ঞপ্তি কম্পোজার এবং FCM API ব্যবহার করে পাঠানো মেসেজও অন্তর্ভুক্ত:

  • পাঠানো — ডেটা মেসেজ বা বিজ্ঞপ্তি মেসেজ ডেলিভারির জন্য সারিবদ্ধ করা হয়েছে অথবা ডেলিভারির জন্য APN-এর মতো থার্ড-পার্টি পরিষেবায় সফলভাবে পাস করা হয়েছে। মনে রাখবেন, পাঠানো সংক্রান্ত পরিসংখ্যান আপডেট হতে কয়েক ঘণ্টা সময় লাগতে পারে। আরও তথ্যের জন্য মেসেজের লাইফটাইম দেখুন।
  • রিসিভ করা হয়েছে (শুধুমাত্র Android ডিভাইসে উপলভ্য) — অ্যাপ ডেটা মেসেজ বা বিজ্ঞপ্তি মেসেজ রিসিভ করেছে। এই ডেটা তখনই উপলভ্য হয় যখন রিসিভ করা Android ডিভাইসে FCM SDK 18.0.1 বা তার পরবর্তী ভার্সন ইনস্টল করা থাকে।
  • ইম্প্রেশন (শুধুমাত্র Android ডিভাইসে বিজ্ঞপ্তি মেসেজের জন্য উপলভ্য) — অ্যাপ ব্যাকগ্রাউন্ডে চলাকালীন ডিভাইসে ডিসপ্লে বিজ্ঞপ্তি দেখানো হয়েছে।
  • খোলা হয়েছে — ব্যবহারকারী বিজ্ঞপ্তি মেসেজটি খুলেছেন। অ্যাপ ব্যাকগ্রাউন্ডে চলাকালীন প্রাপ্ত বিজ্ঞপ্তির জন্য শুধুমাত্র রিপোর্ট করা হয়েছে।

এই ডেটা বিজ্ঞপ্তি পেলোড সহ সব মেসেজ এবং সব লেবেল করা ডেটা মেসেজের জন্য উপলভ্য। লেবেল সম্পর্কে আরও জানতে, মেসেজে অ্যানালিটিক্স লেবেল যোগ করা দেখুন।

মেসেজ রিপোর্ট দেখার সময়, আপনি CSV-তে এক্সপোর্ট করার বিকল্প সহ, দেখানো ডেটার জন্য তারিখের রেঞ্জ সেট করতে পারবেন। এছাড়াও, আপনি এইসব মাপকাঠি অনুযায়ী ফিল্টার করতে পারবেন:

  • প্ল্যাটফর্ম (iOS বা Android)
  • অ্যাপ
  • কাস্টম অ্যানালিটিক্স লেবেল

মেসেজে অ্যানালিটিক্স লেবেল যোগ করা

কাস্টম বিশ্লেষণের জন্য মেসেজ লেবেল করা খুবই উপযোগী, যা আপনাকে লেবেল বা লেবেলের সেট অনুযায়ী ডেলিভারি পরিসংখ্যান ফিল্টার করতে দেয়। আপনি HTTP v1 API ব্যবহার করে পাঠানো যেকোনও মেসেজে লেবেল যোগ করতে পারবেন। এর জন্য আপনাকে মেসেজ অবজেক্টে অথবা প্ল্যাটফর্ম-নির্দিষ্ট AndroidFcmOptions বা ApnsFcmOptions ফিল্ডে fcmOptions.analyticsLabel ফিল্ড সেট করতে হবে।

Analytics লেবেল হল ^[a-zA-Z0-9-_.~%]{1,50}$ ফর্ম্যাটে টেক্সট স্ট্রিং। লেবেলে ছোট ও বড় হাতের অক্ষর, সংখ্যা এবং নিম্নলিখিত চিহ্ন থাকতে পারে:

  • -
  • ~
  • %

সর্বাধিক ৫০টি অক্ষর লেখা যাবে। আপনি প্রতিদিন সর্বাধিক ১০০টি অনন্য লেবেল নির্দিষ্ট করতে পারবেন; এই সীমার বাইরে যোগ করা লেবেল সহ মেসেজ রিপোর্ট করা হয় না।

Firebase কনসোল মেসেজিং রিপোর্ট ট্যাবে, আপনি আগে থেকে থাকা সব লেবেলের তালিকা সার্চ করতে এবং দেখানো পরিসংখ্যান ফিল্টার করতে সেগুলি আলাদাভাবে বা একসাথে প্রয়োগ করতে পারবেন।

FCM Data API ব্যবহার করে ডেলিভারি সংক্রান্ত মোট ডেটা

Firebase Cloud Messaging Data API আপনাকে এমন তথ্য ফিরিয়ে আনতে দেয় যা Android অ্যাপ্লিকেশনে টার্গেট করা মেসেজ অনুরোধের ফলাফল বুঝতে আপনাকে সাহায্য করতে পারে। API, কোনও প্রোজেক্টে ডেটা সংগ্রহ চালু থাকা সব Android ডিভাইস থেকে সংগৃহীত ডেটা প্রদান করে। এর মধ্যে দেরি না করে ডেলিভার করা মেসেজের শতাংশের হার এবং Android ট্রান্সপোর্ট লেয়ার-এর মধ্যে কতগুলি মেসেজ দেরি করে ডেলিভার করা হয়েছে বা ড্রপ করা হয়েছে সেই সংক্রান্ত বিবরণ অন্তর্ভুক্ত। এই ডেটা মূল্যায়ন করলে মেসেজ ডেলিভারির ক্ষেত্রে সামগ্রিক ট্রেন্ড প্রকাশ পেতে পারে এবং আপনার পাঠানোর অনুরোধের পারফর্ম্যান্স উন্নত করার কার্যকর উপায় খুঁজে পেতে আপনাকে সাহায্য করতে পারে। রিপোর্টে তারিখের রেঞ্জ উপলভ্যতার ব্যাপারে তথ্য পেতে মোট ডেটার টাইমলাইন দেখুন।

API কোনও নির্দিষ্ট অ্যাপ্লিকেশনের জন্য উপলভ্য সব ডেটা প্রদান করে। API রেফারেন্স ডকুমেন্টেশন দেখুন।

ডেটা কীভাবে ভাগ করা হয়?

ডেলিভারি ডেটা অ্যাপ্লিকেশন, তারিখ এবং অ্যানালিটিক্স লেবেল অনুযায়ী ভাগ করা হয়। API-তে কল করলে, তারিখ, অ্যাপ্লিকেশন ও অ্যানালিটিক্স লেবেলের প্রতিটি কম্বিনেশনের জন্য ডেটা পাওয়া যাবে। যেমন, একটি androidDeliveryData JSON অবজেক্ট দেখতে এইরকম হবে:

 {
  "appId": "1:23456789:android:a93a5mb1234efe56",
  "date": {
    "year": 2021,
    "month": 1,
    "day": 1
  },
  "analyticsLabel": "foo",
  "data": {
    "countMessagesAccepted": "314159",
    "messageOutcomePercents": {
      "delivered": 71,
      "pending": 15
    },
   "deliveryPerformancePercents": {
      "deliveredNoDelay": 45,
      "delayedDeviceOffline": 11
    }
  }

মেট্রিক কীভাবে ব্যাখ্যা করবেন

ডেলিভারি ডেটা থেকে নিম্নলিখিত প্রতিটি মেট্রিকের সাথে মানানসই মেসেজের শতাংশের আউটলাইন পাওয়া যায়। একটি মেসেজ একাধিক মেট্রিকের সাথে মানানসই হতে পারে। আমরা কীভাবে ডেটা সংগ্রহ করি এবং যে লেভেলে আমরা মেট্রিক্স একত্রিত করি তার সীমাবদ্ধতার কারণে, কিছু মেসেজের ফলাফল মেট্রিক্সে একেবারেই দেখানো হয় না, তাই নিচের শতাংশের যোগফল ১০০% হবে না।

অ্যাক্সেপ্ট করা মেসেজের সংখ্যা

ডেটা সেটে শুধুমাত্র সেইসব মেসেজের সংখ্যা অন্তর্ভুক্ত করা হয় যেগুলি Android ডিভাইসে ডেলিভারি করার জন্য FCM গ্রহণ করেছে। সব শতাংশ এই মানকে হর হিসেবে ব্যবহার করে। মনে রাখবেন, এই গণনায় সেইসব ব্যবহারকারীকে টার্গেট করা মেসেজ অন্তর্ভুক্ত করা হবে না যারা তাদের ডিভাইসে ব্যবহার ও ডায়াগনস্টিক সংক্রান্ত তথ্য সংগ্রহ করার বিকল্প বন্ধ করে দিয়েছেন।

মেসেজের ফলাফল সংক্রান্ত শতাংশ

MessageOutcomePercents অবজেক্টে অন্তর্ভুক্ত ফিল্ডগুলি মেসেজ অনুরোধের ফলাফল সম্পর্কে তথ্য প্রদান করে। বিভাগগুলি সব পারস্পরিকভাবে স্বতন্ত্র। এটি "আমার মেসেজ কি ডেলিভার করা হচ্ছে?" এবং "মেসেজ ড্রপ হওয়ার কারণ কী?" এই ধরনের প্রশ্নের উত্তর দিতে পারে।

যেমন, droppedTooManyPendingMessages ফিল্ডের জন্য বেশি ভ্যালু থাকলে বোঝা যেতে পারে যে অ্যাপ ইনস্ট্যান্স অনেক বেশি পরিমাণে নন-কোলাপসিবল মেসেজ পাচ্ছে যা FCM-এর ১০০টি পেন্ডিং মেসেজের সীমা অতিক্রম করে গেছে। এই সমস্যা কমাতে, আপনার অ্যাপ যাতে onDeletedMessages-এ কল ম্যানেজ করে তা নিশ্চিত করুন এবং কোলাপ্সিবল মেসেজ পাঠানোর কথা বিবেচনা করুন। একইভাবে, droppedDeviceInactive-এর জন্য বেশি শতাংশ আপনার সার্ভারে রেজিস্ট্রেশন টোকেন আপডেট করা, পুরনো টোকেন সরিয়ে দেওয়া এবং বিষয় থেকে সেগুলি আনসাবস্ক্রাইব করার সিগন্যাল হতে পারে। এই বিষয়ে পেশাদার পদ্ধতি সম্পর্কে জানতে FCM রেজিস্ট্রেশন টোকেন ম্যানেজ করুন দেখুন।

ডেলিভারি পারফর্ম্যান্সের শতাংশ

DeliveryPerformancePercents অবজেক্টের ফিল্ডগুলি সফলভাবে ডেলিভার করা মেসেজ সম্পর্কে তথ্য প্রদান করে। এটি "আমার মেসেজ কি দেরিতে এসেছে?" এবং "মেসেজ কেন দেরিতে এসেছে?" এই ধরনের প্রশ্নের উত্তর দিতে পারে। যেমন, delayedMessageThrottled-এর জন্য বেশি ভ্যালু থাকলে তা স্পষ্টভাবে দেখায় যে আপনি ডিভাইস প্রতি সর্বাধিক সীমা অতিক্রম করছেন, এবং আপনার মেসেজ পাঠানোর হার অ্যাডজাস্ট করা উচিত।

মেসেজ ইনসাইট শতাংশ

এই অবজেক্টটি পাঠানো সমস্ত মেসেজ সম্পর্কে অতিরিক্ত তথ্য প্রদান করে। priorityLowered ফিল্ডটি গৃহীত মেসেজের শতাংশ প্রকাশ করে যেগুলির অগ্রাধিকার HIGH থেকে NORMAL-এ নামিয়ে দেওয়া হয়েছে। এই ভ্যালু বেশি হলে, কম সংখ্যক উচ্চ অগ্রাধিকারযুক্ত মেসেজ পাঠানোর চেষ্টা করুন অথবা নিশ্চিত করুন যে উচ্চ অগ্রাধিকারযুক্ত মেসেজ পাঠানোর সময় আপনি সবসময় বিজ্ঞপ্তি দেখান। আরও তথ্যের জন্য মেসেজের অগ্রাধিকার সংক্রান্ত আমাদের ডকুমেন্টেশন দেখুন

BigQuery-তে এক্সপোর্ট করা ডেটার থেকে এই ডেটা কীভাবে আলাদা?

BigQuery এক্সপোর্ট, FCM ব্যাকএন্ডের মাধ্যমে মেসেজ গ্রহণ করা এবং ডিভাইসে SDK-তে মেসেজ ডেলিভারি (FCM আর্কিটেকচারের ২ ও ৪ নম্বর ধাপ) সম্পর্কে স্বতন্ত্র মেসেজ লগ প্রদান করে। এই ডেটা প্রতিটি মেসেজ গ্রহণ ও ডেলিভার করা হয়েছে কিনা তা নিশ্চিত করতে সহায়ক। পরের বিভাগে BigQuery ডেটা এক্সপোর্ট সম্পর্কে আরও পড়ুন।

অন্যদিকে, Firebase Cloud Messaging Data API, Android ট্রান্সপোর্ট লেয়ারে (বা FCM আর্কিটেকচারের ৩ নম্বর ধাপে) নির্দিষ্টভাবে কী ঘটে সেই সম্পর্কে এগ্রিগেট করা বিবরণ প্রদান করে। এই ডেটা বিশেষভাবে FCM ব্যাকএন্ড থেকে Android SDK-তে মেসেজ ডেলিভারি সম্পর্কে ইনসাইট প্রদান করে। এই ট্রান্সপোর্টের সময় কেন মেসেজ দেরিতে এসেছে বা ড্রপ করা হয়েছে সেই সংক্রান্ত ট্রেন্ড দেখানোর জন্য এটি বিশেষভাবে উপযোগী।

কিছু ক্ষেত্রে, নিম্নলিখিত কারণে দুটি ডেটা সেট হুবহু নাও মিলতে পারে:

  • এগ্রিগেট করা মেট্রিক সব মেসেজের শুধুমাত্র একটি অংশ স্যাম্পেল করে
  • এগ্রিগেট করা মেট্রিক রাউন্ড করা হয়েছে
  • গোপনীয়তা থ্রেশহোল্ডের নিচে থাকলে আমরা মেট্রিক্স দেখাই না
  • আমরা যেভাবে বিপুল পরিমাণ ট্রাফিক ম্যানেজ করি, তা অপ্টিমাইজ করার কারণে মেসেজ ফলাফলের একটি অংশ অনুপস্থিত।

API-এর সীমাবদ্ধতা

মোট ডেটা টাইমলাইন

API ৭ দিনের পুরনো ডেটা দেখাবে; তবে, এই API-এর দেখানো ডেটা ৫ দিন পর্যন্ত দেরিতে আসতে পারে। যেমন, ২০ জানুয়ারি, ৯ জানুয়ারি - ১৫ জানুয়ারি পর্যন্ত ডেটা উপলভ্য হবে, কিন্তু ১৬ জানুয়ারি বা তার পরের ডেটা উপলভ্য হবে না। এছাড়াও, ডেটা যথাসম্ভব নির্ভুলভাবে প্রদান করা হয়। ডেটা আউটএজ হলে, FCM সমস্যাটি সমাধান করার জন্য কাজ করবে এবং সমস্যাটি সমাধান হওয়ার পরে ডেটা ব্যাকফিল করবে না। আরও বড় ধরনের বিভ্রাটের ক্ষেত্রে, ডেটা এক সপ্তাহ বা তার বেশি সময়ের জন্য উপলভ্য নাও থাকতে পারে।

ডেটা কভারেজ

Firebase Cloud Messaging ডেটা API-এর মাধ্যমে প্রদান করা মেট্রিক্সের উদ্দেশ্য হল মেসেজ ডেলিভারির সামগ্রিক ট্রেন্ড সম্পর্কে ইনসাইট প্রদান করা। তবে, এগুলি সব মেসেজ সিনারিওতে ১০০% কভারেজ প্রদান করে না। নিম্নলিখিত পরিস্থিতিগুলি হল পরিচিত ফলাফল যা মেট্রিক্সে প্রতিফলিত হয় না।

মেয়াদ শেষ হয়ে যাওয়া মেসেজ

প্রদত্ত লগ তারিখের পরে টাইম টু লাইভ (TTL)-এর মেয়াদ শেষ হয়ে গেলে, এই তারিখে মেসেজটি droppedTtlExpired হিসেবে গণনা করা হবে না।

ইনঅ্যাক্টিভ ডিভাইসে মেসেজ

অ্যাক্টিভ নয় এমন ডিভাইসে পাঠানো মেসেজ ডেটাসেটে দেখানো হতে পারে বা নাও হতে পারে, এটি নির্ভর করে কোন ডেটা পাথ তারা ব্যবহার করে তার উপর। এর ফলে droppedDeviceInactive এবং pending ফিল্ডে কিছু ভুল গণনা হতে পারে।

নির্দিষ্ট ব্যবহারকারীর পছন্দ অনুযায়ী ডিভাইসে মেসেজ

যেসব ব্যবহারকারী তাদের ডিভাইসে ব্যবহার ও ডায়াগনস্টিক তথ্য সংগ্রহ করার বিকল্প বন্ধ করে দিয়েছেন, তাদের পছন্দ অনুযায়ী, আমাদের গণনায় তাদের মেসেজ অন্তর্ভুক্ত করা হবে না।

পূর্ণসংখ্যায় পরিণত করা ও ন্যূনতম পরিমাণ

FCM ইচ্ছাকৃতভাবে রাউন্ড করে এবং গণনা বাদ দেয় যেখানে ভলিউম যথেষ্ট বড় নয়।

BigQuery ডেটা এক্সপোর্ট

আরও বিশ্লেষণের জন্য আপনি নিজের মেসেজ ডেটা BigQuery-তে এক্সপোর্ট করতে পারবেন। BigQuery আপনাকে BigQuery SQL ব্যবহার করে ডেটা বিশ্লেষণ করতে, অন্য ক্লাউড প্রোভাইডারে এক্সপোর্ট করতে বা আপনার কাস্টম ML মডেলের জন্য ডেটা ব্যবহার করতে দেয়। BigQuery-তে এক্সপোর্ট করার মধ্যে মেসেজের ধরন বা মেসেজটি API বা বিজ্ঞপ্তি কম্পোজার ব্যবহার করে পাঠানো হয়েছে কিনা তা নির্বিশেষে মেসেজের জন্য উপলভ্য সমস্ত ডেটা অন্তর্ভুক্ত থাকে।

নিম্নলিখিত FCM SDK ন্যূনতম ভার্সন সহ ডিভাইসে পাঠানো মেসেজের জন্য, আপনার অ্যাপের মেসেজ ডেলিভারি ডেটা এক্সপোর্ট করার বিকল্প চালু করার অতিরিক্ত সুবিধা রয়েছে:

  • Android 20.1.0 বা তার পরবর্তী যেকোনও ভার্সন।
  • iOS 8.6.0 বা তার পরবর্তী যেকোনও ভার্সন
  • Firebase Web SDK 12.14.0 বা তার পরবর্তী যেকোনও ভার্সন

শুরু করতে, Firebase কনসোল ব্যবহার করে আপনার প্রোজেক্ট BigQuery-এর সাথে লিঙ্ক করুন:

  1. নিম্নলিখিত বিকল্পগুলির মধ্যে থেকে যেকোনও একটি বেছে নিন:

    • DevOps ও এনগেজমেন্ট > মেসেজিং > বিজ্ঞপ্তি কম্পোজার বিকল্পে যান, তারপর পৃষ্ঠার নিচে BigQuery অ্যাক্সেস করুন বিকল্পে ক্লিক করুন।

    • সেটিংস > ইন্টিগ্রেশন ট্যাব বিকল্পে যান। তারপর BigQuery-এ লিঙ্ক করুন বিকল্পে ক্লিক করুন।

      এই পৃষ্ঠায় প্রোজেক্টে FCM-চালু থাকা সব অ্যাপের জন্য FCM এক্সপোর্ট করার বিকল্প দেখানো হয়।

  2. BigQuery চালু করতে স্ক্রিনে দেখানো নির্দেশাবলী অনুসরণ করুন।

আরও তথ্যের জন্য Firebase-কে BigQuery-এর সাথে লিঙ্ক করুন লিঙ্ক দেখুন।

Cloud Messaging-এর জন্য BigQuery এক্সপোর্ট করার সুবিধা চালু করলে:

  • Firebase BigQuery-এ আপনার ডেটা এক্সপোর্ট করে। মনে রাখবেন যে এক্সপোর্টের জন্য ডেটার প্রাথমিক প্রোপাগেশন সম্পূর্ণ হতে ৪৮ ঘণ্টা পর্যন্ত সময় লাগতে পারে।

  • ডেটাসেট তৈরি করার পরে, লোকেশন পরিবর্তন করা যাবে না, তবে আপনি অন্য লোকেশনে ডেটাসেট কপি করতে অথবা অন্য লোকেশনে ম্যানুয়ালি ডেটাসেট সরাতে (আবার তৈরি করতে) পারবেন। আরও জানতে, ডেটাসেটের লোকেশন পরিবর্তন করুন বিকল্প দেখুন।

  • Firebase আপনার Firebase প্রোজেক্ট থেকে BigQuery-এ আপনার ডেটার নিয়মিত সিঙ্ক সেট-আপ করে। এই দৈনিক এক্সপোর্ট অপারেশন প্যাসিফিক টাইম অনুযায়ী ভোর ৪:০০-এ শুরু হয় এবং সাধারণত ২৪ ঘণ্টার মধ্যে শেষ হয়।

  • ডিফল্ট হিসেবে, আপনার প্রোজেক্টের সব অ্যাপ BigQuery-এর সাথে লিঙ্ক করা থাকে এবং পরে প্রোজেক্টে যোগ করা যেকোনও অ্যাপ অটোমেটিক BigQuery-এর সাথে লিঙ্ক হয়ে যায়। আপনি কোন অ্যাপ ডেটা পাঠাবে তা ম্যানেজ করতে পারবেন।

BigQuery এক্সপোর্ট ডিঅ্যাক্টিভেট করতে, Firebase কনসোলে আপনার প্রোজেক্ট আনলিঙ্ক করুন।

মেসেজ ডেলিভারি ডেটা এক্সপোর্ট চালু করুন

iOS+

FCM SDK 8.6.0 বা তার পরবর্তী যেকোনও ভার্সন সহ iOS ডিভাইস, তাদের অ্যাপের মেসেজ ডেলিভারি ডেটা এক্সপোর্ট চালু করতে পারে। FCM সতর্কতা ও ব্যাকগ্রাউন্ড বিজ্ঞপ্তি, দুটির জন্যই ডেটা এক্সপোর্ট করার সুবিধা দেয়। অ্যাপ লেভেলে ডেটা এক্সপোর্ট করার সুবিধা ডিফল্ট হিসেবে বন্ধ করা থাকে। প্রোগ্রাম্যাটিক্যালি এটি অ্যাপ ইনস্ট্যান্স লেভেলে চালু করলে, আপনি ব্যবহারকারীদের মেসেজ ডেলিভারি ডেটা বিশ্লেষণ করার অনুমতি চাইতে পারবেন (প্রস্তাবিত)। দুটিই সেট করা থাকলে, অ্যাপ ইনস্ট্যান্স লেভেল ভ্যালু অ্যাপ লেভেল ভ্যালুকে ওভাররাইড করে।

এইসব বিকল্প চালু করার আগে, আপনাকে প্রথমে FCM-BiqQuery লিঙ্ক তৈরি করতে হবে, যেমন BigQuery ডেটা এক্সপোর্ট-এ বর্ণনা করা হয়েছে।

সতর্কতা বিজ্ঞপ্তির জন্য ডেলিভারি ডেটা এক্সপোর্ট চালু করুন

শুধুমাত্র সতর্কতা বিজ্ঞপ্তিই বিজ্ঞপ্তি পরিষেবা অ্যাপ এক্সটেনশন ট্রিগার করতে পারে, তাই আপনাকে অ্যাপে বিজ্ঞপ্তি পরিষেবা এক্সটেনশন যোগ করতে হবে এবং ডিসপ্লে মেসেজ ট্র্যাকিং চালু করতে পরিষেবা এক্সটেনশনের মধ্যে এই API কল করতে হবে। নতুন ডেলিভার করা বিজ্ঞপ্তিতে কন্টেন্ট পরিবর্তন করা সম্পর্কে Apple-এর ডকুমেন্টেশন দেখুন

প্রতিটি বিজ্ঞপ্তি পাওয়ার জন্য নিম্নলিখিত কল করতে হবে:

Swift

// For alert notifications, call the API inside the service extension:
class NotificationService: UNNotificationServiceExtension {
  override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    Messaging.serviceExtension().exportDeliveryMetrics(withMessageInfo:request.content.userInfo)
  }
}

Objective-C

// For alert notifications, call the API inside the service extension:
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request
                   withContentHandler:(void (^)(UNNotificationContent *_Nonnull))contentHandler {
  [[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:request.content.userInfo];
}
@end

আপনি HTTP v1 API ব্যবহার করে পাঠানোর অনুরোধ তৈরি করলে, পেলোড অবজেক্টে `mutable-content = 1` উল্লেখ করতে ভুলবেন না।

ব্যাকগ্রাউন্ড বিজ্ঞপ্তির জন্য ডেলিভারি ডেটা এক্সপোর্ট চালু করুন

অ্যাপ ফোরগ্রাউন্ড বা ব্যাকগ্রাউন্ডে থাকার সময় ব্যাকগ্রাউন্ড মেসেজ পেলে, আপনি মূল অ্যাপের ডেটা মেসেজ হ্যান্ডলারের মধ্যে ডেটা এক্সপোর্ট API কল করতে পারবেন। প্রতিটি বিজ্ঞপ্তি পাওয়ার জন্য এই কলটি করতেই হবে:

Swift

// For background notifications, call the API inside the
// UIApplicationDelegate or NSApplicationDelegate method:
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any]) {
  Messaging.serviceExtension().exportDeliveryMetricsToBigQuery(withMessageInfo:userInfo)
}

Objective-C

// For background notifications, call the API inside the
// UIApplicationDelegate or NSApplicationDelegate method:
@implementation AppDelegate
- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  [[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:userInfo];
}
@end

Android

FCM SDK 20.1.0 বা তার পরবর্তী যেকোনও ভার্সন সহ Android ডিভাইস, অ্যাপের মেসেজ ডেলিভারি ডেটা এক্সপোর্ট করার সুবিধা চালু করতে পারে। অ্যাপ লেভেলে ডেটা এক্সপোর্ট করার সুবিধা ডিফল্ট হিসেবে বন্ধ করা থাকে। অ্যাপ ইনস্ট্যান্স লেভেলে প্রোগ্রাম্যাটিক্যালি এটি চালু করলে, আপনি ব্যবহারকারীর মেসেজ ডেলিভারি ডেটা বিশ্লেষণ করার অনুমতি চাইতে পারবেন (প্রস্তাবিত)। দুটিই সেট করা থাকলে, অ্যাপ ইনস্ট্যান্স লেভেল ভ্যালু, অ্যাপ লেভেল ভ্যালুকে ওভাররাইড করে।

এইসব বিকল্প চালু করার আগে, আপনাকে প্রথমে FCM-BiqQuery লিঙ্ক তৈরি করতে হবে, যেমনটি BigQuery ডেটা এক্সপোর্ট-এ বর্ণনা করা হয়েছে।

অ্যাপ ইনস্ট্যান্সের জন্য ডেলিভারি ডেটা এক্সপোর্ট চালু করুন

বেশিরভাগ ক্ষেত্রে, আমরা সাজেস্ট করি যে আপনি মেসেজ ডেলিভারি ডেটা এক্সপোর্ট করার সুবিধা শুধুমাত্র অ্যাপ ইনস্ট্যান্স লেভেলে চালু করুন এবং অ্যাপ লেভেলে বন্ধ রাখুন।

FirebaseMessaging.getInstance().setDeliveryMetricsExportToBigQuery(true);

কোনও অ্যাপের জন্য ডেলিভারি ডেটা এক্সপোর্ট চালু করা

আপনি যদি অ্যাপ লেভেলে এক্সপোর্ট করার সুবিধা চালু করতে চান, তাহলে setDeliveryMetricsExportToBigQuery পদ্ধতি কল করবেন না এবং আপনার অ্যাপ ম্যানিফেস্টে অ্যাপ্লিকেশন অবজেক্টে নিম্নলিখিত প্রপার্টি যোগ করুন:

<application>
  <meta-data android:name="delivery_metrics_exported_to_big_query_enabled"
      android:value="true" />
</application>

ওয়েব

FCM SDK for Web 12.14.0 বা তার পরবর্তী যেকোনও ভার্সন ডেলিভারি ডেটা এক্সপোর্ট করার অনুমতি দেয়। অ্যাপ লেভেলে ডেটা এক্সপোর্ট করার সুবিধা ডিফল্ট হিসেবে বন্ধ করা থাকে। প্রোগ্রাম্যাটিক্যালি এটি অ্যাপ ইনস্ট্যান্স লেভেলে চালু করলে, আপনি ব্যবহারকারীদের থেকে তাদের মেসেজ ডেলিভারি ডেটা বিশ্লেষণ করার অনুমতি চাইতে পারবেন (প্রস্তাবিত)। দুটিই সেট করা থাকলে, অ্যাপ ইনস্ট্যান্স লেভেল ভ্যালু অ্যাপ লেভেল ভ্যালুকে ওভাররাইড করে। ব্যবহারকারী ডেটা সংগ্রহে সম্মতি দিলে বা তা প্রত্যাখ্যান করলে, অ্যাপের প্রতিটি ইনস্ট্যান্সের জন্য এক্সপেরিমেন্টাল চালু বা বন্ধ করার ফ্ল্যাগ সেট করতে হবে, যেমনটি দেখানো হয়েছে:

// userConsent holds the decision of the user to give big query export consent.
const userConsent = ...;

const messaging = getMessagingInSw(app);

experimentalSetDeliveryMetricsExportedToBigQueryEnabled(messaging, userConsent);

BigQuery-তে কোন ডেটা এক্সপোর্ট করা হয়?

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

এক্সপোর্ট করা টেবিলের স্কিমা হল:

_PARTITIONTIME টাইমস্ট্যাম্প এই ছদ্ম কলামে দিনের শুরুর (UTC-তে) টাইমস্ট্যাম্প থাকে যেখানে ডেটা লোড করা হয়েছে। YYYYMMDD পার্টিশনের জন্য, এই ছদ্ম কলামে TIMESTAMP('YYYY-MM-DD') মান থাকে।
event_timestamp টাইমস্ট্যাম্প সার্ভার দ্বারা রেকর্ড করা ইভেন্ট টাইমস্ট্যাম্প
project_number ইন্টিজার প্রোজেক্ট নম্বর সেই প্রোজেক্টকে শনাক্ত করে যেটি মেসেজ পাঠিয়েছে
message_id স্ট্রিং মেসেজ আইডি কোনও মেসেজকে শনাক্ত করে। অ্যাপ আইডি ও টাইমস্ট্যাম্প থেকে তৈরি করা মেসেজ আইডি, কিছু ক্ষেত্রে, বিশ্বব্যাপী অনন্য নাও হতে পারে।
instance_id স্ট্রিং যে অ্যাপে মেসেজ পাঠানো হয়েছে সেটির অনন্য আইডি (উপলভ্য হলে)। এটি ইন্সট্যান্স আইডি বা Firebase ইনস্টলেশন আইডি হতে পারে।
message_type স্ট্রিং মেসেজের ধরন। বিজ্ঞপ্তি মেসেজ বা ডেটা মেসেজ হতে পারে। বিষয় ব্যবহার করা হয় কোনও বিষয় বা ক্যাম্পেন পাঠানোর জন্য আসল মেসেজ শনাক্ত করতে; পরবর্তী মেসেজ হয় বিজ্ঞপ্তি বা ডেটা মেসেজ।
sdk_platform স্ট্রিং প্রাপক অ্যাপের প্ল্যাটফর্ম
app_name স্ট্রিং Android অ্যাপের জন্য প্যাকেজের নাম বা iOS অ্যাপের জন্য বান্ডিল আইডি
collapse_key স্ট্রিং 'কলাপ্স কী' মেসেজের এমন একটি গ্রুপকে শনাক্ত করে যা কলাপ্স করা যেতে পারে। কোনও ডিভাইস কানেক্ট করা না থাকলে, প্রদত্ত কোল্যাপ্স কী সহ শুধুমাত্র শেষ মেসেজটি ডেলিভারির জন্য সারিবদ্ধ করা হয়
অগ্রাধিকার ইন্টিজার মেসেজের গুরুত্ব। ৫ হল "স্বাভাবিক" অগ্রাধিকার এবং ১০ হল "বেশি" অগ্রাধিকার।
ttl ইন্টিজার ডিভাইস অফলাইন থাকলে, FCM স্টোরেজে কতক্ষণ (সেকেন্ডে) মেসেজ রাখা উচিত তা এই প্যারামিটার নির্দিষ্ট করে
প্রসঙ্গ স্ট্রিং যে বিষয়ে মেসেজ পাঠানো হয়েছে তার নাম (প্রযোজ্য হলে)
bulk_id ইন্টিজার বাল্ক আইডি সম্পর্কিত মেসেজের একটি গ্রুপ শনাক্ত করে, যেমন কোনও নির্দিষ্ট বিষয়ে পাঠানো মেসেজ
ইভেন্ট স্ট্রিং ইভেন্টের ধরন। সম্ভাব্য ভ্যালুগুলি হল:
  • MESSAGE_ACCEPTED: FCM সার্ভার মেসেজটি পেয়েছে এবং অনুরোধটি বৈধ;
  • MESSAGE_DELIVERED: ডিভাইসে অ্যাপের FCM SDK-তে মেসেজটি ডেলিভার করা হয়েছে। ডিফল্ট হিসেবে, এই ফিল্ড প্রোপাগেট করা হয় না। চালু করতে, setDeliveryMetricsExportToBigQuery(boolean)-এ দেওয়া নির্দেশাবলী অনুসরণ করুন।
  • MISSING_REGISTRATIONS: রেজিস্ট্রেশন না থাকার কারণে অনুরোধ বাতিল করা হয়েছে;
  • UNAUTHORIZED_REGISTRATION: মেসেজটি বাতিল করা হয়েছে কারণ প্রেরকের কাছে রেজিস্ট্রেশনে পাঠানোর অনুমতি নেই;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: মেসেজ সংক্রান্ত অনুরোধ প্রসেস করার সময় অনির্দিষ্ট সমস্যা হয়েছে;
  • MISMATCH_SENDER_ID: মেসেজ পাঠানোর অনুরোধ বাতিল করা হয়েছে কারণ যে প্রেরক আইডি মেসেজ পাঠাচ্ছে এবং এন্ড-পয়েন্টের জন্য যে আইডি ঘোষণা করা হয়েছে, দুটি এক নয়;
  • QUOTA_EXCEEDED: মেসেজ পাঠানোর অনুরোধ বাতিল করা হয়েছে কারণ কোটা শেষ হয়ে গেছে;
  • INVALID_REGISTRATION: ভুল রেজিস্ট্রেশনের কারণে মেসেজ পাঠানোর অনুরোধ বাতিল করা হয়েছে;
  • INVALID_PACKAGE_NAME: ভুল প্যাকেজের নামের কারণে মেসেজ পাঠানোর অনুরোধ বাতিল করা হয়েছে;
  • INVALID_APNS_CREDENTIAL: মেসেজ পাঠানোর অনুরোধ বাতিল করা হয়েছে কারণ APNS সার্টিফিকেট সঠিক নয়;
  • INVALID_PARAMETERS: ভুল প্যারামিটারের কারণে মেসেজ পাঠানোর অনুরোধ বাতিল করা হয়েছে;
  • PAYLOAD_TOO_LARGE: মেসেজ পাঠানোর অনুরোধ বাতিল করা হয়েছে কারণ পেলোড সীমার চেয়ে বেশি;
  • AUTHENTICATION_ERROR: যাচাইকরণ সংক্রান্ত সমস্যার কারণে মেসেজ পাঠানোর অনুরোধ বাতিল করা হয়েছে (মেসেজ পাঠানোর জন্য ব্যবহৃত API Key চেক করুন);
  • INVALID_TTL: ভুল TTL-এর কারণে মেসেজ পাঠানোর অনুরোধ বাতিল করা হয়েছে।
analytics_label স্ট্রিং HTTP v1 API-এর মাধ্যমে, অ্যানালিটিক্সের উদ্দেশ্যে মেসেজ চিহ্নিত করার জন্য, মেসেজ পাঠানোর সময় অ্যানালিটিক্স লেবেল সেট করা যেতে পারে

এক্সপোর্ট করা ডেটা দিয়ে আপনি কী করতে পারবেন?

নিম্নলিখিত বিভাগে কোয়েরির উদাহরণ দেওয়া হয়েছে যা আপনি এক্সপোর্ট করা FCM ডেটার বিরুদ্ধে BigQuery-তে চালাতে পারবেন।

অ্যাপের মাধ্যমে পাঠানো মেসেজের সংখ্যা

SELECT app_name, COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_id != ''
GROUP BY 1;

মেসেজের মাধ্যমে টার্গেট করা অনন্য অ্যাপ ইনস্ট্যান্সের সংখ্যা গণনা করুন

SELECT COUNT(DISTINCT instance_id)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED';

কতগুলি বিজ্ঞপ্তি মেসেজ পাঠানো হয়েছে তার সংখ্যা

SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_type = 'DISPLAY_NOTIFICATION';

পাঠানো ডেটা মেসেজের সংখ্যা

SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND message_type = 'DATA_MESSAGE';

কোনও বিষয় বা ক্যাম্পেনে পাঠানো মেসেজের সংখ্যা গণনা করা

SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
  _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
  AND event = 'MESSAGE_ACCEPTED'
  AND bulk_id = your bulk id AND message_id != '';

নির্দিষ্ট বিষয়ে পাঠানো মেসেজের জন্য ইভেন্ট ট্র্যাক করতে, এই কোয়েরি পরিবর্তন করে AND message_id != ''-এর জায়গায় AND message_id = <your message id>; লিখুন।

কোনও নির্দিষ্ট বিষয় বা ক্যাম্পেনের জন্য ফ্যানআউট সময়সীমা গণনা করুন

ফ্যানআউট শুরুর সময় হল যখন আসল অনুরোধ পাওয়া যায় এবং শেষ সময় হল যখন একটি ইনস্ট্যান্সকে টার্গেট করে শেষ ব্যক্তিগত মেসেজ তৈরি করা হয়।

SELECT
  TIMESTAMP_DIFF(
    end_timestamp, start_timestamp, MILLISECOND
  ) AS fanout_duration_ms,
  end_timestamp,
  start_timestamp
FROM (
    SELECT MAX(event_timestamp) AS end_timestamp
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND event = 'MESSAGE_ACCEPTED'
      AND bulk_id = your bulk id
  ) sent
  CROSS JOIN (
    SELECT event_timestamp AS start_timestamp
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND event = 'MESSAGE_ACCEPTED'
      AND bulk_id = your bulk id
      AND message_type = 'TOPIC'
  ) initial_message;

ডেলিভার করা মেসেজের শতাংশ গণনা করুন

SELECT
  messages_sent,
  messages_delivered,
  messages_delivered / messages_sent * 100 AS percent_delivered
FROM (
    SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_sent
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND event = 'MESSAGE_ACCEPTED'
  ) sent
  CROSS JOIN (
    SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_delivered
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND (event = 'MESSAGE_DELIVERED'
      AND message_id
      IN (
        SELECT message_id FROM `project ID.firebase_messaging.data`
        WHERE
          _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
          AND event = 'MESSAGE_ACCEPTED'
        GROUP BY 1
      )
  ) delivered;

প্রদত্ত মেসেজ আইডি এবং ইনস্ট্যান্স আইডির জন্য সব ইভেন্ট ট্র্যাক করুন

SELECT *
FROM `project ID.firebase_messaging.data`
WHERE
    _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
    AND message_id = 'your message id'
    AND instance_id = 'your instance id'
ORDER BY event_timestamp;

প্রদত্ত মেসেজ আইডি এবং ইনস্ট্যান্স আইডির জন্য লেটেন্সি গণনা করুন

SELECT
  TIMESTAMP_DIFF(
    MAX(delivered_time), MIN(accepted_time), MILLISECOND
  ) AS latency_ms
FROM (
    SELECT event_timestamp AS accepted_time
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
      AND message_id = 'your message id'
      AND instance_id = 'your instance id'
      AND event = 'MESSAGE_ACCEPTED'
  ) sent
  CROSS JOIN (
    SELECT event_timestamp AS delivered_time
    FROM `project ID.firebase_messaging.data`
    WHERE
      _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND
      message_id = 'your message id' AND instance_id = 'your instance id'
      AND (event = 'MESSAGE_DELIVERED'
  ) delivered;