การทำความเข้าใจการส่งข้อความ

FCM มีเครื่องมือ 3 ชุดที่จะช่วยให้คุณได้รับข้อมูลเชิงลึกเกี่ยวกับการนำส่งข้อความ

  • Firebase รายงานการส่งข้อความในคอนโซล
  • เมตริกการแสดงโฆษณา Android SDK แบบรวมจาก Firebase Cloud Messaging Data API
  • การส่งออกข้อมูลอย่างครอบคลุมไปยัง Google BigQuery

เครื่องมือการรายงานที่อธิบายในหน้านี้ทั้งหมดต้องใช้ Google Analytics จึงจะทํางานได้ หากไม่ได้เปิดใช้ Google Analytics สําหรับโปรเจ็กต์ คุณสามารถตั้งค่าได้ในแท็บการผสานรวมของการตั้งค่าโปรเจ็กต์ Firebase

โปรดทราบว่าการรายงานสถิติหลายรายการในหน้านี้อาจมีความล่าช้าสูงสุด 24 ชั่วโมงเนื่องจากการแบ่งกลุ่มข้อมูลวิเคราะห์

รายงานการส่งข้อความ

ในแท็บรายงานของคอนโซล Firebase คุณสามารถดูข้อมูลต่อไปนี้สำหรับข้อความที่ส่งไปยัง SDK ของ FCM บนแพลตฟอร์ม Android หรือ Apple ซึ่งรวมถึงข้อความที่ส่งผ่านเครื่องมือแก้ไขการแจ้งเตือนและ FCM API

  • ส่ง — ข้อความข้อมูลหรือข้อความแจ้งเตือนอยู่ในคิวการนำส่งหรือส่งไปยังบริการของบุคคลที่สาม เช่น APNs สำหรับการนําส่งเรียบร้อยแล้ว ดูข้อมูลเพิ่มเติมได้ที่อายุการใช้งานของข้อความ
  • ได้รับ (ใช้ได้ในอุปกรณ์ Android เท่านั้น) — แอปได้รับข้อความข้อมูลหรือข้อความแจ้งเตือนแล้ว ข้อมูลนี้จะพร้อมใช้งานเมื่ออุปกรณ์ Android ฝั่งที่รับได้ติดตั้ง FCMSDK 18.0.1 ขึ้นไป
  • การแสดงผล (ใช้ได้กับข้อความแจ้งเตือนในอุปกรณ์ Android เท่านั้น) — การแจ้งเตือนบนจอแสดงผลแสดงในอุปกรณ์ขณะที่แอปทำงานอยู่เบื้องหลัง
  • เปิด — ผู้ใช้เปิดข้อความแจ้งเตือน รายงานเฉพาะการแจ้งเตือนที่ได้รับเมื่อแอปทำงานอยู่ในเบื้องหลัง

ข้อมูลนี้พร้อมใช้งานสำหรับข้อความทั้งหมดที่มีเพย์โหลดการแจ้งเตือน และข้อความข้อมูลที่ติดป้ายกำกับทั้งหมด ดูข้อมูลเพิ่มเติมเกี่ยวกับป้ายกํากับได้ที่หัวข้อการเพิ่มป้ายกํากับข้อมูลวิเคราะห์ลงในข้อความ

เมื่อดูรายงานข้อความ คุณจะตั้งค่าช่วงวันที่ของข้อมูลที่แสดงได้ โดยมีตัวเลือกในการส่งออกเป็น CSV นอกจากนี้ คุณยังกรองตามเกณฑ์ต่อไปนี้ได้ด้วย

  • แพลตฟอร์ม (iOS หรือ Android)
  • แอป
  • ป้ายกํากับข้อมูลวิเคราะห์ที่กําหนดเอง

การเพิ่มป้ายกํากับข้อมูลวิเคราะห์ลงในข้อความ

การติดป้ายกำกับข้อความมีประโยชน์อย่างยิ่งสําหรับการวิเคราะห์ที่กําหนดเอง ซึ่งช่วยให้คุณกรองสถิติการนำส่งตามป้ายกำกับหรือชุดป้ายกำกับได้ คุณสามารถเพิ่มป้ายกำกับให้กับข้อความที่ส่งผ่าน HTTP v1 API ได้โดยการตั้งค่าช่อง fcmOptions.analyticsLabel ในออบเจ็กต์ message หรือในช่อง AndroidFcmOptions หรือ ApnsFcmOptions สำหรับแพลตฟอร์มที่เฉพาะเจาะจง

ป้ายกํากับข้อมูลวิเคราะห์คือสตริงข้อความในรูปแบบ ^[a-zA-Z0-9-_.~%]{1,50}$ ป้ายกำกับมีได้เฉพาะตัวอักษรพิมพ์เล็กและพิมพ์ใหญ่ ตัวเลข และสัญลักษณ์ต่อไปนี้

  • -
  • ~
  • %

ความยาวสูงสุด 50 อักขระ คุณระบุป้ายกำกับที่ไม่ซ้ำกันได้สูงสุด 100 รายการต่อวัน ระบบจะไม่รายงานข้อความที่มีป้ายกำกับซึ่งเพิ่มเกินขีดจำกัดดังกล่าว

ในแท็บรายงานการรับส่งข้อความในคอนโซล คุณสามารถค้นหารายการป้ายกำกับที่มีอยู่ทั้งหมดและใช้ป้ายกำกับเดี่ยวๆ หรือใช้ร่วมกันเพื่อกรองสถิติที่แสดง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
    }
  }

วิธีตีความเมตริก

ข้อมูลการนำส่งจะแสดงเปอร์เซ็นต์ของข้อความที่ตรงกับเมตริกต่อไปนี้ ข้อความเดียวอาจเหมาะกับเมตริกหลายรายการ เนื่องจากข้อจํากัดในวิธีที่เรารวบรวมข้อมูลและระดับความละเอียดในการรวมเมตริก ผลลัพธ์ของข้อความบางรายการจึงไม่แสดงในเมตริกเลย ดังนั้นเปอร์เซ็นต์ด้านล่างจึงไม่ได้รวมกันเป็น 100%

นับข้อความที่ยอมรับ

จำนวนเดียวที่รวมอยู่ในชุดข้อมูลคือจํานวนข้อความที่ FCM ยอมรับเพื่อนำส่งไปยังอุปกรณ์ Android เปอร์เซ็นต์ทั้งหมดจะใช้ค่านี้เป็นตัวส่วน โปรดทราบว่าจำนวนนี้จะไม่รวมข้อความที่กําหนดเป้าหมายไปยังผู้ใช้ที่ปิดใช้การเก็บรวบรวมข้อมูลการใช้งานและการวินิจฉัยในอุปกรณ์

เปอร์เซ็นต์ผลลัพธ์ของข้อความ

ฟิลด์ที่อยู่ในออบเจ็กต์ MessageOutcomePercents จะแสดงข้อมูลเกี่ยวกับผลลัพธ์ของคำขอข้อความ หมวดหมู่ทั้งหมดจะแยกจากกันโดยสิ้นเชิง ซึ่งสามารถตอบคำถามต่างๆ เช่น "ระบบนำส่งข้อความของฉันไหม" และ "อะไรเป็นสาเหตุที่ทำให้ระบบทิ้งข้อความ"

ตัวอย่างเช่น ค่าที่สูงในช่อง droppedTooManyPendingMessages อาจบ่งบอกว่าอินสแตนซ์ของแอปได้รับข้อความแบบไม่สามารถยุบจํานวนมากเกินขีดจํากัดของ FCM ที่มีข้อความรอดําเนินการ 100 รายการ ในการลดปัญหานี้ โปรดตรวจสอบว่าแอปของคุณจัดการการเรียกใช้ onDeletedMessages ได้ และพิจารณาส่งข้อความแบบยุบได้ ในทำนองเดียวกัน เปอร์เซ็นต์สูงสําหรับ droppedDeviceInactive อาจบ่งบอกว่าต้องอัปเดตโทเค็นการลงทะเบียนในเซิร์ฟเวอร์ นำโทเค็นที่ล้าสมัยออก และยกเลิกการติดตามจากหัวข้อ ดูแนวทางปฏิบัติแนะนำในด้านนี้ได้จากหัวข้อจัดการโทเค็นการลงทะเบียน FCM

เปอร์เซ็นต์ประสิทธิภาพการแสดงโฆษณา

ฟิลด์ในออบเจ็กต์ DeliveryPerformancePercents จะให้ข้อมูลเกี่ยวกับข้อความที่ส่งสำเร็จ ซึ่งสามารถตอบคำถามต่างๆ เช่น "ข้อความของฉันล่าช้าไหม" และ "ทำไมข้อความจึงล่าช้า" ตัวอย่างเช่น ค่าที่สูงสำหรับ delayedMessageThrottled จะบ่งชี้อย่างชัดเจนว่าคุณส่งข้อความเกินขีดจำกัดสูงสุดต่ออุปกรณ์ และควรปรับอัตราการส่งข้อความ

เปอร์เซ็นต์ข้อมูลเชิงลึกเกี่ยวกับข้อความ

ออบเจ็กต์นี้จะให้ข้อมูลเพิ่มเติมเกี่ยวกับการส่งข้อความทั้งหมด ช่อง priorityLowered แสดงเปอร์เซ็นต์ของข้อความที่ยอมรับซึ่งมีลำดับความสำคัญลดลงจาก HIGH เป็น NORMAL หากค่านี้สูง ให้ลองส่งข้อความที่มีลำดับความสำคัญสูงน้อยลง หรือตรวจสอบว่าคุณแสดงการแจ้งเตือนทุกครั้งที่มีการส่งข้อความที่มีลำดับความสำคัญสูง ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบเกี่ยวกับลําดับความสําคัญของข้อความ

ข้อมูลนี้แตกต่างจากข้อมูลที่ส่งออกไปยัง BigQuery อย่างไร

BigQuery Export มีบันทึกข้อความแต่ละรายการเกี่ยวกับการยอมรับข้อความโดยแบ็กเอนด์ FCM และการนำส่งข้อความใน SDK บนอุปกรณ์ (ขั้นตอนที่ 2 และ 4 ของสถาปัตยกรรม FCM) ข้อมูลนี้มีประโยชน์ในการยืนยันว่าข้อความแต่ละรายการได้รับการยอมรับและนำส่งแล้ว อ่านเพิ่มเติมเกี่ยวกับการส่งออกข้อมูล BigQuery ในส่วนถัดไป

ในทางตรงกันข้าม Firebase Cloud Messaging Data API จะแสดงรายละเอียดแบบรวมเกี่ยวกับสิ่งที่เกิดขึ้นในเลเยอร์การขนส่งของ Android โดยเฉพาะ (หรือขั้นตอนที่ 3 ของสถาปัตยกรรม FCM) ข้อมูลนี้ให้ข้อมูลเชิงลึกเกี่ยวกับการนำส่งข้อความจากแบ็กเอนด์ FCM ไปยัง Android SDK โดยเฉพาะ ซึ่งมีประโยชน์อย่างยิ่งสำหรับการแสดงแนวโน้มว่าเหตุใดข้อความจึงล่าช้าหรือถูกทิ้งระหว่างการรับส่งนี้

ในบางกรณี ชุดข้อมูล 2 ชุดอาจไม่ตรงกันทั้งหมดเนื่องจากสาเหตุต่อไปนี้

  • เมตริกที่รวบรวมจะสุ่มตัวอย่างข้อความเพียงบางส่วนเท่านั้น
  • ระบบจะปัดเศษเมตริกรวม
  • เราไม่แสดงเมตริกที่ต่ำกว่าเกณฑ์ด้านความเป็นส่วนตัว
  • ผลลัพธ์ของข้อความบางส่วนหายไปเนื่องจากการเพิ่มประสิทธิภาพในวิธีที่เราจัดการการเข้าชมจำนวนมาก

ข้อจํากัดของ API

ไทม์ไลน์ข้อมูลรวม

API จะแสดงข้อมูลย้อนหลัง 7 วัน แต่ข้อมูลที่แสดงโดย API นี้จะล่าช้าสูงสุด 5 วัน ตัวอย่างเช่น ในวันที่ 20 มกราคม ข้อมูลของวันที่ 9-15 มกราคมจะพร้อมใช้งาน แต่จะไม่มีข้อมูลของวันที่ 16 มกราคมเป็นต้นไป นอกจากนี้ ข้อมูลดังกล่าวยังแสดงอย่างเต็มความสามารถ ในกรณีที่ข้อมูลหยุดทำงาน FCM จะพยายามแก้ไขปัญหาไปข้างหน้าและจะไม่ทดแทนข้อมูลหลังจากแก้ไขปัญหาแล้ว ในกรณีที่มีการหยุดทำงานครั้งใหญ่ ข้อมูลอาจไม่พร้อมใช้งานเป็นเวลา 1 สัปดาห์หรือนานกว่านั้น

ความครอบคลุมของข้อมูล

เมตริกที่ Firebase Cloud Messaging Data API ระบุมีไว้เพื่อให้ข้อมูลเชิงลึกเกี่ยวกับแนวโน้มโดยรวมของการแสดงข้อความ อย่างไรก็ตาม ข้อความเหล่านี้ไม่ได้ครอบคลุมสถานการณ์ข้อความทั้งหมด 100% สถานการณ์ต่อไปนี้คือผลลัพธ์ที่ทราบซึ่งไม่ได้แสดงในเมตริก

ข้อความที่หมดอายุ

หาก Time To Live (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 เวอร์ชัน 9.0.0 ขึ้นไป

ดูรายละเอียดเกี่ยวกับการเปิดใช้การส่งออกข้อมูลสำหรับ Android และ iOS ได้ที่ด้านล่าง

วิธีเริ่มต้นใช้งานคือลิงก์โปรเจ็กต์กับ BigQuery โดยทำดังนี้

  1. เลือกตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้

    • เปิดเครื่องมือเขียนการแจ้งเตือน แล้วคลิกเข้าถึง BigQuery ที่ด้านล่างของหน้า

    • จากหน้าการผสานรวมในคอนโซล Firebase ให้คลิกลิงก์ในการ์ด BigQuery

      หน้านี้จะแสดงตัวเลือกการส่งออก FCM สําหรับแอปที่เปิดใช้ FCM ทั้งหมดในโปรเจ็กต์

  2. ทำตามวิธีการบนหน้าจอเพื่อเปิดใช้ BigQuery

ดูข้อมูลเพิ่มเติมได้ที่ลิงก์ Firebase กับ BigQuery

สิ่งที่จะเกิดขึ้นเมื่อคุณเปิดใช้การส่งออก BigQuery สำหรับ Cloud Messaging

  • Firebase ส่งออกข้อมูลของคุณไปยัง BigQuery โปรดทราบว่าการนำไปใช้งานข้อมูลครั้งแรกสำหรับการส่งออกอาจใช้เวลาถึง 48 ชั่วโมงจึงจะเสร็จสมบูรณ์

  • หลังจากสร้างชุดข้อมูลแล้ว คุณจะเปลี่ยนแปลงตำแหน่งไม่ได้ แต่จะคัดลอกชุดข้อมูลไปยังตำแหน่งอื่นหรือย้าย (สร้างใหม่) ชุดข้อมูลไปยังตำแหน่งอื่นด้วยตนเองได้ ดูข้อมูลเพิ่มเติมที่หัวข้อเปลี่ยนตำแหน่งชุดข้อมูล

  • Firebase จะตั้งค่าการซิงค์ข้อมูลของคุณจากโปรเจ็กต์ Firebase กับ BigQuery เป็นประจํา การดำเนินการส่งออกรายวันเหล่านี้จะเริ่มตั้งแต่เวลา 04:00 น. ตามเวลาแปซิฟิก และมักจะเสร็จสิ้นภายใน 24 ชั่วโมง

  • แอปทั้งหมดในโปรเจ็กต์จะลิงก์อยู่กับ BigQuery โดยค่าเริ่มต้น และแอปที่เพิ่มในโปรเจ็กต์ภายหลังจะลิงก์กับ BigQuery โดยอัตโนมัติด้วยเช่นกัน คุณสามารถจัดการแอปที่ส่งข้อมูลได้

หากต้องการปิดใช้งานการส่งออก BigQuery ให้ยกเลิกการลิงก์โปรเจ็กต์ในคอนโซล Firebase

เปิดใช้การส่งออกข้อมูลการนำส่งข้อความ

อุปกรณ์ iOS ที่มี FCM SDK 8.6.0 ขึ้นไปจะเปิดใช้การส่งออกข้อมูลการนำส่งข้อความของแอปได้ FCM รองรับการส่งออกข้อมูลสําหรับทั้งการแจ้งเตือนและการแจ้งเตือนในเบื้องหลัง ก่อนเปิดใช้ตัวเลือกเหล่านี้ คุณต้องสร้างลิงก์ BigQuery สำหรับโปรเจ็กต์ตามที่อธิบายไว้ในการส่งออกข้อมูล BigQuery ก่อนFCM

เปิดใช้การส่งออกข้อมูลการนำส่งสำหรับการแจ้งเตือน

เนื่องจากมีเพียงการแจ้งเตือนแบบแจ้งเตือนเท่านั้นที่เรียกให้ส่วนขยายแอปบริการแจ้งเตือนทำงานได้ คุณจึงต้องเพิ่มส่วนขยายบริการแจ้งเตือนลงในแอปและเรียกใช้ 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.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

หากคุณกำลังสร้างคำขอส่งโดยใช้ 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.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 การประทับเวลา การประทับเวลาเหตุการณ์ตามที่เซิร์ฟเวอร์บันทึกไว้
project_number INTEGER หมายเลขโปรเจ็กต์จะระบุโปรเจ็กต์ที่ส่งข้อความ
message_id STRING รหัสข้อความจะระบุข้อความ รหัสข้อความที่สร้างขึ้นจากรหัสแอปและการประทับเวลาอาจไม่ซ้ำกันทั่วโลกในบางกรณี
instance_id STRING รหัสที่ไม่ซ้ำกันของแอปที่ส่งข้อความถึง (หากมี) ซึ่งอาจเป็นรหัสอินสแตนซ์หรือรหัสการติดตั้ง Firebase
message_type STRING ประเภทของข้อความ อาจเป็นข้อความแจ้งเตือนหรือข้อความข้อมูล หัวข้อ ใช้เพื่อระบุข้อความต้นฉบับสำหรับการส่งหัวข้อหรือแคมเปญ ส่วนข้อความต่อๆ ไปจะเป็นข้อความแจ้งเตือนหรือข้อความข้อมูล
sdk_platform STRING แพลตฟอร์มของแอปผู้รับ
app_name STRING ชื่อแพ็กเกจสําหรับแอป Android หรือรหัสกลุ่มสําหรับแอป iOS
collapse_key STRING คีย์การยุบจะระบุกลุ่มข้อความที่ยุบได้ เมื่ออุปกรณ์ไม่ได้เชื่อมต่ออยู่ ระบบจะจัดคิวเฉพาะข้อความล่าสุดที่มีคีย์การยุบเพื่อส่งในภายหลัง
Priority INTEGER ลำดับความสำคัญของข้อความ ค่าที่ใช้ได้คือ "ปกติ" และ "สูง" ใน iOS ลำดับความสำคัญเหล่านี้จะสอดคล้องกับลำดับความสำคัญของ APN 5 และ 10
ttl INTEGER พารามิเตอร์นี้ระบุระยะเวลา (เป็นวินาที) ที่ควรเก็บข้อความไว้ในพื้นที่เก็บข้อมูล FCM หากอุปกรณ์ออฟไลน์
หัวข้อ STRING ชื่อของหัวข้อที่ส่งข้อความไป (หากมี)
bulk_id INTEGER รหัสกลุ่มจะระบุกลุ่มข้อความที่เกี่ยวข้อง เช่น การส่งข้อความหนึ่งๆ ไปยังหัวข้อ
เหตุการณ์ STRING ประเภทของเหตุการณ์ ค่าที่เป็นไปได้มีดังนี้
  • 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 STRING เมื่อใช้ 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;