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