|
14 | 14 | -- https://firebase.google.com/docs/crashlytics/bigquery-export#without_stack_traces |
15 | 15 |
|
16 | 16 | {% set projects = var('OVERBASE:SOURCES', []) %} |
| 17 | +{% set ready = var('OVERBASE:SOURCES_READY', false) %} |
17 | 18 |
|
18 | | -{% for p in projects %} |
19 | | -{% if not loop.first %}UNION ALL{% endif %} |
20 | | -SELECT |
21 | | - '{{ p.project_id }}' as project_id, |
| 19 | +{% set first = projects[0] if projects and (projects[0] is mapping) else {} %} |
| 20 | +{% set pid0 = first.get('project_id', 'fallback_project') %} |
| 21 | +{% set ds0 = first.get('crashlytics_dataset_id', 'fallback_crashlytics_dataset') %} |
| 22 | + |
| 23 | +{%- set ns = namespace(first=true) -%} |
| 24 | + |
| 25 | +( |
| 26 | +{% if not ready %} |
| 27 | + SELECT |
| 28 | + '{{ pid0 }}' AS project_id |
| 29 | + ,'{{ ds0 }}' AS dataset_id |
22 | 30 | , DATE(event_timestamp) as event_date |
23 | 31 | , received_timestamp as received_ts |
24 | 32 | , installation_uuid as crashlytics_user_pseudo_id |
@@ -84,7 +92,95 @@ SELECT |
84 | 92 | ) AS unity_metadata |
85 | 93 | , COUNT(1) OVER (PARTITION BY installation_uuid, event_id, variant_id) as duplicates_cnt |
86 | 94 |
|
87 | | -FROM {{ source('firebase_crashlytics__' ~ p.project_id, 'events') }} |
88 | | -WHERE {{ overbase_firebase.crashlyticsTSFilterFor("event_timestamp") }} |
89 | | -QUALIFY ROW_NUMBER() OVER (PARTITION BY installation_uuid, event_id, variant_id ORDER BY received_ts) = 1 |
90 | | -{% endfor %} |
| 95 | + FROM {{ source('firebase_crashlytics__fallback', 'events') }} |
| 96 | + WHERE {{ overbase_firebase.crashlyticsTSFilterFor("event_timestamp") }} |
| 97 | + QUALIFY ROW_NUMBER() OVER (PARTITION BY crashlytics_user_pseudo_id, event_id, variant_id ORDER BY received_ts) = 1 |
| 98 | +
|
| 99 | +{% else %} |
| 100 | +
|
| 101 | + {% for p in projects %} |
| 102 | + {% set pid = p.get('project_id') %} |
| 103 | + {% set ds = p.get('crashlytics_dataset_id') %} |
| 104 | +
|
| 105 | + {% if pid and ds %} |
| 106 | + {% if not ns.first %}UNION ALL{% endif %} |
| 107 | + {% set ns.first = false %} |
| 108 | +
|
| 109 | + SELECT |
| 110 | + '{{ pid }}' AS project_id, |
| 111 | + '{{ ds }}' AS dataset_id, |
| 112 | + DATE(event_timestamp) as event_date |
| 113 | + , received_timestamp as received_ts |
| 114 | + , installation_uuid as crashlytics_user_pseudo_id |
| 115 | + , (SELECT value FROM UNNEST(custom_keys) WHERE key = 'fb_user_pseudo_id') as firebase_analytics_user_pseudo_id |
| 116 | + , COALESCE(user.id, (SELECT value FROM UNNEST(custom_keys) WHERE key = 'app_user_id')) as user_id |
| 117 | + , bundle_identifier as app_id |
| 118 | + , ARRAY_TO_STRING(ARRAY_REVERSE(SPLIT(bundle_identifier, '.')), '.') as reverse_app_id |
| 119 | + , event_id |
| 120 | + -- the platform we get in operating_system.type is not populated for Android, only for iOS. So rely on _TABLE_SUFFIX instead |
| 121 | + , CASE WHEN _TABLE_SUFFIX LIKE '%ANDROID%' THEN'ANDROID' |
| 122 | + WHEN _TABLE_SUFFIX LIKE '%IOS%' THEN'IOS' |
| 123 | + ELSE 'UNKNOWN' -- TODO: unit test for this |
| 124 | + END as platform |
| 125 | + , STRUCT<id STRING, title STRING, subtitle STRING, variant_id STRING>( |
| 126 | + issue_id, issue_title, issue_subtitle, variant_id |
| 127 | + ) as issue |
| 128 | + , error_type |
| 129 | + , process_state |
| 130 | + , STRUCT<app STRING, device STRING>( |
| 131 | + app_orientation, device_orientation |
| 132 | + ) as orientation |
| 133 | + , STRUCT<firebase_value STRING, build_no STRING, major INT64, minor INT64, bugfix INT64, major_minor FLOAT64, major_minor_bugfix STRING, normalized INT64, join_value STRING>( |
| 134 | + {%- set v = "application.display_version" -%} |
| 135 | + {{ v }}, application.build_version, {{ overbase_firebase.get_version(v, "major") }}, {{ overbase_firebase.get_version(v, "minor") }}, {{ overbase_firebase.get_version(v, "bugfix") }}, {{ overbase_firebase.get_version(v, "major.minor") }}, {{ overbase_firebase.get_version(v, "major.minor.bugfix") }}, {{ overbase_firebase.get_version(v, "normalized") }}, COALESCE(CAST({{ overbase_firebase.get_version(v, "normalized") }} AS STRING), {{ v }} ) |
| 136 | + ) AS app_version |
| 137 | + , STRUCT<firebase_value STRING, name STRING, major INT64, minor INT64, bugfix INT64, major_minor FLOAT64, major_minor_bugfix STRING, normalized INT64, join_value STRING>( |
| 138 | + {%- set v = "operating_system.display_version" -%} |
| 139 | + {{ v }}, operating_system.name, {{ overbase_firebase.get_version(v, "major") }}, {{ overbase_firebase.get_version(v, "minor") }}, {{ overbase_firebase.get_version(v, "bugfix") }}, {{ overbase_firebase.get_version(v, "major.minor") }}, {{ overbase_firebase.get_version(v, "major.minor.bugfix") }}, {{ overbase_firebase.get_version(v, "normalized") }}, COALESCE(CAST( {{ overbase_firebase.get_version(v, "normalized") }} AS STRING), {{ v }} ) |
| 140 | + ) AS platform_version |
| 141 | + , operating_system.modification_state as jailbroken_state |
| 142 | + , STRUCT<type STRING, manufacturer STRING, os_model STRING, architecture STRING>( |
| 143 | + LOWER(operating_system.device_type), LOWER(device.manufacturer), LOWER(device.model), device.architecture |
| 144 | + ) AS device_hardware |
| 145 | + , {{ overbase_firebase.generate_struct_for_raw_crashlytics_custom_keys() }} as custom_keys |
| 146 | + , custom_keys as custom_keys_raw |
| 147 | + , STRUCT<used_bytes INT64, free_bytes INT64>(memory.used, memory.free) as memory |
| 148 | + , STRUCT<used_bytes INT64, free_bytes INT64>(storage.used, storage.free) as storage |
| 149 | + , STRUCT<name STRING, email STRING>(user.name, user.email) as user |
| 150 | + , crashlytics_sdk_version AS crashlytics_sdk_version_string |
| 151 | + , logs |
| 152 | + , breadcrumbs |
| 153 | + , blame_frame |
| 154 | + , exceptions as android_exceptions |
| 155 | + , errors as ios_non_fatal |
| 156 | + , threads |
| 157 | + , STRUCT<unity_version STRING, debug_build BOOLEAN, processor_type STRING, processor_count INTEGER, processor_frequency INTEGER, system_memory_size INTEGER, graphics_memory_size INTEGER, graphics_device_id INTEGER, graphics_device_vendor_id INTEGER, graphics_device_name STRING, graphics_device_vendor STRING, graphics_device_version STRING, graphics_device_type STRING, graphics_shader_level INTEGER, graphics_render_target_count INTEGER, graphics_copy_texture_support STRING, graphics_max_texture_size INTEGER, screen_size STRING, screen_dpi FLOAT64, screen_refresh_rate INTEGER, processor_frequency_mhz INTEGER, system_memory_size_mb INTEGER, graphics_memory_size_mb INTEGER, screen_size_px STRING, screen_refresh_rate_hz INTEGER, screen_resolution_dpi STRING>( |
| 158 | + {# it has a short form of 20 columns (iOS REALTIME only) and a long form of 26 columns (Android historic, Android realtime & iOS historic ) |
| 159 | + 20:unity_version STRING,debug_build BOOLEAN,processor_type STRING,processor_count INTEGER,processor_frequency_mhz INTEGER,system_memory_size_mb INTEGER,graphics_memory_size_mb INTEGER,graphics_device_id INTEGER,graphics_device_vendor_id INTEGER,graphics_device_name STRING,graphics_device_vendor STRING,graphics_device_version STRING,graphics_device_type STRING,graphics_shader_level INTEGER,graphics_render_target_count INTEGER,graphics_copy_texture_support STRING,graphics_max_texture_size INTEGER,screen_size_px STRING,screen_refresh_rate_hz INTEGER,screen_resolution_dpi STRING, |
| 160 | + sometimes it's processor_frequency_mhz |
| 161 | + 26: unity_version STRING, debug_build BOOLEAN, processor_type STRING, processor_count INTEGER, processor_frequency INTEGER, system_memory_size INTEGER, graphics_memory_size INTEGER, graphics_device_id INTEGER, graphics_device_vendor_id INTEGER, graphics_device_name STRING, graphics_device_vendor STRING, graphics_device_version STRING, graphics_device_type STRING, graphics_shader_level INTEGER, graphics_render_target_count INTEGER, graphics_copy_texture_support STRING, graphics_max_texture_size INTEGER, screen_size STRING, screen_dpi FLOAT, screen_refresh_rate INTEGER, processor_frequency_mhz INTEGER, system_memory_size_mb INTEGER, graphics_memory_size_mb INTEGER, screen_size_px STRING, screen_refresh_rate_hz INTEGER, screen_resolution_dpi STRING |
| 162 | + Differences: |
| 163 | + + processor_frequency (but both also have processor_frequency_mhz) |
| 164 | + + system_memory_size (but both also have system_memory_size_mb) |
| 165 | + + graphics_memory_size (but both also have graphics_memory_size_mb) |
| 166 | + + screen_size |
| 167 | + + screen_dpi |
| 168 | + + screen_refresh_rate |
| 169 | + Those values are NULLed for the time being |
| 170 | + #} |
| 171 | + {{ overbase_firebase.list_map_and_add_prefix([ |
| 172 | + "unity_version","debug_build","processor_type","processor_count",none,none,none,"graphics_device_id","graphics_device_vendor_id","graphics_device_name","graphics_device_vendor","graphics_device_version","graphics_device_type","graphics_shader_level","graphics_render_target_count","graphics_copy_texture_support","graphics_max_texture_size",none,none,none,"processor_frequency_mhz","system_memory_size_mb","graphics_memory_size_mb","screen_size_px","screen_refresh_rate_hz","screen_resolution_dpi" |
| 173 | + ], "unity_metadata." )| join(", ") }} |
| 174 | + ) AS unity_metadata |
| 175 | + , COUNT(1) OVER (PARTITION BY installation_uuid, event_id, variant_id) as duplicates_cnt |
| 176 | + |
| 177 | + FROM {{ source('firebase_crashlytics__' ~ pid, 'events') }} |
| 178 | + WHERE {{ overbase_firebase.crashlyticsTSFilterFor("event_timestamp") }} |
| 179 | + |
| 180 | + {% endif %} |
| 181 | + QUALIFY ROW_NUMBER() OVER (PARTITION BY crashlytics_user_pseudo_id, event_id, variant_id ORDER BY received_ts) = 1 |
| 182 | + {% endfor %} |
| 183 | +{% endif %} |
| 184 | +) |
| 185 | + |
| 186 | + |
0 commit comments