123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615 |
- #ifndef BASE_METRICS_HISTOGRAM_H_
- #define BASE_METRICS_HISTOGRAM_H_
- #include <stddef.h>
- #include <stdint.h>
- #include <map>
- #include <memory>
- #include <string>
- #include <vector>
- #include "base/base_export.h"
- #include "base/check_op.h"
- #include "base/compiler_specific.h"
- #include "base/containers/span.h"
- #include "base/gtest_prod_util.h"
- #include "base/macros.h"
- #include "base/metrics/bucket_ranges.h"
- #include "base/metrics/histogram_base.h"
- #include "base/metrics/histogram_samples.h"
- #include "base/strings/string_piece.h"
- #include "base/time/time.h"
- #include "base/values.h"
- namespace base {
- class BooleanHistogram;
- class CustomHistogram;
- class DelayedPersistentAllocation;
- class Histogram;
- class HistogramTest;
- class LinearHistogram;
- class Pickle;
- class PickleIterator;
- class SampleVector;
- class SampleVectorBase;
- class BASE_EXPORT Histogram : public HistogramBase {
- public:
-
- static const uint32_t kBucketCount_MAX;
- typedef std::vector<Count> Counts;
- ~Histogram() override;
-
-
-
-
-
-
-
-
-
-
- static HistogramBase* FactoryGet(const std::string& name,
- Sample minimum,
- Sample maximum,
- uint32_t bucket_count,
- int32_t flags);
- static HistogramBase* FactoryTimeGet(const std::string& name,
- base::TimeDelta minimum,
- base::TimeDelta maximum,
- uint32_t bucket_count,
- int32_t flags);
- static HistogramBase* FactoryMicrosecondsTimeGet(const std::string& name,
- base::TimeDelta minimum,
- base::TimeDelta maximum,
- uint32_t bucket_count,
- int32_t flags);
-
-
-
- static HistogramBase* FactoryGet(const char* name,
- Sample minimum,
- Sample maximum,
- uint32_t bucket_count,
- int32_t flags);
- static HistogramBase* FactoryTimeGet(const char* name,
- base::TimeDelta minimum,
- base::TimeDelta maximum,
- uint32_t bucket_count,
- int32_t flags);
- static HistogramBase* FactoryMicrosecondsTimeGet(const char* name,
- base::TimeDelta minimum,
- base::TimeDelta maximum,
- uint32_t bucket_count,
- int32_t flags);
-
- static std::unique_ptr<HistogramBase> PersistentCreate(
- const char* name,
- Sample minimum,
- Sample maximum,
- const BucketRanges* ranges,
- const DelayedPersistentAllocation& counts,
- const DelayedPersistentAllocation& logged_counts,
- HistogramSamples::Metadata* meta,
- HistogramSamples::Metadata* logged_meta);
- static void InitializeBucketRanges(Sample minimum,
- Sample maximum,
- BucketRanges* ranges);
-
-
-
-
-
-
-
- static const int kCommonRaceBasedCountMismatch;
-
-
-
-
-
-
- uint32_t FindCorruption(const HistogramSamples& samples) const override;
-
-
-
- const BucketRanges* bucket_ranges() const;
- Sample declared_min() const;
- Sample declared_max() const;
- virtual Sample ranges(uint32_t i) const;
- virtual uint32_t bucket_count() const;
-
-
-
-
-
-
-
- static bool InspectConstructionArguments(StringPiece name,
- Sample* minimum,
- Sample* maximum,
- uint32_t* bucket_count);
-
- uint64_t name_hash() const override;
- HistogramType GetHistogramType() const override;
- bool HasConstructionArguments(Sample expected_minimum,
- Sample expected_maximum,
- uint32_t expected_bucket_count) const override;
- void Add(Sample value) override;
- void AddCount(Sample value, int count) override;
- std::unique_ptr<HistogramSamples> SnapshotSamples() const override;
- std::unique_ptr<HistogramSamples> SnapshotDelta() override;
- std::unique_ptr<HistogramSamples> SnapshotFinalDelta() const override;
- void AddSamples(const HistogramSamples& samples) override;
- bool AddSamplesFromPickle(base::PickleIterator* iter) override;
- void WriteAscii(std::string* output) const override;
- base::DictionaryValue ToGraphDict() const override;
-
-
- void ValidateHistogramContents() const override;
- protected:
-
-
-
-
-
- class Factory;
-
-
- Histogram(const char* name,
- Sample minimum,
- Sample maximum,
- const BucketRanges* ranges);
-
-
-
-
-
-
- Histogram(const char* name,
- Sample minimum,
- Sample maximum,
- const BucketRanges* ranges,
- const DelayedPersistentAllocation& counts,
- const DelayedPersistentAllocation& logged_counts,
- HistogramSamples::Metadata* meta,
- HistogramSamples::Metadata* logged_meta);
-
- void SerializeInfoImpl(base::Pickle* pickle) const override;
-
- virtual bool PrintEmptyBucket(uint32_t index) const;
-
- virtual double GetBucketSize(Count current, uint32_t i) const;
-
-
-
- virtual const std::string GetAsciiBucketRange(uint32_t it) const;
- private:
-
- friend class HistogramTest;
- FRIEND_TEST_ALL_PREFIXES(HistogramTest, BoundsTest);
- FRIEND_TEST_ALL_PREFIXES(HistogramTest, BucketPlacementTest);
- FRIEND_TEST_ALL_PREFIXES(HistogramTest, CorruptSampleCounts);
- friend class StatisticsRecorder;
- friend class StatisticsRecorderTest;
- friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo(
- base::PickleIterator* iter);
- static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter);
-
-
-
- std::unique_ptr<SampleVector> SnapshotAllSamples() const;
-
- std::unique_ptr<SampleVector> SnapshotUnloggedSamples() const;
-
-
- void WriteAsciiBody(const SampleVector& snapshot,
- bool graph_it,
- const std::string& newline,
- std::string* output) const;
-
- double GetPeakBucketSize(const SampleVectorBase& samples) const;
-
- void WriteAsciiHeader(const SampleVectorBase& samples,
- std::string* output) const;
-
-
- void WriteAsciiBucketContext(const int64_t past,
- const Count current,
- const int64_t remaining,
- const uint32_t i,
- std::string* output) const;
-
-
- void GetParameters(DictionaryValue* params) const override;
-
- std::unique_ptr<SampleVectorBase> unlogged_samples_;
-
- std::unique_ptr<SampleVectorBase> logged_samples_;
- #if DCHECK_IS_ON()
-
-
- mutable bool final_delta_created_ = false;
- #endif
- DISALLOW_COPY_AND_ASSIGN(Histogram);
- };
- class BASE_EXPORT LinearHistogram : public Histogram {
- public:
- ~LinearHistogram() override;
-
- static HistogramBase* FactoryGet(const std::string& name,
- Sample minimum,
- Sample maximum,
- uint32_t bucket_count,
- int32_t flags);
- static HistogramBase* FactoryTimeGet(const std::string& name,
- TimeDelta minimum,
- TimeDelta maximum,
- uint32_t bucket_count,
- int32_t flags);
-
-
-
- static HistogramBase* FactoryGet(const char* name,
- Sample minimum,
- Sample maximum,
- uint32_t bucket_count,
- int32_t flags);
- static HistogramBase* FactoryTimeGet(const char* name,
- TimeDelta minimum,
- TimeDelta maximum,
- uint32_t bucket_count,
- int32_t flags);
-
- static std::unique_ptr<HistogramBase> PersistentCreate(
- const char* name,
- Sample minimum,
- Sample maximum,
- const BucketRanges* ranges,
- const DelayedPersistentAllocation& counts,
- const DelayedPersistentAllocation& logged_counts,
- HistogramSamples::Metadata* meta,
- HistogramSamples::Metadata* logged_meta);
- struct DescriptionPair {
- Sample sample;
- const char* description;
- };
-
-
-
-
-
- static HistogramBase* FactoryGetWithRangeDescription(
- const std::string& name,
- Sample minimum,
- Sample maximum,
- uint32_t bucket_count,
- int32_t flags,
- const DescriptionPair descriptions[]);
- static void InitializeBucketRanges(Sample minimum,
- Sample maximum,
- BucketRanges* ranges);
-
- HistogramType GetHistogramType() const override;
- protected:
- class Factory;
- LinearHistogram(const char* name,
- Sample minimum,
- Sample maximum,
- const BucketRanges* ranges);
- LinearHistogram(const char* name,
- Sample minimum,
- Sample maximum,
- const BucketRanges* ranges,
- const DelayedPersistentAllocation& counts,
- const DelayedPersistentAllocation& logged_counts,
- HistogramSamples::Metadata* meta,
- HistogramSamples::Metadata* logged_meta);
- double GetBucketSize(Count current, uint32_t i) const override;
-
-
- const std::string GetAsciiBucketRange(uint32_t i) const override;
-
-
- bool PrintEmptyBucket(uint32_t index) const override;
- private:
- friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo(
- base::PickleIterator* iter);
- static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter);
-
-
-
- typedef std::map<Sample, std::string> BucketDescriptionMap;
- BucketDescriptionMap bucket_description_;
- DISALLOW_COPY_AND_ASSIGN(LinearHistogram);
- };
- class BASE_EXPORT ScaledLinearHistogram {
- using AtomicCount = Histogram::AtomicCount;
- using Sample = Histogram::Sample;
- public:
-
-
- ScaledLinearHistogram(const char* name,
- Sample minimum,
- Sample maximum,
- uint32_t bucket_count,
- int32_t scale,
- int32_t flags);
- ScaledLinearHistogram(const std::string& name,
- Sample minimum,
- Sample maximum,
- uint32_t bucket_count,
- int32_t scale,
- int32_t flags);
- ~ScaledLinearHistogram();
-
-
-
- void AddScaledCount(Sample value, int count);
- int32_t scale() const { return scale_; }
- HistogramBase* histogram() { return histogram_; }
- private:
-
-
-
- HistogramBase* const histogram_;
-
- const int32_t scale_;
-
-
-
- std::vector<AtomicCount> remainders_;
- DISALLOW_COPY_AND_ASSIGN(ScaledLinearHistogram);
- };
- class BASE_EXPORT BooleanHistogram : public LinearHistogram {
- public:
- static HistogramBase* FactoryGet(const std::string& name, int32_t flags);
-
-
-
- static HistogramBase* FactoryGet(const char* name, int32_t flags);
-
- static std::unique_ptr<HistogramBase> PersistentCreate(
- const char* name,
- const BucketRanges* ranges,
- const DelayedPersistentAllocation& counts,
- const DelayedPersistentAllocation& logged_counts,
- HistogramSamples::Metadata* meta,
- HistogramSamples::Metadata* logged_meta);
- HistogramType GetHistogramType() const override;
- protected:
- class Factory;
- private:
- BooleanHistogram(const char* name, const BucketRanges* ranges);
- BooleanHistogram(const char* name,
- const BucketRanges* ranges,
- const DelayedPersistentAllocation& counts,
- const DelayedPersistentAllocation& logged_counts,
- HistogramSamples::Metadata* meta,
- HistogramSamples::Metadata* logged_meta);
- friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo(
- base::PickleIterator* iter);
- static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter);
- DISALLOW_COPY_AND_ASSIGN(BooleanHistogram);
- };
- class BASE_EXPORT CustomHistogram : public Histogram {
- public:
-
-
-
-
- static HistogramBase* FactoryGet(const std::string& name,
- const std::vector<Sample>& custom_ranges,
- int32_t flags);
-
-
-
- static HistogramBase* FactoryGet(const char* name,
- const std::vector<Sample>& custom_ranges,
- int32_t flags);
-
- static std::unique_ptr<HistogramBase> PersistentCreate(
- const char* name,
- const BucketRanges* ranges,
- const DelayedPersistentAllocation& counts,
- const DelayedPersistentAllocation& logged_counts,
- HistogramSamples::Metadata* meta,
- HistogramSamples::Metadata* logged_meta);
-
- HistogramType GetHistogramType() const override;
-
-
-
-
-
- static std::vector<Sample> ArrayToCustomEnumRanges(
- base::span<const Sample> values);
- protected:
- class Factory;
- CustomHistogram(const char* name, const BucketRanges* ranges);
- CustomHistogram(const char* name,
- const BucketRanges* ranges,
- const DelayedPersistentAllocation& counts,
- const DelayedPersistentAllocation& logged_counts,
- HistogramSamples::Metadata* meta,
- HistogramSamples::Metadata* logged_meta);
-
- void SerializeInfoImpl(base::Pickle* pickle) const override;
- double GetBucketSize(Count current, uint32_t i) const override;
- private:
- friend BASE_EXPORT HistogramBase* DeserializeHistogramInfo(
- base::PickleIterator* iter);
- static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter);
- static bool ValidateCustomRanges(const std::vector<Sample>& custom_ranges);
- DISALLOW_COPY_AND_ASSIGN(CustomHistogram);
- };
- }
- #endif
|