Вы можете экспортировать данные Firebase Crashlytics в BigQuery для дальнейшего анализа. BigQuery позволяет анализировать данные с помощью BigQuery SQL, экспортировать их в другой облачный провайдер и использовать для визуализации и создания пользовательских информационных панелей с помощью Google Data Studio.
Включить экспорт в BigQuery
В консоли Firebase перейдите на страницу «Интеграции» .
На карточке BigQuery нажмите «Ссылка» .
Следуйте инструкциям на экране, чтобы включить экспорт в BigQuery .
Если вам нужен доступ к данным Crashlytics в BigQuery практически в реальном времени, рассмотрите возможность перехода на потоковый экспорт .
Что произойдет, если вы включите экспорт?
Вы выбираете местоположение набора данных. После создания набора данных его местоположение невозможно изменить, но вы можете скопировать набор данных в другое место или вручную переместить (воссоздать) набор данных в другом месте. Дополнительные сведения см. в разделе Изменение местоположения существующих экспортированных файлов .
Это расположение применимо только для данных, экспортированных в BigQuery , и не влияет на расположение данных, хранящихся для использования на панели управления Crashlytics консоли Firebase или в Android Studio.
По умолчанию все приложения в вашем проекте связаны с BigQuery , и все приложения, которые вы позже добавите в проект, автоматически связываются с BigQuery . Вы можете управлять тем, какие приложения отправляют данные .
Firebase настраивает ежедневную синхронизацию ваших данных с BigQuery .
После связывания проекта вам обычно нужно дождаться синхронизации на следующий день, чтобы первый набор данных был экспортирован в BigQuery .
Ежедневная синхронизация происходит один раз в день, независимо от запланированного экспорта, который вы могли настроить в BigQuery . Обратите внимание, что время и продолжительность задания синхронизации могут измениться, поэтому мы не рекомендуем планировать последующие операции или задания на основе определенного времени экспорта.
Firebase экспортирует копию существующих данных в BigQuery . Первоначальное распространение данных для экспорта может занять до 48 часов.
Для каждого связанного приложения этот экспорт включает пакетную таблицу, содержащую данные ежедневной синхронизации.
Вы можете вручную запланировать заполнение данных для пакетной таблицы за последние 30 дней или до самой последней даты, когда вы включили экспорт в BigQuery (в зависимости от того, что наступит позже).
Обратите внимание: если вы включили экспорт данных Crashlytics до середины октября 2024 года, вы также можете выполнить обратное заполнение за 30 дней до дня включения экспорта.
Если вы включите экспорт потоковой передачи Crashlytics в BigQuery , все связанные приложения также будут иметь таблицу в реальном времени, содержащую постоянно обновляемые данные.
Чтобы деактивировать экспорт в BigQuery , отсоедините свой проект в консоли Firebase .
Какие данные экспортируются в BigQuery ?
Данные Firebase Crashlytics экспортируются в набор данных BigQuery с именем firebase_crashlytics
. По умолчанию внутри набора данных Crashlytics будут созданы отдельные таблицы для каждого приложения в вашем проекте. Firebase называет таблицы на основе идентификатора приложения, точки преобразуются в символы подчеркивания, а в конце добавляется имя платформы.
Например, данные для приложения Android с именем пакета com.google.test
будут находиться в таблице с именем com_google_test_ANDROID
. Эта пакетная таблица обновляется один раз в день. Если вы включите потоковый экспорт Crashlytics в BigQuery , данные Crashlytics также будут передаваться в режиме реального времени в таблицу с именем com_google_test_ANDROID_REALTIME
.
Каждая строка в таблице представляет событие, произошедшее в приложении, включая сбои, нефатальные ошибки и ошибки ANR.
Экспорт потоковой передачи Crashlytics в BigQuery
Вы можете осуществлять потоковую передачу данных Crashlytics в режиме реального времени с помощью потоковой передачи BigQuery . Вы можете использовать его для любых целей, требующих оперативных данных, например для представления информации на интерактивной информационной панели, просмотра развертывания в реальном времени или мониторинга проблем приложений, которые вызывают оповещения и настраиваемые рабочие процессы.
Когда вы включаете потоковый экспорт Crashlytics в BigQuery , помимо пакетной таблицы у вас также будет таблица реального времени. Вот различия, о которых вам следует знать между таблицами:
Таблица партий | Таблица реального времени |
---|---|
|
|
Пакетная таблица идеально подходит для долгосрочного анализа и выявления тенденций с течением времени, поскольку мы надежно сохраняем события перед их записью, и их можно повторно заполнять в таблице на срок до 30 дней*. Когда мы записываем данные в вашу таблицу реального времени, мы немедленно записываем их в BigQuery , поэтому они идеально подходят для интерактивных информационных панелей и пользовательских оповещений. Эти две таблицы можно объединить с запросом на сшивание, чтобы получить преимущества обеих.
По умолчанию срок действия раздела таблицы реального времени составляет 30 дней. Чтобы узнать, как это изменить, см. раздел «Установка срока действия раздела» в документации BigQuery .
* Подробности о поддержке обратной засыпки см. в разделе Обновление до новой экспортной инфраструктуры .
Включить экспорт потоковой передачи Crashlytics в BigQuery
В консоли Firebase перейдите на страницу «Интеграции» .
На карточке BigQuery нажмите «Управление» .
Установите флажок Включить потоковую передачу .
Это действие включает потоковую передачу для всех связанных приложений.
Вы не видите данные в своей таблице реального времени?
Убедитесь, что вы отправили как минимум два события из своего приложения в Crashlytics и подождали пару минут после их отправки.
Убедитесь, что ваш проект Firebase включен в тарифный план Blaze с оплатой по мере использования.
Вы можете проверить это, посмотрев в левый нижний угол консоли Firebase .Если после отправки двух событий и ожидания пары минут в вашей таблице реального времени по-прежнему нет данных:
Перейдите на карточку BigQuery в консоли Firebase .
Отключите, а затем снова включите потоковый экспорт.
Убедитесь, что учетная запись службы
service- PROJECT_NUMBER @gcp-sa-crashlytics.iam.gserviceaccount.com
находится в вашем проекте Firebase и имеет роль агента службы Firebase Crashlytics .
Вы можете проверить это на странице IAM консоли Google Cloud (обязательно установите флажок Включить предоставленные Google роли ).Отправьте в Crashlytics как минимум два события и подождите пару минут.
Если вы по-прежнему не видите данные в таблице реального времени, обратитесь в службу поддержки Firebase .
Что можно делать с экспортированными данными?
Используйте шаблон Студии данных
Создание представлений
Запуск запросов
Пример 1: Сбои по дням
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;
Пример 2. Найдите наиболее распространенные сбои
Чтобы правильно расставить приоритеты в производственных планах, вам нужно найти 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;
Пример 3. 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;
Пример 4. Фильтрация по пользовательскому ключу
Вы разработчик игр и хотите знать, на каком уровне вашей игры происходит больше всего сбоев.
Чтобы отслеживать эту статистику, вы устанавливаете специальный ключ Crashlytics под названием current_level
и обновляете его каждый раз, когда пользователь достигает нового уровня.
Crashlytics.sharedInstance().setIntValue(3, forKey: "current_level");
CrashlyticsKit setIntValue:3 forKey:@"current_level";
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
Пример 5: извлечение идентификатора пользователя
У вас есть приложение для 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
Пример 6. Найдите всех пользователей, столкнувшихся с определенной проблемой сбоя.
Ваша команда случайно сообщила группе бета-тестеров о критической ошибке. Ваша команда смогла использовать запрос из приведенного выше примера «Найти наиболее распространенные сбои», чтобы определить конкретный идентификатор проблемы сбоя. Теперь ваша команда хотела бы выполнить запрос, чтобы получить список пользователей приложения, на которых повлиял этот сбой.
Ниже приведен пример запроса для приложения 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;
Пример 7. Количество пользователей, затронутых проблемой сбоя, с разбивкой по странам.
Ваша команда обнаружила критическую ошибку во время развертывания новой версии. Вы смогли использовать запрос из приведенного выше примера «Найти наиболее распространенные сбои», чтобы определить конкретный идентификатор проблемы сбоя. Теперь ваша команда хотела бы узнать, распространился ли этот сбой на пользователей в разных странах мира.
Чтобы написать этот запрос, вашей команде необходимо будет сделать следующее:
Включите экспорт данных Google Analytics в BigQuery . См. раздел Экспорт данных проекта в BigQuery .
Обновите свое приложение, чтобы передавать идентификатор пользователя как в Google Analytics SDK, так и в Crashlytics SDK.
Crashlytics.sharedInstance().setUserIdentifier("123456789"); Analytics.setUserID("123456789");
CrashlyticsKit setUserIdentifier:@"123456789"; FIRAnalytics setUserID:@"12345678 9";
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
Пример 8: 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;
Пример 9: 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 >= "YYYY_MM_DD " GROUP BY issue_id ORDER BY events DESC LIMIT 5;
Понимание схемы Crashlytics в BigQuery
Когда вы настраиваете экспорт данных Crashlytics в BigQuery , Firebase экспортирует последние события (сбои, нефатальные ошибки и ANR), включая события, произошедшие за два дня до установления связи, с возможностью обратного заполнения за период до 30 дней.
С этого момента и до тех пор, пока вы не отключите экспорт, Firebase экспортирует события Crashlytics ежедневно. После каждого экспорта данные могут появиться в BigQuery через несколько минут.
Наборы данных
Crashlytics создает новый набор данных в BigQuery для данных Crashlytics . Набор данных охватывает весь ваш проект, даже если в нем имеется несколько приложений.
Таблицы
Crashlytics создает таблицу в наборе данных для каждого приложения в вашем проекте, если вы не отключили экспорт данных для этого приложения. Firebase называет таблицы на основе идентификатора приложения, точки преобразуются в символы подчеркивания, а в конце добавляется имя платформы.
Например, данные для приложения Android с именем пакета com.google.test
будут находиться в таблице с именем com_google_test_ANDROID
, а данные в реальном времени (если они включены) будут в таблице с именем com_google_test_ANDROID_REALTIME
Таблицы содержат стандартный набор данных Crashlytics в дополнение к любым пользовательским ключам Crashlytics , определенным вами в вашем приложении.
Строки
Каждая строка в таблице представляет ошибку, с которой столкнулось приложение.
Столбцы
Столбцы в таблице идентичны для сбоев, нефатальных ошибок и ошибок ANR. Если включен потоковый экспорт Crashlytics в BigQuery , таблица реального времени будет иметь те же столбцы, что и пакетная таблица. Обратите внимание, что в строках могут быть столбцы, представляющие события, не имеющие трассировки стека.
Столбцы экспорта перечислены в этой таблице:
Имя поля | Тип данных | Описание |
---|---|---|
platform | НИТЬ | Платформа приложения, зарегистрированная в проекте Firebase (допустимые значения: IOS или ANDROID ). |
bundle_identifier | НИТЬ | Уникальный идентификатор приложения, зарегистрированный в проекте Firebase (например,com.google.gmail )Для приложений платформы Apple это идентификатор пакета приложения. Для приложений Android это имя пакета приложения. |
event_id | НИТЬ | Уникальный идентификатор мероприятия. |
is_fatal | БУЛЕВОЕ значение | |
error_type | НИТЬ | Тип ошибки события (например, FATAL , NON_FATAL , ANR и т. д.) |
issue_id | НИТЬ | Проблема, связанная с событием |
variant_id | НИТЬ | Вариант проблемы, связанный с этим событием Обратите внимание, что не со всеми событиями связан вариант проблемы. |
event_timestamp | ТАЙМ-МЕТКА | Когда произошло событие |
device | ЗАПИСЫВАТЬ | Устройство, на котором произошло событие |
device.manufacturer | НИТЬ | Производитель устройства |
device.model | НИТЬ | Модель устройства |
device.architecture | НИТЬ | Например, X86_32 , X86_64 , ARMV7 , ARM64 , ARMV7S или ARMV7K |
memory | ЗАПИСЫВАТЬ | Состояние памяти устройства |
memory.used | ИНТ64 | Использовано байт памяти |
memory.free | ИНТ64 | Осталось байт памяти |
storage | ЗАПИСЫВАТЬ | Постоянное хранилище устройства |
storage.used | ИНТ64 | Использовано байт памяти |
storage.free | ИНТ64 | Осталось места в байтах |
operating_system | ЗАПИСЫВАТЬ | Подробности об ОС на устройстве |
operating_system.display_version | НИТЬ | Версия ОС на устройстве |
operating_system.name | НИТЬ | Название ОС на устройстве |
operating_system.modification_state | НИТЬ | Было ли устройство модифицировано (например, приложение с джейлбрейком MODIFIED , а приложение с root-правами НЕ UNMODIFIED ) |
operating_system.type | НИТЬ | (Только приложения Apple) Тип ОС, установленной на устройстве (например, IOS , MACOS и т. д.). |
operating_system.device_type | НИТЬ | Тип устройства (например, MOBILE , TABLET , TV и т. д.); также известная как «категория устройства» |
application | ЗАПИСЫВАТЬ | Приложение, сгенерировавшее событие |
application.build_version | НИТЬ | Версия сборки приложения |
application.display_version | НИТЬ | |
user | ЗАПИСЫВАТЬ | (Необязательно) Собранная информация о пользователе приложения. |
user.name | НИТЬ | (Необязательно) Имя пользователя |
user.email | НИТЬ | (Необязательно) Адрес электронной почты пользователя. |
user.id | НИТЬ | (Необязательно) Идентификатор приложения, связанный с пользователем. |
custom_keys | ПОВТОРНАЯ ЗАПИСЬ | Определенные разработчиком пары ключ-значение |
custom_keys.key | НИТЬ | Ключ, определенный разработчиком |
custom_keys.value | НИТЬ | Значение, определенное разработчиком |
installation_uuid | НИТЬ | Идентификатор, идентифицирующий уникальную установку приложения и устройства. |
crashlytics_sdk_versions | НИТЬ | Версия Crashlytics SDK, сгенерировавшая событие. |
app_orientation | НИТЬ | Например, PORTRAIT , LANDSCAPE , FACE_UP , FACE_DOWN и т. д. |
device_orientation | НИТЬ | Например, PORTRAIT , LANDSCAPE , FACE_UP , FACE_DOWN и т. д. |
process_state | НИТЬ | BACKGROUND или FOREGROUND |
logs | ПОВТОРНАЯ ЗАПИСЬ | Сообщения журнала с отметкой времени, созданные регистратором Crashlytics , если он включен. |
logs.timestamp | ТАЙМ-МЕТКА | Когда был сделан журнал |
logs.message | НИТЬ | Зарегистрированное сообщение |
breadcrumbs | ПОВТОРНАЯ ЗАПИСЬ | Хлебные крошки Google Analytics с отметкой времени, если они включены. |
breadcrumbs.timestamp | ТАЙМ-МЕТКА | Временная метка, связанная с навигационной цепочкой |
breadcrumbs.name | НИТЬ | Имя, связанное с хлебными крошками |
breadcrumbs.params | ПОВТОРНАЯ ЗАПИСЬ | Параметры, связанные с навигационной цепочкой |
breadcrumbs.params.key | НИТЬ | Ключ параметра, связанный с навигационной цепочкой |
breadcrumbs.params.value | НИТЬ | Значение параметра, связанное с навигационной цепочкой. |
blame_frame | ЗАПИСЫВАТЬ | Кадр, определенный как основная причина сбоя или ошибки. |
blame_frame.line | ИНТ64 | Номер строки файла кадра |
blame_frame.file | НИТЬ | Имя файла кадра |
blame_frame.symbol | НИТЬ | Гидратированный символ или необработанный символ, если он не гидратируется. |
blame_frame.offset | ИНТ64 | Смещение байта в двоичном изображении, содержащем код. Не настроено для исключений Java |
blame_frame.address | ИНТ64 | Адрес в двоичном изображении, содержащем код Не установлено для фреймов Java |
blame_frame.library | НИТЬ | Отображаемое имя библиотеки, включающей фрейм. |
blame_frame.owner | НИТЬ | Например, DEVELOPER , VENDOR , RUNTIME , PLATFORM или SYSTEM |
blame_frame.blamed | БУЛЕВОЕ значение | Определил ли Crashlytics , что этот кадр является причиной сбоя или ошибки |
exceptions | ПОВТОРНАЯ ЗАПИСЬ | (Только для Android) Исключения, возникшие во время этого события. Вложенные исключения представлены в обратном хронологическом порядке, что означает, что последняя запись является первым возникшим исключением. |
exceptions.type | НИТЬ | Тип исключения (например,java.lang.IllegalStateException) |
exceptions.exception_message | НИТЬ | Сообщение, связанное с исключением |
exceptions.nested | БУЛЕВОЕ значение | Истинно для всех исключений, кроме последнего (имеется в виду первая запись). |
exceptions.title | НИТЬ | Название темы |
exceptions.subtitle | НИТЬ | Подзаголовок темы |
exceptions.blamed | БУЛЕВОЕ значение | Истинно, если Crashlytics определяет, что исключение является причиной ошибки или сбоя. |
exceptions.frames | ПОВТОРНАЯ ЗАПИСЬ | Кадры, связанные с исключением |
exceptions.frames.line | ИНТ64 | Номер строки файла кадра |
exceptions.frames.file | НИТЬ | Имя файла кадра |
exceptions.frames.symbol | НИТЬ | Гидратированный символ или необработанный символ, если он не гидратируется. |
exceptions.frames.offset | ИНТ64 | Смещение байта в двоичном изображении, содержащем код. Не настроено для исключений Java |
exceptions.frames.address | ИНТ64 | Адрес в двоичном изображении, содержащем код Не установлено для фреймов Java |
exceptions.frames.library | НИТЬ | Отображаемое имя библиотеки, включающей фрейм. |
exceptions.frames.owner | НИТЬ | Например, DEVELOPER , VENDOR , RUNTIME , PLATFORM или SYSTEM |
exceptions.frames.blamed | БУЛЕВОЕ значение | Определил ли Crashlytics , что этот кадр является причиной сбоя или ошибки |
error | ПОВТОРНАЯ ЗАПИСЬ | (Только приложения Apple) Нефатальные ошибки |
error.queue_name | НИТЬ | Очередь, в которой выполнялся поток |
error.code | ИНТ64 | Код ошибки, связанный с зарегистрированной в приложении NSError. |
error.title | НИТЬ | Название темы |
error.subtitle | НИТЬ | Подзаголовок темы |
error.blamed | БУЛЕВОЕ значение | Определил ли Crashlytics , что именно этот кадр является причиной ошибки |
error.frames | ПОВТОРНАЯ ЗАПИСЬ | Кадры трассировки стека |
error.frames.line | ИНТ64 | Номер строки файла кадра |
error.frames.file | НИТЬ | Имя файла кадра |
error.frames.symbol | НИТЬ | Гидратированный символ или необработанный символ, если он не гидратируется. |
error.frames.offset | ИНТ64 | Смещение байта в двоичном изображении, содержащем код. |
error.frames.address | ИНТ64 | Адрес в двоичном изображении, содержащем код |
error.frames.library | НИТЬ | Отображаемое имя библиотеки, включающей фрейм. |
error.frames.owner | НИТЬ | Например, DEVELOPER , VENDOR , RUNTIME , PLATFORM или SYSTEM |
error.frames.blamed | БУЛЕВОЕ значение | Определил ли Crashlytics , что именно этот кадр является причиной ошибки |
threads | ПОВТОРНАЯ ЗАПИСЬ | Темы, присутствующие на момент события |
threads.crashed | БУЛЕВОЕ значение | Разбился ли поток |
threads.thread_name | НИТЬ | Название темы |
threads.queue_name | НИТЬ | (Только для приложений Apple) Очередь, в которой выполнялся поток |
threads.signal_name | НИТЬ | Имя сигнала, вызвавшего сбой приложения, присутствует только в сбойных собственных потоках. |
threads.signal_code | НИТЬ | Код сигнала, вызвавшего сбой приложения; присутствует только в поврежденных собственных потоках |
threads.crash_address | ИНТ64 | Адрес сигнала, вызвавшего сбой приложения; присутствует только в поврежденных собственных потоках |
threads.code | ИНТ64 | (Только для приложений Apple) Код ошибки пользовательского журнала NSError приложения. |
threads.title | НИТЬ | Название темы |
threads.subtitle | НИТЬ | Подзаголовок темы |
threads.blamed | БУЛЕВОЕ значение | Определил ли Crashlytics , что этот кадр является причиной сбоя или ошибки |
threads.frames | ПОВТОРНАЯ ЗАПИСЬ | Кадры из нити |
threads.frames.line | ИНТ64 | Номер строки файла кадра |
threads.frames.file | НИТЬ | Имя файла кадра |
threads.frames.symbol | НИТЬ | Гидратированный символ или необработанный символ, если он не гидратируется. |
threads.frames.offset | ИНТ64 | Смещение байта в двоичном изображении, содержащем код. |
threads.frames.address | ИНТ64 | Адрес в двоичном изображении, содержащем код |
threads.frames.library | НИТЬ | Отображаемое имя библиотеки, включающей фрейм. |
threads.frames.owner | НИТЬ | Например, DEVELOPER , VENDOR , RUNTIME , PLATFORM или SYSTEM |
threads.frames.blamed | БУЛЕВОЕ значение | Определил ли Crashlytics , что именно этот кадр является причиной ошибки |
unity_metadata.unity_version | НИТЬ | Версия Unity, работающая на этом устройстве. |
unity_metadata.debug_build | БУЛЕВОЕ значение | Если это отладочная сборка |
unity_metadata.processor_type | НИТЬ | Тип процессора |
unity_metadata.processor_count | ИНТ64 | Количество процессоров (ядер) |
unity_metadata.processor_frequency_mhz | ИНТ64 | Частота процессора(ов) в МГц |
unity_metadata.system_memory_size_mb | ИНТ64 | Размер системной памяти в Мб |
unity_metadata.graphics_memory_size_mb | ИНТ64 | Графическая память в МБ |
unity_metadata.graphics_device_id | ИНТ64 | Идентификатор графического устройства |
unity_metadata.graphics_device_vendor_id | ИНТ64 | Идентификатор производителя графического процессора |
unity_metadata.graphics_device_name | НИТЬ | Имя графического устройства |
unity_metadata.graphics_device_vendor | НИТЬ | Поставщик графического устройства |
unity_metadata.graphics_device_version | НИТЬ | Версия графического устройства |
unity_metadata.graphics_device_type | НИТЬ | Тип графического устройства |
unity_metadata.graphics_shader_level | ИНТ64 | Уровень шейдеров графики |
unity_metadata.graphics_render_target_count | ИНТ64 | Количество целей графического рендеринга |
unity_metadata.graphics_copy_texture_support | НИТЬ | Поддержка копирования графической текстуры, как определено в Unity API. |
unity_metadata.graphics_max_texture_size | ИНТ64 | Максимальный размер, предназначенный для рендеринга текстуры |
unity_metadata.screen_size_px | НИТЬ | Размер экрана в пикселях в формате ширина х высота. |
unity_metadata.screen_resolution_dpi | НИТЬ | DPI экрана как число с плавающей запятой |
unity_metadata.screen_refresh_rate_hz | ИНТ64 | Частота обновления экрана в Гц |
Визуализация экспортированных данных Crashlytics с помощью Data Studio
Google Data Studio превращает ваши наборы данных Crashlytics в BigQuery в отчеты, которые легче читать, которыми легче делиться и которые полностью настраиваемы.
Чтобы узнать больше об использовании Data Studio, ознакомьтесь с кратким руководством по Data Studio Добро пожаловать в Data Studio .
Используйте шаблон отчета Crashlytics
В Data Studio есть образец отчета для Crashlytics , который включает полный набор параметров и показателей из экспортированной схемы Crashlytics BigQuery . Если вы включили потоковый экспорт Crashlytics в BigQuery , вы можете просмотреть эти данные на странице тенденций в реальном времени шаблона Data Studio. Вы можете использовать образец в качестве шаблона для быстрого создания новых отчетов и визуализаций на основе необработанных данных о сбоях вашего собственного приложения:
Нажмите «Использовать шаблон» в правом верхнем углу.
В раскрывающемся списке «Новый источник данных» выберите «Создать новый источник данных» .
Нажмите «Выбрать» на карточке BigQuery .
Выберите таблицу, содержащую экспортированные данные Crashlytics , выбрав Мои проекты > PROJECT_ID > firebase_crashlytics > TABLE_NAME .
Ваш пакетный стол всегда доступен для выбора. Если включен экспорт потоковой передачи Crashlytics в BigQuery , вместо этого вы можете выбрать таблицу реального времени.
В разделе «Конфигурация» установите для уровня шаблона Crashlytics значение «По умолчанию» .
Нажмите «Подключиться» , чтобы создать новый источник данных.
Нажмите «Добавить в отчет» , чтобы вернуться к шаблону Crashlytics .
Наконец, нажмите «Создать отчет» , чтобы создать копию шаблона панели инструментов Crashlytics Data Studio.
Переход на новую экспортную инфраструктуру
В середине октября 2024 года Crashlytics запустила новую инфраструктуру для экспорта данных Crashlytics в BigQuery . На данный момент обновление до этой новой инфраструктуры не является обязательным.
Эта новая инфраструктура поддерживает местоположения наборов данных Crashlytics за пределами США.
Если вы включили экспорт до середины октября 2024 года, теперь вы можете при желании изменить местоположение для экспорта данных на любое местоположение набора данных, поддерживаемое BigQuery .
Если вы включили экспорт в середине октября 2024 года или позднее, во время настройки вы можете выбрать любое расположение набора данных, поддерживаемое BigQuery .
Еще одно отличие новой инфраструктуры заключается в том, что она не поддерживает заполнение данных, существовавших до включения экспорта. (В старой инфраструктуре вы могли выполнить заполнение за 30 дней до даты включения.) Новая инфраструктура поддерживает заполнение за последние 30 дней или за самую последнюю дату, когда вы включили экспорт в BigQuery (в зависимости от того, что наступит позже).
Обязательное условие для обновления
Прежде чем переходить на новую инфраструктуру, убедитесь, что вы соответствуете следующим предварительным требованиям: ваши текущие пакетные таблицы BigQuery имеют идентификаторы, соответствующие идентификаторам пакетов или именам пакетов, установленным для ваших зарегистрированных приложений Firebase.
Например:
Если у вас есть таблица BigQuery с именем
com_yourcompany_yourproject_IOS
, то в вашем проекте Firebase должно быть зарегистрировано приложение Firebase iOS+ с идентификатором пакетаcom.yourcompany.yourproject
.Если у вас есть таблица BigQuery с именем
com_yourcompany_yourproject_ANDROID
, то в вашем проекте Firebase должно быть зарегистрировано Android-приложение Firebase с именем пакетаcom.yourcompany.yourproject
.
Вот как найти все приложения Firebase, зарегистрированные в вашем проекте Firebase:
В консоли Firebase перейдите в Project Settings .
Прокрутите вниз до карточки «Ваши приложения» , затем нажмите нужное приложение Firebase, чтобы просмотреть информацию о приложении, включая его идентификатор.
Новая инфраструктура экспорта будет экспортировать данные каждого приложения на основе имени пакета или идентификатора пакета, установленного для зарегистрированного приложения Firebase. Чтобы не нарушать рабочий процесс BigQuery , важно убедиться, что текущие пакетные таблицы уже имеют правильные имена, чтобы новая инфраструктура могла добавлять все новые данные в существующие таблицы. Если у вас есть имена пакетных таблиц, которые не соответствуют зарегистрированным приложениям Firebase, но вы все равно хотите выполнить обновление, обратитесь в службу поддержки Firebase .
Как перейти на новую инфраструктуру
Если вы уже включили экспорт, вы можете перейти на новую инфраструктуру, просто выключив и снова включив экспорт данных Crashlytics в консоли Firebase .
Вот подробные шаги:
В консоли Firebase перейдите на страницу «Интеграции» .
На карточке BigQuery нажмите «Управление» .
Отключите ползунок Crashlytics , чтобы отключить экспорт. При появлении запроса подтвердите, что вы хотите остановить экспорт данных.
Немедленно снова включите ползунок Crashlytics , чтобы снова включить экспорт. При появлении запроса подтвердите, что вы хотите экспортировать данные.
Для экспорта данных Crashlytics в BigQuery теперь используется новая инфраструктура экспорта.
Вы можете экспортировать данные Firebase Crashlytics в BigQuery для дальнейшего анализа. BigQuery позволяет анализировать данные с помощью BigQuery SQL, экспортировать их в другой облачный провайдер и использовать для визуализации и создания пользовательских информационных панелей с помощью Google Data Studio.
Включить экспорт в BigQuery
В консоли Firebase перейдите на страницу «Интеграции» .
На карточке BigQuery нажмите «Ссылка» .
Следуйте инструкциям на экране, чтобы включить экспорт в BigQuery .
Если вам нужен доступ к данным Crashlytics в BigQuery практически в реальном времени, рассмотрите возможность перехода на потоковый экспорт .
Что произойдет, если вы включите экспорт?
Вы выбираете местоположение набора данных. После создания набора данных его местоположение невозможно изменить, но вы можете скопировать набор данных в другое место или вручную переместить (воссоздать) набор данных в другом месте. Дополнительные сведения см. в разделе Изменение местоположения существующих экспортированных файлов .
Это расположение применимо только для данных, экспортированных в BigQuery , и не влияет на расположение данных, хранящихся для использования на панели управления Crashlytics консоли Firebase или в Android Studio.
По умолчанию все приложения в вашем проекте связаны с BigQuery , и все приложения, которые вы позже добавите в проект, автоматически связываются с BigQuery . Вы можете управлять тем, какие приложения отправляют данные .
Firebase настраивает ежедневную синхронизацию ваших данных с BigQuery .
После связывания проекта вам обычно нужно дождаться синхронизации на следующий день, чтобы первый набор данных был экспортирован в BigQuery .
Ежедневная синхронизация происходит один раз в день, независимо от запланированного экспорта, который вы могли настроить в BigQuery . Обратите внимание, что время и продолжительность задания синхронизации могут измениться, поэтому мы не рекомендуем планировать последующие операции или задания на основе определенного времени экспорта.
Firebase экспортирует копию существующих данных в BigQuery . Первоначальное распространение данных для экспорта может занять до 48 часов.
Для каждого связанного приложения этот экспорт включает пакетную таблицу, содержащую данные ежедневной синхронизации.
Вы можете вручную запланировать заполнение данных для пакетной таблицы за последние 30 дней или до самой последней даты, когда вы включили экспорт в BigQuery (в зависимости от того, что наступит позже).
Обратите внимание: если вы включили экспорт данных Crashlytics до середины октября 2024 года, вы также можете выполнить обратное заполнение за 30 дней до дня включения экспорта.
Если вы включите экспорт потоковой передачи Crashlytics в BigQuery , все связанные приложения также будут иметь таблицу в реальном времени, содержащую постоянно обновляемые данные.
Чтобы деактивировать экспорт в BigQuery , отсоедините свой проект в консоли Firebase .
Какие данные экспортируются в BigQuery ?
Данные Firebase Crashlytics экспортируются в набор данных BigQuery с именем firebase_crashlytics
. По умолчанию внутри набора данных Crashlytics будут созданы отдельные таблицы для каждого приложения в вашем проекте. Firebase называет таблицы на основе идентификатора приложения, точки преобразуются в символы подчеркивания, а в конце добавляется имя платформы.
Например, данные для приложения Android с именем пакета com.google.test
будут находиться в таблице с именем com_google_test_ANDROID
. Эта пакетная таблица обновляется один раз в день. Если вы включите потоковый экспорт Crashlytics в BigQuery , данные Crashlytics также будут передаваться в режиме реального времени в таблицу с именем com_google_test_ANDROID_REALTIME
.
Каждая строка в таблице представляет событие, произошедшее в приложении, включая сбои, нефатальные ошибки и ошибки ANR.
Экспорт потоковой передачи Crashlytics в BigQuery
Вы можете осуществлять потоковую передачу данных Crashlytics в режиме реального времени с помощью потоковой передачи BigQuery . Вы можете использовать его для любых целей, требующих оперативных данных, например для представления информации на интерактивной информационной панели, просмотра развертывания в реальном времени или мониторинга проблем приложений, которые вызывают оповещения и настраиваемые рабочие процессы.
Когда вы включаете потоковый экспорт Crashlytics в BigQuery , помимо пакетной таблицы у вас также будет таблица реального времени. Вот различия, о которых вам следует знать между таблицами:
Таблица партий | Таблица реального времени |
---|---|
|
|
Пакетная таблица идеально подходит для долгосрочного анализа и выявления тенденций с течением времени, поскольку мы надежно сохраняем события перед их записью, и их можно повторно заполнить в таблице на срок до 30 дней*. Когда мы записываем данные в вашу таблицу реального времени, мы немедленно записываем их в BigQuery , поэтому они идеально подходят для интерактивных информационных панелей и пользовательских оповещений. Эти две таблицы можно объединить с запросом на сшивание, чтобы получить преимущества обеих.
По умолчанию срок действия раздела таблицы реального времени составляет 30 дней. Чтобы узнать, как это изменить, см. раздел «Установка срока действия раздела» в документации BigQuery .
* Подробности о поддержке обратной засыпки см. в разделе Обновление до новой экспортной инфраструктуры .
Включить экспорт потоковой передачи Crashlytics в BigQuery
В консоли Firebase перейдите на страницу «Интеграции» .
На карточке BigQuery нажмите «Управление» .
Установите флажок Включить потоковую передачу .
Это действие включает потоковую передачу для всех связанных приложений.
Вы не видите данные в своей таблице реального времени?
Убедитесь, что вы отправили как минимум два события из своего приложения в Crashlytics и подождали пару минут после их отправки.
Убедитесь, что ваш проект Firebase включен в тарифный план Blaze с оплатой по мере использования.
Вы можете проверить это, посмотрев в левый нижний угол консоли Firebase .Если после отправки двух событий и ожидания пары минут в вашей таблице реального времени по-прежнему нет данных:
Перейдите на карту BigQuery в консоли Firebase .
Отключить, а затем повторно включить потоковой экспорт.
Убедитесь, что учетная запись обслуживания service- PROJECT_NUMBER @gcp-sa-crashlytics.iam.gserviceaccount.com
находится в вашем проекте Firebase и играет роль агента Firebase Crashlytics .
Вы можете проверить это на странице IAM на консоли Google Cloud Console (обязательно выберите флажок для включения ролевых грантов Google ).Отправьте как минимум два события на Crashlytics и подождите пару минут.
Если вы все еще не видите данные в своей таблице в реальном времени, обратитесь к поддержке Firebase .
Что вы можете сделать с экспортируемыми данными?
Используйте шаблон студии данных
Создайте представления
Запустить запросы
Пример 1: сбои днем
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;
Пример 2: Найдите самые распространенные аварии
Чтобы правильно расставить приоритеты в производственных планах, вы хотите найти 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;
Пример 3: Топ -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;
Пример 4: Фильтр от пользовательского ключа
Вы разработчик игр, который хочет знать, какой уровень вашей игры испытывает большинство сбоев.
Чтобы помочь отслеживать этот стат, вы устанавливаете пользовательский ключ Crashlytics под названием current_level
и обновлять его каждый раз, когда пользователь достигает нового уровня.
Crashlytics.sharedInstance().setIntValue(3, forKey: "current_level");
CrashlyticsKit setIntValue:3 forKey:@"current_level";
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
Пример 5: Извлечение идентификатора пользователя
У вас есть приложение для 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
Пример 6: Найдите всех пользователей, сталкивающихся с конкретной проблемой сбоя
Ваша команда случайно выпустила критическую ошибку для группы бета -тестеров. Ваша команда смогла использовать пример «Найти большинство распространенных сбоев» выше, чтобы определить конкретный идентификатор проблемы с аварией. Теперь ваша команда хотела бы запустить запрос, чтобы извлечь список пользователей приложений, которые повлияли на этот аварий.
Вот пример запроса для приложения 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;
Пример 7: Количество пользователей, пострадавших от проблемы с аварией, разбитая страной
Ваша команда обнаружила критическую ошибку во время развертывания нового релиза. Вы смогли использовать запрос из примера «Найти большинство распространенных сбоев» выше, чтобы определить конкретный идентификатор проблемы с аварией. Теперь ваша команда хотела бы посмотреть, распространилась ли эта авария на пользователей в разных странах мира.
Чтобы написать этот запрос, вашей команде нужно будет сделать следующее:
Включить экспорт данных Google Analytics в BigQuery . Смотрите данные экспорта проекта в BigQuery .
Обновите свое приложение, чтобы передать идентификатор пользователя как в Google Analytics SDK, так и в Crashlytics SDK.
Crashlytics.sharedInstance().setUserIdentifier("123456789"); Analytics.setUserID("123456789");
CrashlyticsKit setUserIdentifier:@"123456789"; FIRAnalytics setUserID:@"12345678 9";
Crashlytics.setUserIdentifier("123456789"); mFirebaseAnalytics.setUserId("123456789");
Напишите запрос, который использует поле идентификатора пользователя, чтобы присоединиться к событиям в наборе данных Google Analytics с Crashes в наборе данных 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
Пример 8: 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;
Пример 9: 5 лучших выпусков с даты, в том числе сегодня
Вы также можете объединить пакетные и таблицы в реальном времени с помощью запроса сшивания, чтобы добавить информацию в реальном времени к надежным данным партии. Поскольку 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 >= "YYYY_MM_DD " GROUP BY issue_id ORDER BY events DESC LIMIT 5;
Понять схему Crashlytics в BigQuery
Когда вы настраиваете экспорт данных Crashlytics в BigQuery , Firebase экспортирует последние события (сбои, нефильные ошибки и ANR), включая события за два дня до ссылки, с возможностью обратной засыпки до 30 дней.
С этого момента, пока вы не отключите экспорт, ежедневно экспортируется Crashlytics Firebase. Для каждого экспорта может потребоваться несколько минут, чтобы данные были доступны в BigQuery .
Наборы данных
Crashlytics создает новый набор данных в BigQuery для данных Crashlytics . Набор данных охватывает весь ваш проект, даже если он имеет несколько приложений.
Таблицы
Crashlytics создает таблицу в наборе данных для каждого приложения в вашем проекте, если только вы не выбрали экспорт данных для этого приложения. Firebase называет таблицы на основе идентификатора приложения, с периодами, преобразованными в подчеркивание, и имя платформы добавлено к концу.
Например, данные для приложения Android с именем пакета com.google.test
будут в таблице с именем com_google_test_ANDROID
, а данные в реальном времени (если включены) будут в таблице с именем com_google_test_ANDROID_REALTIME
Таблицы содержат стандартный набор данных Crashlytics в дополнение к любым пользовательским клавишам Crashlytics , определенными вами в вашем приложении.
Строки
Каждая строка в таблице представляет ошибку, с которой столкнулось приложение.
Столбцы
Столбцы в таблице идентичны для сбоев, не жидких ошибок и ANR. Если включен экспорт потоковой передачи Crashlytics в BigQuery , то таблица в реальном времени будет иметь те же столбцы, что и таблица партии. Обратите внимание, что у вас могут быть столбцы в рядах, которые представляют события, которые не имеют трассий.
Столбцы в экспорте перечислены в этой таблице:
Имя поля | Тип данных | Описание |
---|---|---|
platform | НИТЬ | Платформа приложения, зарегистрированная в проекте Firebase (Допустимые значения: IOS или ANDROID ) |
bundle_identifier | НИТЬ | Уникальный идентификатор для приложения, зарегистрированного в проекте Firebase (например,com.google.gmail )Для приложений Apple Platform это идентификатор пакета приложения. Для приложений Android это имя пакета приложения. |
event_id | НИТЬ | Уникальный идентификатор для мероприятия |
is_fatal | БУЛЕВОЕ значение | |
error_type | НИТЬ | Тип ошибки события (например, FATAL , NON_FATAL , ANR и т. Д.) |
issue_id | НИТЬ | Проблема, связанная с событием |
variant_id | НИТЬ | Вариант проблемы, связанный с этим событием Обратите внимание, что не все события имеют соответствующий вариант проблемы. |
event_timestamp | ТАЙМ-МЕТКА | Когда произошло событие |
device | ЗАПИСЫВАТЬ | Устройство, на котором произошло событие |
device.manufacturer | НИТЬ | Производитель устройства |
device.model | НИТЬ | Модель устройства |
device.architecture | НИТЬ | Например, X86_32 , X86_64 , ARMV7 , ARM64 , ARMV7S или ARMV7K |
memory | ЗАПИСЫВАТЬ | Состояние памяти устройства |
memory.used | Int64 | Байты памяти используются |
memory.free | Int64 | Оставшиеся байты памяти |
storage | ЗАПИСЫВАТЬ | Постоянное хранилище устройства |
storage.used | Int64 | Используемые байты хранения |
storage.free | Int64 | Оставшиеся байты хранения |
operating_system | ЗАПИСЫВАТЬ | Детали ОС на устройстве |
operating_system.display_version | НИТЬ | Версия ОС на устройстве |
operating_system.name | НИТЬ | Название ОС на устройстве |
operating_system.modification_state | НИТЬ | Было ли устройство изменено (например, приложение с джейлбрандом MODIFIED , и укодимое приложение UNMODIFIED ) |
operating_system.type | НИТЬ | (Только приложения Apple) Тип ОС, работающей на устройстве (например, IOS , MACOS и т. Д.) |
operating_system.device_type | НИТЬ | Тип устройства (например, MOBILE , TABLET , TV и т. Д.); Также известен как «категория устройств» |
application | ЗАПИСЫВАТЬ | Приложение, которое сгенерировало событие |
application.build_version | НИТЬ | Версия сборки приложения |
application.display_version | НИТЬ | |
user | ЗАПИСЫВАТЬ | (Необязательно) Информация, собранная о пользователе приложения |
user.name | НИТЬ | (Необязательно) Имя пользователя |
user.email | НИТЬ | (Необязательно) Адрес электронной почты пользователя |
user.id | НИТЬ | (Необязательно) идентификатор, специфичный для приложения, связанный с пользователем |
custom_keys | Повторная запись | Разработчики, определенные пары ключей |
custom_keys.key | НИТЬ | Определенный разработчиком ключ |
custom_keys.value | НИТЬ | Значение разработчика |
installation_uuid | НИТЬ | Идентификатор, который идентифицирует уникальную установку приложения и устройства |
crashlytics_sdk_versions | НИТЬ | Версия Crashlytics SDK, которая сгенерировала событие |
app_orientation | НИТЬ | Например, PORTRAIT , LANDSCAPE , FACE_UP , FACE_DOWN и т. Д. |
device_orientation | НИТЬ | Например, PORTRAIT , LANDSCAPE , FACE_UP , FACE_DOWN и т. Д. |
process_state | НИТЬ | BACKGROUND или FOREGROUND |
logs | Повторная запись | Сообщения журнала TimeStected, сгенерированные журналом Crashlytics , если включено |
logs.timestamp | ТАЙМ-МЕТКА | Когда журнал был сделан |
logs.message | НИТЬ | Зарегистрированное сообщение |
breadcrumbs | Повторная запись | TimeStemed Google Analytics Shuthcrumbs , если включено |
breadcrumbs.timestamp | ТАЙМ-МЕТКА | Временная метка, связанная с хлебной крошкой |
breadcrumbs.name | НИТЬ | Название, связанное с хлебной крошкой |
breadcrumbs.params | Повторная запись | Параметры, связанные с хлебной крошкой |
breadcrumbs.params.key | НИТЬ | Ключ параметра, связанный с хлебной крошкой |
breadcrumbs.params.value | НИТЬ | Значение параметра, связанное с хлебной крошкой |
blame_frame | ЗАПИСЫВАТЬ | Кадра, идентифицированная как основная причина сбоя или ошибки |
blame_frame.line | Int64 | Номер строки файла кадра |
blame_frame.file | НИТЬ | Имя файла кадра |
blame_frame.symbol | НИТЬ | Гидратированный символ, или сырой символ, если он невырожденный |
blame_frame.offset | Int64 | Смещение байта в двоичное изображение, которое содержит код Необходимо для исключений Java |
blame_frame.address | Int64 | Адрес в двоичном изображении, который содержит код Неоткрывать для рамки Java |
blame_frame.library | НИТЬ | Отображаемое имя библиотеки, которая включает в себя кадр |
blame_frame.owner | НИТЬ | Например, DEVELOPER , VENDOR , RUNTIME , PLATFORM или SYSTEM |
blame_frame.blamed | БУЛЕВОЕ значение | Определили ли Crashlytics , что этот кадр является причиной сбоя или ошибки |
exceptions | Повторная запись | (Только для Android) исключения, которые произошли во время этого события. Вложенные исключения представлены в обратном хронологическом порядке, что означает, что последняя запись является первым исключением |
exceptions.type | НИТЬ | Тип исключения (например,,java.lang.IllegalStateException) |
exceptions.exception_message | НИТЬ | Сообщение, связанное с исключением |
exceptions.nested | БУЛЕВОЕ значение | Верно для всех, кроме последнего исключения (что означает первая запись) |
exceptions.title | НИТЬ | Название ветки |
exceptions.subtitle | НИТЬ | Субтитры нити |
exceptions.blamed | БУЛЕВОЕ значение | True, если Crashlytics определяет, что исключение отвечает за ошибку или сбой |
exceptions.frames | Повторная запись | Рамки, связанные с исключением |
exceptions.frames.line | Int64 | Номер строки файла кадра |
exceptions.frames.file | НИТЬ | Имя файла кадра |
exceptions.frames.symbol | НИТЬ | Гидратированный символ, или сырой символ, если он невырожденный |
exceptions.frames.offset | Int64 | Смещение байта в двоичное изображение, которое содержит код Необходимо для исключений Java |
exceptions.frames.address | Int64 | Адрес в двоичном изображении, который содержит код Неоткрывать для рамки Java |
exceptions.frames.library | НИТЬ | Отображаемое имя библиотеки, которая включает в себя кадр |
exceptions.frames.owner | НИТЬ | Например, DEVELOPER , VENDOR , RUNTIME , PLATFORM или SYSTEM |
exceptions.frames.blamed | БУЛЕВОЕ значение | Определили ли Crashlytics , что этот кадр является причиной сбоя или ошибки |
error | Повторная запись | (Только приложения Apple) Неурозненные ошибки |
error.queue_name | НИТЬ | Очередь, на которой работала нить |
error.code | Int64 | Код ошибки, связанный с пользовательским зарегистрированным NSERROR приложения |
error.title | НИТЬ | Название ветки |
error.subtitle | НИТЬ | Субтитры нити |
error.blamed | БУЛЕВОЕ значение | Определили ли Crashlytics , что этот кадр является причиной ошибки |
error.frames | Повторная запись | Рамы StackTrace |
error.frames.line | Int64 | Номер строки файла кадра |
error.frames.file | НИТЬ | Имя файла кадра |
error.frames.symbol | НИТЬ | Гидратированный символ, или сырой символ, если он невырожденный |
error.frames.offset | Int64 | Смещение байта в двоичное изображение, которое содержит код |
error.frames.address | Int64 | Адрес в двоичном изображении, который содержит код |
error.frames.library | НИТЬ | Отображаемое имя библиотеки, которая включает в себя кадр |
error.frames.owner | НИТЬ | Например, DEVELOPER , VENDOR , RUNTIME , PLATFORM или SYSTEM |
error.frames.blamed | БУЛЕВОЕ значение | Определили ли Crashlytics , что этот кадр является причиной ошибки |
threads | Повторная запись | Потоки присутствуют во время мероприятия |
threads.crashed | БУЛЕВОЕ значение | Разбилась ли нить |
threads.thread_name | НИТЬ | Имя ветки |
threads.queue_name | НИТЬ | (Только приложения Apple) очередь, на которой работала поток |
threads.signal_name | НИТЬ | Название сигнала, которое заставило приложение сбой, присутствует только на разбитых местных потоках |
threads.signal_code | НИТЬ | Код сигнала, который заставил приложение сбой; присутствует только в разбитых местных нитях |
threads.crash_address | Int64 | Адрес сигнала, который заставил приложение сбой; присутствует только в разбитых местных нитях |
threads.code | Int64 | (Только приложения Apple) Код ошибки пользовательского регистрационного приложения. |
threads.title | НИТЬ | Название ветки |
threads.subtitle | НИТЬ | Субтитры нити |
threads.blamed | БУЛЕВОЕ значение | Определили ли Crashlytics , что этот кадр является причиной сбоя или ошибки |
threads.frames | Повторная запись | Рамы нити |
threads.frames.line | Int64 | Номер строки файла кадра |
threads.frames.file | НИТЬ | Имя файла кадра |
threads.frames.symbol | НИТЬ | Гидратированный символ или сырой символ, если он невы |
threads.frames.offset | Int64 | Смещение байта в двоичное изображение, которое содержит код |
threads.frames.address | Int64 | Адрес в двоичном изображении, который содержит код |
threads.frames.library | НИТЬ | Отображаемое имя библиотеки, которая включает в себя кадр |
threads.frames.owner | НИТЬ | Например, DEVELOPER , VENDOR , RUNTIME , PLATFORM или SYSTEM |
threads.frames.blamed | БУЛЕВОЕ значение | Определили ли Crashlytics , что этот кадр является причиной ошибки |
unity_metadata.unity_version | НИТЬ | Версия Unity работает на этом устройстве |
unity_metadata.debug_build | БУЛЕВОЕ значение | Если это сборка отладки |
unity_metadata.processor_type | НИТЬ | Тип процессора |
unity_metadata.processor_count | Int64 | Количество процессоров (ядер) |
unity_metadata.processor_frequency_mhz | Int64 | Частота процессора (ы) в МГц |
unity_metadata.system_memory_size_mb | Int64 | Размер памяти системы в МБ |
unity_metadata.graphics_memory_size_mb | Int64 | Графическая память в МБ |
unity_metadata.graphics_device_id | Int64 | Идентификатор графического устройства |
unity_metadata.graphics_device_vendor_id | Int64 | Идентификатор поставщика графического процессора |
unity_metadata.graphics_device_name | НИТЬ | Название графического устройства |
unity_metadata.graphics_device_vendor | НИТЬ | Поставщик графического устройства |
unity_metadata.graphics_device_version | НИТЬ | Версия графического устройства |
unity_metadata.graphics_device_type | НИТЬ | Тип графического устройства |
unity_metadata.graphics_shader_level | Int64 | Уровень шейдера графики |
unity_metadata.graphics_render_target_count | Int64 | Количество целей графического рендеринга |
unity_metadata.graphics_copy_texture_support | НИТЬ | Поддержка копирования графики текстуры, как определено в Unity API |
unity_metadata.graphics_max_texture_size | Int64 | Максимальный размер, посвященный текстуре рендеринга |
unity_metadata.screen_size_px | НИТЬ | Размер экрана в пикселях, отформатированный как ширина x высота |
unity_metadata.screen_resolution_dpi | НИТЬ | DPI экрана в виде номера плавающей запятой |
unity_metadata.screen_refresh_rate_hz | Int64 | Скорость обновления экрана в Гц |
Визуализировать экспортируемые данные Crashlytics с Data Studio
Google Data Studio превращает ваши наборы данных Crashlytics в BigQuery в отчеты, которые легче читать, легче обмениваться и полностью настраиваться.
Чтобы узнать больше об использовании Data Studio, попробуйте руководство QuickStart Data Studio, добро пожаловать в Data Studio .
Используйте шаблон отчета о Crashlytics
Data Studio имеет образец отчета о Crashlytics , который включает в себя комплексный набор измерений и показателей из экспортированной схемы BigQuery Crashlytics . Если вы включили экспорт потоковой передачи Crashlytics в BigQuery , вы можете просмотреть данные на странице Trends Trends в шаблоне студии Data. Вы можете использовать выборку в качестве шаблона для быстрого создания новых отчетов и визуализаций на основе необработанных данных вашего приложения:
Откройте шаблон мониторинга Data Studio Crashlytics .
Нажмите «Использовать шаблон» в верхнем правом углу.
В выброшении нового источника данных выберите «Создать новый источник данных» .
Нажмите выберите на карте BigQuery .
Выберите таблицу, содержащую экспортируемые данные Crashlytics , выбирая мои проекты> PROJECT_ID > firebase_crashlytics> TABLE_NAME .
Ваша пакетная таблица всегда доступна для выбора. Если включен экспорт потоковой передачи Crashlytics в BigQuery , то вместо этого вы можете выбрать свою таблицу в реальном времени.
Под конфигурацией установите уровень шаблона Crashlytics по умолчанию .
Нажмите «Подключиться» , чтобы создать новый источник данных.
Нажмите «Добавить», чтобы сообщить , чтобы вернуться в шаблон Crashlytics .
Наконец, нажмите «Создать отчет» , чтобы создать свою копию шаблона Data Studio Crashlytics Studio.
Обновление до новой экспортной инфраструктуры
В середине октября 2024 года Crashlytics запустила новую инфраструктуру для экспорта данных Crashlytics в BigQuery . На данный момент обновление этой новой инфраструктуры не является обязательным.
Эта новая инфраструктура поддерживает местоположения наборов данных Crashlytics за пределами Соединенных Штатов.
Если вы включили экспорт до середины октября 2024 года, теперь вы можете при желании изменить местоположение для экспорта данных на любое местоположение набора данных BigQuery .
Если вы включили экспорт в середине октября 2024 года или позже, вы можете выбрать любое местоположение набора данных BigQuery -поддержки во время настройки.
Еще одно отличие в новой инфраструктуре заключается в том, что она не поддерживает обратные засыпки данных, прежде чем вы включите экспорт. (Со старой инфраструктурой вы можете засыпаться до 30 дней до даты поддержки.) Новая инфраструктура поддерживает обратные засыпания до последних 30 дней или на последнюю дату, когда вы включили экспорт в BigQuery (в зависимости от последнего).
Условие для обновления
Перед тем, как обновить новую инфраструктуру, подтвердите, что вы соответствуете следующей предпосылке: ваши текущие пакеты BigQuery Tables имеют соответствующие идентификаторы с идентификаторами пакета или именами пакетов, установленных для ваших зарегистрированных приложений Firebase.
Например:
Если у вас есть таблица BigQuery с именем
com_yourcompany_yourproject_IOS
, то у вас должно быть зарегистрировано приложение Firebase IOS+ в вашем проекте Firebase с помощью идентификатора пакетаcom.yourcompany.yourproject
.Если у вас есть таблица BigQuery с именем
com_yourcompany_yourproject_ANDROID
, то у вас должно быть зарегистрировано приложение Firebase Android в вашем проекте Firebase с именем пакетаcom.yourcompany.yourproject
.
Вот как найти все приложения Firebase, зарегистрированные в вашем проекте Firebase:
В консоли Firebase перейдите к проекта настройки .
Прокрутите вниз до карты ваших приложений , затем нажмите на желаемое приложение Firebase, чтобы просмотреть информацию приложения, включая его идентификатор.
Новая экспортная инфраструктура будет экспортировать данные каждого приложения на основе имени пакета или идентификатора пакета для зарегистрированного приложения Firebase. Чтобы не нарушать ваш рабочий процесс BigQuery , важно убедиться, что ваши текущие пакетные таблицы уже имеют правильные имена, чтобы новая инфраструктура могла добавить все новые данные к существующим таблицам. Если у вас есть имена пакетных таблиц, которые не соответствуют вашим зарегистрированным приложениям Firebase, но вы все равно хотите обновить, обратитесь к поддержке Firebase .
Как перейти на новую инфраструктуру
Если вы уже включили экспорт, вы можете перейти на новую инфраструктуру, просто переключая экспорт данных Crashlytics , а затем снова в консоли Firebase .
Вот подробные шаги:
В консоли Firebase перейдите на страницу интеграции .
В карте BigQuery нажмите «Управление» .
Установите Crashlytics -слайдер, чтобы отключить экспорт. При запросе подтвердите, что вы хотите, чтобы экспорт данных остановился.
Сразу же снова включите Crashlytics Swider для повторного экспорта. При запросе подтвердите, что вы хотите экспортировать данные.
Ваш экспорт данных Crashlytics в BigQuery теперь использует новую экспортную инфраструктуру.
Вы можете экспортировать данные Firebase Crashlytics в BigQuery для дальнейшего анализа. BigQuery позволяет анализировать данные с помощью BigQuery SQL, экспортировать их другому облачному провайдеру и использовать их для визуализации и пользовательских инструментов с помощью Google Data Studio.
Включить экспорт в BigQuery
В консоли Firebase перейдите на страницу интеграции .
В карте BigQuery нажмите ссылку .
Следуйте инструкциям на экране, чтобы обеспечить экспорт в BigQuery .
Если вы хотите, чтобы почти в реальном времени был доступ к вашим данным Crashlytics в BigQuery , подумайте о том, чтобы обновление до потокового экспорта .
Что происходит, когда вы включаете экспорт?
Вы выбираете местоположение набора данных. После создания набора данных местоположение нельзя изменить, но вы можете скопировать набор данных в другое место или вручную перемещать (воссоздать) набор данных в другом месте. Чтобы узнать больше, см. Измените место для существующего экспорта .
Это местоположение применимо только к данным, экспортируемым в BigQuery , и не влияет на местоположение данных, хранящихся для использования на приборной панели Crashlytics на консоли Firebase или в Android Studio.
По умолчанию все приложения в вашем проекте связаны с BigQuery , и любые приложения, которые вы позже добавляете в проект, автоматически связаны с BigQuery . Вы можете управлять тем, какие приложения отправляют данные .
Firebase устанавливает ежедневные синхронизации ваших данных в BigQuery .
После того, как вы связываете свой проект, вам обычно нужно ждать синхронизации на следующий день, чтобы ваш первый набор данных был экспортирован в BigQuery .
Ежедневная синхронизация происходит один раз в день, независимо от любого запланированного экспорта, который вы могли создать в BigQuery . Обратите внимание, что время и продолжительность задания синхронизации могут измениться, поэтому мы не рекомендуем планировать операции или задания вниз по течению на основе конкретного времени экспорта.
Firebase экспортирует копию ваших существующих данных в BigQuery . Первоначальное распространение данных для экспорта может занять до 48 часов.
Для каждого связанного приложения этот экспорт включает в себя пакетную таблицу, содержащую данные из Daily Sync.
Вы можете вручную запланировать засыпание данных для пакетного стола до последних 30 дней или на последнюю дату, когда вы включили экспорт в BigQuery (в зависимости от того, что последнее).
Обратите внимание, что если вы включили экспорт данных о Crashlytics до середины октября 2024 года, вы также можете заполнить за 30 дней до того дня, когда вы включили экспорт.
Если вы позволите экспорте потоковой передачи Crashlytics в BigQuery , все связанные приложения также будут иметь таблицу в режиме реального времени, содержащую постоянное обновление данных.
Чтобы деактивировать экспорт в BigQuery , не сообщите ваш проект в консоли Firebase .
Какие данные экспортируются в BigQuery ?
Данные Firebase Crashlytics экспортируются в набор данных BigQuery с именем firebase_crashlytics
. По умолчанию отдельные таблицы будут создаваться в наборе данных Crashlytics для каждого приложения в вашем проекте. Firebase называет таблицы на основе идентификатора приложения, с периодами, преобразованными в подчеркивание, и имя платформы добавлено к концу.
Например, данные для приложения Android с именем пакета com.google.test
будут в таблице с именем com_google_test_ANDROID
. Эта пакетная таблица обновляется один раз в день. Если вы включите экспорт потоковой передачи Crashlytics в BigQuery , то данные Crashlytics также будут транслироваться в реальном времени в таблицу с именем com_google_test_ANDROID_REALTIME
.
Каждая строка в таблице представляет собой событие, которое произошло в приложении, включая сбои, нерадостные ошибки и ANR.
Crashlytics Streaming Export в BigQuery
Вы можете транслировать свои данные Crashlytics в режиме реального времени с помощью потоковой передачи BigQuery . Вы можете использовать его для любых целей, которые требуют живых данных, таких как представление информации на решающей панели, просмотр развертывания в прямом эфире или мониторинг проблем приложений, которые вызывают оповещения и пользовательские рабочие процессы.
Когда вы включите экспорт Crashlytics в BigQuery , в дополнение к пакетной таблице, у вас также будет таблица в реальном времени. Вот различия, о которых вы должны знать между таблицами:
Пакетная таблица | Таблица в реальном времени |
---|---|
|
|
Пакетная таблица идеально подходит для долгосрочного анализа и идентификации тенденций с течением времени, потому что мы более храним события, прежде чем писать, и они могут быть заполнены столе в течение до 30 дней*. Когда мы пишем данные в вашу таблицу в реальном времени, мы сразу же записываем их в BigQuery , и поэтому они идеально подходят для живых панелей и пользовательских оповещений. Эти две таблицы могут быть объединены с запросом сшивания, чтобы получить преимущества обоих.
По умолчанию таблица в реальном времени имеет время истечения срока действия раздела 30 дней. Чтобы узнать, как изменить это, см. Установите истечение срока действия разделения в документации BigQuery .
* См. Подробную информацию о поддержке обратной засыпки в обновлении до новой экспортной инфраструктуры .
Включить экспорт Crashlytics в BigQuery
В консоли Firebase перейдите на страницу интеграции .
В карте BigQuery нажмите «Управление» .
Выберите флажок « Включить потоковую передачу ».
Это действие позволяет потоковой передаче для всех ваших связанных приложений.
Вы не видите данные в своей таблице в реальном времени?
Убедитесь, что вы отправили как минимум два события из вашего приложения в Crashlytics , и ждали через пару минут после отправки их.
Убедитесь, что ваш проект Firebase находится в плане пламени пламя.
Вы можете проверить это, посмотрев в левом нижнем углу консоли Firebase .Если в вашей таблице в реальном времени все еще нет данных после отправки двух событий и ожидания пару минут:
Перейдите на карту BigQuery в консоли Firebase .
Отключить, а затем повторно включить потоковой экспорт.
Убедитесь, что учетная запись обслуживания service- PROJECT_NUMBER @gcp-sa-crashlytics.iam.gserviceaccount.com
находится в вашем проекте Firebase и играет роль агента Firebase Crashlytics .
Вы можете проверить это на странице IAM на консоли Google Cloud Console (обязательно выберите флажок для включения ролевых грантов Google ).Отправьте как минимум два события на Crashlytics и подождите пару минут.
Если вы все еще не видите данные в своей таблице в реальном времени, обратитесь к поддержке Firebase .
Что вы можете сделать с экспортируемыми данными?
Используйте шаблон студии данных
Создайте представления
Запустить запросы
Пример 1: сбои днем
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;
Пример 2: Найдите самые распространенные аварии
Чтобы правильно расставить приоритеты в производственных планах, вы хотите найти 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;
Пример 3: Топ -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;
Пример 4: Фильтр от пользовательского ключа
Вы разработчик игр, который хочет знать, какой уровень вашей игры испытывает большинство сбоев.
Чтобы помочь отслеживать этот стат, вы устанавливаете пользовательский ключ Crashlytics под названием current_level
, и обновляете его каждый раз, когда пользователь достигает нового уровня.
Crashlytics.sharedInstance().setIntValue(3, forKey: "current_level");
CrashlyticsKit setIntValue:3 forKey:@"current_level";
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
Пример 5: Извлечение идентификатора пользователя
У вас есть приложение для 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
Пример 6: Найдите всех пользователей, сталкивающихся с конкретной проблемой сбоя
Ваша команда случайно выпустила критическую ошибку для группы бета -тестеров. Ваша команда смогла использовать пример «Найти большинство распространенных сбоев» выше, чтобы определить конкретный идентификатор проблемы с аварией. Теперь ваша команда хотела бы запустить запрос, чтобы извлечь список пользователей приложений, которые повлияли на этот аварий.
Вот пример запроса для приложения 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;
Пример 7: Количество пользователей, пострадавших от проблемы с аварией, разбитая страной
Ваша команда обнаружила критическую ошибку во время развертывания нового релиза. Вы смогли использовать запрос из примера «Найти большинство распространенных сбоев» выше, чтобы определить конкретный идентификатор проблемы с аварией. Теперь ваша команда хотела бы посмотреть, распространилась ли эта авария на пользователей в разных странах мира.
Чтобы написать этот запрос, вашей команде нужно будет сделать следующее:
Включить экспорт данных Google Analytics в BigQuery . Смотрите данные экспорта проекта в BigQuery .
Обновите свое приложение, чтобы передать идентификатор пользователя как в Google Analytics SDK, так и в Crashlytics SDK.
Crashlytics.sharedInstance().setUserIdentifier("123456789"); Analytics.setUserID("123456789");
CrashlyticsKit setUserIdentifier:@"123456789"; FIRAnalytics setUserID:@"12345678 9";
Crashlytics.setUserIdentifier("123456789"); mFirebaseAnalytics.setUserId("123456789");
Напишите запрос, который использует поле идентификатора пользователя, чтобы присоединиться к событиям в наборе данных Google Analytics с Crashes в наборе данных 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
Пример 8: 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;
Пример 9: 5 лучших выпусков с даты, в том числе сегодня
Вы также можете объединить пакетные и таблицы в реальном времени с помощью запроса сшивания, чтобы добавить информацию в реальном времени к надежным данным партии. Поскольку 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 >= "YYYY_MM_DD " GROUP BY issue_id ORDER BY events DESC LIMIT 5;
Понять схему Crashlytics в BigQuery
When you set up Crashlytics data export to BigQuery , Firebase exports recent events (crashes, non-fatal errors, and ANRs), including events from up to two days before the link, with the option to backfill up to 30 days.
From that point until you deactivate the export, Firebase exports Crashlytics events on a daily basis. It can take a few minutes for the data to be available in BigQuery after each export.
Наборы данных
Crashlytics creates a new dataset in BigQuery for Crashlytics data. The dataset covers your entire project, even if it has multiple apps.
Таблицы
Crashlytics creates a table in the dataset for each app in your project, unless you've opted out of exporting data for that app. Firebase names the tables based on the app's identifier, with periods converted to underscores, and a platform name appended to the end.
For example, data for an Android app with the package name com.google.test
would be in a table named com_google_test_ANDROID
, and realtime data (if enabled) would be in a table named com_google_test_ANDROID_REALTIME
Tables contain a standard set of Crashlytics data in addition to any custom Crashlytics keys defined by you in your app.
Строки
Each row in a table represents an error the app encountered.
Столбцы
The columns in a table are identical for crashes, non-fatal errors, and ANRs. If Crashlytics streaming export to BigQuery is enabled, then the realtime table will have the same columns as the batch table. Note that you may have columns in rows that represent events that don't have stack traces.
The columns within the export are listed in this table:
Имя поля | Тип данных | Описание |
---|---|---|
platform | НИТЬ | The platform of the app as registered in the Firebase project (valid values: IOS or ANDROID ) |
bundle_identifier | НИТЬ | The unique identifier for the app as registered in the Firebase project (for example,com.google.gmail )For Apple platform apps, this is the bundle ID of the app. For Android apps, this is the package name of the app. |
event_id | НИТЬ | The unique ID for the event |
is_fatal | БУЛЕВОЕ значение | |
error_type | НИТЬ | The error type of the event (for example, FATAL , NON_FATAL , ANR , etc.) |
issue_id | НИТЬ | The issue associated with the event |
variant_id | НИТЬ | The issue variant associated with this event Note that not all events have an associated issue variant. |
event_timestamp | ТАЙМ-МЕТКА | When the event occurred |
device | ЗАПИСЫВАТЬ | The device the event occurred on |
device.manufacturer | НИТЬ | The device manufacturer |
device.model | НИТЬ | The device model |
device.architecture | НИТЬ | For example, X86_32 , X86_64 , ARMV7 , ARM64 , ARMV7S , or ARMV7K |
memory | ЗАПИСЫВАТЬ | The device's memory status |
memory.used | INT64 | Bytes of memory used |
memory.free | INT64 | Bytes of memory remaining |
storage | ЗАПИСЫВАТЬ | The device's persistent storage |
storage.used | INT64 | Bytes of storage used |
storage.free | INT64 | Bytes of storage remaining |
operating_system | ЗАПИСЫВАТЬ | The details of the OS on the device |
operating_system.display_version | НИТЬ | The version of the OS on the device |
operating_system.name | НИТЬ | The name of the OS on the device |
operating_system.modification_state | НИТЬ | Whether the device has been modified (for example, a jailbroken app is MODIFIED and a rooted app is UNMODIFIED ) |
operating_system.type | НИТЬ | (Apple apps only) The type of OS running on the device (for example, IOS , MACOS , etc.) |
operating_system.device_type | НИТЬ | The type of device (for example, MOBILE , TABLET , TV , etc.); also known as "device category" |
application | ЗАПИСЫВАТЬ | The app that generated the event |
application.build_version | НИТЬ | The app's build version |
application.display_version | НИТЬ | |
user | ЗАПИСЫВАТЬ | (Optional) Info collected about the app's user |
user.name | НИТЬ | (Optional) The user's name |
user.email | НИТЬ | (Optional) The user's email address |
user.id | НИТЬ | (Optional) An app-specific ID associated with the user |
custom_keys | REPEATED RECORD | Developer-defined key-value pairs |
custom_keys.key | НИТЬ | A developer-defined key |
custom_keys.value | НИТЬ | A developer-defined value |
installation_uuid | НИТЬ | An ID that identifies a unique app and device installation |
crashlytics_sdk_versions | НИТЬ | The Crashlytics SDK version that generated the event |
app_orientation | НИТЬ | For example, PORTRAIT , LANDSCAPE , FACE_UP , FACE_DOWN , etc. |
device_orientation | НИТЬ | For example, PORTRAIT , LANDSCAPE , FACE_UP , FACE_DOWN , etc. |
process_state | НИТЬ | BACKGROUND or FOREGROUND |
logs | REPEATED RECORD | Timestamped log messages generated by the Crashlytics logger, if enabled |
logs.timestamp | ТАЙМ-МЕТКА | When the log was made |
logs.message | НИТЬ | The logged message |
breadcrumbs | REPEATED RECORD | Timestamped Google Analytics breadcrumbs , if enabled |
breadcrumbs.timestamp | ТАЙМ-МЕТКА | The timestamp associated with the breadcrumb |
breadcrumbs.name | НИТЬ | The name associated with the breadcrumb |
breadcrumbs.params | REPEATED RECORD | Parameters associated with the breadcrumb |
breadcrumbs.params.key | НИТЬ | A parameter key associated with the breadcrumb |
breadcrumbs.params.value | НИТЬ | A parameter value associated with the breadcrumb |
blame_frame | ЗАПИСЫВАТЬ | The frame identified as the root cause of the crash or error |
blame_frame.line | INT64 | The line number of the file of the frame |
blame_frame.file | НИТЬ | The name of the frame file |
blame_frame.symbol | НИТЬ | The hydrated symbol, or raw symbol if it's unhydrateable |
blame_frame.offset | INT64 | The byte offset into the binary image that contains the code Unset for Java exceptions |
blame_frame.address | INT64 | The address in the binary image which contains the code Unset for Java frames |
blame_frame.library | НИТЬ | The display name of the library that includes the frame |
blame_frame.owner | НИТЬ | For example, DEVELOPER , VENDOR , RUNTIME , PLATFORM , or SYSTEM |
blame_frame.blamed | БУЛЕВОЕ значение | Whether Crashlytics determined that this frame is the cause of the crash or error |
exceptions | REPEATED RECORD | (Android only) Exceptions that occurred during this event. Nested exceptions are presented in reverse chronological order, which means that the last record is the first exception thrown |
exceptions.type | НИТЬ | The exception type (for example,java.lang.IllegalStateException) |
exceptions.exception_message | НИТЬ | A message associated with the exception |
exceptions.nested | БУЛЕВОЕ значение | True for all but the last-thrown exception (meaning the first record) |
exceptions.title | НИТЬ | The title of the thread |
exceptions.subtitle | НИТЬ | The subtitle of the thread |
exceptions.blamed | БУЛЕВОЕ значение | True if Crashlytics determines the exception is responsible for the error or crash |
exceptions.frames | REPEATED RECORD | The frames associated with the exception |
exceptions.frames.line | INT64 | The line number of the file of the frame |
exceptions.frames.file | НИТЬ | The name of the frame file |
exceptions.frames.symbol | НИТЬ | The hydrated symbol, or raw symbol if it's unhydrateable |
exceptions.frames.offset | INT64 | The byte offset into the binary image that contains the code Unset for Java exceptions |
exceptions.frames.address | INT64 | The address in the binary image which contains the code Unset for Java frames |
exceptions.frames.library | НИТЬ | The display name of the library that includes the frame |
exceptions.frames.owner | НИТЬ | For example, DEVELOPER , VENDOR , RUNTIME , PLATFORM , or SYSTEM |
exceptions.frames.blamed | БУЛЕВОЕ значение | Whether Crashlytics determined that this frame is the cause of the crash or error |
error | REPEATED RECORD | (Apple apps only) non-fatal errors |
error.queue_name | НИТЬ | The queue the thread was running on |
error.code | INT64 | Error code associated with the app's custom logged NSError |
error.title | НИТЬ | The title of the thread |
error.subtitle | НИТЬ | The subtitle of the thread |
error.blamed | БУЛЕВОЕ значение | Whether Crashlytics determined that this frame is the cause of the error |
error.frames | REPEATED RECORD | The frames of the stacktrace |
error.frames.line | INT64 | The line number of the file of the frame |
error.frames.file | НИТЬ | The name of the frame file |
error.frames.symbol | НИТЬ | The hydrated symbol, or raw symbol if it's unhydrateable |
error.frames.offset | INT64 | The byte offset into the binary image that contains the code |
error.frames.address | INT64 | The address in the binary image which contains the code |
error.frames.library | НИТЬ | The display name of the library that includes the frame |
error.frames.owner | НИТЬ | For example, DEVELOPER , VENDOR , RUNTIME , PLATFORM , or SYSTEM |
error.frames.blamed | БУЛЕВОЕ значение | Whether Crashlytics determined that this frame is the cause of the error |
threads | REPEATED RECORD | Threads present at the time of the event |
threads.crashed | БУЛЕВОЕ значение | Whether the thread crashed |
threads.thread_name | НИТЬ | The thread's name |
threads.queue_name | НИТЬ | (Apple apps only) The queue the thread was running on |
threads.signal_name | НИТЬ | The name of the signal that caused the app to crash, only present on crashed native threads |
threads.signal_code | НИТЬ | The code of the signal that caused the app to crash; only present on crashed native threads |
threads.crash_address | INT64 | The address of the signal that caused the application to crash; only present on crashed native threads |
threads.code | INT64 | (Apple apps only) Error code of the application's custom logged NSError |
threads.title | НИТЬ | The title of the thread |
threads.subtitle | НИТЬ | The subtitle of the thread |
threads.blamed | БУЛЕВОЕ значение | Whether Crashlytics determined that this frame is the cause of the crash or error |
threads.frames | REPEATED RECORD | The frames of the thread |
threads.frames.line | INT64 | The line number of the file of the frame |
threads.frames.file | НИТЬ | The name of the frame file |
threads.frames.symbol | НИТЬ | The hydrated symbol, or raw symbol if it's unhydreatable |
threads.frames.offset | INT64 | The byte offset into the binary image that contains the code |
threads.frames.address | INT64 | The address in the binary image which contains the code |
threads.frames.library | НИТЬ | The display name of the library that includes the frame |
threads.frames.owner | НИТЬ | For example, DEVELOPER , VENDOR , RUNTIME , PLATFORM , or SYSTEM |
threads.frames.blamed | БУЛЕВОЕ значение | Whether Crashlytics determined that this frame is the cause of the error |
unity_metadata.unity_version | НИТЬ | The version of Unity running on this device |
unity_metadata.debug_build | БУЛЕВОЕ значение | If this is a debug build |
unity_metadata.processor_type | НИТЬ | The type of processor |
unity_metadata.processor_count | INT64 | The number of processors (cores) |
unity_metadata.processor_frequency_mhz | INT64 | The frequency of the processor(s) in MHz |
unity_metadata.system_memory_size_mb | INT64 | The size of the system's memory in Mb |
unity_metadata.graphics_memory_size_mb | INT64 | The graphics memory in MB |
unity_metadata.graphics_device_id | INT64 | The identifier of the graphics device |
unity_metadata.graphics_device_vendor_id | INT64 | The identifier of the graphics processor's vendor |
unity_metadata.graphics_device_name | НИТЬ | The name of the graphics device |
unity_metadata.graphics_device_vendor | НИТЬ | The vendor of the graphics device |
unity_metadata.graphics_device_version | НИТЬ | The version of the graphics device |
unity_metadata.graphics_device_type | НИТЬ | The type of the graphics device |
unity_metadata.graphics_shader_level | INT64 | The shader level of the graphics |
unity_metadata.graphics_render_target_count | INT64 | The number of graphical rendering targets |
unity_metadata.graphics_copy_texture_support | НИТЬ | Support for copying graphics texture as defined in the Unity API |
unity_metadata.graphics_max_texture_size | INT64 | The maximum size dedicated to rendering texture |
unity_metadata.screen_size_px | НИТЬ | The size of the screen in pixels, formatted as width x height |
unity_metadata.screen_resolution_dpi | НИТЬ | The DPI of the screen as a floating point number |
unity_metadata.screen_refresh_rate_hz | INT64 | The refresh rate of the screen in Hz |
Visualize exported Crashlytics data with Data Studio
Google Data Studio turns your Crashlytics datasets in BigQuery into reports that are easier to read, easier to share, and fully customizable.
To learn more about using Data Studio, try the Data Studio quickstart guide, Welcome to Data Studio .
Use a Crashlytics report template
Data Studio has a sample report for Crashlytics that includes a comprehensive set of dimensions and metrics from the exported Crashlytics BigQuery schema. If you have enabled Crashlytics streaming export to BigQuery , then you can view that data on the Realtime trends page of the Data Studio template.You can use the sample as a template to quickly create new reports and visualizations based on your own app's raw crash data:
Open the Crashlytics Data Studio Dashboard template .
Click Use Template in the upper-right corner.
In the New Data Source drop down, select Create New Data Source .
Click Select on the BigQuery card.
Select a table containing exported Crashlytics data by choosing My Projects > PROJECT_ID > firebase_crashlytics > TABLE_NAME .
Your batch table is always available to select. If Crashlytics streaming export to BigQuery is enabled, then you can select your realtime table instead.
Under Configuration , set Crashlytics Template level to Default .
Click Connect to create the new data source.
Click Add to Report to return to the Crashlytics template.
Finally, click Create Report to create your copy of the Crashlytics Data Studio Dashboard template.
Upgrade to the new export infrastructure
In mid-October 2024, Crashlytics launched a new infrastructure for exporting Crashlytics data into BigQuery . For now, upgrading to this new infrastructure is optional.
This new infrastructure supports Crashlytics dataset locations outside the United States.
If you enabled export before mid-October 2024, you can now optionally change the location for data export to any BigQuery -supported dataset location.
If you enabled export in mid-October 2024 or later, then you can select any BigQuery -supported dataset location during setup.
Another difference in the new infrastructure is that it doesn't support backfills of data from before you enabled export. (With the old infrastructure, you could backfill up to 30 days prior to the enablement date.) The new infrastructure supports backfills up to the past 30 days or for the most recent date when you enabled export to BigQuery (whichever is most recent).
Prerequisite for upgrading
Before upgrading to the new infrastructure, confirm that you meet the following prerequisite: Your current batch BigQuery tables have matching identifiers to the bundle IDs or package names set for your registered Firebase Apps.
Например:
If you have a BigQuery table named
com_yourcompany_yourproject_IOS
, then you should have a Firebase iOS+ App registered in your Firebase project with the bundle IDcom.yourcompany.yourproject
.If you have a BigQuery table named
com_yourcompany_yourproject_ANDROID
, then you should have a Firebase Android App registered in your Firebase project with the package namecom.yourcompany.yourproject
.
Here's how to find all the Firebase Apps registered in your Firebase project:
In the Firebase console, go to your Project settings .
Scroll down to the Your apps card, then click on the desired Firebase App to view the app's information, including its identifier.
The new export infrastructure will export each app's data based on the package name or bundle ID set for the registered Firebase App. In order to not disrupt your BigQuery workflow, it's important to make sure your current batch tables already have the correct names so that the new infrastructure can append all new data to the existing tables. If you have batch table names that do not match your registered Firebase Apps, but you still want to upgrade, reach out to Firebase Support .
How to upgrade to the new infrastructure
If you've already enabled export, you can upgrade to the new infrastructure simply by toggling Crashlytics data export off and then on again in the Firebase console.
Вот подробные шаги:
In the Firebase console, go to the Integrations page .
In the BigQuery card, click Manage .
Toggle off the Crashlytics slider to disable export. When prompted, confirm that you want data export to stop.
Immediately toggle on again the Crashlytics slider to re-enable export. When prompted, confirm that you want to export data.
Your Crashlytics data export to BigQuery is now using the new export infrastructure.