فهم تسليم الرسائل

توفر FCM ثلاث مجموعات من الأدوات لمساعدتك في الحصول على نظرة ثاقبة حول تسليم الرسائل:

  • تقارير تسليم رسائل وحدة التحكم في Firebase
  • مقاييس تسليم Android SDK المجمعة من Firebase Cloud Messaging Data API
  • تصدير بيانات شاملة إلى Google BigQuery

تتطلب جميع أدوات إعداد التقارير الموضحة في هذه الصفحة Google Analytics حتى تعمل. إذا لم يتم تمكين Google Analytics لمشروعك، فيمكنك إعداده في علامة تبويب عمليات التكامل في إعدادات مشروع Firebase.

ضع في اعتبارك أن الإبلاغ عن العديد من الإحصائيات في هذه الصفحة يخضع للتأخير لمدة تصل إلى 24 ساعة بسبب تجميع البيانات التحليلية.

تقارير تسليم الرسائل

في علامة التبويب "التقارير" في وحدة تحكم Firebase، يمكنك عرض البيانات التالية للرسائل المرسلة إلى Android أو Apple Platform FCM SDKs، بما في ذلك تلك المرسلة عبر مؤلف الإشعارات وواجهات برمجة تطبيقات FCM:

  • الإرسال - تم وضع رسالة البيانات أو رسالة الإعلام في قائمة الانتظار للتسليم أو تم تمريرها بنجاح إلى خدمة خارجية مثل APNs للتسليم. انظر عمر الرسالة لمزيد من المعلومات.
  • تم الاستلام (متوفر فقط على أجهزة Android) - تم استلام رسالة البيانات أو رسالة الإشعار بواسطة التطبيق. تتوفر هذه البيانات عندما يكون جهاز Android المتلقي مثبتًا عليه FCM SDK 18.0.1 أو إصدار أحدث.
  • مرات الظهور (متوفرة فقط لرسائل الإشعارات على أجهزة Android) - تم عرض إشعار العرض على الجهاز أثناء وجود التطبيق في الخلفية.
  • الفتح — فتح المستخدم رسالة الإعلام. يتم الإبلاغ عنها فقط للإشعارات المستلمة عندما يكون التطبيق في الخلفية.

تتوفر هذه البيانات لجميع الرسائل التي تحتوي على حمولة إعلامية ولجميع رسائل البيانات المصنفة . لمعرفة المزيد حول التصنيفات، راجع إضافة تصنيفات تحليلية إلى الرسائل .

عند عرض تقارير الرسائل، يمكنك تعيين نطاق زمني للبيانات المعروضة، مع خيار التصدير إلى ملف CSV. يمكنك أيضًا التصفية حسب هذه المعايير:

  • النظام الأساسي (iOS أو Android)
  • برنامج
  • تسميات التحليلات المخصصة

إضافة تسميات تحليلية إلى الرسائل

يعد تصنيف الرسائل مفيدًا جدًا للتحليل المخصص، مما يسمح لك بتصفية إحصائيات التسليم حسب التصنيفات أو مجموعات التصنيفات. يمكنك إضافة تصنيف إلى أي رسالة مرسلة عبر HTTP v1 API عن طريق تعيين الحقل fcmOptions.analyticsLabel في كائن الرسالة ، أو في حقول AndroidFcmOptions أو ApnsFcmOptions الخاصة بالنظام الأساسي.

تصنيفات Analytics عبارة عن سلاسل نصية بالتنسيق ^[a-zA-Z0-9-_.~%]{1,50}$ . يمكن أن تتضمن التسميات أحرفًا صغيرة وكبيرة وأرقامًا والرموز التالية:

  • -
  • ~
  • %

الحد الأقصى للطول هو 50 حرفًا. يمكنك تحديد ما يصل إلى 100 تصنيف فريد يوميًا؛ ولا يتم الإبلاغ عن الرسائل ذات التصنيفات المضافة بعد هذا الحد.

في علامة التبويب تقارير رسائل وحدة تحكم Firebase، يمكنك البحث في قائمة بجميع التصنيفات الموجودة وتطبيقها منفردة أو مجتمعة لتصفية الإحصائيات المعروضة.

بيانات التسليم المجمعة عبر FCM Data API

تتيح لك واجهة برمجة تطبيقات Firebase Cloud Messaging Data API استرداد المعلومات التي يمكن أن تساعدك في فهم نتائج طلبات الرسائل التي تستهدف تطبيقات Android. توفر واجهة برمجة التطبيقات (API) بيانات مجمعة عبر جميع أجهزة Android التي تدعم جمع البيانات في المشروع. يتضمن ذلك تفاصيل حول النسبة المئوية للرسائل التي تم تسليمها دون تأخير بالإضافة إلى عدد الرسائل التي تم تأخيرها أو إسقاطها داخل طبقة النقل في Android . يمكن أن يكشف تقييم هذه البيانات عن اتجاهات واسعة النطاق في تسليم الرسائل ويساعدك في العثور على طرق فعالة لتحسين أداء طلبات الإرسال الخاصة بك. راجع الجداول الزمنية للبيانات المجمعة للحصول على معلومات حول مدى توفر النطاق الزمني في التقارير.

توفر واجهة برمجة التطبيقات جميع البيانات المتاحة لتطبيق معين. راجع الوثائق المرجعية لواجهة برمجة التطبيقات (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
    }
  }

كيفية تفسير المقاييس

تحدد بيانات التسليم النسبة المئوية للرسائل التي تتوافق مع كل من المقاييس التالية. من الممكن أن تناسب رسالة واحدة مقاييس متعددة. نظرًا للقيود المفروضة على كيفية جمع البيانات ومستوى التفاصيل التي قمنا بتجميع المقاييس بها، فإن بعض نتائج الرسائل لا يتم تمثيلها في المقاييس على الإطلاق، وبالتالي فإن النسب المئوية أدناه لن يصل مجموعها إلى 100%.

عدد الرسائل المقبولة

العدد الوحيد المدرج في مجموعة البيانات هو عدد الرسائل التي قبلتها FCM لتسليمها إلى أجهزة Android. تستخدم جميع النسب المئوية هذه القيمة كمقام. ضع في اعتبارك أن هذا العدد لن يتضمن الرسائل الموجهة للمستخدمين الذين قاموا بتعطيل جمع معلومات الاستخدام والتشخيص على أجهزتهم.

النسب المئوية لنتائج الرسالة

توفر الحقول المضمنة في كائن MessageOutcomePercents معلومات حول نتائج طلبات الرسائل. الفئات كلها متنافية. يمكنه الإجابة على أسئلة مثل "هل يتم تسليم رسائلي؟" و"ما الذي يسبب إسقاط الرسائل؟"

على سبيل المثال، قد تشير القيمة العالية للحقل droppedTooManyPendingMessages إلى أن مثيلات التطبيق تتلقى كميات من الرسائل غير القابلة للطي تتجاوز حد FCM وهو 100 رسالة معلقة. للتخفيف من ذلك، تأكد من أن تطبيقك يتعامل مع المكالمات إلى onDeletedMessages ، وفكر في إرسال رسائل قابلة للطي. وبالمثل، يمكن أن تكون النسب المئوية العالية لـ droppedDeviceInactive إشارة لتحديث الرموز المميزة للتسجيل على الخادم الخاص بك، وإزالة الرموز المميزة التي لا معنى لها وإلغاء اشتراكها من المواضيع. راجع إدارة الرموز المميزة لتسجيل FCM للتعرف على أفضل الممارسات في هذا المجال.

نسب أداء التسليم

توفر الحقول الموجودة في كائن DeliveryPerformancePercents معلومات حول الرسائل التي تم تسليمها بنجاح. يمكنه الإجابة على أسئلة مثل "هل تأخرت رسائلي؟" و"لماذا تتأخر الرسائل؟" على سبيل المثال، تشير القيمة العالية لـ delayedMessageThrottled بوضوح إلى أنك تتجاوز الحدود القصوى لكل جهاز ، ويجب ضبط المعدل الذي ترسل به الرسائل.

النسب المئوية لرؤية الرسالة

يوفر هذا الكائن معلومات إضافية حول كافة الرسائل المرسلة. يعبر الحقل priorityLowered عن النسبة المئوية للرسائل المقبولة التي تم تخفيض أولويتها من HIGH إلى NORMAL . إذا كانت هذه القيمة عالية، فحاول إرسال عدد أقل من الرسائل ذات الأولوية العالية أو تأكد من عرض إشعار دائمًا عند إرسال رسالة ذات أولوية عالية. راجع وثائقنا حول أولوية الرسالة لمزيد من المعلومات

كيف تختلف هذه البيانات عن البيانات المصدرة إلى BigQuery؟

يوفر تصدير BigQuery سجلات رسائل فردية حول قبول الرسالة من خلال الواجهة الخلفية لـ FCM وتسليم الرسائل في SDK على الجهاز (الخطوتان 2 و4 من بنية FCM ). هذه البيانات مفيدة لضمان قبول الرسائل الفردية وتسليمها. اقرأ المزيد حول تصدير بيانات BigQuery في القسم التالي.

على النقيض من ذلك، توفر Firebase Cloud Messaging Data API تفاصيل مجمعة حول ما يحدث على وجه التحديد في طبقة نقل Android (أو الخطوة 3 من بنية FCM ). توفر هذه البيانات على وجه التحديد نظرة ثاقبة حول تسليم الرسائل من واجهات FCM الخلفية إلى Android SDK. إنه مفيد بشكل خاص لإظهار الاتجاهات المتعلقة بسبب تأخير الرسائل أو إسقاطها أثناء عملية النقل هذه.

في بعض الحالات، من الممكن ألا تتطابق مجموعتا البيانات بشكل دقيق للأسباب التالية:

  • لا تمثل المقاييس المجمعة سوى عينة من جزء من جميع الرسائل
  • يتم تقريب المقاييس المجمعة
  • نحن لا نقدم مقاييس أقل من حد الخصوصية
  • جزء من نتائج الرسائل مفقود بسبب التحسينات في كيفية إدارة الحجم الكبير من حركة المرور.

قيود واجهة برمجة التطبيقات

الجداول الزمنية للبيانات المجمعة

ستعيد واجهة برمجة التطبيقات (API) البيانات التاريخية لمدة 7 أيام؛ ومع ذلك، سيتم تأخير البيانات التي يتم إرجاعها بواسطة واجهة برمجة التطبيقات هذه لمدة تصل إلى 5 أيام. على سبيل المثال، في 20 كانون الثاني (يناير)، ستكون البيانات للفترة من 9 كانون الثاني (يناير) إلى 15 كانون الثاني (يناير) متاحة، ولكن ليس ليوم 16 كانون الثاني (يناير) أو ما بعده. بالإضافة إلى ذلك، يتم توفير البيانات في أفضل جهد. في حالة انقطاع البيانات، ستعمل FCM على الإصلاح للأمام ولن تقوم بإعادة ملء البيانات بعد إصلاح المشكلة. وفي حالات الانقطاع الكبيرة، قد تكون البيانات غير متاحة لمدة أسبوع أو أكثر.

تغطية البيانات

تهدف المقاييس التي توفرها Firebase Cloud Messaging Data API إلى توفير نظرة ثاقبة للاتجاهات العامة لتسليم الرسائل. ومع ذلك، فإنها لا توفر تغطية 100% لكافة سيناريوهات الرسائل. السيناريوهات التالية هي نتائج معروفة لا تنعكس في المقاييس.

الرسائل المطوية

لا تظهر الرسائل التي تم طيها بواسطة رسالة أخرى في مجموعة البيانات.

رسائل إلى الأجهزة غير النشطة

قد تظهر أو لا تظهر الرسائل المرسلة إلى الأجهزة غير النشطة في مجموعة البيانات اعتمادًا على مسار البيانات الذي تسلكه. يمكن أن يؤدي هذا إلى بعض الأخطاء في العد في الحقلين droppedDeviceInactive pending .

رسائل إلى الأجهزة ذات تفضيلات مستخدم معينة

المستخدمون الذين قاموا بتعطيل جمع معلومات الاستخدام والتشخيص على أجهزتهم لن يتم تضمين رسائلهم في حسابنا، وذلك تماشيًا مع تفضيلاتهم.

التقريب والحد الأدنى

تقوم FCM بتقريب واستبعاد الأعداد التي لا تكون فيها الأحجام كبيرة بدرجة كافية.

تصدير بيانات BigQuery

يمكنك تصدير بيانات رسالتك إلى BigQuery لمزيد من التحليل. يتيح لك BigQuery تحليل البيانات باستخدام BigQuery SQL، أو تصديرها إلى موفر سحابي آخر، أو استخدام البيانات لنماذج تعلم الآلة المخصصة لديك. تتضمن عملية التصدير إلى BigQuery جميع البيانات المتاحة للرسائل، بغض النظر عن نوع الرسالة أو ما إذا كانت الرسالة قد تم إرسالها عبر واجهة برمجة التطبيقات أو مؤلف الإشعارات.

بالنسبة للرسائل المرسلة إلى الأجهزة التي تحتوي على الحد الأدنى من إصدارات FCM SDK التالية، لديك خيار إضافي لتمكين تصدير بيانات تسليم الرسائل لتطبيقك:

  • أندرويد 20.1.0 أو أعلى.
  • iOS 8.6.0 أو أعلى
  • Firebase Web SDK 9.0.0 أو أعلى

انظر أدناه للحصول على تفاصيل حول تمكين تصدير البيانات لنظامي التشغيل Android و iOS .

للبدء، اربط مشروعك بـ BigQuery:

  1. اختيار واحد من الخيارات التالية:

    • افتح مؤلف الإشعارات ، ثم انقر على Access BigQuery في أسفل الصفحة.

    • من صفحة عمليات التكامل في وحدة تحكم Firebase، انقر على الرابط في بطاقة BigQuery .

      تعرض هذه الصفحة خيارات تصدير FCM لجميع التطبيقات التي تدعم FCM في المشروع.

  2. اتبع التعليمات التي تظهر على الشاشة لتمكين BigQuery.

راجع ربط Firebase بـ BigQuery لمزيد من المعلومات.

عند تمكين تصدير BigQuery للمراسلة السحابية:

  • يقوم Firebase بتصدير بياناتك إلى BigQuery. لاحظ أن النشر الأولي للبيانات للتصدير قد يستغرق ما يصل إلى 48 ساعة حتى يكتمل.

  • بعد إنشاء مجموعة البيانات، لا يمكن تغيير الموقع، ولكن يمكنك نسخ مجموعة البيانات إلى موقع مختلف أو نقل (إعادة إنشاء) مجموعة البيانات يدويًا في موقع مختلف. لمعرفة المزيد، راجع تغيير موقع مجموعة البيانات .

  • يقوم Firebase بإعداد عمليات مزامنة منتظمة لبياناتك من مشروع Firebase الخاص بك إلى BigQuery. تبدأ عمليات التصدير اليومية هذه في الساعة 4:00 صباحًا بتوقيت المحيط الهادئ وتنتهي عادةً خلال 24 ساعة.

  • افتراضيًا، ترتبط جميع التطبيقات في مشروعك بـ BigQuery وأي تطبيقات تضيفها لاحقًا إلى المشروع يتم ربطها تلقائيًا بـ BigQuery. يمكنك إدارة التطبيقات التي ترسل البيانات .

لإلغاء تنشيط تصدير BigQuery، قم بإلغاء ربط مشروعك في وحدة تحكم Firebase.

تفعيل تصدير بيانات تسليم الرسائل

يمكن لأجهزة iOS المزودة بـ FCM SDK 8.6.0 أو أعلى تمكين تصدير بيانات تسليم الرسائل الخاصة بتطبيقاتها. يدعم FCM تصدير البيانات لكل من إشعارات التنبيه والخلفية. قبل تمكين هذه الخيارات، يجب عليك أولاً إنشاء رابط FCM-BiqQuery لمشروعك كما هو موضح في تصدير بيانات BigQuery .

تمكين تصدير بيانات التسليم لإشعارات التنبيه

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

يجب إجراء المكالمة التالية لكل إشعار يتم استلامه:

سويفت

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

ج موضوعية

// 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 في كائن الحمولة .

تمكين تصدير بيانات التسليم لإشعارات الخلفية

بالنسبة لرسائل الخلفية المستلمة عندما يكون التطبيق في المقدمة أو الخلفية، يمكنك استدعاء واجهة برمجة تطبيقات تصدير البيانات داخل معالج رسائل بيانات التطبيق الرئيسي. يجب إجراء هذه المكالمة لكل إشعار يتم تلقيه:

سويفت

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

ج موضوعية

// 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

ما البيانات التي يتم تصديرها إلى BigQuery؟

لاحظ أن استهداف الرموز القديمة أو التسجيلات غير النشطة قد يؤدي إلى تضخيم بعض هذه الإحصائيات.

مخطط الجدول المصدر هو:

_PARTITIONTIME الطابع الزمني يحتوي هذا العمود الزائف على طابع زمني لبداية اليوم (بالتوقيت العالمي المنسق) الذي تم فيه تحميل البيانات. بالنسبة للقسم YYYYMMDD، يحتوي هذا العمود الزائف على القيمة TIMESTAMP('YYYY-MM-DD').
events_timestamp الطابع الزمني الطابع الزمني للحدث كما سجله الخادم
رقم المشروع عدد صحيح يحدد رقم المشروع المشروع الذي أرسل الرسالة
معرف الرسالة خيط يحدد معرف الرسالة الرسالة. قد لا يكون معرف الرسالة، الذي يتم إنشاؤه من معرف التطبيق والطابع الزمني، فريدًا عالميًا في بعض الحالات.
example_id خيط المعرف الفريد للتطبيق الذي يتم إرسال الرسالة إليه (عند توفره). يمكن أن يكون معرف مثيل أو معرف تثبيت Firebase.
نوع الرسالة خيط نوع الرسالة. يمكن أن تكون رسالة إعلام أو رسالة بيانات. يتم استخدام الموضوع لتحديد الرسالة الأصلية لموضوع أو حملة يتم إرسالها؛ وتكون الرسائل اللاحقة إما إشعارًا أو رسالة بيانات.
sdk_platform خيط منصة التطبيق المتلقي
اسم التطبيق خيط اسم الحزمة لتطبيقات Android أو معرف الحزمة لتطبيقات iOS
انهيار_مفتاح خيط يحدد مفتاح الانهيار مجموعة من الرسائل التي يمكن طيها. عندما لا يكون الجهاز متصلاً، يتم وضع الرسالة الأخيرة التي تحتوي على مفتاح طي محدد فقط في قائمة الانتظار للتسليم النهائي
أولوية عدد صحيح أولوية الرسالة. القيم الصالحة هي "عادية" و"عالية". على نظام التشغيل iOS، تتوافق هذه مع أولويات APN 5 و10
ttl عدد صحيح تحدد هذه المعلمة المدة (بالثواني) التي يجب أن تبقى فيها الرسالة في وحدة تخزين FCM إذا كان الجهاز غير متصل بالإنترنت
عنوان خيط اسم الموضوع الذي تم إرسال الرسالة إليه (إن أمكن)
معرف السائبة عدد صحيح يحدد المعرف المجمع مجموعة من الرسائل ذات الصلة، مثل إرسال معين إلى موضوع ما
حدث خيط نوع الحدث. القيم المحتملة هي:
  • 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 المستخدم لإرسال الرسالة)؛
  • INVALID_TTL: تم رفض طلب إرسال الرسالة بسبب وجود TTL غير صالح.
analytics_label خيط باستخدام HTTP v1 API ، يمكن تعيين تسمية التحليلات عند إرسال الرسالة، وذلك لوضع علامة على الرسالة لأغراض التحليلات

ماذا يمكنك أن تفعل بالبيانات المصدرة؟

تقدم الأقسام التالية أمثلة على الاستعلامات التي يمكنك تشغيلها في BigQuery مقابل بيانات FCM المصدرة.

عد الرسائل المرسلة عن طريق التطبيق

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;