Menjalankan kueri SQL pada data yang diekspor di BigQuery

Setelah mengekspor data Crashlytics dan (opsional) data sesi Firebase ke BigQuery, Anda dapat mulai menggunakan data tersebut:

  • Menganalisis data menggunakan kueri SQL
    Anda dapat menjalankan kueri pada data Crashlytics untuk membuat laporan dan ringkasan kustom. Karena jenis laporan kustom ini tidak tersedia di dasbor Crashlytics Firebase console, laporan ini dapat melengkapi analisis dan pemahaman Anda tentang data error. Lihat kumpulan contoh kueri di bagian selanjutnya dalam halaman ini.

  • Menggabungkan data dari set data yang berbeda
    Misalnya, jika Anda memilih untuk mengekspor data sesi Firebase saat menyiapkan ekspor data Crashlytics, Anda dapat meningkatkan pemahaman tentang pengguna bebas error dan sesi bebas error (lihat contoh kueri). Selain itu, Anda dapat mengekspor data dari berbagai produk Firebase (seperti Performance Monitoring) atau dari Google Analytics, lalu menggabungkan dan menganalisis data tersebut di BigQuery dengan data Crashlytics Anda.

  • Membuat tampilan
    Dengan menggunakan UI BigQuery, Anda dapat membuat tampilan, yang merupakan tabel virtual yang ditentukan oleh kueri SQL. Untuk mengetahui petunjuk mendetail tentang berbagai jenis tampilan dan cara membuatnya, lihat dokumentasi BigQuery.

Untuk mengetahui detail tentang skema set data, lihat Skema set data untuk data yang diekspor dalam BigQuery.

Mempelajari SQL BigQuery

Contoh kueri untuk data Crashlytics

Bagian ini memberikan beberapa contoh situasi dan contoh kueri yang menunjukkan cara menggunakan SQL BigQuery dengan data Crashlytics yang diekspor dan data sesi Firebase.

Contoh 1: Menghitung metrik bebas error menggunakan data sesi Firebase

Dalam versi terbaru, Anda meluncurkan perombakan besar-besaran pada aplikasi untuk mengatasi error dalam perjalanan penting pengguna. Anda telah menerima ulasan yang sangat baik dari pengguna, tetapi Anda ingin bukti kuantitatif bahwa aplikasi Anda lebih stabil dari sebelumnya.

Metrik bebas error dapat membantu memberikan informasi ini. Metrik ini adalah pengukuran penting yang membantu Anda memahami kondisi keseluruhan aplikasi. Dengan data sesi Firebase dan peristiwa Crashlytics, Anda dapat menghitung metrik ini dengan kueri dasar.

Berikut adalah contoh kueri untuk aplikasi Android. Untuk aplikasi iOS, gunakan ID paket dan IOS-nya (bukan nama paket dan ANDROID).

Pengguna bebas error untuk versi tertentu:

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

Sesi bebas error selama seminggu terakhir (168 jam terakhir):

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

Contoh 2: Error per hari

Setelah berupaya memperbaiki bug sebanyak mungkin, Anda merasa bahwa tim Anda telah siap meluncurkan aplikasi berbagi foto yang baru. Sebelum melakukannya, Anda ingin memeriksa jumlah error per hari selama sebulan terakhir, untuk memastikan bahwa pemecahan masalah bug Anda membuat aplikasi menjadi lebih stabil dari waktu ke waktu.

Berikut adalah contoh kueri untuk aplikasi Android. Untuk aplikasi iOS, gunakan ID paket dan IOS (bukan nama paket dan 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;

Contoh 3: Menemukan error yang paling signifikan

Untuk memprioritaskan rencana produksi dengan benar, Anda ingin menemukan 10 error paling signifikan dalam aplikasi. Anda membuat kueri yang memberikan poin data yang relevan.

Berikut adalah contoh kueri untuk aplikasi Android. Untuk aplikasi iOS, gunakan ID paket dan IOS (bukan nama paket dan 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;

Contoh 4: 10 perangkat yang paling sering mengalami error

Musim gugur adalah musim ponsel baru. Perusahaan Anda tahu bahwa ini juga berarti musim munculnya masalah pada perangkat baru — terutama untuk Android. Untuk mengatasi masalah kompatibilitas tersebut, Anda mengumpulkan kueri yang mengidentifikasi 10 perangkat yang paling sering mengalami error dalam seminggu terakhir (168 jam).

Berikut adalah contoh kueri untuk aplikasi Android. Untuk aplikasi iOS, gunakan ID paket dan IOS (bukan nama paket dan 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;

Contoh 5: Memfilter berdasarkan kunci kustom

Anda adalah developer game yang ingin mengetahui level mana dari game Anda yang paling sering mengalami error.

Untuk membantu melacak statistik tersebut, Anda menetapkan kunci Crashlytics kustom (iOS+ | Android | Flutter | Unity ) yang disebut current_level, dan memperbaruinya setiap kali pengguna mencapai level baru.

Swift

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

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Java

Crashlytics.setInt("current_level", 3);

Dengan kunci tersebut dalam ekspor ke BigQuery, Anda kemudian dapat menulis kueri untuk melaporkan distribusi nilai current_level yang terkait dengan setiap peristiwa error.

Berikut adalah contoh kueri untuk aplikasi Android. Untuk aplikasi iOS, gunakan ID paket dan IOS (bukan nama paket dan 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

Contoh 6: Mengekstrak ID pengguna

Anda memiliki aplikasi Android dalam akses awal. Sebagian besar pengguna menyukai aplikasi tersebut, tetapi tiga pengguna mengalami jumlah error yang tidak biasa. Untuk menyelesaikan masalah, Anda menulis kueri yang menarik semua peristiwa error pada pengguna tersebut menggunakan ID pengguna mereka:

Berikut adalah contoh kueri untuk aplikasi Android. Untuk aplikasi iOS, gunakan ID paket dan IOS (bukan nama paket dan 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
 

Contoh 7: Menemukan semua pengguna yang mengalami masalah error tertentu

Tim Anda tidak sengaja merilis bug kritis kepada sekelompok penguji beta. Tim Anda dapat menggunakan kueri dari contoh "Menemukan error yang paling signifikan" di atas untuk mengidentifikasi ID masalah error yang spesifik. Sekarang, tim Anda ingin menjalankan kueri untuk mengekstrak daftar pengguna aplikasi yang terkena dampak error ini.

Berikut adalah contoh kueri untuk aplikasi Android. Untuk aplikasi iOS, gunakan ID paket dan IOS (bukan nama paket dan 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;

Contoh 8: Jumlah pengguna yang terkena dampak masalah error, dibagi berdasarkan negara

Tim Anda telah mendeteksi bug kritis selama peluncuran rilis baru. Anda dapat menggunakan kueri dari contoh "Menemukan error yang paling signifikan" di atas untuk mengidentifikasi ID masalah error yang spesifik. Sekarang, tim Anda ingin melihat apakah error ini telah menyebar ke pengguna di berbagai negara di dunia.

Untuk menulis kueri ini, tim Anda harus melakukan hal berikut:

  1. Aktifkan ekspor data Google Analytics ke BigQuery. Lihat Mengekspor data project ke BigQuery.

  2. Update aplikasi Anda untuk meneruskan ID pengguna ke Google Analytics SDK dan Crashlytics SDK.

    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. Menulis kueri yang menggunakan kolom ID pengguna untuk menggabungkan peristiwa di set data Google Analytics dengan error di set data Crashlytics.

    Berikut adalah contoh kueri untuk aplikasi Android. Untuk aplikasi iOS, gunakan ID paket dan IOS (bukan nama paket dan 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

Contoh 9: 5 masalah teratas sejauh ini

Berikut adalah contoh kueri untuk aplikasi Android. Untuk aplikasi iOS, gunakan ID paket dan IOS (bukan nama paket dan 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;

Contoh 10: 5 masalah teratas sejak TANGGAL, termasuk hari ini

Anda juga dapat menggabungkan tabel batch dan realtime dengan kueri penggabungan untuk menambahkan informasi realtime ke data batch yang dapat diandalkan. Karena event_id adalah kunci utama, Anda dapat menggunakan DISTINCT event_id untuk menghilangkan duplikat setiap peristiwa umum dari kedua tabel.

Berikut adalah contoh kueri untuk aplikasi Android. Untuk aplikasi iOS, gunakan ID paket dan IOS (bukan nama paket dan 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;

Apa langkah selanjutnya?