1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "services/network/trust_tokens/trust_token_operation_metrics_recorder.h"
6 #include "base/metrics/histogram_functions.h"
7 #include "base/strings/string_util.h"
8 #include "services/network/public/mojom/trust_tokens.mojom-shared.h"
9
10 namespace network {
11
12 namespace internal {
13
14 const char kTrustTokenTotalTimeHistogramNameBase[] =
15 "Net.TrustTokens.OperationTotalTime";
16 const char kTrustTokenFinalizeTimeHistogramNameBase[] =
17 "Net.TrustTokens.OperationFinalizeTime";
18 const char kTrustTokenBeginTimeHistogramNameBase[] =
19 "Net.TrustTokens.OperationBeginTime";
20 const char kTrustTokenServerTimeHistogramNameBase[] =
21 "Net.TrustTokens.OperationServerTime";
22
23 } // namespace internal
24
25 namespace {
26
27 // These must stay in sync with the corresponding histogram suffixes in
28 // histograms.xml.
StatusToSuccessOrFailure(mojom::TrustTokenOperationStatus status)29 base::StringPiece StatusToSuccessOrFailure(
30 mojom::TrustTokenOperationStatus status) {
31 switch (status) {
32 case mojom::TrustTokenOperationStatus::kOk:
33 case mojom::TrustTokenOperationStatus::kAlreadyExists:
34 return "Success";
35 default:
36 return "Failure";
37 }
38 }
39
40 // These must stay in sync with the corresponding histogram suffixes in
41 // histograms.xml.
TypeToString(mojom::TrustTokenOperationType type)42 base::StringPiece TypeToString(mojom::TrustTokenOperationType type) {
43 switch (type) {
44 case mojom::TrustTokenOperationType::kIssuance:
45 return "Issuance";
46 case mojom::TrustTokenOperationType::kRedemption:
47 return "Redemption";
48 case mojom::TrustTokenOperationType::kSigning:
49 return "Signing";
50 }
51 }
52
53 const char kHistogramPartsSeparator[] = ".";
54
55 } // namespace
56
BeginBegin(mojom::TrustTokenOperationType type)57 void TrustTokenOperationMetricsRecorder::BeginBegin(
58 mojom::TrustTokenOperationType type) {
59 type_ = type;
60 begin_start_ = base::TimeTicks::Now();
61 }
62
FinishBegin(mojom::TrustTokenOperationStatus status)63 void TrustTokenOperationMetricsRecorder::FinishBegin(
64 mojom::TrustTokenOperationStatus status) {
65 begin_end_ = base::TimeTicks::Now();
66
67 base::UmaHistogramTimes(
68 base::JoinString({internal::kTrustTokenBeginTimeHistogramNameBase,
69 StatusToSuccessOrFailure(status), TypeToString(type_)},
70 kHistogramPartsSeparator),
71 begin_end_ - begin_start_);
72 }
73
BeginFinalize()74 void TrustTokenOperationMetricsRecorder::BeginFinalize() {
75 // Wait until FinishFinalize to determine whether to log the server time as a
76 // success or a failure.
77 finalize_start_ = base::TimeTicks::Now();
78 }
79
FinishFinalize(mojom::TrustTokenOperationStatus status)80 void TrustTokenOperationMetricsRecorder::FinishFinalize(
81 mojom::TrustTokenOperationStatus status) {
82 base::TimeTicks finalize_end = base::TimeTicks::Now();
83
84 base::UmaHistogramTimes(
85 base::JoinString({internal::kTrustTokenServerTimeHistogramNameBase,
86 StatusToSuccessOrFailure(status), TypeToString(type_)},
87 kHistogramPartsSeparator),
88 finalize_start_ - begin_end_);
89
90 base::UmaHistogramTimes(
91 base::JoinString({internal::kTrustTokenTotalTimeHistogramNameBase,
92 StatusToSuccessOrFailure(status), TypeToString(type_)},
93 kHistogramPartsSeparator),
94 finalize_end - begin_start_);
95
96 base::UmaHistogramTimes(
97 base::JoinString({internal::kTrustTokenFinalizeTimeHistogramNameBase,
98 StatusToSuccessOrFailure(status), TypeToString(type_)},
99 kHistogramPartsSeparator),
100 finalize_end - finalize_start_);
101 }
102
HistogramTrustTokenOperationNetError(network::mojom::TrustTokenOperationType type,network::mojom::TrustTokenOperationStatus status,int net_error)103 void HistogramTrustTokenOperationNetError(
104 network::mojom::TrustTokenOperationType type,
105 network::mojom::TrustTokenOperationStatus status,
106 int net_error) {
107 base::UmaHistogramSparse(
108 base::JoinString({"Net.TrustTokens.NetErrorForTrustTokenOperation",
109 StatusToSuccessOrFailure(status), TypeToString(type)},
110 kHistogramPartsSeparator),
111 net_error);
112 }
113
114 } // namespace network
115