درک تحویل پیام

برای عیب‌یابی خطاهای مداوم در ارسال پیام، از عیب‌یاب FCM استفاده کنید و برای درک دلایل مختلف عدم مشاهده پیام خود، به این پست وبلاگ مراجعه کنید. همچنین می‌توانید از داشبورد وضعیت FCM دیدن کنید تا مشخص شود که آیا اختلالات مداومی در سرویس FCM وجود دارد یا خیر.

FCM also provides three sets of tools to help you get insight into broad evaluation of messaging success and strategy:

  • گزارش‌های تحویل پیام کنسول Firebase
  • Aggregated Android SDK delivery metrics from the Firebase Cloud Messaging Data API
  • صادرات جامع داده‌ها به Google BigQuery

خروجی داده‌های BigQuery و تب Reports در کنسول Firebase برای عملکرد به Google Analytics نیاز دارند. اگر Google Analytics برای پروژه شما فعال نیست، می‌توانید آن را در تب integrations در تنظیمات پروژه Firebase خود تنظیم کنید. Aggregated Delivery Data برای عملکرد به Google Analytics نیاز ندارد.

Keep in mind that the reporting of many of the statistics on this page, are subject to delays up to 24 hours due to batching of analytics data.

Message delivery reports

در تب Reports در کنسول Firebase ، می‌توانید داده‌های زیر را برای پیام‌های ارسال شده به FCM SDKهای پلتفرم اندروید یا اپل، از جمله آنهایی که از طریق آهنگساز Notifications و APIهای FCM ارسال شده‌اند، مشاهده کنید:

  • ارسال‌ها — پیام داده یا پیام اعلان برای تحویل در صف قرار گرفته یا با موفقیت به یک سرویس شخص ثالث مانند APN برای تحویل منتقل شده است. توجه داشته باشید که آمار ارسال‌ها ممکن است برای چند ساعت با تأخیر مواجه شود. برای اطلاعات بیشتر به بخش طول عمر یک پیام مراجعه کنید.
  • دریافت‌شده (فقط در دستگاه‌های اندروید موجود است) — پیام داده یا پیام اعلان توسط برنامه دریافت شده است. این داده‌ها زمانی در دسترس هستند که دستگاه اندروید دریافت‌کننده، FCM SDK 18.0.1 یا بالاتر را نصب کرده باشد.
  • Impressions (available only for notification messages on Android devices) — The display notification has been displayed on the device while the app is in the background.
  • Opens — The user opened the notification message. Reported only for notifications received when the app is in the background.

This data is available for all messages with a notification payload and all labeled data messages . To learn more about labels, see Adding analytics labels to messages .

When viewing message reports, you can set a date range for the data displayed, with the option to export to CSV. You can also filter by these criteria:

  • Platform (iOS or Android)
  • برنامه
  • برچسب‌های تحلیلی سفارشی

Adding analytics labels to messages

برچسب‌گذاری پیام‌ها برای تحلیل‌های سفارشی بسیار مفید است و به شما امکان می‌دهد آمار تحویل را بر اساس برچسب‌ها یا مجموعه‌ای از برچسب‌ها فیلتر کنید. می‌توانید با تنظیم فیلد fcmOptions.analyticsLabel در شیء پیام یا در فیلدهای AndroidFcmOptions یا ApnsFcmOptions مخصوص پلتفرم، به هر پیامی که از طریق HTTP v1 API ارسال می‌شود، برچسب اضافه کنید.

Analytics labels are text strings in the format ^[a-zA-Z0-9-_.~%]{1,50}$ . Labels can include lower and upper case letters, numbers, and the following symbols:

  • -
  • ~
  • %

Max length is 50 characters. You can specify up to 100 unique labels per day; messages with labels added beyond that limit are not reported.

In the Firebase console messaging Reports tab, you can search a list of all existing labels and apply them singly or in combination to filter the statistics displayed.

Aggregated delivery data using the FCM Data API

API داده‌های پیام‌رسانی ابری Firebase به شما امکان می‌دهد اطلاعاتی را بازیابی کنید که به شما در درک نتایج درخواست‌های پیام هدفمند برای برنامه‌های اندروید کمک می‌کند. این API داده‌های تجمیعی را در تمام دستگاه‌های اندروید دارای قابلیت جمع‌آوری داده در یک پروژه ارائه می‌دهد. این شامل جزئیاتی در مورد درصد پیام‌های تحویل داده شده بدون تأخیر و همچنین تعداد پیام‌های تأخیر یافته یا رها شده در لایه انتقال اندروید است . ارزیابی این داده‌ها می‌تواند روندهای کلی در تحویل پیام را آشکار کند و به شما در یافتن راه‌های مؤثر برای بهبود عملکرد درخواست‌های ارسال کمک کند. برای اطلاعات در مورد در دسترس بودن محدوده تاریخ در گزارش‌ها، به جدول زمانی داده‌های تجمیعی مراجعه کنید.

The API provides all data available for a given application. See the API reference documentation .

How is the data broken down?

داده‌های تحویل بر اساس کاربرد، تاریخ و برچسب تحلیلی تفکیک می‌شوند. فراخوانی API، داده‌ها را برای هر ترکیبی از تاریخ، کاربرد و برچسب تحلیلی برمی‌گرداند. برای مثال، یک شیء JSON androidDeliveryData به صورت زیر خواهد بود:

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

How to Interpret the Metrics

داده‌های تحویل، درصد پیام‌هایی را که با هر یک از معیارهای زیر مطابقت دارند، مشخص می‌کند. ممکن است یک پیام واحد با چندین معیار مطابقت داشته باشد. به دلیل محدودیت‌هایی که در نحوه جمع‌آوری داده‌ها و سطح جزئیاتی که معیارها را تجمیع کرده‌ایم، برخی از نتایج پیام‌ها اصلاً در معیارها نمایش داده نمی‌شوند، بنابراین درصدهای زیر به ۱۰۰٪ نمی‌رسند.

Count Messages Accepted

تنها تعداد موجود در مجموعه داده‌ها، تعداد پیام‌هایی است که توسط FCM برای تحویل به دستگاه‌های اندروید پذیرفته شده‌اند. همه درصدها از این مقدار به عنوان مخرج استفاده می‌کنند. به خاطر داشته باشید که این تعداد شامل پیام‌هایی که برای کاربرانی که جمع‌آوری اطلاعات استفاده و تشخیصی را در دستگاه‌های خود غیرفعال کرده‌اند، ارسال شده‌اند، نمی‌شود.

Message Outcome Percentages

فیلدهای موجود در شیء MessageOutcomePercents اطلاعاتی در مورد نتایج درخواست‌های پیام ارائه می‌دهند. همه دسته‌ها متقابلاً منحصر به فرد هستند. می‌تواند به سؤالاتی مانند "آیا پیام‌های من تحویل داده می‌شوند؟" و "چه چیزی باعث از دست رفتن پیام‌ها می‌شود؟" پاسخ دهد.

برای مثال، مقدار بالای فیلد droppedTooManyPendingMessages می‌تواند نشان دهد که نمونه‌های برنامه، حجم پیام‌های غیرقابل‌جمع‌شونده‌ای را دریافت می‌کنند که از محدودیت ۱۰۰ پیام در انتظار FCM فراتر رفته است. برای کاهش این مشکل، مطمئن شوید که برنامه شما فراخوانی‌های onDeletedMessages را مدیریت می‌کند و ارسال پیام‌های قابل‌بازگشت را در نظر بگیرید. به طور مشابه، درصد بالای droppedDeviceInactive می‌تواند نشانه‌ای برای به‌روزرسانی توکن‌های ثبت‌نام روی سرور شما، حذف توکن‌های قدیمی و لغو اشتراک آنها از موضوعات باشد. برای بهترین شیوه‌ها در این زمینه، به مدیریت توکن‌های ثبت‌نام FCM مراجعه کنید.

Delivery Performance Percentages

فیلدهای موجود در شیء DeliveryPerformancePercents اطلاعاتی در مورد پیام‌هایی که با موفقیت تحویل داده شده‌اند ارائه می‌دهند. این شیء می‌تواند به سؤالاتی مانند «آیا پیام‌های من با تأخیر ارسال شدند؟» و «چرا پیام‌ها با تأخیر ارسال می‌شوند؟» پاسخ دهد. برای مثال، مقدار بالای delayedMessageThrottled به وضوح نشان می‌دهد که شما از حداکثر محدودیت‌های هر دستگاه فراتر رفته‌اید و باید نرخ ارسال پیام‌ها را تنظیم کنید.

Message Insight Percentages

این شیء اطلاعات بیشتری در مورد همه پیام‌های ارسالی ارائه می‌دهد. فیلد priorityLowered درصد پیام‌های پذیرفته‌شده‌ای را که اولویت آنها از HIGH به NORMAL کاهش یافته است، بیان می‌کند. اگر این مقدار بالا باشد، سعی کنید پیام‌های با اولویت بالا کمتری ارسال کنید یا مطمئن شوید که همیشه هنگام ارسال یک پیام با اولویت بالا، اعلانی نمایش داده می‌شود. برای اطلاعات بیشتر به مستندات ما در مورد اولویت پیام مراجعه کنید.

How does this data differ from data exported to BigQuery?

خروجی BigQuery، گزارش‌های پیام‌های جداگانه‌ای در مورد پذیرش پیام توسط backend FCM و تحویل پیام در SDK روی دستگاه ارائه می‌دهد (مراحل 2 و 4 معماری FCM ). این داده‌ها برای اطمینان از پذیرش و تحویل پیام‌های جداگانه مفید هستند. در بخش بعدی، درباره خروجی داده‌های BigQuery بیشتر بخوانید.

در مقابل، API داده‌های پیام‌رسانی ابری Firebase جزئیات تجمیعی در مورد آنچه که به‌طور خاص در لایه انتقال اندروید (یا مرحله ۳ معماری FCM ) اتفاق می‌افتد، ارائه می‌دهد. این داده‌ها به‌طور خاص بینشی در مورد تحویل پیام‌ها از بک‌اندهای FCM به SDK اندروید ارائه می‌دهند. این امر به‌ویژه برای نشان دادن روندهایی در مورد دلیل تأخیر یا حذف پیام‌ها در طول این انتقال مفید است.

In some cases, it is possible that the two data sets might not match precisely due to the following:

  • The aggregated metrics only sample a portion of all messages
  • The aggregated metrics are rounded
  • We don't present metrics below a privacy threshold
  • A portion of message outcomes are missing due to optimizations in how we manage the large volume of traffic.

Limitations of the API

Aggregate Data Timelines

این API داده‌های تاریخی ۷ روز را برمی‌گرداند؛ با این حال، داده‌هایی که توسط این API برگردانده می‌شوند تا ۵ روز تأخیر خواهند داشت. به عنوان مثال، در ۲۰ ژانویه، داده‌های ۹ تا ۱۵ ژانویه در دسترس خواهند بود، اما داده‌های ۱۶ ژانویه یا بعد از آن در دسترس نخواهند بود. علاوه بر این، داده‌ها با بهترین تلاش ارائه می‌شوند. در صورت قطع شدن داده‌ها، FCM برای رفع مشکل به جلو تلاش می‌کند و پس از رفع مشکل، داده‌ها را دوباره پر نمی‌کند. در قطعی‌های بزرگتر، داده‌ها ممکن است برای یک هفته یا بیشتر در دسترس نباشند.

پوشش داده

معیارهای ارائه شده توسط Firebase Cloud Messaging Data API به منظور ارائه بینشی در مورد روندهای کلی تحویل پیام در نظر گرفته شده‌اند. با این حال، آنها پوشش ۱۰۰٪ از تمام سناریوهای پیام را ارائه نمی‌دهند. سناریوهای زیر نتایج شناخته شده‌ای هستند که در معیارها منعکس نشده‌اند.

Expired messages

If the Time To Live (TTL) expires after the end of the given log date, the message won't be counted as droppedTtlExpired on this date.

Messages to inactive devices

پیام‌های ارسالی به دستگاه‌های غیرفعال، بسته به مسیر داده‌ای که طی می‌کنند، ممکن است در مجموعه داده‌ها نمایش داده شوند یا نشوند. این می‌تواند منجر به برخی اشتباهات در شمارش فیلدهای droppedDeviceInactive و pending شود.

Messages to devices with certain user preferences

Users who have disabled the collection of usage and diagnostic information on their devices will not have their messages included in our counting, in keeping with their preferences.

Rounding and Minimums

FCM deliberately rounds and excludes counts where the volumes are not large enough.

خروجی گرفتن از داده‌های BigQuery

شما می‌توانید داده‌های پیام خود را برای تجزیه و تحلیل بیشتر به BigQuery صادر کنید. BigQuery به شما امکان می‌دهد داده‌ها را با استفاده از BigQuery SQL تجزیه و تحلیل کنید، آنها را به یک ارائه‌دهنده ابری دیگر صادر کنید یا از داده‌ها برای مدل‌های ML سفارشی خود استفاده کنید. یک خروجی به BigQuery شامل تمام داده‌های موجود برای پیام‌ها، صرف نظر از نوع پیام یا اینکه آیا پیام از طریق API یا آهنگساز Notifications ارسال شده است، می‌شود.

For messages sent to devices with the following FCM SDK minimum versions, you have the additional option to enable the export of message delivery data for your app:

  • Android 20.1.0 or higher.
  • iOS 8.6.0 or higher
  • Firebase Web SDK 9.0.0 or higher

برای جزئیات بیشتر در مورد فعال کردن صادرات داده برای اندروید و iOS ، به زیر مراجعه کنید.

To get started, link your project to BigQuery:

  1. یکی از گزینه‌های زیر را انتخاب کنید:

    • Open the Notifications composer , then click Access BigQuery at the bottom of the page.

    • From the Integrations page in the Firebase console, click Link in the BigQuery card.

      This page displays FCM export options for all FCM -enabled apps in the project.

  2. Follow the on-screen instructions to enable BigQuery.

برای اطلاعات بیشتر به لینک کردن فایربیس به بیگ‌کوئری مراجعه کنید.

When you enable BigQuery export for Cloud Messaging :

  • Firebase exports your data to BigQuery . Note that the initial propagation of data for export may take up to 48 hours to complete.

  • پس از ایجاد مجموعه داده‌ها، مکان را نمی‌توان تغییر داد، اما می‌توانید مجموعه داده‌ها را به مکان دیگری کپی کنید یا به صورت دستی مجموعه داده‌ها را به مکان دیگری منتقل (بازسازی) کنید. برای کسب اطلاعات بیشتر، به تغییر مکان مجموعه داده‌ها مراجعه کنید.

  • Firebase sets up regular syncs of your data from your Firebase project to BigQuery . These daily export operations begin at 4:00 AM Pacific Time and usually finish in 24 hours.

  • به طور پیش‌فرض، تمام برنامه‌های موجود در پروژه شما به BigQuery متصل هستند و هر برنامه‌ای که بعداً به پروژه اضافه کنید، به طور خودکار به BigQuery متصل می‌شود. می‌توانید مدیریت کنید که کدام برنامه‌ها داده ارسال کنند .

برای غیرفعال کردن خروجی BigQuery ، پروژه خود را در کنسول Firebase از حالت لینک خارج کنید.

Enable message delivery data export

دستگاه‌های iOS با FCM SDK 8.6.0 یا بالاتر می‌توانند خروجی داده‌های تحویل پیام برنامه خود را فعال کنند. FCM از خروجی داده‌ها برای هشدارها و اعلان‌های پس‌زمینه پشتیبانی می‌کند. خروجی داده‌ها به طور پیش‌فرض در سطح برنامه غیرفعال است. فعال کردن برنامه‌نویسی آن در سطح نمونه برنامه به شما امکان می‌دهد از کاربران نهایی اجازه تجزیه و تحلیل داده‌های تحویل پیام آنها را بخواهید (توصیه می‌شود). وقتی هر دو تنظیم شوند، مقدار سطح نمونه برنامه بر مقدار سطح برنامه غلبه می‌کند.

قبل از فعال کردن این گزینه‌ها، ابتدا باید لینک FCM -BiqQuery را برای پروژه خود همانطور که در BigQuery data export توضیح داده شده است، ایجاد کنید.

فعال کردن خروجی داده‌های تحویل برای اعلان‌های هشدار

از آنجا که فقط اعلان‌های هشدار می‌توانند افزونه‌های برنامه سرویس اعلان را فعال کنند، باید یک افزونه سرویس اعلان به برنامه خود اضافه کنید و این API را درون یک افزونه سرویس فراخوانی کنید تا ردیابی پیام نمایش فعال شود. به مستندات اپل در مورد اصلاح محتوا در اعلان‌های تازه تحویل داده شده مراجعه کنید.

برای هر اعلان دریافتی، باید فراخوانی زیر انجام شود:

سویفت

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

اگر در حال ساخت درخواست‌های ارسال با استفاده از API HTTP نسخه ۱ هستید، حتماً mutable-content = 1 در شیء payload مشخص کنید.

فعال کردن خروجی داده‌های تحویل برای اعلان‌های پس‌زمینه

برای پیام‌های پس‌زمینه که وقتی برنامه در پیش‌زمینه یا پس‌زمینه است دریافت می‌شوند، می‌توانید API مربوط به صادرات داده را درون کنترل‌کننده پیام داده برنامه اصلی فراخوانی کنید. این فراخوانی باید برای هر اعلان دریافتی انجام شود:

سویفت

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

What data is exported to BigQuery?

توجه داشته باشید که هدف قرار دادن توکن‌های قدیمی یا ثبت‌نام‌های غیرفعال ممکن است برخی از این آمارها را افزایش دهد.

The schema of the exported table is:

زمان تقسیم مهر زمانی این شبه ستون شامل یک مهر زمانی برای شروع روزی (به UTC) است که داده‌ها در آن بارگذاری شده‌اند. برای پارتیشن YYYYMMDD، این شبه ستون شامل مقدار TIMESTAMP('YYYY-MM-DD') است.
event_timestamp مهر زمانی Event timestamp as recorded by the server
project_number عدد صحیح شماره پروژه، پروژه‌ای را که پیام را ارسال کرده است، مشخص می‌کند.
message_id رشته شناسه پیام، یک پیام را شناسایی می‌کند. این شناسه که از شناسه برنامه و مهر زمانی تولید می‌شود، ممکن است در برخی موارد منحصر به فرد نباشد.
instance_id رشته شناسه منحصر به فرد برنامه‌ای که پیام به آن ارسال می‌شود (در صورت وجود). این شناسه می‌تواند یک شناسه نمونه یا یک شناسه نصب Firebase باشد.
message_type رشته نوع پیام. می‌تواند پیام اعلان یا پیام داده باشد. موضوع برای شناسایی پیام اصلی برای ارسال یک موضوع یا کمپین استفاده می‌شود؛ پیام‌های بعدی یا یک پیام اعلان یا داده هستند.
sdk_platform رشته پلتفرم اپلیکیشن گیرنده
نام برنامه رشته نام بسته برای برنامه‌های اندروید یا شناسه بسته برای برنامه‌های iOS
کلید فروپاشی رشته کلید فروپاشی، گروهی از پیام‌ها را که می‌توانند فروپاشی شوند، مشخص می‌کند. هنگامی که دستگاهی متصل نیست، فقط آخرین پیامی که کلید فروپاشی آن مشخص شده است، برای تحویل نهایی در صف قرار می‌گیرد.
اولویت عدد صحیح اولویت پیام. مقادیر معتبر «عادی» و «بالا» هستند. در iOS، این مقادیر مربوط به اولویت‌های ۵ و ۱۰ در APNها هستند.
تی‌تی‌ال عدد صحیح این پارامتر مشخص می‌کند که اگر دستگاه آفلاین باشد، پیام باید چه مدت (بر حسب ثانیه) در حافظه 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 مورد استفاده برای ارسال پیام را بررسی کنید)؛
  • INVALID_TTL: درخواست ارسال پیام به دلیل TTL نامعتبر رد شد.
برچسب_تحلیلی رشته با استفاده از 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>; جایگزین کنید.

محاسبه مدت زمان فانوت برای یک موضوع یا کمپین مشخص

زمان شروع fanout زمانی است که درخواست اصلی دریافت می‌شود و زمان پایان زمانی است که آخرین پیام منفرد که یک نمونه واحد را هدف قرار می‌دهد، ایجاد می‌شود.

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;