تنفيذ طلبات بحث SQL على البيانات التي تم تصديرها في BigQuery

بعد تصدير بيانات Crashlytics وبيانات جلسات Firebase (اختياريًا) إلى BigQuery، يمكنك البدء في استخدام البيانات باتّباع الخطوات التالية:

  • تحليل البيانات باستخدام طلبات SQL
    يمكنك تنفيذ طلبات على بيانات Crashlytics لإنشاء تقارير وملخّصات مخصّصة. بما أنّ هذه الأنواع من التقارير المخصّصة غير متاحة في لوحة بيانات Crashlytics ضمن وحدة تحكّم Firebase، يمكنها أن تكمل تحليلك وفهمك لبيانات الأعطال. يمكنك الاطّلاع على مجموعة من أمثلة على طلبات البحث لاحقًا في هذه الصفحة.

  • دمج البيانات من مجموعات بيانات مختلفة
    على سبيل المثال، إذا اخترت تصدير بيانات الجلسات في Firebase عند إعداد Crashlytics عملية تصدير البيانات، يمكنك تحسين فهم المستخدمين الذين لم يواجهوا أي أعطال والجلسات التي لم تشهد أي أعطال (راجِع مثال على طلب البحث). يمكنك أيضًا تصدير البيانات من منتجات Firebase المختلفة (مثل Performance Monitoring) أو من Google Analytics، ثم ربط هذه البيانات وتحليلها في BigQuery مع بيانات Crashlytics.

  • إنشاء طرق عرض
    باستخدام واجهة مستخدم BigQuery، يمكنك إنشاء طريقة عرض، وهي جدول افتراضي يتم تحديده من خلال طلب بحث SQL. للحصول على تعليمات تفصيلية حول أنواع طرق العرض المختلفة وكيفية إنشائها، راجِع مستندات BigQuery.

للاطّلاع على تفاصيل حول مخطّط مجموعة البيانات، يُرجى الاطّلاع على مخطّط مجموعة البيانات للبيانات التي تم تصديرها في BigQuery.

مزيد من المعلومات حول BigQuery SQL

أمثلة على طلبات البحث عن بيانات Crashlytics

يقدّم هذا القسم بعض الأمثلة على الحالات والاستعلامات التي توضّح كيفية استخدام BigQuery SQL مع بيانات Crashlytics التي تم تصديرها وبيانات جلسات Firebase.

المثال 1: احتساب مقاييس عدم حدوث أعطال باستخدام بيانات الجلسات في Firebase

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

يمكن أن تساعد مقاييس عدم حدوث أعطال في توفير هذه المعلومات. هذه المقاييس هي قياسات مهمة تساعدك في فهم الحالة العامة لتطبيقك. وباستخدام بيانات الجلسات وCrashlytics الأحداث في Firebase، يمكنك احتساب هذه المقاييس باستخدام طلب بحث أساسي.

في ما يلي أمثلة على طلبات بحث لتطبيق Android. بالنسبة إلى تطبيق iOS، استخدِم معرّف الحزمة وIOS (بدلاً من اسم الحزمة وANDROID).

المستخدمون الذين لم يواجههم أي تعطُّل في إصدار معيّن:

SELECT
  TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY) AS event_date,
  (1 - (COUNT (DISTINCT installation_uuid) / COUNT (DISTINCT instance_id))) AS CFU
FROM
  `PROJECT_ID.firebase_sessions.PACKAGE_NAME_ANDROID` AS sessions
LEFT JOIN
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` AS crashlytics
ON
  TIMESTAMP_TRUNC(sessions.event_timestamp,DAY) = TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY)
WHERE
  crashlytics.error_type="FATAL"
  AND crashlytics.application.display_version="APP_VERSION"
  AND sessions.application.display_version = "APP_VERSION"
GROUP BY
  event_date
ORDER BY
  event_date

الجلسات الخالية من الأعطال خلال الأسبوع الماضي (آخر 168 ساعة):

SELECT
  TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY) AS event_date,
  (1 - (COUNT (DISTINCT crashlytics.firebase_session_id) / COUNT (DISTINCT sessions.session_id))) AS CFS
FROM
  `PROJECT_ID.firebase_sessions.PACKAGE_NAME_ANDROID` AS sessions
LEFT JOIN
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` AS crashlytics
ON
  TIMESTAMP_TRUNC(sessions.event_timestamp,DAY) = TIMESTAMP_TRUNC(crashlytics.event_timestamp,DAY)
WHERE
  crashlytics.error_type="FATAL" AND _PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 168 HOUR)
  AND _PARTITIONTIME < CURRENT_TIMESTAMP()
GROUP BY
  event_date
ORDER BY
  event_date

المثال 2: الأعطال حسب اليوم

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

في ما يلي مثال على طلب بحث لتطبيق Android. بالنسبة إلى تطبيق iOS، استخدِم معرّف الحزمة وIOS (بدلاً من اسم الحزمة وANDROID).

SELECT
  COUNT(DISTINCT event_id) AS number_of_crashes,
  FORMAT_TIMESTAMP("%F", event_timestamp) AS date_of_crashes
FROM
 `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
GROUP BY
  date_of_crashes
ORDER BY
  date_of_crashes DESC
LIMIT 30;

المثال 3: العثور على الأعطال الأكثر انتشارًا

لتحديد أولويات خطط الإنتاج بشكل سليم، عليك العثور على أكثر 10 أعطال شيوعًا في تطبيقك. يمكنك إنشاء طلب بحث يقدّم نقاط البيانات ذات الصلة.

في ما يلي مثال على طلب بحث لتطبيق Android. بالنسبة إلى تطبيق iOS، استخدِم معرّف الحزمة وIOS (بدلاً من اسم الحزمة وANDROID).

SELECT
  DISTINCT issue_id,
  COUNT(DISTINCT event_id) AS number_of_crashes,
  COUNT(DISTINCT installation_uuid) AS number_of_impacted_user,
  blame_frame.file,
  blame_frame.line
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(),INTERVAL 168 HOUR)
  AND event_timestamp < CURRENT_TIMESTAMP()
GROUP BY
  issue_id,
  blame_frame.file,
  blame_frame.line
ORDER BY
  number_of_crashes DESC
LIMIT 10;

المثال 4: أفضل 10 أجهزة تحدث فيها أعطال

الخريف هو موسم الهواتف الجديدة! وتدرك شركتك أنّ هذا يعني أيضًا أنّ موسم المشاكل الخاصة بالأجهزة الجديدة قد بدأ، لا سيما على Android. للتغلّب على المخاوف بشأن التوافق، أعددت طلب بحث يحدّد 10 أجهزة حدثت فيها معظم الأعطال خلال الأسبوع الماضي (168 ساعة).

في ما يلي مثال على طلب بحث لتطبيق Android. بالنسبة إلى تطبيق iOS، استخدِم معرّف الحزمة وIOS (بدلاً من اسم الحزمة وANDROID).

SELECT
  device.model,
COUNT(DISTINCT event_id) AS number_of_crashes
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  event_timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 168 HOUR)
  AND event_timestamp < CURRENT_TIMESTAMP()
GROUP BY
  device.model
ORDER BY
  number_of_crashes DESC
LIMIT 10;

المثال 5: الفلترة حسب المفتاح المخصّص

أنت مطوّر ألعاب وتريد معرفة مستوى اللعبة الذي يحدث فيه أكبر عدد من الأعطال.

للمساعدة في تتبُّع هذا الإحصاء، يمكنك ضبط مفتاح Crashlytics مخصّص (iOS+ | Android | Flutter | Unity ) يُسمى current_level، وتعديله في كل مرة يصل فيها المستخدم إلى مستوى جديد.

Swift

Crashlytics.sharedInstance().setIntValue(3, forKey: "current_level");

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Java

Crashlytics.setInt("current_level", 3);

باستخدام هذا المفتاح في عملية التصدير إلى BigQuery، يمكنك بعد ذلك كتابة طلب بحث لإعداد تقرير عن توزيع قيم current_level المرتبطة بكل حدث تعطل.

في ما يلي مثال على طلب بحث لتطبيق Android. بالنسبة إلى تطبيق iOS، استخدِم معرّف الحزمة وIOS (بدلاً من اسم الحزمة وANDROID).

SELECT
COUNT(DISTINCT event_id) AS num_of_crashes,
  value
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
UNNEST(custom_keys)
WHERE
  key = "current_level"
GROUP BY
  key,
  value
ORDER BY
  num_of_crashes DESC

المثال 6: استخراج أرقام تعريف المستخدمين

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

في ما يلي مثال على طلب بحث لتطبيق Android. بالنسبة إلى تطبيق iOS، استخدِم معرّف الحزمة وIOS (بدلاً من اسم الحزمة وANDROID).

SELECT *
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  user.id IN ("USER_ID_1", "USER_ID_2", "USER_ID_3")
ORDER BY
  user.id
 

المثال 7: العثور على جميع المستخدمين الذين يواجهون مشكلة تعطُّل معيّنة

أصدر فريقك عن طريق الخطأ خطأً فادحًا لمجموعة من مختبِري الإصدار التجريبي. تمكّن فريقك من استخدام طلب البحث من مثال"العثور على الأعطال الأكثر انتشارًا" أعلاه لتحديد رقم تعريف مشكلة العطل المحدّدة. يريد فريقك الآن تنفيذ طلب بحث لاستخراج قائمة بمستخدمي التطبيق الذين تأثّروا بهذا التعطُّل.

في ما يلي مثال على طلب بحث لتطبيق Android. بالنسبة إلى تطبيق iOS، استخدِم معرّف الحزمة وIOS (بدلاً من اسم الحزمة وANDROID).

SELECT user.id as user_id
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`
WHERE
  issue_id = "ISSUE_ID"
  AND application.display_version = "APP_VERSION"
  AND user.id != ""
ORDER BY
  user.id;

المثال 8: عدد المستخدمين المتأثرين بمشكلة تعطُّل، مصنّف حسب البلد

رصد فريقك خطأً فادحًا أثناء طرح إصدار جديد. لقد تمكّنت من استخدام طلب البحث من مثال"العثور على الأعطال الأكثر انتشارًا" أعلاه لتحديد المعرّف الخاص بمشكلة التعطُّل. يريد فريقك الآن معرفة ما إذا كان هذا العطل قد انتشر بين المستخدمين في بلدان مختلفة حول العالم.

لكتابة هذا الاستعلام، على فريقك اتّخاذ الخطوات التالية:

  1. فعِّل تصدير بيانات Google Analytics إلى BigQuery. اطّلِع على تصدير بيانات المشروع إلى BigQuery.

  2. حدِّث تطبيقك لإرسال رقم تعريف المستخدم إلى كلّ من حزمة تطوير البرامج Google Analytics وحزمة تطوير البرامج Crashlytics.

    Swift

    Crashlytics.sharedInstance().setUserIdentifier("123456789");
    Analytics.setUserID("123456789");
    

    Objective-C

    CrashlyticsKit setUserIdentifier:@"123456789";
    FIRAnalytics setUserID:@"12345678 9";
    

    Java

    Crashlytics.setUserIdentifier("123456789");
    mFirebaseAnalytics.setUserId("123456789");
    
  3. اكتب طلب بحث يستخدِم حقل رقم تعريف المستخدِم لربط الأحداث في مجموعة بيانات Google Analytics بالأعطال في مجموعة بيانات Crashlytics.

    في ما يلي مثال على طلب بحث لتطبيق Android. بالنسبة إلى تطبيق iOS، استخدِم معرّف الحزمة وIOS (بدلاً من اسم الحزمة وANDROID).

    SELECT DISTINCT c.issue_id, a.geo.country, COUNT(DISTINCT c.user.id) as num_users_impacted
    FROM `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID` c
    INNER JOIN  `PROJECT_ID.analytics_TABLE_NAME.events_*` a on c.user.id = a.user_id
    WHERE
      c.issue_id = "ISSUE_ID"
      AND a._TABLE_SUFFIX BETWEEN '20190101'
      AND '20200101'
    GROUP BY
      c.issue_id,
      a.geo.country,
      c.user.id

المثال 9: أهم 5 مشاكل حتى الآن اليوم

في ما يلي مثال على طلب بحث لتطبيق Android. بالنسبة إلى تطبيق iOS، استخدِم معرّف الحزمة وIOS (بدلاً من اسم الحزمة وANDROID).

SELECT
  issue_id,
  COUNT(DISTINCT event_id) AS events
FROM
  `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID_REALTIME`
WHERE
  DATE(event_timestamp) = CURRENT_DATE()
GROUP BY
  issue_id
ORDER BY
  events DESC
LIMIT
  5;

المثال 10: أهم 5 مشاكل منذ DATE، بما في ذلك اليوم

يمكنك أيضًا الجمع بين جدولَي الدُفعات والوقت الفعلي باستخدام طلب بحث ربط لإضافة معلومات الوقت الفعلي إلى بيانات الدُفعات الموثوقة. بما أنّ event_id هو مفتاح أساسي، يمكنك استخدام DISTINCT event_id لإزالة أي أحداث مكرّرة من الجدولَين.

في ما يلي مثال على طلب بحث لتطبيق Android. بالنسبة إلى تطبيق iOS، استخدِم معرّف الحزمة وIOS (بدلاً من اسم الحزمة وANDROID).

SELECT
  issue_id,
  COUNT(DISTINCT event_id) AS events
FROM (
  SELECT
    issue_id,
    event_id,
    event_timestamp
  FROM
    `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID_REALTIME`
  UNION ALL
  SELECT
    issue_id,
    event_id,
    event_timestamp
  FROM
    `PROJECT_ID.firebase_crashlytics.PACKAGE_NAME_ANDROID`)
WHERE
  event_timestamp >= PARSE_TIMESTAMP("%Y_%m_%d", "YYYY_MM_DD")
GROUP BY
  issue_id
ORDER BY
  events DESC
LIMIT
  5;

ما هي الخطوات التالية؟