| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| part of reporting; |
| |
| /// A generic usage even that does not involve custom dimensions. |
| /// |
| /// If sending values for custom dimensions is required, extend this class as |
| /// below. |
| class UsageEvent { |
| UsageEvent(this.category, this.parameter); |
| |
| final String category; |
| final String parameter; |
| |
| void send() { |
| flutterUsage.sendEvent(category, parameter); |
| } |
| } |
| |
| /// A usage event related to hot reload/restart. |
| /// |
| /// On a successful hot reload, we collect stats that help understand scale of |
| /// the update. For example, [syncedLibraryCount]/[finalLibraryCount] indicates |
| /// how many libraries were affected by the hot reload request. Relation of |
| /// [invalidatedSourcesCount] to [syncedLibraryCount] should help understand |
| /// sync/transfer "overhead" of updating this number of source files. |
| class HotEvent extends UsageEvent { |
| HotEvent(String parameter, { |
| @required this.targetPlatform, |
| @required this.sdkName, |
| @required this.emulator, |
| @required this.fullRestart, |
| this.reason, |
| this.finalLibraryCount, |
| this.syncedLibraryCount, |
| this.syncedClassesCount, |
| this.syncedProceduresCount, |
| this.syncedBytes, |
| this.invalidatedSourcesCount, |
| this.transferTimeInMs, |
| this.overallTimeInMs, |
| }) : super('hot', parameter); |
| |
| final String reason; |
| final String targetPlatform; |
| final String sdkName; |
| final bool emulator; |
| final bool fullRestart; |
| final int finalLibraryCount; |
| final int syncedLibraryCount; |
| final int syncedClassesCount; |
| final int syncedProceduresCount; |
| final int syncedBytes; |
| final int invalidatedSourcesCount; |
| final int transferTimeInMs; |
| final int overallTimeInMs; |
| |
| @override |
| void send() { |
| final Map<String, String> parameters = _useCdKeys(<CustomDimensions, String>{ |
| CustomDimensions.hotEventTargetPlatform: targetPlatform, |
| CustomDimensions.hotEventSdkName: sdkName, |
| CustomDimensions.hotEventEmulator: emulator.toString(), |
| CustomDimensions.hotEventFullRestart: fullRestart.toString(), |
| if (reason != null) |
| CustomDimensions.hotEventReason: reason, |
| if (finalLibraryCount != null) |
| CustomDimensions.hotEventFinalLibraryCount: finalLibraryCount.toString(), |
| if (syncedLibraryCount != null) |
| CustomDimensions.hotEventSyncedLibraryCount: syncedLibraryCount.toString(), |
| if (syncedClassesCount != null) |
| CustomDimensions.hotEventSyncedClassesCount: syncedClassesCount.toString(), |
| if (syncedProceduresCount != null) |
| CustomDimensions.hotEventSyncedProceduresCount: syncedProceduresCount.toString(), |
| if (syncedBytes != null) |
| CustomDimensions.hotEventSyncedBytes: syncedBytes.toString(), |
| if (invalidatedSourcesCount != null) |
| CustomDimensions.hotEventInvalidatedSourcesCount: invalidatedSourcesCount.toString(), |
| if (transferTimeInMs != null) |
| CustomDimensions.hotEventTransferTimeInMs: transferTimeInMs.toString(), |
| if (overallTimeInMs != null) |
| CustomDimensions.hotEventOverallTimeInMs: overallTimeInMs.toString(), |
| }); |
| flutterUsage.sendEvent(category, parameter, parameters: parameters); |
| } |
| } |
| |
| /// An event that reports the result of a [DoctorValidator] |
| class DoctorResultEvent extends UsageEvent { |
| DoctorResultEvent({ |
| @required DoctorValidator validator, |
| @required ValidationResult result |
| }) : super('doctorResult.${validator.runtimeType.toString()}', |
| result.typeStr); |
| // TODO(zra): Override send() to detect a GroupedValidator and send separate |
| // events for each sub-validator. |
| } |
| |
| /// An event that reports success or failure of a pub get. |
| class PubGetEvent extends UsageEvent { |
| PubGetEvent({ |
| @required bool success, |
| }) : super('packages-pub-get', success ? 'success' : 'failure'); |
| } |
| |
| /// An event that reports something about a build. |
| class BuildEvent extends UsageEvent { |
| BuildEvent(String parameter, { |
| this.command, |
| this.settings, |
| }) : super( |
| 'build' + |
| (FlutterCommand.current == null ? '' : '-${FlutterCommand.current.name}'), |
| parameter); |
| |
| final String command; |
| final String settings; |
| |
| @override |
| void send() { |
| final Map<String, String> parameters = _useCdKeys(<CustomDimensions, String>{ |
| if (command != null) |
| CustomDimensions.buildEventCommand: command, |
| if (settings != null) |
| CustomDimensions.buildEventSettings: settings, |
| }); |
| flutterUsage.sendEvent(category, parameter, parameters: parameters); |
| } |
| } |
| |
| /// An event that reports the result of a top-level command. |
| class CommandResultEvent extends UsageEvent { |
| CommandResultEvent(String commandPath, FlutterCommandResult result) |
| : super(commandPath, result?.toString() ?? 'unspecified'); |
| } |