1*90c8c64dSAndroid Build Coastguard Worker/* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Workerimport {globalConfig} from 'common/global_config'; 18*90c8c64dSAndroid Build Coastguard Workerimport {CoarseVersion} from 'trace/coarse_version'; 19*90c8c64dSAndroid Build Coastguard Workerimport {Parser} from 'trace/parser'; 20*90c8c64dSAndroid Build Coastguard Workerimport {TraceType} from 'trace/trace_type'; 21*90c8c64dSAndroid Build Coastguard Worker 22*90c8c64dSAndroid Build Coastguard Worker/* eslint-disable no-undef */ 23*90c8c64dSAndroid Build Coastguard Workerexport class Analytics { 24*90c8c64dSAndroid Build Coastguard Worker private static BUGANIZER_OPENED = 'buganizer_opened'; 25*90c8c64dSAndroid Build Coastguard Worker private static CROSS_TOOL_SYNC = 'cross_tool_sync'; 26*90c8c64dSAndroid Build Coastguard Worker private static DARK_MODE_ENABLED = 'dark_mode_enabled'; 27*90c8c64dSAndroid Build Coastguard Worker private static DOCUMENTATION_OPENED = 'documentation_opened'; 28*90c8c64dSAndroid Build Coastguard Worker private static EXPANDED_TIMELINE_OPENED = 'expanded_timeline_opened'; 29*90c8c64dSAndroid Build Coastguard Worker private static GLOBAL_EXCEPTION = 'global_exception'; 30*90c8c64dSAndroid Build Coastguard Worker private static HIERARCHY_SETTINGS = 'hierarchy_settings'; 31*90c8c64dSAndroid Build Coastguard Worker private static NAVIGATION_ZOOM_EVENT = 'navigation_zoom'; 32*90c8c64dSAndroid Build Coastguard Worker private static PROPERTIES_SETTINGS = 'properties_settings'; 33*90c8c64dSAndroid Build Coastguard Worker private static PROXY_ERROR = 'proxy_error'; 34*90c8c64dSAndroid Build Coastguard Worker private static PROXY_SERVER_NOT_FOUND = 'proxy_server_not_found'; 35*90c8c64dSAndroid Build Coastguard Worker private static PROXY_NO_FILES_FOUND = 'proxy_no_files_found'; 36*90c8c64dSAndroid Build Coastguard Worker private static TP_QUERY_EXECUTION_TIME = 'tp_query_execution_time'; 37*90c8c64dSAndroid Build Coastguard Worker private static TP_QUERY_REQUESTED = 'tp_query_requested'; 38*90c8c64dSAndroid Build Coastguard Worker private static TP_QUERY_FAILED = 'tp_query_failed'; 39*90c8c64dSAndroid Build Coastguard Worker private static TP_QUERY_SAVED = 'tp_query_saved'; 40*90c8c64dSAndroid Build Coastguard Worker private static RECT_SETTINGS = 'rect_settings'; 41*90c8c64dSAndroid Build Coastguard Worker private static REFRESH_DUMPS = 'refresh_dumps'; 42*90c8c64dSAndroid Build Coastguard Worker private static TIME_BOOKMARK = 'time_bookmark'; 43*90c8c64dSAndroid Build Coastguard Worker private static TIME_COPIED = 'time_copied'; 44*90c8c64dSAndroid Build Coastguard Worker private static TIME_INPUT = 'time_input'; 45*90c8c64dSAndroid Build Coastguard Worker private static TRACE_TAB_SWITCHED = 'trace_tab_switched'; 46*90c8c64dSAndroid Build Coastguard Worker private static TRACE_TIMELINE_DESELECTED = 'trace_timeline_deselected'; 47*90c8c64dSAndroid Build Coastguard Worker private static TRACING_LOADED_EVENT = 'tracing_trace_loaded'; 48*90c8c64dSAndroid Build Coastguard Worker private static TRACING_COLLECT_DUMP = 'tracing_collect_dump'; 49*90c8c64dSAndroid Build Coastguard Worker private static TRACING_COLLECT_TRACE = 'tracing_collect_trace'; 50*90c8c64dSAndroid Build Coastguard Worker private static TRACING_OPEN_FROM_ABT = 'tracing_from_abt'; 51*90c8c64dSAndroid Build Coastguard Worker private static USER_WARNING = 'user_warning'; 52*90c8c64dSAndroid Build Coastguard Worker 53*90c8c64dSAndroid Build Coastguard Worker static Error = class { 54*90c8c64dSAndroid Build Coastguard Worker static logGlobalException(description: string) { 55*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.GLOBAL_EXCEPTION, { 56*90c8c64dSAndroid Build Coastguard Worker description, 57*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 58*90c8c64dSAndroid Build Coastguard Worker } 59*90c8c64dSAndroid Build Coastguard Worker static logProxyError(description: string) { 60*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.PROXY_ERROR, { 61*90c8c64dSAndroid Build Coastguard Worker description, 62*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 63*90c8c64dSAndroid Build Coastguard Worker } 64*90c8c64dSAndroid Build Coastguard Worker }; 65*90c8c64dSAndroid Build Coastguard Worker 66*90c8c64dSAndroid Build Coastguard Worker static Help = class { 67*90c8c64dSAndroid Build Coastguard Worker static logDocumentationOpened() { 68*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.DOCUMENTATION_OPENED); 69*90c8c64dSAndroid Build Coastguard Worker } 70*90c8c64dSAndroid Build Coastguard Worker 71*90c8c64dSAndroid Build Coastguard Worker static logBuganizerOpened() { 72*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.BUGANIZER_OPENED); 73*90c8c64dSAndroid Build Coastguard Worker } 74*90c8c64dSAndroid Build Coastguard Worker }; 75*90c8c64dSAndroid Build Coastguard Worker 76*90c8c64dSAndroid Build Coastguard Worker static Navigation = class { 77*90c8c64dSAndroid Build Coastguard Worker static logExpandedTimelineOpened() { 78*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.EXPANDED_TIMELINE_OPENED); 79*90c8c64dSAndroid Build Coastguard Worker } 80*90c8c64dSAndroid Build Coastguard Worker 81*90c8c64dSAndroid Build Coastguard Worker static logHierarchySettingsChanged( 82*90c8c64dSAndroid Build Coastguard Worker option: string, 83*90c8c64dSAndroid Build Coastguard Worker value: boolean, 84*90c8c64dSAndroid Build Coastguard Worker traceType: string, 85*90c8c64dSAndroid Build Coastguard Worker ) { 86*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.HIERARCHY_SETTINGS, { 87*90c8c64dSAndroid Build Coastguard Worker option, 88*90c8c64dSAndroid Build Coastguard Worker value, 89*90c8c64dSAndroid Build Coastguard Worker traceType, 90*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 91*90c8c64dSAndroid Build Coastguard Worker } 92*90c8c64dSAndroid Build Coastguard Worker 93*90c8c64dSAndroid Build Coastguard Worker static logPropertiesSettingsChanged( 94*90c8c64dSAndroid Build Coastguard Worker option: string, 95*90c8c64dSAndroid Build Coastguard Worker value: boolean, 96*90c8c64dSAndroid Build Coastguard Worker traceType: string, 97*90c8c64dSAndroid Build Coastguard Worker ) { 98*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.PROPERTIES_SETTINGS, { 99*90c8c64dSAndroid Build Coastguard Worker option, 100*90c8c64dSAndroid Build Coastguard Worker value, 101*90c8c64dSAndroid Build Coastguard Worker traceType, 102*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 103*90c8c64dSAndroid Build Coastguard Worker } 104*90c8c64dSAndroid Build Coastguard Worker 105*90c8c64dSAndroid Build Coastguard Worker static logRectSettingsChanged( 106*90c8c64dSAndroid Build Coastguard Worker option: string, 107*90c8c64dSAndroid Build Coastguard Worker value: string | number | boolean, 108*90c8c64dSAndroid Build Coastguard Worker traceType: string, 109*90c8c64dSAndroid Build Coastguard Worker ) { 110*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.RECT_SETTINGS, { 111*90c8c64dSAndroid Build Coastguard Worker option, 112*90c8c64dSAndroid Build Coastguard Worker value, 113*90c8c64dSAndroid Build Coastguard Worker traceType, 114*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 115*90c8c64dSAndroid Build Coastguard Worker } 116*90c8c64dSAndroid Build Coastguard Worker 117*90c8c64dSAndroid Build Coastguard Worker static logTabSwitched(tabTraceType: string) { 118*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TRACE_TAB_SWITCHED, { 119*90c8c64dSAndroid Build Coastguard Worker type: tabTraceType, 120*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 121*90c8c64dSAndroid Build Coastguard Worker } 122*90c8c64dSAndroid Build Coastguard Worker 123*90c8c64dSAndroid Build Coastguard Worker static logTimeCopied(type: 'ns' | 'human') { 124*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TIME_COPIED, { 125*90c8c64dSAndroid Build Coastguard Worker type, 126*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 127*90c8c64dSAndroid Build Coastguard Worker } 128*90c8c64dSAndroid Build Coastguard Worker 129*90c8c64dSAndroid Build Coastguard Worker static logTimeInput(type: 'ns' | 'human') { 130*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TIME_INPUT, { 131*90c8c64dSAndroid Build Coastguard Worker type, 132*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 133*90c8c64dSAndroid Build Coastguard Worker } 134*90c8c64dSAndroid Build Coastguard Worker 135*90c8c64dSAndroid Build Coastguard Worker static logTimeBookmark() { 136*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TIME_BOOKMARK); 137*90c8c64dSAndroid Build Coastguard Worker } 138*90c8c64dSAndroid Build Coastguard Worker 139*90c8c64dSAndroid Build Coastguard Worker static logTraceTimelineDeselected(type: string) { 140*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TRACE_TIMELINE_DESELECTED, { 141*90c8c64dSAndroid Build Coastguard Worker type, 142*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 143*90c8c64dSAndroid Build Coastguard Worker } 144*90c8c64dSAndroid Build Coastguard Worker 145*90c8c64dSAndroid Build Coastguard Worker static logZoom( 146*90c8c64dSAndroid Build Coastguard Worker type: 'scroll' | 'button' | 'reset' | 'key', 147*90c8c64dSAndroid Build Coastguard Worker component: 'rects' | 'timeline', 148*90c8c64dSAndroid Build Coastguard Worker direction?: 'in' | 'out', 149*90c8c64dSAndroid Build Coastguard Worker ) { 150*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.NAVIGATION_ZOOM_EVENT, { 151*90c8c64dSAndroid Build Coastguard Worker direction, 152*90c8c64dSAndroid Build Coastguard Worker component, 153*90c8c64dSAndroid Build Coastguard Worker type, 154*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 155*90c8c64dSAndroid Build Coastguard Worker } 156*90c8c64dSAndroid Build Coastguard Worker }; 157*90c8c64dSAndroid Build Coastguard Worker 158*90c8c64dSAndroid Build Coastguard Worker static Proxy = class { 159*90c8c64dSAndroid Build Coastguard Worker static logServerNotFound() { 160*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.PROXY_SERVER_NOT_FOUND); 161*90c8c64dSAndroid Build Coastguard Worker } 162*90c8c64dSAndroid Build Coastguard Worker 163*90c8c64dSAndroid Build Coastguard Worker static logNoFilesFound() { 164*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.PROXY_NO_FILES_FOUND); 165*90c8c64dSAndroid Build Coastguard Worker } 166*90c8c64dSAndroid Build Coastguard Worker }; 167*90c8c64dSAndroid Build Coastguard Worker 168*90c8c64dSAndroid Build Coastguard Worker static Settings = class { 169*90c8c64dSAndroid Build Coastguard Worker static logDarkModeEnabled() { 170*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.DARK_MODE_ENABLED); 171*90c8c64dSAndroid Build Coastguard Worker } 172*90c8c64dSAndroid Build Coastguard Worker static logCrossToolSync(value: boolean) { 173*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.CROSS_TOOL_SYNC, { 174*90c8c64dSAndroid Build Coastguard Worker value, 175*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 176*90c8c64dSAndroid Build Coastguard Worker } 177*90c8c64dSAndroid Build Coastguard Worker }; 178*90c8c64dSAndroid Build Coastguard Worker 179*90c8c64dSAndroid Build Coastguard Worker static TraceSearch = class { 180*90c8c64dSAndroid Build Coastguard Worker static logQueryExecutionTime(value: number) { 181*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TP_QUERY_EXECUTION_TIME, { 182*90c8c64dSAndroid Build Coastguard Worker value, 183*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 184*90c8c64dSAndroid Build Coastguard Worker } 185*90c8c64dSAndroid Build Coastguard Worker static logQueryFailure() { 186*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TP_QUERY_FAILED); 187*90c8c64dSAndroid Build Coastguard Worker } 188*90c8c64dSAndroid Build Coastguard Worker static logQueryRequested(type: 'new' | 'saved' | 'recent') { 189*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TP_QUERY_REQUESTED, { 190*90c8c64dSAndroid Build Coastguard Worker type, 191*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 192*90c8c64dSAndroid Build Coastguard Worker } 193*90c8c64dSAndroid Build Coastguard Worker static logQuerySaved() { 194*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TP_QUERY_SAVED); 195*90c8c64dSAndroid Build Coastguard Worker } 196*90c8c64dSAndroid Build Coastguard Worker }; 197*90c8c64dSAndroid Build Coastguard Worker 198*90c8c64dSAndroid Build Coastguard Worker static Tracing = class { 199*90c8c64dSAndroid Build Coastguard Worker static logTraceLoaded(parser: Parser<object>) { 200*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TRACING_LOADED_EVENT, { 201*90c8c64dSAndroid Build Coastguard Worker type: TraceType[parser.getTraceType()], 202*90c8c64dSAndroid Build Coastguard Worker coarse_version: CoarseVersion[parser.getCoarseVersion()], 203*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 204*90c8c64dSAndroid Build Coastguard Worker } 205*90c8c64dSAndroid Build Coastguard Worker 206*90c8c64dSAndroid Build Coastguard Worker static logCollectDumps(requestedDumps: string[]) { 207*90c8c64dSAndroid Build Coastguard Worker requestedDumps.forEach((dumpType) => { 208*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TRACING_COLLECT_DUMP, { 209*90c8c64dSAndroid Build Coastguard Worker type: dumpType, 210*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 211*90c8c64dSAndroid Build Coastguard Worker }); 212*90c8c64dSAndroid Build Coastguard Worker } 213*90c8c64dSAndroid Build Coastguard Worker 214*90c8c64dSAndroid Build Coastguard Worker static logCollectTraces(requestedTraces: string[]) { 215*90c8c64dSAndroid Build Coastguard Worker requestedTraces.forEach((traceType) => { 216*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TRACING_COLLECT_TRACE, { 217*90c8c64dSAndroid Build Coastguard Worker type: traceType, 218*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 219*90c8c64dSAndroid Build Coastguard Worker }); 220*90c8c64dSAndroid Build Coastguard Worker } 221*90c8c64dSAndroid Build Coastguard Worker 222*90c8c64dSAndroid Build Coastguard Worker static logOpenFromABT() { 223*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.TRACING_OPEN_FROM_ABT); 224*90c8c64dSAndroid Build Coastguard Worker } 225*90c8c64dSAndroid Build Coastguard Worker 226*90c8c64dSAndroid Build Coastguard Worker static logRefreshDumps() { 227*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.REFRESH_DUMPS); 228*90c8c64dSAndroid Build Coastguard Worker } 229*90c8c64dSAndroid Build Coastguard Worker }; 230*90c8c64dSAndroid Build Coastguard Worker 231*90c8c64dSAndroid Build Coastguard Worker static UserNotification = class { 232*90c8c64dSAndroid Build Coastguard Worker static logUserWarning(description: string, message: string) { 233*90c8c64dSAndroid Build Coastguard Worker Analytics.doLogEvent(Analytics.USER_WARNING, { 234*90c8c64dSAndroid Build Coastguard Worker description, 235*90c8c64dSAndroid Build Coastguard Worker message, 236*90c8c64dSAndroid Build Coastguard Worker } as Gtag.CustomParams); 237*90c8c64dSAndroid Build Coastguard Worker } 238*90c8c64dSAndroid Build Coastguard Worker }; 239*90c8c64dSAndroid Build Coastguard Worker 240*90c8c64dSAndroid Build Coastguard Worker private static doLogEvent( 241*90c8c64dSAndroid Build Coastguard Worker eventName: Gtag.EventNames | (string & {}), 242*90c8c64dSAndroid Build Coastguard Worker eventParams?: Gtag.ControlParams | Gtag.EventParams | Gtag.CustomParams, 243*90c8c64dSAndroid Build Coastguard Worker ) { 244*90c8c64dSAndroid Build Coastguard Worker if (globalConfig.MODE === 'PROD') { 245*90c8c64dSAndroid Build Coastguard Worker gtag('event', eventName, eventParams); 246*90c8c64dSAndroid Build Coastguard Worker } 247*90c8c64dSAndroid Build Coastguard Worker } 248*90c8c64dSAndroid Build Coastguard Worker} 249