1 // Copyright (c) 2012 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.
5 #include "chrome/browser/performance_monitor/metric.h"
7 #include "base/basictypes.h"
8 #include "base/logging.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/time/time.h"
11 #include "chrome/browser/performance_monitor/constants.h"
13 namespace performance_monitor
{
17 // For certain metrics (for instance, bytes read), it is possible that there is
18 // no maximum value which we can safely assume.
19 const double kNoMaximum
= -1.0;
21 // These constants are designed to keep metrics reasonable. However, due to the
22 // variety of system configurations which can run chrome, these values may not
23 // catch *all* erroneous values. For instance, on a one-CPU machine, any CPU
24 // usage > 100 is erroneous, but on a 16-CPU machine, it's perfectly normal.
25 // These are "best-guesses" in order to weed out obviously-false values. A
26 // metric is valid if it is greater than or equal to the minimum and less than
27 // the maximum, i.e. if it falls in the range [min, max).
28 const double kMinUndefined
= 0.0;
29 const double kMaxUndefined
= 0.0; // No undefined metric is valid.
30 const double kMinCpuUsage
= 0.0;
31 const double kMaxCpuUsage
= 100000.0; // 100% on a 1000-CPU machine.
32 const double kMinPrivateMemoryUsage
= 0.0;
33 const double kMaxPrivateMemoryUsage
= kBytesPerTerabyte
;
34 const double kMinSharedMemoryUsage
= 0.0;
35 const double kMaxSharedMemoryUsage
= kBytesPerTerabyte
;
36 const double kMinStartupTime
= 0.0;
37 const double kMaxStartupTime
= base::Time::kMicrosecondsPerMinute
* 15.0;
38 const double kMinTestStartupTime
= 0.0;
39 const double kMaxTestStartupTime
= base::Time::kMicrosecondsPerMinute
* 15.0;
40 const double kMinSessionRestoreTime
= 0.0;
41 const double kMaxSessionRestoreTime
= base::Time::kMicrosecondsPerMinute
* 15.0;
42 const double kMinPageLoadTime
= 0.0;
43 const double kMaxPageLoadTime
= base::Time::kMicrosecondsPerMinute
* 15.0;
44 const double kMinNetworkBytesRead
= 0.0;
45 const double kMaxNetworkBytesRead
= kNoMaximum
;
52 const MetricBound kMetricBounds
[] = {
53 { kMinUndefined
, kMaxUndefined
},
54 { kMinCpuUsage
, kMaxCpuUsage
},
55 { kMinPrivateMemoryUsage
, kMaxPrivateMemoryUsage
},
56 { kMinSharedMemoryUsage
, kMaxSharedMemoryUsage
},
57 { kMinStartupTime
, kMaxStartupTime
},
58 { kMinTestStartupTime
, kMaxTestStartupTime
},
59 { kMinSessionRestoreTime
, kMaxSessionRestoreTime
},
60 { kMinPageLoadTime
, kMaxPageLoadTime
},
61 { kMinNetworkBytesRead
, kMaxNetworkBytesRead
},
64 COMPILE_ASSERT(ARRAYSIZE_UNSAFE(kMetricBounds
) == METRIC_NUMBER_OF_METRICS
,
65 metric_bounds_size_doesnt_match_metric_count
);
69 Metric::Metric() : type(METRIC_UNDEFINED
), value(0.0) {
72 Metric::Metric(MetricType metric_type
,
73 const base::Time
& metric_time
,
74 const double metric_value
)
75 : type(metric_type
), time(metric_time
), value(metric_value
) {
78 Metric::Metric(MetricType metric_type
,
79 const std::string
& metric_time
,
80 const std::string
& metric_value
) : type(metric_type
) {
82 base::StringToInt64(metric_time
, &conversion
);
83 time
= base::Time::FromInternalValue(conversion
);
84 CHECK(base::StringToDouble(metric_value
, &value
));
90 bool Metric::IsValid() const {
91 return type
< METRIC_NUMBER_OF_METRICS
&&
92 (value
< kMetricBounds
[type
].max
||
93 kMetricBounds
[type
].max
== kNoMaximum
) &&
94 value
>= kMetricBounds
[type
].min
;
97 std::string
Metric::ValueAsString() const {
98 return base::DoubleToString(value
);
101 } // namespace performance_monitor