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