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