BigQuery'deki dışa aktarılan veriler üzerinde SQL sorguları çalıştırma

Crashlytics ve (isteğe bağlı olarak) Firebase oturum verilerinizi BigQuery'ye aktardıktan sonra verilerle çalışmaya başlayabilirsiniz:

  • SQL sorgularını kullanarak verileri analiz etme
    Özel raporlar ve özetler oluşturmak için Crashlytics verilerinizde sorgu çalıştırabilirsiniz. Bu tür özel raporlar, Firebase konsolunun Crashlytics kontrol panelinde kullanılamadığından kilitlenme verilerinin analizini ve anlaşılmasını destekleyebilir. Bu sayfanın ilerleyen bölümlerinde yer alan örnek sorgular koleksiyonuna bakın.

  • Farklı veri kümelerindeki verileri birleştirme
    Örneğin, veri dışa aktarma işlemini ayarlarken Firebase oturum verilerini dışa aktarmayı seçerseniz Crashlytics kilitlenme içermeyen kullanıcılar ve kilitlenme içermeyen oturumlar hakkında daha iyi bilgi edinebilirsiniz (örnek sorguya bakın). Ayrıca, çeşitli Firebase ürünlerinden (ör. Performance Monitoring) veya Google Analytics'den veri dışa aktarabilir, ardından bu verileri BigQuery'de Crashlytics verilerinizle birleştirip analiz edebilirsiniz.

  • Görünüm oluşturma
    BigQuery kullanıcı arayüzünü kullanarak SQL sorgusuyla tanımlanan sanal bir tablo olan görünüm oluşturabilirsiniz. Farklı görünüm türleri ve bunların nasıl oluşturulacağı hakkında ayrıntılı talimatlar için BigQuery dokümanlarına bakın.

Veri kümesi şeması hakkında ayrıntılı bilgi için BigQuery'da dışa aktarılan verilerin veri kümesi şeması başlıklı makaleyi inceleyin.

BigQuery SQL hakkında bilgi

Crashlytics verileri için örnek sorgular

Bu bölümde, dışa aktarılan BigQuery verileriniz ve Firebase oturum verilerinizle Crashlytics SQL'i nasıl kullanabileceğinizi gösteren bazı örnek durumlar ve örnek sorgular verilmektedir.

1. örnek: Firebase oturum verilerini kullanarak kilitlenme sorunu ile karşılaşmayan kullanıcılarla ilgili metrikleri hesaplama

En son sürümünüzde, kritik bir kullanıcı yolculuğundaki kilitlenmeleri gidermek için uygulamanızda büyük bir yenileme yaptınız. Kullanıcılardan mükemmel yorumlar aldınız ancak uygulamanızın eskisinden daha kararlı olduğuna dair nicel kanıtlar istiyorsunuz.

Bu bilgileri kilitlenme içermeyen metrikler aracılığıyla edinebilirsiniz. Bu metrikler, uygulamanızın genel durumunu anlamanıza yardımcı olan önemli ölçümlerdir. Firebase oturum verileri ve Crashlytics etkinlikleriyle bu metrikleri temel bir sorguyla hesaplayabilirsiniz.

Android uygulaması için örnek sorgular aşağıda verilmiştir. iOS uygulaması için paket adı ve ANDROID yerine paket kimliğini ve IOS kullanın.

Belirli bir sürümde kilitlenme sorunu yaşamayan kullanıcılar:

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

Geçen hafta (son 168 saat) boyunca kilitlenme sorunu yaşanmayan oturum sayısı:

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. örnek: Günlük kilitlenme sayısı

Mümkün olduğunca çok sayıda hatayı düzeltmek için çalıştıktan sonra ekibinizin nihayet yeni fotoğraf paylaşım uygulamanızı başlatmaya hazır olduğunu düşünüyorsunuz. Ancak bunu yapmadan önce, hata avınızın uygulamayı zaman içinde daha kararlı hale getirdiğinden emin olmak için son bir ayda günlük kilitlenme sayısını kontrol etmek istiyorsunuz.

Android uygulaması için örnek sorguyu aşağıda bulabilirsiniz. iOS uygulaması için paket adı ve ANDROID yerine paket kimliğini ve IOS kullanın.

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. örnek: En yaygın kilitlenmeleri bulma

Üretim planlarına doğru şekilde öncelik vermek için uygulamanızdaki en yaygın 10 kilitlenmeyi bulmak istiyorsunuz. İlgili veri noktalarını sağlayan bir sorgu oluşturuyorsunuz.

Android uygulaması için örnek sorguyu aşağıda bulabilirsiniz. iOS uygulaması için paket adı ve ANDROID yerine paket kimliğini ve IOS kullanın.

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. örnek: En çok kilitlenen 10 cihaz

Sonbahar, yeni telefon sezonu! Şirketiniz, bu durumun özellikle Android'de yeni cihaza özgü sorunların yaşanabileceği bir dönem olduğunu da biliyor. Yaklaşan uyumluluk sorunlarını önlemek için geçen hafta (168 saat) en çok kilitlenen 10 cihazı belirleyen bir sorgu oluşturdunuz.

Android uygulaması için örnek sorguyu aşağıda bulabilirsiniz. iOS uygulaması için paket adı ve ANDROID yerine paket kimliğini ve IOS kullanın.

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;

Örnek 5: Özel anahtara göre filtreleme

Oyununuzun hangi seviyesinde en çok kilitlenme yaşandığını öğrenmek isteyen bir oyun geliştiricisiniz.

Bu istatistiği izlemeye yardımcı olmak için Crashlytics anahtarı (iOS+ | Android | Flutter | Unity ) ayarlarsınız. Bu anahtarın adı current_level olur ve kullanıcı yeni bir seviyeye ulaştığında güncellenir.

Swift

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

Objective-C

CrashlyticsKit setIntValue:3 forKey:@"current_level";

Java

Crashlytics.setInt("current_level", 3);

Dışa aktarma işleminizde bu anahtarı kullanarak BigQuery, her kilitlenme etkinliğiyle ilişkili current_level değerlerinin dağılımını bildirmek için bir sorgu yazabilirsiniz.

Android uygulaması için örnek sorguyu aşağıda bulabilirsiniz. iOS uygulaması için paket adı ve ANDROID yerine paket kimliğini ve IOS kullanın.

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. örnek: Kullanıcı kimliklerini ayıklama

Erken erişim aşamasında olan bir Android uygulamanız var. Kullanıcılarınızın çoğu bu sürümü beğeniyor ancak üç kullanıcı, alışılmadık sayıda kilitlenme sorunu yaşıyor. Sorunun kaynağını bulmak için bu kullanıcıların kullanıcı kimliklerini kullanarak bu kullanıcılarla ilgili tüm kilitlenme etkinliklerini çeken bir sorgu yazarsınız.

Android uygulaması için örnek sorguyu aşağıda bulabilirsiniz. iOS uygulaması için paket adı ve ANDROID yerine paket kimliğini ve IOS kullanın.

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. örnek: Belirli bir kilitlenme sorunuyla karşılaşan tüm kullanıcıları bulma

Ekibiniz, önemli bir hatayı yanlışlıkla bir grup beta test kullanıcısına yayınladı. Ekibiniz, yukarıdaki "En yaygın kilitlenmeleri bulma" örneğindeki sorguyu kullanarak belirli kilitlenme sorunu kimliğini belirleyebildi. Şimdi ekibiniz, bu kilitlenmeden etkilenen uygulama kullanıcılarının listesini çıkarmak için bir sorgu çalıştırmak istiyor.

Android uygulaması için örnek sorguyu aşağıda bulabilirsiniz. iOS uygulaması için paket adı ve ANDROID yerine paket kimliğini ve IOS kullanın.

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. örnek: Kilitlenme sorunundan etkilenen kullanıcı sayısı (ülkeye göre ayrılmış)

Ekibiniz, yeni bir sürümün kullanıma sunulması sırasında kritik bir hata tespit etti. Yukarıdaki "En yaygın kilitlenmeleri bulma" örneğindeki sorguyu kullanarak belirli kilitlenme sorunu kimliğini belirleyebildiniz. Ekibiniz, bu kilitlenmenin dünyanın farklı ülkelerindeki kullanıcılara yayılıp yayılmadığını görmek istiyor.

Bu sorguyu yazmak için ekibinizin aşağıdakileri yapması gerekir:

  1. Google Analytics verilerinin BigQuery'ye aktarılmasını etkinleştirin. Proje verilerini BigQuery'ye aktarma başlıklı makaleyi inceleyin.

  2. Uygulamanızı, hem Google Analytics SDK'sına hem de Crashlytics SDK'sına kullanıcı kimliği iletecek şekilde güncelleyin.

    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 veri kümesindeki etkinlikleri Crashlytics veri kümesindeki kilitlenmelerle birleştirmek için kullanıcı kimliği alanını kullanan bir sorgu yazın.

    Android uygulaması için örnek sorgu: iOS uygulaması için paket kimliğini ve IOS (paket adı ve ANDROID yerine) kullanın.

    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. örnek: Bugün şu ana kadar karşılaşılan en büyük 5 sorun

Android uygulaması için örnek sorguyu aşağıda bulabilirsiniz. iOS uygulaması için paket adı ve ANDROID yerine paket kimliğini ve IOS kullanın.

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;

Örnek 10: Bugün dahil olmak üzere, TARİH'ten bu yana en büyük 5 sorun

Güvenilir toplu verilere gerçek zamanlı bilgiler eklemek için toplu ve gerçek zamanlı tabloları birleştirme sorgusuyla da birleştirebilirsiniz. event_id birincil anahtar olduğundan, iki tablodaki ortak etkinlikleri tekilleştirmek için DISTINCT event_id kullanabilirsiniz.

Android uygulaması için örnek sorguyu aşağıda bulabilirsiniz. iOS uygulaması için paket adı ve ANDROID yerine paket kimliğini ve IOS kullanın.

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;

Sırada ne var?