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

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

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

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

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

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

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

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

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

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

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

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

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

কাস্টম বিশ্লেষণের জন্য মেসেজ লেবেল করা খুবই উপযোগী, এটি আপনাকে লেবেল বা লেবেলের সেট অনুযায়ী ডেলিভারি সংক্রান্ত পরিসংখ্যান ফিল্টার করতে দেয়। HTTP v1 API ব্যবহার করে পাঠানো যেকোনও মেসেজে আপনি লেবেল যোগ করতে পারেন। এর জন্য message অবজেক্টে অথবা প্ল্যাটফর্ম-নির্দিষ্ট 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 Data 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 বা তার পরবর্তী যেকোনও ভার্সন

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

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

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

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

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

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

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

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

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

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

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

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

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

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

iOS+

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

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

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

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

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

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

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

FirebaseMessaging.getInstance().setDeliveryMetricsExportToBigQuery(true);

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

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

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

ওয়েব

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

// 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 স্ট্রিং 'লুকিয়ে রাখার কী' এমন মেসেজের গ্রুপ শনাক্ত করে যেগুলি লুকিয়ে রাখা যেতে পারে। কোনও ডিভাইস কানেক্ট করা না থাকলে, প্রদত্ত collapse কী সহ শুধুমাত্র শেষ মেসেজটিই শেষ পর্যন্ত ডেলিভার করার জন্য সারিবদ্ধ করা হয়
অগ্রাধিকার ইন্টিজার মেসেজের অগ্রাধিকার। ৫ হল "সাধারণ" অগ্রাধিকার এবং ১০ হল "উচ্চ" অগ্রাধিকার।
ttl ইন্টিজার ডিভাইস অফলাইন থাকলে, FCM স্টোরেজে মেসেজটি কতক্ষণ (সেকেন্ডে) রাখতে হবে তা এই প্যারামিটার নির্দিষ্ট করে
প্রসঙ্গ স্ট্রিং যে বিষয়ে মেসেজ পাঠানো হয়েছে তার নাম (প্রযোজ্য হলে)
bulk_id ইন্টিজার বাল্ক আইডি সম্পর্কিত মেসেজের একটি গ্রুপকে শনাক্ত করে, যেমন কোনও নির্দিষ্ট বিষয়বস্তুতে পাঠানো
ইভেন্ট স্ট্রিং ইভেন্টের ধরন। সম্ভাব্য মান হল:
  • MESSAGE_ACCEPTED: FCM সার্ভার মেসেজটি পেয়েছে এবং অনুরোধটি বৈধ;
  • MESSAGE_DELIVERED: মেসেজটি ডিভাইসে অ্যাপের FCM SDK-তে ডেলিভার করা হয়েছে। সাধারণত, এই ফিল্ডটি প্রোপাগেট করা হয় না। চালু করতে, setDeliveryMetricsExportToBigQuery(boolean)-এ দেওয়া নির্দেশাবলী অনুসরণ করুন।
  • MISSING_REGISTRATIONS: the request was rejected due to a missing registration;
  • UNAUTHORIZED_REGISTRATION: the message was rejected because the sender is not authorized to send to the registration;
  • MESSAGE_RECEIVED_INTERNAL_ERROR: there was an unspecified error when processing the message request;
  • MISMATCH_SENDER_ID: মেসেজ পাঠানোর অনুরোধটি বাতিল করা হয়েছে কারণ মেসেজ পাঠানো সেন্ডার আইডি এবং এন্ড-পয়েন্টের জন্য ঘোষণা করা আইডি দুটির মধ্যে মিল নেই;
  • QUOTA_EXCEEDED: the request to send a message was rejected due to insufficient quota;
  • INVALID_REGISTRATION: the request to send a message was rejected due to an invalid registration;
  • INVALID_PACKAGE_NAME: the request to send a message was rejected due to an invalid package name;
  • INVALID_APNS_CREDENTIAL: the request to send a message was rejected due to an invalid APNS certificate;
  • INVALID_PARAMETERS: the request to send a message was rejected due to invalid parameters;
  • PAYLOAD_TOO_LARGE: মেসেজ পাঠানোর অনুরোধটি বাতিল করা হয়েছে কারণ পে-লোডের সাইজ সর্বাধিক সীমার চেয়ে বেশি;
  • AUTHENTICATION_ERROR: মেসেজ পাঠানোর অনুরোধটি অনুমোদন সংক্রান্ত সমস্যার কারণে বাতিল করা হয়েছে (মেসেজ পাঠানোর জন্য ব্যবহৃত API কী চেক করুন);
  • 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;