blob: 3ec3a9ea49d6fc84f601963ab62467974009da34 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/network/trust_tokens/trust_token_operation_metrics_recorder.h"
#include "base/metrics/histogram_functions.h"
#include "base/strings/string_util.h"
#include "services/network/public/mojom/trust_tokens.mojom-shared.h"
namespace network {
namespace internal {
const char kTrustTokenTotalTimeHistogramNameBase[] =
"Net.TrustTokens.OperationTotalTime";
const char kTrustTokenFinalizeTimeHistogramNameBase[] =
"Net.TrustTokens.OperationFinalizeTime";
const char kTrustTokenBeginTimeHistogramNameBase[] =
"Net.TrustTokens.OperationBeginTime";
const char kTrustTokenServerTimeHistogramNameBase[] =
"Net.TrustTokens.OperationServerTime";
} // namespace internal
namespace {
// These must stay in sync with the corresponding histogram suffixes in
// histograms.xml.
base::StringPiece StatusToSuccessOrFailure(
mojom::TrustTokenOperationStatus status) {
switch (status) {
case mojom::TrustTokenOperationStatus::kOk:
case mojom::TrustTokenOperationStatus::kAlreadyExists:
case mojom::TrustTokenOperationStatus::
kOperationSuccessfullyFulfilledLocally:
return "Success";
default:
return "Failure";
}
}
// These must stay in sync with the corresponding histogram suffixes in
// histograms.xml.
base::StringPiece TypeToString(mojom::TrustTokenOperationType type) {
switch (type) {
case mojom::TrustTokenOperationType::kIssuance:
return "Issuance";
case mojom::TrustTokenOperationType::kRedemption:
return "Redemption";
case mojom::TrustTokenOperationType::kSigning:
return "Signing";
}
}
const char kHistogramPartsSeparator[] = ".";
} // namespace
TrustTokenOperationMetricsRecorder::TrustTokenOperationMetricsRecorder(
mojom::TrustTokenOperationType type)
: type_(type) {}
TrustTokenOperationMetricsRecorder::~TrustTokenOperationMetricsRecorder() =
default;
void TrustTokenOperationMetricsRecorder::BeginBegin() {
begin_start_ = base::TimeTicks::Now();
}
void TrustTokenOperationMetricsRecorder::FinishBegin(
mojom::TrustTokenOperationStatus status) {
begin_end_ = base::TimeTicks::Now();
base::UmaHistogramTimes(
base::JoinString({internal::kTrustTokenBeginTimeHistogramNameBase,
StatusToSuccessOrFailure(status), TypeToString(type_)},
kHistogramPartsSeparator),
begin_end_ - begin_start_);
}
void TrustTokenOperationMetricsRecorder::BeginFinalize() {
// Wait until FinishFinalize to determine whether to log the server time as a
// success or a failure.
finalize_start_ = base::TimeTicks::Now();
}
void TrustTokenOperationMetricsRecorder::FinishFinalize(
mojom::TrustTokenOperationStatus status) {
base::TimeTicks finalize_end = base::TimeTicks::Now();
base::UmaHistogramTimes(
base::JoinString({internal::kTrustTokenServerTimeHistogramNameBase,
StatusToSuccessOrFailure(status), TypeToString(type_)},
kHistogramPartsSeparator),
finalize_start_ - begin_end_);
base::UmaHistogramTimes(
base::JoinString({internal::kTrustTokenTotalTimeHistogramNameBase,
StatusToSuccessOrFailure(status), TypeToString(type_)},
kHistogramPartsSeparator),
finalize_end - begin_start_);
base::UmaHistogramTimes(
base::JoinString({internal::kTrustTokenFinalizeTimeHistogramNameBase,
StatusToSuccessOrFailure(status), TypeToString(type_)},
kHistogramPartsSeparator),
finalize_end - finalize_start_);
}
void HistogramTrustTokenOperationNetError(
network::mojom::TrustTokenOperationType type,
network::mojom::TrustTokenOperationStatus status,
int net_error) {
base::UmaHistogramSparse(
base::JoinString({"Net.TrustTokens.NetErrorForTrustTokenOperation",
StatusToSuccessOrFailure(status), TypeToString(type)},
kHistogramPartsSeparator),
net_error);
}
} // namespace network