1*90c8c64dSAndroid Build Coastguard Worker/* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2023 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 {TimeRange} from 'common/time'; 18*90c8c64dSAndroid Build Coastguard Workerimport {TimeDuration} from 'common/time_duration'; 19*90c8c64dSAndroid Build Coastguard Workerimport {TRACE_INFO} from 'trace/trace_info'; 20*90c8c64dSAndroid Build Coastguard Workerimport {TraceType} from 'trace/trace_type'; 21*90c8c64dSAndroid Build Coastguard Workerimport {UserWarning} from './user_warning'; 22*90c8c64dSAndroid Build Coastguard Worker 23*90c8c64dSAndroid Build Coastguard Workerexport class CorruptedArchive extends UserWarning { 24*90c8c64dSAndroid Build Coastguard Worker constructor(private readonly file: File) { 25*90c8c64dSAndroid Build Coastguard Worker super(); 26*90c8c64dSAndroid Build Coastguard Worker } 27*90c8c64dSAndroid Build Coastguard Worker 28*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 29*90c8c64dSAndroid Build Coastguard Worker return 'corrupted archive'; 30*90c8c64dSAndroid Build Coastguard Worker } 31*90c8c64dSAndroid Build Coastguard Worker 32*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 33*90c8c64dSAndroid Build Coastguard Worker return `${this.file.name}: corrupted archive`; 34*90c8c64dSAndroid Build Coastguard Worker } 35*90c8c64dSAndroid Build Coastguard Worker} 36*90c8c64dSAndroid Build Coastguard Worker 37*90c8c64dSAndroid Build Coastguard Workerexport class NoValidFiles extends UserWarning { 38*90c8c64dSAndroid Build Coastguard Worker constructor(private traces?: string[]) { 39*90c8c64dSAndroid Build Coastguard Worker super(); 40*90c8c64dSAndroid Build Coastguard Worker } 41*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 42*90c8c64dSAndroid Build Coastguard Worker return 'no valid files'; 43*90c8c64dSAndroid Build Coastguard Worker } 44*90c8c64dSAndroid Build Coastguard Worker 45*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 46*90c8c64dSAndroid Build Coastguard Worker return ( 47*90c8c64dSAndroid Build Coastguard Worker 'No valid trace files found' + 48*90c8c64dSAndroid Build Coastguard Worker (this.traces ? ` for ${this.traces.join(', ')}` : '') 49*90c8c64dSAndroid Build Coastguard Worker ); 50*90c8c64dSAndroid Build Coastguard Worker } 51*90c8c64dSAndroid Build Coastguard Worker} 52*90c8c64dSAndroid Build Coastguard Worker 53*90c8c64dSAndroid Build Coastguard Workerexport class TraceHasOldData extends UserWarning { 54*90c8c64dSAndroid Build Coastguard Worker constructor( 55*90c8c64dSAndroid Build Coastguard Worker private readonly descriptor: string, 56*90c8c64dSAndroid Build Coastguard Worker private readonly timeGap?: TimeRange, 57*90c8c64dSAndroid Build Coastguard Worker ) { 58*90c8c64dSAndroid Build Coastguard Worker super(); 59*90c8c64dSAndroid Build Coastguard Worker } 60*90c8c64dSAndroid Build Coastguard Worker 61*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 62*90c8c64dSAndroid Build Coastguard Worker return 'old trace'; 63*90c8c64dSAndroid Build Coastguard Worker } 64*90c8c64dSAndroid Build Coastguard Worker 65*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 66*90c8c64dSAndroid Build Coastguard Worker const elapsedTime = this.timeGap 67*90c8c64dSAndroid Build Coastguard Worker ? new TimeDuration( 68*90c8c64dSAndroid Build Coastguard Worker this.timeGap.to.getValueNs() - this.timeGap.from.getValueNs(), 69*90c8c64dSAndroid Build Coastguard Worker ) 70*90c8c64dSAndroid Build Coastguard Worker : undefined; 71*90c8c64dSAndroid Build Coastguard Worker return ( 72*90c8c64dSAndroid Build Coastguard Worker `${this.descriptor}: discarded because data is old` + 73*90c8c64dSAndroid Build Coastguard Worker (this.timeGap ? `er than ${elapsedTime?.format()}` : '') 74*90c8c64dSAndroid Build Coastguard Worker ); 75*90c8c64dSAndroid Build Coastguard Worker } 76*90c8c64dSAndroid Build Coastguard Worker} 77*90c8c64dSAndroid Build Coastguard Worker 78*90c8c64dSAndroid Build Coastguard Workerexport class TraceOverridden extends UserWarning { 79*90c8c64dSAndroid Build Coastguard Worker constructor( 80*90c8c64dSAndroid Build Coastguard Worker private readonly descriptor: string, 81*90c8c64dSAndroid Build Coastguard Worker private readonly overridingType?: TraceType, 82*90c8c64dSAndroid Build Coastguard Worker ) { 83*90c8c64dSAndroid Build Coastguard Worker super(); 84*90c8c64dSAndroid Build Coastguard Worker } 85*90c8c64dSAndroid Build Coastguard Worker 86*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 87*90c8c64dSAndroid Build Coastguard Worker return 'trace overridden'; 88*90c8c64dSAndroid Build Coastguard Worker } 89*90c8c64dSAndroid Build Coastguard Worker 90*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 91*90c8c64dSAndroid Build Coastguard Worker if (this.overridingType !== undefined) { 92*90c8c64dSAndroid Build Coastguard Worker return `${this.descriptor}: overridden by another trace of type ${ 93*90c8c64dSAndroid Build Coastguard Worker TraceType[this.overridingType] 94*90c8c64dSAndroid Build Coastguard Worker }`; 95*90c8c64dSAndroid Build Coastguard Worker } 96*90c8c64dSAndroid Build Coastguard Worker return `${this.descriptor}: overridden by another trace of same type`; 97*90c8c64dSAndroid Build Coastguard Worker } 98*90c8c64dSAndroid Build Coastguard Worker} 99*90c8c64dSAndroid Build Coastguard Worker 100*90c8c64dSAndroid Build Coastguard Workerexport class UnsupportedFileFormat extends UserWarning { 101*90c8c64dSAndroid Build Coastguard Worker constructor(private readonly descriptor: string) { 102*90c8c64dSAndroid Build Coastguard Worker super(); 103*90c8c64dSAndroid Build Coastguard Worker } 104*90c8c64dSAndroid Build Coastguard Worker 105*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 106*90c8c64dSAndroid Build Coastguard Worker return 'unsupported format'; 107*90c8c64dSAndroid Build Coastguard Worker } 108*90c8c64dSAndroid Build Coastguard Worker 109*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 110*90c8c64dSAndroid Build Coastguard Worker return `${this.descriptor}: unsupported format`; 111*90c8c64dSAndroid Build Coastguard Worker } 112*90c8c64dSAndroid Build Coastguard Worker} 113*90c8c64dSAndroid Build Coastguard Worker 114*90c8c64dSAndroid Build Coastguard Workerexport class InvalidLegacyTrace extends UserWarning { 115*90c8c64dSAndroid Build Coastguard Worker constructor( 116*90c8c64dSAndroid Build Coastguard Worker private readonly descriptor: string, 117*90c8c64dSAndroid Build Coastguard Worker private readonly errorMessage: string, 118*90c8c64dSAndroid Build Coastguard Worker ) { 119*90c8c64dSAndroid Build Coastguard Worker super(); 120*90c8c64dSAndroid Build Coastguard Worker } 121*90c8c64dSAndroid Build Coastguard Worker 122*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 123*90c8c64dSAndroid Build Coastguard Worker return 'invalid legacy trace'; 124*90c8c64dSAndroid Build Coastguard Worker } 125*90c8c64dSAndroid Build Coastguard Worker 126*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 127*90c8c64dSAndroid Build Coastguard Worker return `${this.descriptor}: ${this.errorMessage}`; 128*90c8c64dSAndroid Build Coastguard Worker } 129*90c8c64dSAndroid Build Coastguard Worker} 130*90c8c64dSAndroid Build Coastguard Worker 131*90c8c64dSAndroid Build Coastguard Workerexport class InvalidPerfettoTrace extends UserWarning { 132*90c8c64dSAndroid Build Coastguard Worker constructor( 133*90c8c64dSAndroid Build Coastguard Worker private readonly descriptor: string, 134*90c8c64dSAndroid Build Coastguard Worker private readonly errorMessages: string[], 135*90c8c64dSAndroid Build Coastguard Worker ) { 136*90c8c64dSAndroid Build Coastguard Worker super(); 137*90c8c64dSAndroid Build Coastguard Worker } 138*90c8c64dSAndroid Build Coastguard Worker 139*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 140*90c8c64dSAndroid Build Coastguard Worker return 'invalid perfetto trace'; 141*90c8c64dSAndroid Build Coastguard Worker } 142*90c8c64dSAndroid Build Coastguard Worker 143*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 144*90c8c64dSAndroid Build Coastguard Worker return `${this.descriptor}: ${this.errorMessages.join(', ')}`; 145*90c8c64dSAndroid Build Coastguard Worker } 146*90c8c64dSAndroid Build Coastguard Worker} 147*90c8c64dSAndroid Build Coastguard Worker 148*90c8c64dSAndroid Build Coastguard Workerexport class FailedToCreateTracesParser extends UserWarning { 149*90c8c64dSAndroid Build Coastguard Worker constructor( 150*90c8c64dSAndroid Build Coastguard Worker private readonly traceType: TraceType, 151*90c8c64dSAndroid Build Coastguard Worker private readonly errorMessage: string, 152*90c8c64dSAndroid Build Coastguard Worker ) { 153*90c8c64dSAndroid Build Coastguard Worker super(); 154*90c8c64dSAndroid Build Coastguard Worker } 155*90c8c64dSAndroid Build Coastguard Worker 156*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 157*90c8c64dSAndroid Build Coastguard Worker return 'failed to create traces parser'; 158*90c8c64dSAndroid Build Coastguard Worker } 159*90c8c64dSAndroid Build Coastguard Worker 160*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 161*90c8c64dSAndroid Build Coastguard Worker return `Failed to create ${TRACE_INFO[this.traceType].name} parser: ${ 162*90c8c64dSAndroid Build Coastguard Worker this.errorMessage 163*90c8c64dSAndroid Build Coastguard Worker }`; 164*90c8c64dSAndroid Build Coastguard Worker } 165*90c8c64dSAndroid Build Coastguard Worker} 166*90c8c64dSAndroid Build Coastguard Worker 167*90c8c64dSAndroid Build Coastguard Workerexport class CannotVisualizeTraceEntry extends UserWarning { 168*90c8c64dSAndroid Build Coastguard Worker constructor(private readonly errorMessage: string) { 169*90c8c64dSAndroid Build Coastguard Worker super(); 170*90c8c64dSAndroid Build Coastguard Worker } 171*90c8c64dSAndroid Build Coastguard Worker 172*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 173*90c8c64dSAndroid Build Coastguard Worker return 'cannot visualize trace entry'; 174*90c8c64dSAndroid Build Coastguard Worker } 175*90c8c64dSAndroid Build Coastguard Worker 176*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 177*90c8c64dSAndroid Build Coastguard Worker return this.errorMessage; 178*90c8c64dSAndroid Build Coastguard Worker } 179*90c8c64dSAndroid Build Coastguard Worker} 180*90c8c64dSAndroid Build Coastguard Worker 181*90c8c64dSAndroid Build Coastguard Workerexport class FailedToInitializeTimelineData extends UserWarning { 182*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 183*90c8c64dSAndroid Build Coastguard Worker return 'failed to initialize timeline data'; 184*90c8c64dSAndroid Build Coastguard Worker } 185*90c8c64dSAndroid Build Coastguard Worker 186*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 187*90c8c64dSAndroid Build Coastguard Worker return 'Cannot visualize all traces: Failed to initialize timeline data.\nTry removing some traces.'; 188*90c8c64dSAndroid Build Coastguard Worker } 189*90c8c64dSAndroid Build Coastguard Worker} 190*90c8c64dSAndroid Build Coastguard Worker 191*90c8c64dSAndroid Build Coastguard Workerexport class IncompleteFrameMapping extends UserWarning { 192*90c8c64dSAndroid Build Coastguard Worker constructor(private readonly errorMessage: string) { 193*90c8c64dSAndroid Build Coastguard Worker super(); 194*90c8c64dSAndroid Build Coastguard Worker } 195*90c8c64dSAndroid Build Coastguard Worker 196*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 197*90c8c64dSAndroid Build Coastguard Worker return 'incomplete frame mapping'; 198*90c8c64dSAndroid Build Coastguard Worker } 199*90c8c64dSAndroid Build Coastguard Worker 200*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 201*90c8c64dSAndroid Build Coastguard Worker return `Error occurred in frame mapping: ${this.errorMessage}`; 202*90c8c64dSAndroid Build Coastguard Worker } 203*90c8c64dSAndroid Build Coastguard Worker} 204*90c8c64dSAndroid Build Coastguard Worker 205*90c8c64dSAndroid Build Coastguard Workerexport class NoTraceTargetsSelected extends UserWarning { 206*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 207*90c8c64dSAndroid Build Coastguard Worker return 'No trace targets selected'; 208*90c8c64dSAndroid Build Coastguard Worker } 209*90c8c64dSAndroid Build Coastguard Worker 210*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 211*90c8c64dSAndroid Build Coastguard Worker return 'No trace targets selected.'; 212*90c8c64dSAndroid Build Coastguard Worker } 213*90c8c64dSAndroid Build Coastguard Worker} 214*90c8c64dSAndroid Build Coastguard Worker 215*90c8c64dSAndroid Build Coastguard Workerexport class MissingVsyncId extends UserWarning { 216*90c8c64dSAndroid Build Coastguard Worker constructor(private readonly tableName: string) { 217*90c8c64dSAndroid Build Coastguard Worker super(); 218*90c8c64dSAndroid Build Coastguard Worker } 219*90c8c64dSAndroid Build Coastguard Worker 220*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 221*90c8c64dSAndroid Build Coastguard Worker return 'missing vsync id'; 222*90c8c64dSAndroid Build Coastguard Worker } 223*90c8c64dSAndroid Build Coastguard Worker 224*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 225*90c8c64dSAndroid Build Coastguard Worker return `missing vsync_id value for one or more entries in ${this.tableName}`; 226*90c8c64dSAndroid Build Coastguard Worker } 227*90c8c64dSAndroid Build Coastguard Worker} 228*90c8c64dSAndroid Build Coastguard Worker 229*90c8c64dSAndroid Build Coastguard Workerexport class ProxyTraceTimeout extends UserWarning { 230*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 231*90c8c64dSAndroid Build Coastguard Worker return 'proxy trace timeout'; 232*90c8c64dSAndroid Build Coastguard Worker } 233*90c8c64dSAndroid Build Coastguard Worker 234*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 235*90c8c64dSAndroid Build Coastguard Worker return 'Errors occurred during tracing: trace timed out'; 236*90c8c64dSAndroid Build Coastguard Worker } 237*90c8c64dSAndroid Build Coastguard Worker} 238*90c8c64dSAndroid Build Coastguard Worker 239*90c8c64dSAndroid Build Coastguard Workerexport class ProxyTracingWarnings extends UserWarning { 240*90c8c64dSAndroid Build Coastguard Worker constructor(private readonly warnings: string[]) { 241*90c8c64dSAndroid Build Coastguard Worker super(); 242*90c8c64dSAndroid Build Coastguard Worker } 243*90c8c64dSAndroid Build Coastguard Worker 244*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 245*90c8c64dSAndroid Build Coastguard Worker return 'proxy tracing warnings'; 246*90c8c64dSAndroid Build Coastguard Worker } 247*90c8c64dSAndroid Build Coastguard Worker 248*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 249*90c8c64dSAndroid Build Coastguard Worker return `Trace collection warning: ${this.warnings.join(', ')}`; 250*90c8c64dSAndroid Build Coastguard Worker } 251*90c8c64dSAndroid Build Coastguard Worker} 252*90c8c64dSAndroid Build Coastguard Worker 253*90c8c64dSAndroid Build Coastguard Workerexport class ProxyTracingErrors extends UserWarning { 254*90c8c64dSAndroid Build Coastguard Worker constructor(private readonly errorMessages: string[]) { 255*90c8c64dSAndroid Build Coastguard Worker super(); 256*90c8c64dSAndroid Build Coastguard Worker } 257*90c8c64dSAndroid Build Coastguard Worker 258*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 259*90c8c64dSAndroid Build Coastguard Worker return 'proxy tracing errors'; 260*90c8c64dSAndroid Build Coastguard Worker } 261*90c8c64dSAndroid Build Coastguard Worker 262*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 263*90c8c64dSAndroid Build Coastguard Worker return `Trace collection errors: ${this.errorMessages.join(', ')}`; 264*90c8c64dSAndroid Build Coastguard Worker } 265*90c8c64dSAndroid Build Coastguard Worker} 266*90c8c64dSAndroid Build Coastguard Worker 267*90c8c64dSAndroid Build Coastguard Workerexport class MissingLayerIds extends UserWarning { 268*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 269*90c8c64dSAndroid Build Coastguard Worker return 'missing layer ids'; 270*90c8c64dSAndroid Build Coastguard Worker } 271*90c8c64dSAndroid Build Coastguard Worker 272*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 273*90c8c64dSAndroid Build Coastguard Worker return 'Cannot parse some layers due to null or undefined layer id'; 274*90c8c64dSAndroid Build Coastguard Worker } 275*90c8c64dSAndroid Build Coastguard Worker} 276*90c8c64dSAndroid Build Coastguard Worker 277*90c8c64dSAndroid Build Coastguard Workerexport class DuplicateLayerIds extends UserWarning { 278*90c8c64dSAndroid Build Coastguard Worker constructor(private readonly layerIds: number[]) { 279*90c8c64dSAndroid Build Coastguard Worker super(); 280*90c8c64dSAndroid Build Coastguard Worker } 281*90c8c64dSAndroid Build Coastguard Worker 282*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 283*90c8c64dSAndroid Build Coastguard Worker return 'duplicate layer id'; 284*90c8c64dSAndroid Build Coastguard Worker } 285*90c8c64dSAndroid Build Coastguard Worker 286*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 287*90c8c64dSAndroid Build Coastguard Worker const optionalPlural = this.layerIds.length > 1 ? 's' : ''; 288*90c8c64dSAndroid Build Coastguard Worker const layerIds = this.layerIds.join(', '); 289*90c8c64dSAndroid Build Coastguard Worker return `Duplicate SF layer id${optionalPlural} ${layerIds} found - adding as "Duplicate" to the hierarchy`; 290*90c8c64dSAndroid Build Coastguard Worker } 291*90c8c64dSAndroid Build Coastguard Worker} 292*90c8c64dSAndroid Build Coastguard Worker 293*90c8c64dSAndroid Build Coastguard Workerexport class MonotonicScreenRecording extends UserWarning { 294*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 295*90c8c64dSAndroid Build Coastguard Worker return 'monotonic screen recording'; 296*90c8c64dSAndroid Build Coastguard Worker } 297*90c8c64dSAndroid Build Coastguard Worker 298*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 299*90c8c64dSAndroid Build Coastguard Worker return `Screen recording may not be synchronized with the 300*90c8c64dSAndroid Build Coastguard Worker other traces. Metadata contains monotonic time instead of elapsed.`; 301*90c8c64dSAndroid Build Coastguard Worker } 302*90c8c64dSAndroid Build Coastguard Worker} 303*90c8c64dSAndroid Build Coastguard Worker 304*90c8c64dSAndroid Build Coastguard Workerexport class CannotParseAllTransitions extends UserWarning { 305*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 306*90c8c64dSAndroid Build Coastguard Worker return 'cannot parse all transitions'; 307*90c8c64dSAndroid Build Coastguard Worker } 308*90c8c64dSAndroid Build Coastguard Worker 309*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 310*90c8c64dSAndroid Build Coastguard Worker return 'Cannot parse all transitions. Some may be missing in Transitions viewer.'; 311*90c8c64dSAndroid Build Coastguard Worker } 312*90c8c64dSAndroid Build Coastguard Worker} 313*90c8c64dSAndroid Build Coastguard Worker 314*90c8c64dSAndroid Build Coastguard Workerexport class TraceSearchQueryFailed extends UserWarning { 315*90c8c64dSAndroid Build Coastguard Worker constructor(private readonly errorMessage: string) { 316*90c8c64dSAndroid Build Coastguard Worker super(); 317*90c8c64dSAndroid Build Coastguard Worker } 318*90c8c64dSAndroid Build Coastguard Worker 319*90c8c64dSAndroid Build Coastguard Worker getDescriptor(): string { 320*90c8c64dSAndroid Build Coastguard Worker return 'trace search query failed'; 321*90c8c64dSAndroid Build Coastguard Worker } 322*90c8c64dSAndroid Build Coastguard Worker 323*90c8c64dSAndroid Build Coastguard Worker getMessage(): string { 324*90c8c64dSAndroid Build Coastguard Worker return `Search query failed: ${this.errorMessage}`; 325*90c8c64dSAndroid Build Coastguard Worker } 326*90c8c64dSAndroid Build Coastguard Worker} 327