// 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