הבנת העברת הודעות

FCM מספקת שלוש קבוצות של כלים שיעזרו לך לקבל תובנות לגבי העברת הודעות:

  • דוחות מסירת הודעות במסוף Firebase
  • מדדי מסירה מצטברים של Android SDK מ-Firebase Cloud Messaging Data API
  • ייצוא נתונים מקיף ל-Google BigQuery

כלי הדיווח המתוארים בדף זה דורשים כולם גוגל אנליטיקס על מנת לתפקד. אם Google Analytics אינו מופעל עבור הפרויקט שלך, תוכל להגדיר אותו בכרטיסיית האינטגרציות של הגדרות הפרויקט שלך ב-Firebase.

זכור כי הדיווח של רבים מהנתונים הסטטיסטיים בדף זה כפוף לעיכובים של עד 24 שעות עקב אצווה של נתוני ניתוח.

דוחות מסירת הודעות

בכרטיסייה דוחות במסוף Firebase, תוכל להציג את הנתונים הבאים עבור הודעות שנשלחו ל-FCM SDK של פלטפורמת אנדרואיד או אפל, כולל אלה שנשלחו דרך יוצר ההודעות וממשקי ה-API של FCM:

  • שולחים - הודעת הנתונים או הודעת ההתראה הועמדו בתור למשלוח או הועברו בהצלחה לשירות צד שלישי כמו APNs למשלוח. ראה את משך החיים של הודעה למידע נוסף.
  • התקבל (זמין רק במכשירי אנדרואיד) - הודעת הנתונים או הודעת ההתראה התקבלו על ידי האפליקציה. נתונים אלה זמינים כאשר במכשיר ה-Android המקבל מותקן FCM SDK 18.0.1 ומעלה.
  • הופעות (זמינות רק עבור הודעות התראה במכשירי אנדרואיד) — הודעת התצוגה הוצגה במכשיר כשהאפליקציה ברקע.
  • נפתח - המשתמש פתח את הודעת ההתראה. דווח רק עבור התראות שהתקבלו כאשר האפליקציה ברקע.

נתונים אלה זמינים עבור כל ההודעות עם מטען הודעות וכל הודעות הנתונים המסומנות בתווית . למידע נוסף על תוויות, ראה הוספת תוויות ניתוח להודעות .

בעת הצגת דוחות הודעות, ניתן להגדיר טווח תאריכים עבור הנתונים המוצגים, עם אפשרות לייצא ל-CSV. אתה יכול גם לסנן לפי הקריטריונים הבאים:

  • פלטפורמה (iOS או אנדרואיד)
  • אפליקציה
  • תוויות ניתוח מותאמות אישית

הוספת תוויות ניתוח להודעות

תיוג הודעות שימושי מאוד לניתוח מותאם אישית, ומאפשר לך לסנן סטטיסטיקות מסירה לפי תוויות או קבוצות של תוויות. אתה יכול להוסיף תווית לכל הודעה שנשלחת דרך ה-API של HTTP v1 על ידי הגדרת השדה fcmOptions.analyticsLabel באובייקט ההודעה , או בשדות AndroidFcmOptions או ApnsFcmOptions הספציפיים לפלטפורמה.

תוויות Analytics הן מחרוזות טקסט בפורמט ^[a-zA-Z0-9-_.~%]{1,50}$ . תוויות יכולות לכלול אותיות קטנות וגדולות, מספרים והסמלים הבאים:

  • -
  • ~
  • %

האורך המרבי הוא 50 תווים. אתה יכול לציין עד 100 תוויות ייחודיות ליום; הודעות עם תוויות שנוספו מעבר למגבלה זו אינן מדווחות.

בכרטיסייה דוחות הודעות במסוף Firebase, תוכל לחפש רשימה של כל התוויות הקיימות ולהחיל אותן בנפרד או בשילוב כדי לסנן את הנתונים הסטטיסטיים המוצגים.

נתוני מסירה מצטברים באמצעות FCM Data API

ממשק ה-API של Firebase Cloud Messaging Data מאפשר לך לאחזר מידע שיכול לעזור לך להבין את התוצאות של בקשות להודעות הממוקדות ליישומי 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
    }
  }

כיצד לפרש את המדדים

נתוני מסירה מתארים את אחוז ההודעות שמתאימות לכל אחד מהמדדים הבאים. ייתכן שהודעה בודדת מתאימה למספר מדדים. בשל מגבלות באופן שבו אנו אוספים את הנתונים ורמת הפירוט שבה אגרנו את המדדים, חלק מתוצאות ההודעות אינן מיוצגות במדדים כלל, כך שהאחוזים להלן לא יסכמו ב-100%.

ספירת הודעות שהתקבלו

הספירה היחידה הכלולה במערך הנתונים היא ספירת ההודעות שהתקבלו על ידי FCM למשלוח למכשירי אנדרואיד. כל האחוזים משתמשים בערך זה כמכנה. זכור שספירה זו לא תכלול הודעות הממוקדות למשתמשים שהשביתו את איסוף מידע השימוש והאבחון במכשירים שלהם.

אחוזי תוצאות של הודעות

השדות הכלולים באובייקט MessageOutcomePercents מספקים מידע על התוצאות של בקשות להודעות. הקטגוריות כולן סותרות זו את זו. זה יכול לענות על שאלות כגון "האם ההודעות שלי נמסרות?" ו"מה גורם לביטול הודעות?"

לדוגמה, ערך גבוה עבור השדה droppedTooManyPendingMessages יכול לאותת שמופעי אפליקציה מקבלים נפחים של הודעות בלתי מתקפלות החורגות מהמגבלה של FCM של 100 הודעות ממתינות. כדי למתן את זה, ודא שהאפליקציה שלך מטפלת בשיחות ל- onDeletedMessages , ושקול לשלוח הודעות הניתנות לקיפול. באופן דומה, אחוזים גבוהים עבור droppedDeviceInactive יכולים להיות איתות לעדכון אסימוני רישום בשרת שלך, הסרת אסימונים מיושנים וביטול ההרשמה שלהם לנושאים. ראה ניהול אסימוני רישום של FCM לקבלת שיטות עבודה מומלצות בתחום זה.

אחוזי ביצועי משלוח

השדות באובייקט DeliveryPerformancePercents מספקים מידע על הודעות שנמסרו בהצלחה. זה יכול לענות על שאלות כגון "האם ההודעות שלי עוכבו?" ו"מדוע הודעות מתעכבות?" לדוגמה, ערך גבוה עבור delayedMessageThrottled יציין בבירור שאתה חורג מהמגבלות המקסימליות לכל מכשיר , ועליו להתאים את הקצב שבו אתה שולח הודעות.

Message Insight אחוזים

אובייקט זה מספק מידע נוסף על כל שליחת ההודעות. השדה priorityLowered מבטא את אחוז ההודעות המקובלות שהעדיפות הורדה מ- HIGH ל- NORMAL . אם ערך זה גבוה, נסה לשלוח פחות הודעות בעדיפות גבוהה או ודא שאתה תמיד מציג התראה כאשר נשלחת הודעה בעדיפות גבוהה. עיין בתיעוד שלנו על עדיפות הודעות למידע נוסף

במה נתונים אלה שונים מנתונים המיוצאים ל-BigQuery?

הייצוא של BigQuery מספק יומני הודעות בודדים לגבי קבלת הודעות על ידי הקצה העורפי של FCM ומשלוח הודעות ב-SDK במכשיר (שלבים 2 ו-4 של ארכיטקטורת FCM ). נתונים אלה שימושיים כדי להבטיח שהודעות בודדות התקבלו ונמסרו. קרא עוד על ייצוא נתונים של BigQuery בסעיף הבא.

לעומת זאת, Firebase Cloud Messaging Data API מספק פרטים מצטברים על מה שקורה ספציפית בשכבת התעבורה של Android (או שלב 3 של ארכיטקטורת FCM ). נתונים אלה מספקים תובנות ספציפיות לגבי מסירת הודעות מ-FCM backends ל-Android SDK. זה שימושי במיוחד להצגת מגמות לגבי הסיבה לכך שהודעות עוכבו או נפלו במהלך ההעברה הזו.

במקרים מסוימים, ייתכן ששתי ערכות הנתונים לא תואמות במדויק בגלל הדברים הבאים:

  • המדדים המצטברים מדגימים רק חלק מכל ההודעות
  • המדדים המצטברים מעוגלים
  • אנחנו לא מציגים מדדים מתחת לסף פרטיות
  • חלק מתוצאות ההודעות חסרות עקב אופטימיזציות באופן שבו אנו מנהלים את נפח התעבורה הגדול.

מגבלות ה-API

קווי זמן מצטברים של נתונים

ה-API יחזיר 7 ימים של נתונים היסטוריים; עם זאת, נתונים שיוחזרו על ידי API זה יעוכבו עד 5 ימים. לדוגמה, ב-20 בינואר, הנתונים עבור 9 בינואר עד 15 בינואר יהיו זמינים, אך לא עבור 16 בינואר ואילך. בנוסף, הנתונים מסופקים בכל מאמץ. במקרה של הפסקת נתונים, FCM תפעל לתיקון קדימה ולא תמלא מחדש את הנתונים לאחר תיקון הבעיה. בהפסקות גדולות יותר, ייתכן שהנתונים לא יהיו זמינים במשך שבוע או יותר.

כיסוי נתונים

המדדים שמספק Firebase Cloud Messaging Data API נועדו לספק תובנות לגבי מגמות רחבות של העברת הודעות. עם זאת, הם אינם מספקים כיסוי של 100% של כל תרחישי ההודעות. התרחישים הבאים הם תוצאות ידועות שאינן משתקפות במדדים.

הודעות מכווצות

הודעות שכווצו על ידי הודעה אחרת אינן מופיעות במערך הנתונים.

הודעות למכשירים לא פעילים

הודעות שנשלחות למכשירים לא פעילים עשויות להופיע במערך הנתונים או לא, בהתאם לנתיב הנתונים שהם עוברים. זה יכול להוביל לספירה שגויה בשדות droppedDeviceInactive pending .

הודעות למכשירים עם העדפות משתמש מסוימות

משתמשים שהשביתו את איסוף מידע השימוש והאבחון במכשירים שלהם לא יכללו את ההודעות שלהם בספירה שלנו, בהתאם להעדפותיהם.

עיגול ומינימום

FCM מעגלת בכוונה ולא כוללת ספירות שבהן הנפחים אינם גדולים מספיק.

ייצוא נתונים של BigQuery

אתה יכול לייצא את נתוני ההודעות שלך ל- BigQuery לניתוח נוסף. BigQuery מאפשרת לך לנתח את הנתונים באמצעות BigQuery SQL, לייצא אותם לספק ענן אחר, או להשתמש בנתונים עבור מודלים ML המותאמים אישית שלך. ייצוא ל-BigQuery כולל את כל הנתונים הזמינים עבור הודעות, ללא קשר לסוג ההודעה או אם ההודעה נשלחת דרך ה-API או מחבר ההודעות.

עבור הודעות שנשלחות למכשירים עם גרסאות המינימום הבאות של FCM SDK, יש לך אפשרות נוספת לאפשר ייצוא של נתוני מסירת הודעות עבור האפליקציה שלך:

  • אנדרואיד 20.1.0 ומעלה.
  • iOS 8.6.0 ומעלה
  • Firebase Web SDK 9.0.0 ומעלה

ראה למטה לפרטים על הפעלת ייצוא נתונים עבור Android ו- iOS .

כדי להתחיל, קשר את הפרויקט שלך ל-BigQuery:

  1. בחר אחת מהאפשרויות הבאות:

    • פתח את יוצר ההתראות ולאחר מכן לחץ על גישה אל BigQuery בתחתית הדף.

    • בדף השילובים במסוף Firebase, לחץ על קישור בכרטיס BigQuery .

      דף זה מציג אפשרויות ייצוא של FCM עבור כל האפליקציות התומכות ב-FCM בפרויקט.

  2. עקוב אחר ההוראות שעל המסך כדי להפעיל את BigQuery.

עיין בקישור Firebase ל-BigQuery למידע נוסף.

כאשר אתה מפעיל את BigQuery Export עבור העברת הודעות בענן:

  • Firebase מייצא את הנתונים שלך ל-BigQuery. שים לב שההפצה הראשונית של נתונים לייצוא עשויה להימשך עד 48 שעות.

  • לאחר יצירת מערך הנתונים, לא ניתן לשנות את המיקום, אך ניתן להעתיק את מערך הנתונים למיקום אחר או להעביר (ליצור מחדש) באופן ידני את מערך הנתונים במיקום אחר. למידע נוסף, ראה שינוי מיקום מערך הנתונים .

  • Firebase מגדיר סנכרון קבוע של הנתונים שלך מפרויקט Firebase שלך ​​ל-BigQuery. פעולות הייצוא היומיות הללו מתחילות בשעה 4:00 בבוקר שעון האוקיינוס ​​השקט ומסתיימות בדרך כלל תוך 24 שעות.

  • כברירת מחדל, כל האפליקציות בפרויקט שלך מקושרות ל-BigQuery וכל אפליקציות שתוסיף מאוחר יותר לפרויקט מקושרות אוטומטית ל-BigQuery. אתה יכול לנהל אילו אפליקציות שולחות נתונים .

כדי להשבית את יצוא BigQuery, בטל את הקישור של הפרויקט שלך במסוף Firebase.

אפשר ייצוא נתוני מסירת הודעות

מכשירי iOS עם FCM SDK 8.6.0 ומעלה יכולים לאפשר את ייצוא נתוני מסירת ההודעות של האפליקציה שלהם. FCM תומך בייצוא נתונים הן עבור התראות והן עבור התראות ברקע. לפני הפעלת אפשרויות אלה, תחילה עליך ליצור את הקישור FCM-BiqQuery עבור הפרויקט שלך כמתואר ב- BigQuery ייצוא נתונים .

אפשר ייצוא נתוני מסירה עבור התראות התראה

מכיוון שרק הודעות התראה יכולות להפעיל הרחבות אפליקציות לשירות הודעות, עליך להוסיף תוסף לשירות הודעות לאפליקציה שלך ולהתקשר ל-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)
  }
}

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

אם אתה בונה בקשות שליחה באמצעות ה-API של HTTP v1, הקפד לציין mutable-content = 1 באובייקט המטען .

אפשר ייצוא נתוני מסירה עבור הודעות רקע

עבור הודעות רקע שהתקבלו כאשר האפליקציה נמצאת בחזית או ברקע, אתה יכול לקרוא ל-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)
}

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

אילו נתונים מיוצאים ל-BigQuery?

שים לב כי מיקוד לאסימונים מיושנים או לרישום לא פעילות עלול לנפח חלק מהנתונים הסטטיסטיים הללו.

הסכימה של הטבלה המיוצאת היא:

_PARTITIONTIME חותמת זמן עמודה פסאודו זו מכילה חותמת זמן לתחילת היום (ב-UTC) שבו הנתונים נטענו. עבור המחיצה YYYYMMDD, עמודה פסאודו זו מכילה את הערך TIMESTAMP('YYYY-MM-DD').
event_timestamp חותמת זמן חותמת זמן של אירוע כפי שתועד על ידי השרת
מספר פרויקט מספר שלם מספר הפרויקט מזהה את הפרויקט ששלח את ההודעה
message_id חוּט מזהה ההודעה מזהה הודעה. נוצר ממזהה האפליקציה וחותמת הזמן, מזהה ההודעה עשוי, במקרים מסוימים, לא להיות ייחודי גלובלי.
instance_id חוּט המזהה הייחודי של האפליקציה שאליה ההודעה נשלחת (כאשר זמין). זה יכול להיות מזהה מופע או מזהה התקנה של Firebase.
סוג הודעה חוּט סוג ההודעה. יכולה להיות הודעת הודעה או הודעת נתונים. נושא משמש לזיהוי ההודעה המקורית עבור נושא או קמפיין שליחה; ההודעות הבאות הן הודעה או הודעת נתונים.
sdk_platform חוּט הפלטפורמה של אפליקציית הנמען
שם האפליקציה חוּט שם החבילה עבור אפליקציות אנדרואיד או מזהה החבילה עבור אפליקציות iOS
collapse_key חוּט מפתח הכיווץ מזהה קבוצת הודעות שניתן לכווץ. כאשר מכשיר אינו מחובר, רק ההודעה האחרונה עם מפתח כיווץ נתון נמצאת בתור למסירה בסופו של דבר
עדיפות מספר שלם העדיפות של ההודעה. ערכים חוקיים הם "רגיל" ו"גבוה". ב-iOS, אלה תואמים לעדיפויות APN 5 ו-10
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 ששימש לשליחת ההודעה);
  • INVALID_TTL: הבקשה לשלוח הודעה נדחתה עקב TTL לא חוקי.
תווית_אנליטיקה חוּט עם ה- API של HTTP v1 , ניתן להגדיר את תווית הניתוח בעת שליחת ההודעה, על מנת לסמן את ההודעה למטרות ניתוח

מה אתה יכול לעשות עם הנתונים המיוצאים?

הסעיפים הבאים מציעים דוגמאות לשאילתות שתוכל להריץ ב-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;