blob: fc02eef0228f5cd23a3b6783185bf57812804d86 [file] [log] [blame]
// Copyright 2024 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/policy/skyvault/histogram_helper.h"
#include <string>
#include "base/metrics/histogram.h"
#include "base/metrics/histogram_functions.h"
#include "base/notreached.h"
#include "base/strings/strcat.h"
#include "chrome/browser/ash/policy/skyvault/local_files_migration_constants.h"
#include "chrome/browser/ash/policy/skyvault/policy_utils.h"
namespace policy::local_user_files {
namespace {
constexpr char kSkyVaultUMAPrefix[] = "Enterprise.SkyVault.";
// Suffixes for upload flow histograms.
constexpr char kDeleteErrorSuffix[] = "DeleteError";
constexpr char kOneDriveSignInErrorSuffix[] = "SignInError";
// Suffixes for local storage histograms.
constexpr char kLocalStorageEnabledSuffix[] = "LocalStorage.Enabled";
constexpr char kLocalStorageMisconfiguredSuffix[] =
"LocalStorage.Misconfigured";
// Suffixes for migration flow histograms.
constexpr char kMigrationEnabledSuffix[] = "Enabled";
constexpr char kMigrationMisconfiguredSuffix[] = "Misconfigured";
constexpr char kMigrationResetSuffix[] = "Reset";
constexpr char kMigrationRetrySuffix[] = "Retry";
constexpr char kMigrationStoppedSuffix[] = "Stopped";
constexpr char kMigrationStateErrorContextSuffix[] = "StateErrorContext";
constexpr char kMigrationWrongStateSuffix[] = "WrongState";
constexpr char kMigrationFailedSuffix[] = "Failed";
constexpr char kMigrationSuccessDurationSuffix[] = "SuccessDuration";
constexpr char kMigrationFailureDurationSuffix[] = "FailureDuration";
constexpr char kMigrationWriteAccessErrorSuffix[] = "WriteAccessError";
constexpr char kMigrationUploadErrorSuffix[] = "UploadError";
constexpr char kMigrationDialogActionSuffix[] = "DialogAction";
constexpr char kMigrationDialogShownSuffix[] = "DialogShown";
// Constants for cloud providers used in histogram names.
constexpr char kGoogleDriveProvider[] = "GoogleDrive";
constexpr char kOneDriveProvider[] = "OneDrive";
// Constants for upload triggers used in histogram names.
constexpr char kDownloadTrigger[] = "Download";
constexpr char kScreenCaptureTrigger[] = "ScreenCapture";
constexpr char kMigrationTrigger[] = "Migration";
// Min, max, and bucket count for time based histograms.
constexpr base::TimeDelta kMin = base::Milliseconds(1);
constexpr base::TimeDelta kMax = base::Hours(36);
// Number of buckets calculated to have a bucket size of 5 minutes:
// (kMax in h * 60 min/h) / 5 min/bucket = 36 * 60 / 5 = 432 buckets
constexpr int kBuckets = 432;
// Converts `provider` to a string representation used to form a metric name.
std::string GetUMACloudProvider(CloudProvider provider) {
switch (provider) {
case CloudProvider::kNotSpecified:
NOTREACHED();
case CloudProvider::kGoogleDrive:
return kGoogleDriveProvider;
case CloudProvider::kOneDrive:
return kOneDriveProvider;
}
}
// Converts `trigger` to a string representation used to form a metric name.
std::string GetUMAAction(UploadTrigger trigger) {
std::string action;
switch (trigger) {
case UploadTrigger::kDownload:
return kDownloadTrigger;
case UploadTrigger::kScreenCapture:
return kScreenCaptureTrigger;
case UploadTrigger::kMigration:
return kMigrationTrigger;
}
}
std::string GetHistogramName(
const std::string& suffix,
std::optional<UploadTrigger> trigger = std::nullopt,
std::optional<CloudProvider> provider = std::nullopt) {
std::vector<std::string> parts = {kSkyVaultUMAPrefix};
if (trigger.has_value()) {
parts.push_back(GetUMAAction(trigger.value()));
parts.push_back(".");
}
if (provider.has_value()) {
parts.push_back(GetUMACloudProvider(provider.value()));
parts.push_back(".");
}
parts.push_back(suffix);
return base::StrCat(parts);
}
} // namespace
void SkyVaultDeleteErrorHistogram(UploadTrigger trigger,
CloudProvider provider,
bool value) {
base::UmaHistogramBoolean(
GetHistogramName(kDeleteErrorSuffix, trigger, provider), value);
}
void SkyVaultOneDriveSignInErrorHistogram(UploadTrigger trigger, bool value) {
base::UmaHistogramBoolean(GetHistogramName(kOneDriveSignInErrorSuffix,
trigger, CloudProvider::kOneDrive),
value);
}
void SkyVaultLocalStorageEnabledHistogram(bool value) {
base::UmaHistogramBoolean(GetHistogramName(kLocalStorageEnabledSuffix),
value);
}
void SkyVaultLocalStorageMisconfiguredHistogram(bool value) {
base::UmaHistogramBoolean(GetHistogramName(kLocalStorageMisconfiguredSuffix),
value);
}
void SkyVaultMigrationEnabledHistogram(CloudProvider provider, bool value) {
base::UmaHistogramBoolean(
GetHistogramName(kMigrationEnabledSuffix, UploadTrigger::kMigration,
provider),
value);
}
void SkyVaultMigrationMisconfiguredHistogram(CloudProvider provider,
bool value) {
base::UmaHistogramBoolean(
GetHistogramName(kMigrationMisconfiguredSuffix, UploadTrigger::kMigration,
provider),
value);
}
void SkyVaultMigrationResetHistogram(bool value) {
base::UmaHistogramBoolean(
GetHistogramName(kMigrationResetSuffix, UploadTrigger::kMigration),
value);
}
void SkyVaultMigrationRetryHistogram(int count) {
base::UmaHistogramCustomCounts(
GetHistogramName(kMigrationRetrySuffix, UploadTrigger::kMigration), count,
1, kMaxRetryCount, kMaxRetryCount);
}
void SkyVaultMigrationStoppedHistogram(CloudProvider provider, bool value) {
base::UmaHistogramBoolean(
GetHistogramName(kMigrationStoppedSuffix, UploadTrigger::kMigration,
provider),
value);
}
void SkyVaultMigrationWrongStateHistogram(CloudProvider provider,
StateErrorContext context,
State state) {
base::UmaHistogramEnumeration(
GetHistogramName(kMigrationStateErrorContextSuffix,
UploadTrigger::kMigration, provider),
context);
base::UmaHistogramEnumeration(
GetHistogramName(kMigrationWrongStateSuffix, UploadTrigger::kMigration,
provider),
state);
}
void SkyVaultMigrationDoneHistograms(CloudProvider provider,
bool success,
base::TimeDelta duration) {
base::UmaHistogramBoolean(
GetHistogramName(kMigrationFailedSuffix, UploadTrigger::kMigration,
provider),
!success);
const std::string suffix = success ? kMigrationSuccessDurationSuffix
: kMigrationFailureDurationSuffix;
base::UmaHistogramCustomTimes(
GetHistogramName(suffix, UploadTrigger::kMigration, provider), duration,
kMin, kMax, kBuckets);
}
void SkyVaultMigrationWriteAccessErrorHistogram(bool value) {
base::UmaHistogramBoolean(GetHistogramName(kMigrationWriteAccessErrorSuffix,
UploadTrigger::kMigration),
value);
}
void SkyVaultMigrationUploadErrorHistogram(CloudProvider provider,
MigrationUploadError error) {
base::UmaHistogramEnumeration(
GetHistogramName(kMigrationUploadErrorSuffix, UploadTrigger::kMigration,
provider),
error);
}
void SkyVaultMigrationDialogActionHistogram(CloudProvider provider,
DialogAction action) {
base::UmaHistogramEnumeration(
GetHistogramName(kMigrationDialogActionSuffix, UploadTrigger::kMigration,
provider),
action);
}
void SkyVaultMigrationDialogShownHistogram(CloudProvider provider, bool value) {
base::UmaHistogramBoolean(
GetHistogramName(kMigrationDialogShownSuffix, UploadTrigger::kMigration,
provider),
value);
}
} // namespace policy::local_user_files