xref: /aosp_15_r20/external/cronet/components/nacl/renderer/histogram.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2014 The Chromium Authors
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 "components/nacl/renderer/histogram.h"
6 
7 #include <algorithm>
8 
9 #include "base/metrics/histogram.h"
10 #include "build/build_config.h"
11 
12 namespace nacl {
13 
HistogramCustomCounts(const std::string & name,int32_t sample,int32_t min,int32_t max,uint32_t bucket_count)14 void HistogramCustomCounts(const std::string& name,
15                            int32_t sample,
16                            int32_t min,
17                            int32_t max,
18                            uint32_t bucket_count) {
19   base::HistogramBase* counter =
20       base::Histogram::FactoryGet(
21           name,
22           min,
23           max,
24           bucket_count,
25           base::HistogramBase::kUmaTargetedHistogramFlag);
26   // The histogram can be NULL if it is constructed with bad arguments.  Ignore
27   // that data for this API.  An error message will be logged.
28   if (counter)
29     counter->Add(sample);
30 }
31 
HistogramEnumerate(const std::string & name,int32_t sample,int32_t boundary_value)32 void HistogramEnumerate(const std::string& name,
33                         int32_t sample,
34                         int32_t boundary_value) {
35   base::HistogramBase* counter =
36       base::LinearHistogram::FactoryGet(
37           name,
38           1,
39           boundary_value,
40           boundary_value + 1,
41           base::HistogramBase::kUmaTargetedHistogramFlag);
42   counter->Add(sample);
43 }
44 
HistogramEnumerateLoadStatus(PP_NaClError error_code,bool is_installed)45 void HistogramEnumerateLoadStatus(PP_NaClError error_code,
46                                   bool is_installed) {
47   HistogramEnumerate("NaCl.LoadStatus.Plugin", error_code, PP_NACL_ERROR_MAX);
48 
49   // Gather data to see if being installed changes load outcomes.
50   const char* name = is_installed ?
51       "NaCl.LoadStatus.Plugin.InstalledApp" :
52       "NaCl.LoadStatus.Plugin.NotInstalledApp";
53   HistogramEnumerate(name, error_code, PP_NACL_ERROR_MAX);
54 }
55 
HistogramEnumerateOsArch(const std::string & sandbox_isa)56 void HistogramEnumerateOsArch(const std::string& sandbox_isa) {
57   enum NaClOSArch {
58     kNaClLinux32 = 0,
59     kNaClLinux64,
60     kNaClLinuxArm,
61     kNaClMac32,
62     kNaClMac64,
63     kNaClMacArm,
64     kNaClWin32,
65     kNaClWin64,
66     kNaClWinArm,
67     kNaClLinuxMips,
68     kNaClOSArchMax
69   };
70 
71   NaClOSArch os_arch = kNaClOSArchMax;
72 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
73   os_arch = kNaClLinux32;
74 #endif
75 
76   if (sandbox_isa == "x86-64")
77     os_arch = static_cast<NaClOSArch>(os_arch + 1);
78   if (sandbox_isa == "arm")
79     os_arch = static_cast<NaClOSArch>(os_arch + 2);
80   if (sandbox_isa == "mips32")
81     os_arch = kNaClLinuxMips;
82 
83   HistogramEnumerate("NaCl.Client.OSArch", os_arch, kNaClOSArchMax);
84 }
85 
86 // Records values up to 20 seconds.
HistogramTimeSmall(const std::string & name,int64_t sample)87 void HistogramTimeSmall(const std::string& name, int64_t sample) {
88   if (sample < 0)
89     sample = 0;
90   base::HistogramBase* counter = base::Histogram::FactoryTimeGet(
91       name, base::Milliseconds(1), base::Milliseconds(20000), 100,
92       base::HistogramBase::kUmaTargetedHistogramFlag);
93   if (counter)
94     counter->AddTime(base::Milliseconds(sample));
95 }
96 
97 // Records values up to 3 minutes, 20 seconds.
HistogramTimeMedium(const std::string & name,int64_t sample)98 void HistogramTimeMedium(const std::string& name, int64_t sample) {
99   if (sample < 0)
100     sample = 0;
101   base::HistogramBase* counter = base::Histogram::FactoryTimeGet(
102       name, base::Milliseconds(10), base::Milliseconds(200000), 100,
103       base::HistogramBase::kUmaTargetedHistogramFlag);
104   if (counter)
105     counter->AddTime(base::Milliseconds(sample));
106 }
107 
108 // Records values up to 33 minutes.
HistogramTimeLarge(const std::string & name,int64_t sample)109 void HistogramTimeLarge(const std::string& name, int64_t sample) {
110   if (sample < 0)
111     sample = 0;
112   base::HistogramBase* counter = base::Histogram::FactoryTimeGet(
113       name, base::Milliseconds(100), base::Milliseconds(2000000), 100,
114       base::HistogramBase::kUmaTargetedHistogramFlag);
115   if (counter)
116     counter->AddTime(base::Milliseconds(sample));
117 }
118 
119 // Records values up to 12 minutes.
HistogramTimeTranslation(const std::string & name,int64_t sample_ms)120 void HistogramTimeTranslation(const std::string& name, int64_t sample_ms) {
121   if (sample_ms < 0)
122     sample_ms = 0;
123   base::HistogramBase* counter = base::Histogram::FactoryTimeGet(
124       name, base::Milliseconds(10), base::Milliseconds(720000), 100,
125       base::HistogramBase::kUmaTargetedHistogramFlag);
126   if (counter)
127     counter->AddTime(base::Milliseconds(sample_ms));
128 }
129 
HistogramStartupTimeSmall(const std::string & name,base::TimeDelta td,int64_t nexe_size)130 void HistogramStartupTimeSmall(const std::string& name,
131                                base::TimeDelta td,
132                                int64_t nexe_size) {
133   HistogramTimeSmall(name, static_cast<int64_t>(td.InMilliseconds()));
134   if (nexe_size > 0) {
135     float size_in_MB = static_cast<float>(nexe_size) / (1024.f * 1024.f);
136     HistogramTimeSmall(name + "PerMB",
137                        static_cast<int64_t>(td.InMilliseconds() / size_in_MB));
138   }
139 }
140 
HistogramStartupTimeMedium(const std::string & name,base::TimeDelta td,int64_t nexe_size)141 void HistogramStartupTimeMedium(const std::string& name,
142                                 base::TimeDelta td,
143                                 int64_t nexe_size) {
144   HistogramTimeMedium(name, static_cast<int64_t>(td.InMilliseconds()));
145   if (nexe_size > 0) {
146     float size_in_MB = static_cast<float>(nexe_size) / (1024.f * 1024.f);
147     HistogramTimeMedium(name + "PerMB",
148                         static_cast<int64_t>(td.InMilliseconds() / size_in_MB));
149   }
150 }
151 
HistogramSizeKB(const std::string & name,int32_t sample)152 void HistogramSizeKB(const std::string& name, int32_t sample) {
153   if (sample < 0) return;
154   HistogramCustomCounts(name,
155                         sample,
156                         1,
157                         512 * 1024,  // A very large .nexe.
158                         100);
159 }
160 
HistogramHTTPStatusCode(const std::string & name,int32_t status)161 void HistogramHTTPStatusCode(const std::string& name,
162                              int32_t status) {
163   // Log the status codes in rough buckets - 1XX, 2XX, etc.
164   int sample = status / 100;
165   // HTTP status codes only go up to 5XX, using "6" to indicate an internal
166   // error.
167   // Note: installed files may have "0" for a status code.
168   if (status < 0 || status >= 600)
169     sample = 6;
170   HistogramEnumerate(name, sample, 7);
171 }
172 
HistogramEnumerateManifestIsDataURI(bool is_data_uri)173 void HistogramEnumerateManifestIsDataURI(bool is_data_uri) {
174   HistogramEnumerate("NaCl.Manifest.IsDataURI", is_data_uri, 2);
175 }
176 
HistogramKBPerSec(const std::string & name,int64_t kb,int64_t us)177 void HistogramKBPerSec(const std::string& name, int64_t kb, int64_t us) {
178   if (kb < 0 || us <= 0) return;
179   static const double kMaxRate = 30 * 1000.0;  // max of 30MB/sec.
180   int32_t rate = std::min(kb / (us / 1000000.0), kMaxRate);
181   HistogramCustomCounts(name,
182                         rate,
183                         1,
184                         30 * 1000,  // max of 30 MB/sec.
185                         100);
186 }
187 
HistogramRatio(const std::string & name,int64_t numerator,int64_t denominator)188 void HistogramRatio(const std::string& name,
189                     int64_t numerator,
190                     int64_t denominator) {
191   static const int32_t kRatioMin = 10;
192   static const int32_t kRatioMax = 10 * 100;  // max of 10x difference.
193   static const uint32_t kRatioBuckets = 100;
194   if (numerator < 0 || denominator <= 0)
195     return;
196   HistogramCustomCounts(name,
197                         static_cast<int32_t>(100 * numerator / denominator),
198                         kRatioMin, kRatioMax, kRatioBuckets);
199 }
200 
201 }  // namespace nacl
202