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

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: Address feedback. 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 bbc64371624a23f8d4e6e87aa237f1dbfe4de9ba..7fc0c4e5d725794ace3e5cd94f7a08ec45cb9803 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
@@ -38,10 +38,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;
@@ -51,8 +52,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;
@@ -69,8 +73,9 @@ importer.MediaImportHandler.prototype.importFromScanResult =
this.historyLoader_,
scanResult,
destinationDirectory,
- this.duplicateFinder_,
- destination);
+ this.duplicateFinderFactory_.create(),
+ destination,
+ this.tracker_);
task.addObserver(this.onTaskProgress_.bind(this, task));
@@ -154,6 +159,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,
@@ -161,7 +167,8 @@ importer.MediaImportHandler.ImportTask = function(
scanResult,
destinationFactory,
duplicateFinder,
- destination) {
+ destination,
+ tracker) {
importer.TaskQueue.BaseTask.call(this, taskId);
/** @private {string} */
@@ -182,6 +189,9 @@ importer.MediaImportHandler.ImportTask = function(
/** @private {!importer.HistoryLoader} */
this.historyLoader_ = historyLoader;
+ /** @private {!analytics.Tracker} */
+ this.tracker_ = tracker;
+
/** @private {Promise<!DirectoryEntry>} */
this.destinationPromise_ = null;
@@ -199,6 +209,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 */
@@ -254,6 +267,7 @@ importer.MediaImportHandler.ImportTask.prototype.run = function() {
*/
importer.MediaImportHandler.ImportTask.prototype.requestCancel = function() {
this.canceled_ = true;
+ this.tracker_.send(metrics.Events.IMPORT_CANCELLED);
if (this.cancelCallback_) {
// Reset the callback before calling it, as the callback might do anything
// (including calling #requestCancel again).
@@ -265,9 +279,19 @@ 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.Events.IMPORT_STARTED);
+ this.tracker_.send(metrics.Events.IMPORT_FILE_COUNT
Steve McKay 2015/02/17 23:47:50 Report file and byte count only when finished.
Ben Kwa 2015/02/18 22:23:01 File counts - done. Byte counts - as discussed of
+ .value(this.remainingFilesCount_));
+ this.tracker_.send(metrics.Events.IMPORT_BYTE_COUNT
+ .value(this.totalBytes_));
+ this.tracker_.send(metrics.Events.HISTORY_DEDUPE_COUNT
+ .value(stats.duplicateFileCount));
};
/**
@@ -318,6 +342,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);
@@ -451,6 +476,21 @@ importer.MediaImportHandler.ImportTask.prototype.markAsImported_ =
/** @private */
importer.MediaImportHandler.ImportTask.prototype.onSuccess_ = function() {
this.notify(importer.TaskQueue.UpdateType.SUCCESS);
+ this.tracker_.send(metrics.Events.IMPORT_ENDED);
+ this.tracker_.send(metrics.Events.CONTENT_DEDUPE_COUNT
+ .value(this.dedupeCount_));
+
+ // Send aggregate deduplication timings, to avoid flooding analytics with one
+ // timing per file.
+ var deduplicatorStats = this.deduplicator_.getStatistics();
+ this.tracker_.sendTiming(
+ metrics.Categories.IMPORT,
+ metrics.timing.Variables.COMPUTE_HASH,
+ deduplicatorStats.computeHashTime);
+ this.tracker_.sendTiming(
+ metrics.Categories.IMPORT,
+ metrics.timing.Variables.SEARCH_BY_HASH,
+ deduplicatorStats.searchHashTime);
};
/**
@@ -459,6 +499,9 @@ 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.Events.IMPORT_ERROR);
};
/**

Powered by Google App Engine
This is Rietveld 408576698