histogram_base.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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. 4 5#include "base/metrics/histogram_base.h" 6 7#include <climits> 8 9#include "base/json/json_string_value_serializer.h" 10#include "base/logging.h" 11#include "base/memory/scoped_ptr.h" 12#include "base/metrics/histogram.h" 13#include "base/metrics/histogram_samples.h" 14#include "base/metrics/sparse_histogram.h" 15#include "base/pickle.h" 16#include "base/process/process_handle.h" 17#include "base/strings/stringprintf.h" 18#include "base/values.h" 19 20namespace base { 21 22std::string HistogramTypeToString(HistogramType type) { 23 switch (type) { 24 case HISTOGRAM: 25 return "HISTOGRAM"; 26 case LINEAR_HISTOGRAM: 27 return "LINEAR_HISTOGRAM"; 28 case BOOLEAN_HISTOGRAM: 29 return "BOOLEAN_HISTOGRAM"; 30 case CUSTOM_HISTOGRAM: 31 return "CUSTOM_HISTOGRAM"; 32 case SPARSE_HISTOGRAM: 33 return "SPARSE_HISTOGRAM"; 34 default: 35 NOTREACHED(); 36 } 37 return "UNKNOWN"; 38} 39 40HistogramBase* DeserializeHistogramInfo(PickleIterator* iter) { 41 int type; 42 if (!iter->ReadInt(&type)) 43 return NULL; 44 45 switch (type) { 46 case HISTOGRAM: 47 return Histogram::DeserializeInfoImpl(iter); 48 case LINEAR_HISTOGRAM: 49 return LinearHistogram::DeserializeInfoImpl(iter); 50 case BOOLEAN_HISTOGRAM: 51 return BooleanHistogram::DeserializeInfoImpl(iter); 52 case CUSTOM_HISTOGRAM: 53 return CustomHistogram::DeserializeInfoImpl(iter); 54 case SPARSE_HISTOGRAM: 55 return SparseHistogram::DeserializeInfoImpl(iter); 56 default: 57 return NULL; 58 } 59} 60 61const HistogramBase::Sample HistogramBase::kSampleType_MAX = INT_MAX; 62 63HistogramBase::HistogramBase(const std::string& name) 64 : histogram_name_(name), 65 flags_(kNoFlags) {} 66 67HistogramBase::~HistogramBase() {} 68 69void HistogramBase::CheckName(const StringPiece& name) const { 70 DCHECK_EQ(histogram_name(), name); 71} 72 73void HistogramBase::SetFlags(int32 flags) { 74 flags_ |= flags; 75} 76 77void HistogramBase::ClearFlags(int32 flags) { 78 flags_ &= ~flags; 79} 80 81void HistogramBase::AddTime(const TimeDelta& time) { 82 Add(static_cast<Sample>(time.InMilliseconds())); 83} 84 85void HistogramBase::AddBoolean(bool value) { 86 Add(value ? 1 : 0); 87} 88 89bool HistogramBase::SerializeInfo(Pickle* pickle) const { 90 if (!pickle->WriteInt(GetHistogramType())) 91 return false; 92 return SerializeInfoImpl(pickle); 93} 94 95int HistogramBase::FindCorruption(const HistogramSamples& samples) const { 96 // Not supported by default. 97 return NO_INCONSISTENCIES; 98} 99 100void HistogramBase::WriteJSON(std::string* output) const { 101 Count count; 102 int64 sum; 103 scoped_ptr<ListValue> buckets(new ListValue()); 104 GetCountAndBucketData(&count, &sum, buckets.get()); 105 scoped_ptr<DictionaryValue> parameters(new DictionaryValue()); 106 GetParameters(parameters.get()); 107 108 JSONStringValueSerializer serializer(output); 109 DictionaryValue root; 110 root.SetString("name", histogram_name()); 111 root.SetInteger("count", count); 112 root.SetDouble("sum", sum); 113 root.SetInteger("flags", flags()); 114 root.Set("params", parameters.release()); 115 root.Set("buckets", buckets.release()); 116 root.SetInteger("pid", GetCurrentProcId()); 117 serializer.Serialize(root); 118} 119 120void HistogramBase::WriteAsciiBucketGraph(double current_size, 121 double max_size, 122 std::string* output) const { 123 const int k_line_length = 72; // Maximal horizontal width of graph. 124 int x_count = static_cast<int>(k_line_length * (current_size / max_size) 125 + 0.5); 126 int x_remainder = k_line_length - x_count; 127 128 while (0 < x_count--) 129 output->append("-"); 130 output->append("O"); 131 while (0 < x_remainder--) 132 output->append(" "); 133} 134 135const std::string HistogramBase::GetSimpleAsciiBucketRange( 136 Sample sample) const { 137 std::string result; 138 if (kHexRangePrintingFlag & flags()) 139 StringAppendF(&result, "%#x", sample); 140 else 141 StringAppendF(&result, "%d", sample); 142 return result; 143} 144 145void HistogramBase::WriteAsciiBucketValue(Count current, 146 double scaled_sum, 147 std::string* output) const { 148 StringAppendF(output, " (%d = %3.1f%%)", current, current/scaled_sum); 149} 150 151} // namespace base 152