بعد تصدير بيانات Crashlytics وبيانات الجلسات في Firebase (اختياريًا) إلى BigQuery، يمكنك البدء في العمل على البيانات باتّباع الخطوات التالية:
تحليل البيانات باستخدام طلبات بحث SQL
يمكنك تنفيذ طلبات بحث على بيانات Crashlytics لإنشاء تقارير وملخّصات مخصّصة، وبما أنّ هذه الأنواع من التقارير المخصّصة غير متاحة في لوحة بيانات Crashlytics في وحدة تحكّم Firebase، يمكن أن تكمل هذه التقارير تحليلك وفهمك لبيانات الأعطال. يمكنك الاطّلاع على مجموعة أمثلة على طلبات البحث في وقت لاحق من هذه الصفحة.دمج البيانات من مجموعات بيانات مختلفة
على سبيل المثال، إذا اخترت تصدير بيانات الجلسات في Firebase عند إعداد Crashlytics لتصدير البيانات، يمكنك تحسين فهمك للمستخدمين الذين لم يواجهوا أعطالاً والجلسات التي لم تشهد أعطالاً (راجِع مثال على طلب البحث). يمكنك أيضًا تصدير البيانات من منتجات Firebase المختلفة (مثل Performance Monitoring) أو من Google Analytics، ثم دمج هذه البيانات وتحليلها في BigQuery باستخدام بيانات Crashlytics.إنشاء طرق عرض
باستخدام واجهة مستخدم BigQuery، يمكنك إنشاء طريقة عرض، وهي عبارة عن جدول افتراضي يتم تحديده من خلال طلب بحث SQL. للحصول على تعليمات مفصّلة حول الأنواع المختلفة من طرق العرض وكيفية إنشائها، راجِع مستندات BigQuery.
للاطّلاع على تفاصيل حول مخطّط مجموعة البيانات، يُرجى الرجوع إلى مخطّط مجموعة البيانات للبيانات التي تم تصديرها في BigQuery.
مزيد من المعلومات حول BigQuery SQL
تعرَّف على أنواع طلبات البحث التي يمكنك تنفيذها، بما في ذلك مهام طلبات البحث التفاعلية ومهام طلبات البحث المجمّعة ومهام طلبات البحث المستمرة.
يمكنك الاطّلاع على العبارات ولهجات SQL المتوافقة في BigQuery.
كيفية كتابة طلبات بحث باستخدام ميزة "المساعدة المستندة إلى الذكاء الاصطناعي" (Gemini)
أمثلة على طلبات البحث عن بيانات Crashlytics
يقدّم هذا القسم بعض الأمثلة على الحالات والاستعلامات التي توضّح كيفية استخدام BigQuery SQL مع بيانات Crashlytics التي تم تصديرها وبيانات الجلسات في Firebase.
- احتساب مقاييس عدم حدوث أعطال باستخدام بيانات الجلسات في Firebase
- الأعطال حسب اليوم
- العثور على الأعطال الأكثر انتشارًا
- أكثر 10 أجهزة تحدث فيها أعطال
- الفلترة حسب المفتاح المخصّص
- استخراج أرقام تعريف المستخدمين
- العثور على جميع المستخدمين الذين يواجهون مشكلة معيّنة في الأعطال
- عدد المستخدمين المتأثّرين بمشكلة عُطل، مصنّف حسب البلد
- أهم 5 مشاكل حتى الآن اليوم
- أهم 5 مشاكل منذ DATE، بما في ذلك اليوم
المثال 1: احتساب مقاييس الجلسات الخالية من الأعطال باستخدام بيانات الجلسات في Firebase
في أحدث إصدار، أطلقت عملية تجديد كبيرة لتطبيقك بهدف معالجة الأعطال في تجربة المستخدم الأساسية. وقد تلقّيت مراجعات رائعة من المستخدمين، ولكنك تريد الحصول على دليل كمّي على أنّ تطبيقك أكثر استقرارًا من ذي قبل.
يمكن أن تساعد مقاييس عدم حدوث الأعطال في توفير هذه المعلومات، وهي مقاييس مهمة تساعدك في فهم الحالة العامة لتطبيقك. وباستخدام بيانات الجلسات في Firebase وأحداث Crashlytics، يمكنك احتساب هذه المقاييس باستخدام طلب بحث أساسي.
في ما يلي أمثلة على طلبات بحث لتطبيق 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: عدد المستخدمين المتأثرين بمشكلة تعطُّل، مصنّف حسب البلد
رصد فريقك خطأً فادحًا أثناء طرح إصدار جديد. لقد تمكّنت من استخدام طلب البحث من مثال"العثور على الأعطال الأكثر انتشارًا" أعلاه لتحديد رقم تعريف مشكلة التعطُّل المحدّدة. يريد فريقك الآن معرفة ما إذا كان هذا العطل قد انتشر بين المستخدمين في بلدان مختلفة حول العالم.
لكتابة هذا الاستعلام، على فريقك تنفيذ ما يلي:
فعِّل تصدير بيانات Google Analytics إلى BigQuery. اطّلِع على تصدير بيانات المشروع إلى BigQuery.
حدِّث تطبيقك لإدخال رقم تعريف المستخدم في كلّ من حزمة تطوير البرامج 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");اكتب طلب بحث يستخدِم حقل رقم تعريف المستخدِم لربط الأحداث في مجموعة بيانات 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;
ما هي الخطوات التالية؟
إنشاء لوحات بيانات مخصّصة باستخدام البيانات التي تم تصديرها وخدمات Google Cloud المختلفة، مثل Data Studio
مزيد من المعلومات عن مخطط مجموعة البيانات للبيانات التي يتم تصديرها