1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/file_system_provider/odfs_metrics.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/strcat.h"
namespace ash::file_system_provider {
namespace {
const char* ToString(RequestType request_type) {
switch (request_type) {
case RequestType::kAbort:
return "onAbortRequested";
case RequestType::kAddWatcher:
return "onAddWatcherRequested";
case RequestType::kCloseFile:
return "onCloseFileRequested";
case RequestType::kConfigure:
return "onConfigureRequested";
case RequestType::kCopyEntry:
return "onCopyEntryRequested";
case RequestType::kCreateDirectory:
return "onCreateDirectoryRequested";
case RequestType::kCreateFile:
return "onCreateFileRequested";
case RequestType::kDeleteEntry:
return "onDeleteEntryRequested";
case RequestType::kExecuteAction:
return "onExecuteActionRequested";
case RequestType::kGetActions:
return "onGetActionsRequested";
case RequestType::kGetMetadata:
return "onGetMetadataRequested";
case RequestType::kMount:
return "onMountRequested";
case RequestType::kMoveEntry:
return "onMoveEntryRequested";
case RequestType::kOpenFile:
return "onOpenFileRequested";
case RequestType::kReadDirectory:
return "onReadDirectoryRequested";
case RequestType::kReadFile:
return "onReadFileRequested";
case RequestType::kRemoveWatcher:
return "onRemoveWatcherRequested";
case RequestType::kTruncate:
return "onTruncateRequested";
case RequestType::kUnmount:
return "onUnmountRequested";
case RequestType::kWriteFile:
return "onWriteFileRequested";
}
}
std::string GetHistogramName(const char* metric, RequestType request_type) {
return base::StrCat({"FileBrowser.OfficeFiles.ODFS.FileSystemProvider.",
metric, ".", ToString(request_type)});
}
} // namespace
struct ODFSMetrics::Request {
RequestType request_type;
base::File::Error result = base::File::FILE_OK;
base::ElapsedTimer latency_timer;
};
ODFSMetrics::ODFSMetrics() = default;
ODFSMetrics::~ODFSMetrics() = default;
void ODFSMetrics::OnRequestCreated(int request_id, RequestType type) {
Request& request = requests_[request_id];
request.request_type = type;
}
void ODFSMetrics::OnRequestDestroyed(int request_id,
OperationCompletion completion) {
auto it = requests_.find(request_id);
if (it == requests_.end()) {
return;
}
Request& request = it->second;
base::UmaHistogramMediumTimes(GetHistogramName("Time", request.request_type),
request.latency_timer.Elapsed());
base::UmaHistogramEnumeration(
GetHistogramName("Completion", request.request_type), completion);
requests_.erase(it);
}
void ODFSMetrics::OnRequestExecuted(int request_id) {}
void ODFSMetrics::OnRequestFulfilled(int request_id,
const RequestValue& result,
bool has_more) {
if (!has_more) {
RecordResult(request_id, base::File::FILE_OK);
}
}
void ODFSMetrics::OnRequestRejected(int request_id,
const RequestValue& result,
base::File::Error error) {
RecordResult(request_id, error);
}
void ODFSMetrics::OnRequestTimedOut(int request_id) {}
void ODFSMetrics::RecordResult(int request_id, base::File::Error error) {
auto it = requests_.find(request_id);
if (it == requests_.end()) {
return;
}
Request& request = it->second;
base::UmaHistogramExactLinear(GetHistogramName("Error", request.request_type),
-error, -base::File::FILE_ERROR_MAX);
}
} // namespace ash::file_system_provider
|