summaryrefslogtreecommitdiff
path: root/chromium/base/metrics
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/base/metrics')
-rw-r--r--chromium/base/metrics/dummy_histogram.cc5
-rw-r--r--chromium/base/metrics/dummy_histogram.h3
-rw-r--r--chromium/base/metrics/field_trial.cc15
-rw-r--r--chromium/base/metrics/field_trial.h8
-rw-r--r--chromium/base/metrics/field_trial_params.h1
-rw-r--r--chromium/base/metrics/field_trial_unittest.cc81
-rw-r--r--chromium/base/metrics/histogram.cc21
-rw-r--r--chromium/base/metrics/histogram.h9
-rw-r--r--chromium/base/metrics/histogram_base.cc24
-rw-r--r--chromium/base/metrics/histogram_base.h9
-rw-r--r--chromium/base/metrics/histogram_macros_internal.h2
-rw-r--r--chromium/base/metrics/histogram_macros_local.h1
-rw-r--r--chromium/base/metrics/histogram_unittest.cc49
-rw-r--r--chromium/base/metrics/sparse_histogram.cc10
-rw-r--r--chromium/base/metrics/sparse_histogram.h6
-rw-r--r--chromium/base/metrics/sparse_histogram_unittest.cc47
-rw-r--r--chromium/base/metrics/ukm_source_id.cc3
-rw-r--r--chromium/base/metrics/ukm_source_id.h6
-rw-r--r--chromium/base/metrics/user_metrics.cc2
19 files changed, 161 insertions, 141 deletions
diff --git a/chromium/base/metrics/dummy_histogram.cc b/chromium/base/metrics/dummy_histogram.cc
index ca7c4d9d30d..45ae7f2fb11 100644
--- a/chromium/base/metrics/dummy_histogram.cc
+++ b/chromium/base/metrics/dummy_histogram.cc
@@ -101,10 +101,7 @@ std::unique_ptr<HistogramSamples> DummyHistogram::SnapshotFinalDelta() const {
}
base::DictionaryValue DummyHistogram::ToGraphDict() const {
- base::DictionaryValue dict;
- dict.SetString("header", "dummy");
- dict.SetString("body", "dummy");
- return dict;
+ return base::DictionaryValue();
}
} // namespace base
diff --git a/chromium/base/metrics/dummy_histogram.h b/chromium/base/metrics/dummy_histogram.h
index 6c17cc8924b..08fd36374a0 100644
--- a/chromium/base/metrics/dummy_histogram.h
+++ b/chromium/base/metrics/dummy_histogram.h
@@ -44,9 +44,6 @@ class BASE_EXPORT DummyHistogram : public HistogramBase {
// HistogramBase:
void SerializeInfoImpl(Pickle* pickle) const override {}
void GetParameters(DictionaryValue* params) const override {}
- void GetCountAndBucketData(Count* count,
- int64_t* sum,
- ListValue* buckets) const override {}
private:
friend class NoDestructor<DummyHistogram>;
diff --git a/chromium/base/metrics/field_trial.cc b/chromium/base/metrics/field_trial.cc
index 05470a4deec..9799bfc9713 100644
--- a/chromium/base/metrics/field_trial.cc
+++ b/chromium/base/metrics/field_trial.cc
@@ -719,9 +719,7 @@ void FieldTrialList::GetInitiallyActiveFieldTrials(
}
// static
-bool FieldTrialList::CreateTrialsFromString(
- const std::string& trials_string,
- const std::set<std::string>& ignored_trial_names) {
+bool FieldTrialList::CreateTrialsFromString(const std::string& trials_string) {
DCHECK(global_);
if (trials_string.empty() || !global_)
return true;
@@ -734,14 +732,6 @@ bool FieldTrialList::CreateTrialsFromString(
const std::string trial_name = entry.trial_name.as_string();
const std::string group_name = entry.group_name.as_string();
- if (Contains(ignored_trial_names, trial_name)) {
- // This is to warn that the field trial forced through command-line
- // input is unforcable.
- // Use --enable-logging or --enable-logging=stderr to see this warning.
- LOG(WARNING) << "Field trial: " << trial_name << " cannot be forced.";
- continue;
- }
-
FieldTrial* trial = CreateFieldTrial(trial_name, group_name);
if (!trial)
return false;
@@ -787,8 +777,7 @@ void FieldTrialList::CreateTrialsFromCommandLine(
if (cmd_line.HasSwitch(switches::kForceFieldTrials)) {
bool result = FieldTrialList::CreateTrialsFromString(
- cmd_line.GetSwitchValueASCII(switches::kForceFieldTrials),
- std::set<std::string>());
+ cmd_line.GetSwitchValueASCII(switches::kForceFieldTrials));
UMA_HISTOGRAM_BOOLEAN("ChildProcess.FieldTrials.CreateFromSwitchSuccess",
result);
DCHECK(result);
diff --git a/chromium/base/metrics/field_trial.h b/chromium/base/metrics/field_trial.h
index d0fd3c12d6a..00448389e0d 100644
--- a/chromium/base/metrics/field_trial.h
+++ b/chromium/base/metrics/field_trial.h
@@ -59,7 +59,6 @@
#include <map>
#include <memory>
-#include <set>
#include <string>
#include <vector>
@@ -543,11 +542,8 @@ class BASE_EXPORT FieldTrialList {
// browser process into this non-browser process, but could also be invoked
// through a command line argument to the browser process. Created field
// trials will be marked "used" for the purposes of active trial reporting
- // if they are prefixed with |kActivationMarker|. Trial names in
- // |ignored_trial_names| are ignored when parsing |trials_string|.
- static bool CreateTrialsFromString(
- const std::string& trials_string,
- const std::set<std::string>& ignored_trial_names);
+ // if they are prefixed with |kActivationMarker|.
+ static bool CreateTrialsFromString(const std::string& trials_string);
// Achieves the same thing as CreateTrialsFromString, except wraps the logic
// by taking in the trials from the command line, either via shared memory
diff --git a/chromium/base/metrics/field_trial_params.h b/chromium/base/metrics/field_trial_params.h
index 7b4bd5b37cc..056b50b230f 100644
--- a/chromium/base/metrics/field_trial_params.h
+++ b/chromium/base/metrics/field_trial_params.h
@@ -10,6 +10,7 @@
#include "base/base_export.h"
#include "base/logging.h"
+#include "base/notreached.h"
namespace base {
diff --git a/chromium/base/metrics/field_trial_unittest.cc b/chromium/base/metrics/field_trial_unittest.cc
index 18723053c00..52e590561c4 100644
--- a/chromium/base/metrics/field_trial_unittest.cc
+++ b/chromium/base/metrics/field_trial_unittest.cc
@@ -527,8 +527,7 @@ TEST_F(FieldTrialTest, Restore) {
ASSERT_FALSE(FieldTrialList::TrialExists("Some_name"));
ASSERT_FALSE(FieldTrialList::TrialExists("xxx"));
- FieldTrialList::CreateTrialsFromString("Some_name/Winner/xxx/yyyy/",
- std::set<std::string>());
+ FieldTrialList::CreateTrialsFromString("Some_name/Winner/xxx/yyyy/");
FieldTrial* trial = FieldTrialList::Find("Some_name");
ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
@@ -542,8 +541,7 @@ TEST_F(FieldTrialTest, Restore) {
}
TEST_F(FieldTrialTest, RestoreNotEndingWithSlash) {
- EXPECT_TRUE(FieldTrialList::CreateTrialsFromString("tname/gname",
- std::set<std::string>()));
+ EXPECT_TRUE(FieldTrialList::CreateTrialsFromString("tname/gname"));
FieldTrial* trial = FieldTrialList::Find("tname");
ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
@@ -552,16 +550,11 @@ TEST_F(FieldTrialTest, RestoreNotEndingWithSlash) {
}
TEST_F(FieldTrialTest, BogusRestore) {
- EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("MissingSlash",
- std::set<std::string>()));
- EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("MissingGroupName/",
- std::set<std::string>()));
- EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("noname, only group/",
- std::set<std::string>()));
- EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("/emptyname",
- std::set<std::string>()));
- EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("*/emptyname",
- std::set<std::string>()));
+ EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("MissingSlash"));
+ EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("MissingGroupName/"));
+ EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("noname, only group/"));
+ EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("/emptyname"));
+ EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("*/emptyname"));
}
TEST_F(FieldTrialTest, DuplicateRestore) {
@@ -575,19 +568,16 @@ TEST_F(FieldTrialTest, DuplicateRestore) {
EXPECT_EQ("Some name/Winner/", save_string);
// It is OK if we redundantly specify a winner.
- EXPECT_TRUE(FieldTrialList::CreateTrialsFromString(save_string,
- std::set<std::string>()));
+ EXPECT_TRUE(FieldTrialList::CreateTrialsFromString(save_string));
// But it is an error to try to change to a different winner.
- EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("Some name/Loser/",
- std::set<std::string>()));
+ EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("Some name/Loser/"));
}
TEST_F(FieldTrialTest, CreateTrialsFromStringNotActive) {
ASSERT_FALSE(FieldTrialList::TrialExists("Abc"));
ASSERT_FALSE(FieldTrialList::TrialExists("Xyz"));
- ASSERT_TRUE(FieldTrialList::CreateTrialsFromString("Abc/def/Xyz/zyx/",
- std::set<std::string>()));
+ ASSERT_TRUE(FieldTrialList::CreateTrialsFromString("Abc/def/Xyz/zyx/"));
FieldTrial::ActiveGroups active_groups;
FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
@@ -609,8 +599,8 @@ TEST_F(FieldTrialTest, CreateTrialsFromStringForceActivation) {
ASSERT_FALSE(FieldTrialList::TrialExists("Abc"));
ASSERT_FALSE(FieldTrialList::TrialExists("def"));
ASSERT_FALSE(FieldTrialList::TrialExists("Xyz"));
- ASSERT_TRUE(FieldTrialList::CreateTrialsFromString(
- "*Abc/cba/def/fed/*Xyz/zyx/", std::set<std::string>()));
+ ASSERT_TRUE(
+ FieldTrialList::CreateTrialsFromString("*Abc/cba/def/fed/*Xyz/zyx/"));
FieldTrial::ActiveGroups active_groups;
FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
@@ -625,8 +615,7 @@ TEST_F(FieldTrialTest, CreateTrialsFromStringNotActiveObserver) {
ASSERT_FALSE(FieldTrialList::TrialExists("Abc"));
TestFieldTrialObserver observer(TestFieldTrialObserver::ASYNCHRONOUS);
- ASSERT_TRUE(FieldTrialList::CreateTrialsFromString("Abc/def/",
- std::set<std::string>()));
+ ASSERT_TRUE(FieldTrialList::CreateTrialsFromString("Abc/def/"));
RunLoop().RunUntilIdle();
// Observer shouldn't be notified.
EXPECT_TRUE(observer.trial_name().empty());
@@ -639,47 +628,6 @@ TEST_F(FieldTrialTest, CreateTrialsFromStringNotActiveObserver) {
EXPECT_EQ("def", observer.group_name());
}
-TEST_F(FieldTrialTest, CreateTrialsFromStringWithIgnoredFieldTrials) {
- ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted1"));
- ASSERT_FALSE(FieldTrialList::TrialExists("Foo"));
- ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted2"));
- ASSERT_FALSE(FieldTrialList::TrialExists("Bar"));
- ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted3"));
-
- std::set<std::string> ignored_trial_names;
- ignored_trial_names.insert("Unaccepted1");
- ignored_trial_names.insert("Unaccepted2");
- ignored_trial_names.insert("Unaccepted3");
-
- FieldTrialList::CreateTrialsFromString(
- "Unaccepted1/Unaccepted1_name/"
- "Foo/Foo_name/"
- "Unaccepted2/Unaccepted2_name/"
- "Bar/Bar_name/"
- "Unaccepted3/Unaccepted3_name/",
- ignored_trial_names);
-
- EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted1"));
- EXPECT_TRUE(FieldTrialList::TrialExists("Foo"));
- EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted2"));
- EXPECT_TRUE(FieldTrialList::TrialExists("Bar"));
- EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted3"));
-
- FieldTrial::ActiveGroups active_groups;
- FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
- EXPECT_TRUE(active_groups.empty());
-
- FieldTrial* trial = FieldTrialList::Find("Foo");
- ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
- EXPECT_EQ("Foo", trial->trial_name());
- EXPECT_EQ("Foo_name", trial->group_name());
-
- trial = FieldTrialList::Find("Bar");
- ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
- EXPECT_EQ("Bar", trial->trial_name());
- EXPECT_EQ("Bar_name", trial->group_name());
-}
-
TEST_F(FieldTrialTest, CreateFieldTrial) {
ASSERT_FALSE(FieldTrialList::TrialExists("Some_name"));
@@ -1154,8 +1102,7 @@ TEST(FieldTrialTestWithoutList, StatesStringFormat) {
// Starting with a new blank FieldTrialList.
FieldTrialList field_trial_list(nullptr);
- ASSERT_TRUE(field_trial_list.CreateTrialsFromString(save_string,
- std::set<std::string>()));
+ ASSERT_TRUE(field_trial_list.CreateTrialsFromString(save_string));
FieldTrial::ActiveGroups active_groups;
field_trial_list.GetActiveFieldTrialGroups(&active_groups);
diff --git a/chromium/base/metrics/histogram.cc b/chromium/base/metrics/histogram.cc
index 12782db9a9d..7e9ea3c7d0d 100644
--- a/chromium/base/metrics/histogram.cc
+++ b/chromium/base/metrics/histogram.cc
@@ -821,27 +821,6 @@ void Histogram::GetParameters(DictionaryValue* params) const {
params->SetIntKey("bucket_count", static_cast<int>(bucket_count()));
}
-void Histogram::GetCountAndBucketData(Count* count,
- int64_t* sum,
- ListValue* buckets) const {
- std::unique_ptr<SampleVector> snapshot = SnapshotAllSamples();
- *count = snapshot->TotalCount();
- *sum = snapshot->sum();
- uint32_t index = 0;
- for (uint32_t i = 0; i < bucket_count(); ++i) {
- Sample count_at_index = snapshot->GetCountAtIndex(i);
- if (count_at_index > 0) {
- std::unique_ptr<DictionaryValue> bucket_value(new DictionaryValue());
- bucket_value->SetIntKey("low", ranges(i));
- if (i != bucket_count() - 1)
- bucket_value->SetIntKey("high", ranges(i + 1));
- bucket_value->SetIntKey("count", count_at_index);
- buckets->Set(index, std::move(bucket_value));
- ++index;
- }
- }
-}
-
//------------------------------------------------------------------------------
// LinearHistogram: This histogram uses a traditional set of evenly spaced
// buckets.
diff --git a/chromium/base/metrics/histogram.h b/chromium/base/metrics/histogram.h
index ba300c70917..3e1c51f46ee 100644
--- a/chromium/base/metrics/histogram.h
+++ b/chromium/base/metrics/histogram.h
@@ -73,10 +73,10 @@
#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/logging.h"
#include "base/macros.h"
#include "base/metrics/bucket_ranges.h"
#include "base/metrics/histogram_base.h"
@@ -314,13 +314,10 @@ class BASE_EXPORT Histogram : public HistogramBase {
const uint32_t i,
std::string* output) const;
- // WriteJSON calls these.
+ // Writes the type, min, max, and bucket count information of the histogram in
+ // |params|.
void GetParameters(DictionaryValue* params) const override;
- void GetCountAndBucketData(Count* count,
- int64_t* sum,
- ListValue* buckets) const override;
-
// Samples that have not yet been logged with SnapshotDelta().
std::unique_ptr<SampleVectorBase> unlogged_samples_;
diff --git a/chromium/base/metrics/histogram_base.cc b/chromium/base/metrics/histogram_base.cc
index 8d55e92e1dd..ce7fbf16e38 100644
--- a/chromium/base/metrics/histogram_base.cc
+++ b/chromium/base/metrics/histogram_base.cc
@@ -179,6 +179,30 @@ void HistogramBase::FindAndRunCallback(HistogramBase::Sample sample) const {
cb.Run(sample);
}
+void HistogramBase::GetCountAndBucketData(Count* count,
+ int64_t* sum,
+ ListValue* buckets) const {
+ std::unique_ptr<HistogramSamples> snapshot = SnapshotSamples();
+ *count = snapshot->TotalCount();
+ *sum = snapshot->sum();
+ std::unique_ptr<SampleCountIterator> it = snapshot->Iterator();
+ uint32_t index = 0;
+ while (!it->Done()) {
+ std::unique_ptr<DictionaryValue> bucket_value(new DictionaryValue());
+ Sample bucket_min;
+ int64_t bucket_max;
+ Count bucket_count;
+ it->Get(&bucket_min, &bucket_max, &bucket_count);
+
+ bucket_value->SetIntKey("low", bucket_min);
+ bucket_value->SetIntKey("high", bucket_max);
+ bucket_value->SetIntKey("count", bucket_count);
+ buckets->Set(index, std::move(bucket_value));
+ it->Next();
+ ++index;
+ }
+}
+
void HistogramBase::WriteAsciiBucketGraph(double current_size,
double max_size,
std::string* output) const {
diff --git a/chromium/base/metrics/histogram_base.h b/chromium/base/metrics/histogram_base.h
index de3a2cc6427..7a12fc1989e 100644
--- a/chromium/base/metrics/histogram_base.h
+++ b/chromium/base/metrics/histogram_base.h
@@ -236,7 +236,8 @@ class BASE_EXPORT HistogramBase {
// The following method provides graphical histogram displays.
virtual void WriteAscii(std::string* output) const = 0;
- // Returns histogram data as a Dict with the following format:
+ // Returns histograms data as a Dict (or an empty dict if not available),
+ // with the following format:
// {"header": "Name of the histogram with samples, mean, and/or flags",
// "body": "ASCII histogram representation"}
virtual base::DictionaryValue ToGraphDict() const = 0;
@@ -262,9 +263,9 @@ class BASE_EXPORT HistogramBase {
// Writes information about the current (non-empty) buckets and their sample
// counts to |buckets|, the total sample count to |count| and the total sum
// to |sum|.
- virtual void GetCountAndBucketData(Count* count,
- int64_t* sum,
- ListValue* buckets) const = 0;
+ void GetCountAndBucketData(Count* count,
+ int64_t* sum,
+ ListValue* buckets) const;
//// Produce actual graph (set of blank vs non blank char's) for a bucket.
void WriteAsciiBucketGraph(double current_size,
diff --git a/chromium/base/metrics/histogram_macros_internal.h b/chromium/base/metrics/histogram_macros_internal.h
index dcbff508e8e..9f68583d8af 100644
--- a/chromium/base/metrics/histogram_macros_internal.h
+++ b/chromium/base/metrics/histogram_macros_internal.h
@@ -12,7 +12,7 @@
#include <memory>
#include <type_traits>
-#include "base/logging.h"
+#include "base/check_op.h"
#include "base/metrics/histogram.h"
#include "base/metrics/sparse_histogram.h"
#include "base/time/time.h"
diff --git a/chromium/base/metrics/histogram_macros_local.h b/chromium/base/metrics/histogram_macros_local.h
index 38a2d785202..47e5ba42f49 100644
--- a/chromium/base/metrics/histogram_macros_local.h
+++ b/chromium/base/metrics/histogram_macros_local.h
@@ -5,7 +5,6 @@
#ifndef BASE_METRICS_HISTOGRAM_MACROS_LOCAL_H_
#define BASE_METRICS_HISTOGRAM_MACROS_LOCAL_H_
-#include "base/logging.h"
#include "base/metrics/histogram.h"
#include "base/metrics/histogram_macros_internal.h"
#include "base/time/time.h"
diff --git a/chromium/base/metrics/histogram_unittest.cc b/chromium/base/metrics/histogram_unittest.cc
index aef19340d4b..d7addaaa266 100644
--- a/chromium/base/metrics/histogram_unittest.cc
+++ b/chromium/base/metrics/histogram_unittest.cc
@@ -101,6 +101,15 @@ class HistogramTest : public testing::TestWithParam<bool> {
return h->SnapshotAllSamples();
}
+ void GetCountAndBucketData(Histogram* histogram,
+ base::Histogram::Count* count,
+ int64_t* sum,
+ base::ListValue* buckets) {
+ // A simple wrapper around |GetCountAndBucketData| to make it visible for
+ // testing.
+ histogram->GetCountAndBucketData(count, sum, buckets);
+ }
+
const bool use_persistent_histogram_allocator_;
std::unique_ptr<StatisticsRecorder> statistics_recorder_;
@@ -899,6 +908,46 @@ TEST_P(HistogramTest, ExpiredHistogramTest) {
EXPECT_EQ(2, samples->TotalCount());
}
+TEST_P(HistogramTest, CheckGetCountAndBucketData) {
+ const size_t kBucketCount = 50;
+ Histogram* histogram = static_cast<Histogram*>(Histogram::FactoryGet(
+ "AddCountHistogram", 10, 100, kBucketCount, HistogramBase::kNoFlags));
+ // Add samples in reverse order and make sure the output is in correct order.
+ histogram->AddCount(/*sample=*/30, /*value=*/14);
+ histogram->AddCount(/*sample=*/20, /*value=*/15);
+ histogram->AddCount(/*sample=*/20, /*value=*/15);
+ histogram->AddCount(/*sample=*/30, /*value=*/14);
+
+ base::Histogram::Count total_count;
+ int64_t sum;
+ base::ListValue buckets;
+ GetCountAndBucketData(histogram, &total_count, &sum, &buckets);
+ EXPECT_EQ(58, total_count);
+ EXPECT_EQ(1440, sum);
+ EXPECT_EQ(2u, buckets.GetSize());
+
+ int low, high, count;
+ // Check the first bucket.
+ base::DictionaryValue* bucket1;
+ EXPECT_TRUE(buckets.GetDictionary(0, &bucket1));
+ EXPECT_TRUE(bucket1->GetInteger("low", &low));
+ EXPECT_TRUE(bucket1->GetInteger("high", &high));
+ EXPECT_TRUE(bucket1->GetInteger("count", &count));
+ EXPECT_EQ(20, low);
+ EXPECT_EQ(21, high);
+ EXPECT_EQ(30, count);
+
+ // Check the second bucket.
+ base::DictionaryValue* bucket2;
+ EXPECT_TRUE(buckets.GetDictionary(1, &bucket2));
+ EXPECT_TRUE(bucket2->GetInteger("low", &low));
+ EXPECT_TRUE(bucket2->GetInteger("high", &high));
+ EXPECT_TRUE(bucket2->GetInteger("count", &count));
+ EXPECT_EQ(30, low);
+ EXPECT_EQ(31, high);
+ EXPECT_EQ(28, count);
+}
+
TEST_P(HistogramTest, WriteAscii) {
HistogramBase* histogram =
LinearHistogram::FactoryGet("AsciiOut", /*minimum=*/1, /*maximum=*/10,
diff --git a/chromium/base/metrics/sparse_histogram.cc b/chromium/base/metrics/sparse_histogram.cc
index 61635d0417f..6d2720c2369 100644
--- a/chromium/base/metrics/sparse_histogram.cc
+++ b/chromium/base/metrics/sparse_histogram.cc
@@ -238,13 +238,9 @@ HistogramBase* SparseHistogram::DeserializeInfoImpl(PickleIterator* iter) {
}
void SparseHistogram::GetParameters(DictionaryValue* params) const {
- // TODO(kaiwang): Implement. (See HistogramBase::WriteJSON.)
-}
-
-void SparseHistogram::GetCountAndBucketData(Count* count,
- int64_t* sum,
- ListValue* buckets) const {
- // TODO(kaiwang): Implement. (See HistogramBase::WriteJSON.)
+ // Unlike Histogram::GetParameters, only set the type here, and no other
+ // params. The other params do not make sense for sparse histograms.
+ params->SetString("type", HistogramTypeToString(GetHistogramType()));
}
void SparseHistogram::WriteAsciiBody(const HistogramSamples& snapshot,
diff --git a/chromium/base/metrics/sparse_histogram.h b/chromium/base/metrics/sparse_histogram.h
index ab1d9157063..ff1ce569b92 100644
--- a/chromium/base/metrics/sparse_histogram.h
+++ b/chromium/base/metrics/sparse_histogram.h
@@ -75,10 +75,8 @@ class BASE_EXPORT SparseHistogram : public HistogramBase {
base::PickleIterator* iter);
static HistogramBase* DeserializeInfoImpl(base::PickleIterator* iter);
+ // Writes the type of the sparse histogram in the |params|.
void GetParameters(DictionaryValue* params) const override;
- void GetCountAndBucketData(Count* count,
- int64_t* sum,
- ListValue* buckets) const override;
// Helpers for emitting Ascii graphic. Each method appends data to output.
void WriteAsciiBody(const HistogramSamples& snapshot,
@@ -90,7 +88,7 @@ class BASE_EXPORT SparseHistogram : public HistogramBase {
void WriteAsciiHeader(const HistogramSamples& snapshot,
std::string* output) const;
- // For constuctor calling.
+ // For constructor calling.
friend class SparseHistogramTest;
// Protects access to |samples_|.
diff --git a/chromium/base/metrics/sparse_histogram_unittest.cc b/chromium/base/metrics/sparse_histogram_unittest.cc
index a92b68b4a6d..47d8b818920 100644
--- a/chromium/base/metrics/sparse_histogram_unittest.cc
+++ b/chromium/base/metrics/sparse_histogram_unittest.cc
@@ -78,6 +78,15 @@ class SparseHistogramTest : public testing::TestWithParam<bool> {
return std::unique_ptr<SparseHistogram>(new SparseHistogram(name));
}
+ void GetCountAndBucketData(SparseHistogram* histogram,
+ base::Histogram::Count* count,
+ int64_t* sum,
+ base::ListValue* buckets) {
+ // A simple wrapper around |GetCountAndBucketData| to make it visible for
+ // testing.
+ histogram->GetCountAndBucketData(count, sum, buckets);
+ }
+
const bool use_persistent_histogram_allocator_;
std::unique_ptr<StatisticsRecorder> statistics_recorder_;
@@ -387,6 +396,44 @@ TEST_P(SparseHistogramTest, HistogramNameHash) {
EXPECT_EQ(histogram->name_hash(), HashMetricName(kName));
}
+TEST_P(SparseHistogramTest, CheckGetCountAndBucketData) {
+ std::unique_ptr<SparseHistogram> histogram(NewSparseHistogram("Sparse"));
+ // Add samples in reverse order and make sure the output is in correct order.
+ histogram->AddCount(/*sample=*/200, /*value=*/15);
+ histogram->AddCount(/*sample=*/100, /*value=*/5);
+ // Add samples to the same bucket and make sure they'll be aggregated.
+ histogram->AddCount(/*sample=*/100, /*value=*/5);
+
+ base::Histogram::Count total_count;
+ int64_t sum;
+ base::ListValue buckets;
+ GetCountAndBucketData(histogram.get(), &total_count, &sum, &buckets);
+ EXPECT_EQ(25, total_count);
+ EXPECT_EQ(4000, sum);
+ EXPECT_EQ(2u, buckets.GetSize());
+
+ int low, high, count;
+ // Check the first bucket.
+ base::DictionaryValue* bucket1;
+ EXPECT_TRUE(buckets.GetDictionary(0, &bucket1));
+ EXPECT_TRUE(bucket1->GetInteger("low", &low));
+ EXPECT_TRUE(bucket1->GetInteger("high", &high));
+ EXPECT_TRUE(bucket1->GetInteger("count", &count));
+ EXPECT_EQ(100, low);
+ EXPECT_EQ(101, high);
+ EXPECT_EQ(10, count);
+
+ // Check the second bucket.
+ base::DictionaryValue* bucket2;
+ EXPECT_TRUE(buckets.GetDictionary(1, &bucket2));
+ EXPECT_TRUE(bucket2->GetInteger("low", &low));
+ EXPECT_TRUE(bucket2->GetInteger("high", &high));
+ EXPECT_TRUE(bucket2->GetInteger("count", &count));
+ EXPECT_EQ(200, low);
+ EXPECT_EQ(201, high);
+ EXPECT_EQ(15, count);
+}
+
TEST_P(SparseHistogramTest, WriteAscii) {
HistogramBase* histogram =
SparseHistogram::FactoryGet("AsciiOut", HistogramBase::kNoFlags);
diff --git a/chromium/base/metrics/ukm_source_id.cc b/chromium/base/metrics/ukm_source_id.cc
index 3513b954a36..0b2a8baf296 100644
--- a/chromium/base/metrics/ukm_source_id.cc
+++ b/chromium/base/metrics/ukm_source_id.cc
@@ -33,7 +33,8 @@ UkmSourceId UkmSourceId::New() {
static_cast<int64_t>(RandUint64()) & ~kLowBitsMask;
// Generate some bits which are unique within the process, using a counter.
static AtomicSequenceNumber seq;
- UkmSourceId local_id = FromOtherId(seq.GetNext() + 1, UkmSourceId::Type::UKM);
+ UkmSourceId local_id =
+ FromOtherId(seq.GetNext() + 1, UkmSourceId::Type::DEFAULT);
// Combine the local and process bits to generate a unique ID.
return UkmSourceId((local_id.value_ & kLowBitsMask) | process_id_bits);
}
diff --git a/chromium/base/metrics/ukm_source_id.h b/chromium/base/metrics/ukm_source_id.h
index 3ba01a0d64c..1b9bdccece7 100644
--- a/chromium/base/metrics/ukm_source_id.h
+++ b/chromium/base/metrics/ukm_source_id.h
@@ -13,7 +13,9 @@ namespace base {
// An ID used to identify a Source to UKM, for recording information about it.
// These objects are copyable, assignable, and occupy 64-bits per instance.
-// Prefer passing them by value.
+// Prefer passing them by value. When a new type is added, please also update
+// the enum type in third_party/metrics_proto/ukm/source.proto and the
+// converting function ToProtobufSourceType.
class BASE_EXPORT UkmSourceId {
public:
enum class Type : int64_t {
@@ -21,7 +23,7 @@ class BASE_EXPORT UkmSourceId {
// 'custom' source other than the types below. Source of this type has
// additional restrictions with logging, as determined by
// IsWhitelistedSourceId.
- UKM = 0,
+ DEFAULT = 0,
// Sources created by navigation. They will be kept in memory as long as
// the associated tab is still alive and the number of sources are within
// the max threshold.
diff --git a/chromium/base/metrics/user_metrics.cc b/chromium/base/metrics/user_metrics.cc
index b007d62af3d..24a44515e60 100644
--- a/chromium/base/metrics/user_metrics.cc
+++ b/chromium/base/metrics/user_metrics.cc
@@ -14,7 +14,7 @@
#include "base/macros.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
-#include "base/trace_event/trace_event.h"
+#include "base/trace_event/base_tracing.h"
namespace base {
namespace {