Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(563)

Unified Diff: ui/file_manager/file_manager/background/js/media_import_handler.js

Issue 918713003: Files.app: Add analytics code to instrument cloud import flows. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reorg/rename metrics events. Fix a metrics loading bug. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/file_manager/file_manager/background/js/media_import_handler.js
diff --git a/ui/file_manager/file_manager/background/js/media_import_handler.js b/ui/file_manager/file_manager/background/js/media_import_handler.js
index dffda98f714b4f715d912255e47b1bb6f185917a..848de3884a24dbaba59e916d5ceaf00173d74fa6 100644
--- a/ui/file_manager/file_manager/background/js/media_import_handler.js
+++ b/ui/file_manager/file_manager/background/js/media_import_handler.js
@@ -32,10 +32,11 @@ importer.ImportRunner.prototype.importFromScanResult;
*
* @param {!ProgressCenter} progressCenter
* @param {!importer.HistoryLoader} historyLoader
- * @param {!importer.DuplicateFinder} duplicateFinder
+ * @param {!importer.DuplicateFinder.Factory} duplicateFinderFactory
+ * @param {!analytics.Tracker} tracker
*/
importer.MediaImportHandler =
- function(progressCenter, historyLoader, duplicateFinder) {
+ function(progressCenter, historyLoader, duplicateFinderFactory, tracker) {
/** @private {!ProgressCenter} */
this.progressCenter_ = progressCenter;
@@ -45,8 +46,11 @@ importer.MediaImportHandler =
/** @private {!importer.TaskQueue} */
this.queue_ = new importer.TaskQueue();
- /** @private {!importer.DuplicateFinder} */
- this.duplicateFinder_ = duplicateFinder;
+ /** @private {!importer.DuplicateFinder.Factory} */
+ this.duplicateFinderFactory_ = duplicateFinderFactory;
+
+ /** @private {!analytics.Tracker} */
+ this.tracker_ = tracker;
/** @private {number} */
this.nextTaskId_ = 0;
@@ -61,8 +65,9 @@ importer.MediaImportHandler.prototype.importFromScanResult =
this.historyLoader_,
scanResult,
directoryPromise,
- this.duplicateFinder_,
- destination);
+ this.duplicateFinderFactory_.create(),
+ destination,
+ this.tracker_);
task.addObserver(this.onTaskProgress_.bind(this, task));
@@ -145,6 +150,7 @@ importer.MediaImportHandler.prototype.onTaskProgress_ =
* @param {!importer.DuplicateFinder} duplicateFinder A duplicate-finder linked
* to the import destination, that will be used to deduplicate imports.
* @param {!importer.Destination} destination The logical destination.
+ * @param {!analytics.Tracker} tracker
*/
importer.MediaImportHandler.ImportTask = function(
taskId,
@@ -152,7 +158,8 @@ importer.MediaImportHandler.ImportTask = function(
scanResult,
directoryPromise,
duplicateFinder,
- destination) {
+ destination,
+ tracker) {
importer.TaskQueue.BaseTask.call(this, taskId);
/** @private {string} */
@@ -173,6 +180,9 @@ importer.MediaImportHandler.ImportTask = function(
/** @private {!importer.HistoryLoader} */
this.historyLoader_ = historyLoader;
+ /** @private {!analytics.Tracker} */
+ this.tracker_ = tracker;
+
/** @private {number} */
this.totalBytes_ = 0;
@@ -187,6 +197,9 @@ importer.MediaImportHandler.ImportTask = function(
/** @private {boolean} Indicates whether this task was canceled. */
this.canceled_ = false;
+
+ /** @private {number} Number of files deduped by content dedupe. */
+ this.dedupeCount_ = 0;
};
/** @struct */
@@ -252,9 +265,15 @@ importer.MediaImportHandler.ImportTask.prototype.requestCancel = function() {
/** @private */
importer.MediaImportHandler.ImportTask.prototype.initialize_ = function() {
- this.remainingFilesCount_ = this.scanResult_.getFileEntries().length;
- this.totalBytes_ = this.scanResult_.getTotalBytes();
+ var stats = this.scanResult_.getStatistics();
+
+ this.remainingFilesCount_ = stats.newFileCount;
+ this.totalBytes_ = stats.sizeBytes;
this.notify(importer.TaskQueue.UpdateType.PROGRESS);
+
+ this.tracker_.send(metrics.ImportEvents.STARTED);
+ this.tracker_.send(metrics.ImportEvents.HISTORY_DEDUPE_COUNT
+ .value(stats.duplicateFileCount));
};
/**
@@ -286,6 +305,8 @@ importer.MediaImportHandler.ImportTask.prototype.importOne_ =
function(destinationDirectory, completionCallback, entry) {
if (this.canceled_) {
this.notify(importer.TaskQueue.UpdateType.CANCELED);
+ this.tracker_.send(metrics.ImportEvents.CANCELLED);
+ this.sendImportStats_();
return;
}
@@ -296,6 +317,7 @@ importer.MediaImportHandler.ImportTask.prototype.importOne_ =
if (isDuplicate) {
// If the given file is a duplicate, don't import it again. Just
// update the progress indicator.
+ this.dedupeCount_++;
this.markAsImported_(entry);
this.processedBytes_ += entry.size;
this.notify(importer.TaskQueue.UpdateType.PROGRESS);
@@ -432,6 +454,8 @@ importer.MediaImportHandler.ImportTask.prototype.markAsImported_ =
/** @private */
importer.MediaImportHandler.ImportTask.prototype.onSuccess_ = function() {
this.notify(importer.TaskQueue.UpdateType.SUCCESS);
+ this.tracker_.send(metrics.ImportEvents.ENDED);
+ this.sendImportStats_();
};
/**
@@ -440,4 +464,36 @@ importer.MediaImportHandler.ImportTask.prototype.onSuccess_ = function() {
*/
importer.MediaImportHandler.ImportTask.prototype.onError_ = function(error) {
this.notify(importer.TaskQueue.UpdateType.ERROR);
+ // TODO(kenobi): Impedence mismatch: this gets called per-file, which is
+ // different from onSuccess, which reports overall import success.
+ this.tracker_.send(metrics.ImportEvents.ERROR);
+};
+
+/**
+ * Sends import statistics to analytics.
+ */
+importer.MediaImportHandler.ImportTask.prototype.sendImportStats_ = function() {
+ this.tracker_.send(
+ metrics.ImportEvents.CONTENT_DEDUPE_COUNT
+ .value(this.dedupeCount_));
+ // TODO(kenobi): Send correct import byte counts.
+ var importFileCount = this.scanResult_.getStatistics().newFileCount -
+ (this.dedupeCount_ + this.remainingFilesCount_);
+ this.tracker_.send(
+ metrics.ImportEvents.FILE_COUNT
+ .value(importFileCount));
+
+ // Send aggregate deduplication timings, to avoid flooding analytics with one
+ // timing per file.
+ var deduplicatorStats = this.deduplicator_.getStatistics();
+ this.tracker_.sendTiming(
+ metrics.Categories.ACQUISITION,
+ metrics.timing.Variables.COMPUTE_HASH,
+ deduplicatorStats.computeHashTime,
+ 'In Place');
+ this.tracker_.sendTiming(
+ metrics.Categories.ACQUISITION,
+ metrics.timing.Variables.SEARCH_BY_HASH,
+ deduplicatorStats.searchHashTime);
+
};

Powered by Google App Engine
This is Rietveld 408576698