Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(562)

Side by Side Diff: chromecast/browser/metrics/external_metrics.cc

Issue 2955953002: [Cleanup] Migrate ExternalMetrics to use the Task Scheduler. (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chromecast/browser/metrics/external_metrics.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromecast/browser/metrics/external_metrics.h" 5 #include "chromecast/browser/metrics/external_metrics.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/files/file_path.h" 14 #include "base/files/file_path.h"
15 #include "base/files/file_util.h" 15 #include "base/files/file_util.h"
16 #include "base/metrics/histogram.h" 16 #include "base/metrics/histogram.h"
17 #include "base/metrics/sparse_histogram.h" 17 #include "base/metrics/sparse_histogram.h"
18 #include "base/metrics/statistics_recorder.h" 18 #include "base/metrics/statistics_recorder.h"
19 #include "base/task_scheduler/post_task.h"
20 #include "base/task_scheduler/task_traits.h"
21 #include "base/threading/thread_restrictions.h"
19 #include "chromecast/base/metrics/cast_histograms.h" 22 #include "chromecast/base/metrics/cast_histograms.h"
20 #include "chromecast/base/metrics/cast_metrics_helper.h" 23 #include "chromecast/base/metrics/cast_metrics_helper.h"
21 #include "chromecast/browser/metrics/cast_stability_metrics_provider.h" 24 #include "chromecast/browser/metrics/cast_stability_metrics_provider.h"
22 #include "components/metrics/metrics_service.h" 25 #include "components/metrics/metrics_service.h"
23 #include "components/metrics/serialization/metric_sample.h" 26 #include "components/metrics/serialization/metric_sample.h"
24 #include "components/metrics/serialization/serialization_utils.h" 27 #include "components/metrics/serialization/serialization_utils.h"
25 #include "content/public/browser/browser_thread.h" 28 #include "content/public/browser/browser_thread.h"
26 29
27 namespace chromecast { 30 namespace chromecast {
28 namespace metrics { 31 namespace metrics {
(...skipping 26 matching lines...) Expand all
55 ExternalMetrics::ExternalMetrics( 58 ExternalMetrics::ExternalMetrics(
56 CastStabilityMetricsProvider* stability_provider, 59 CastStabilityMetricsProvider* stability_provider,
57 const std::string& uma_events_file) 60 const std::string& uma_events_file)
58 : stability_provider_(stability_provider), 61 : stability_provider_(stability_provider),
59 uma_events_file_(uma_events_file), 62 uma_events_file_(uma_events_file),
60 weak_factory_(this) { 63 weak_factory_(this) {
61 DCHECK(stability_provider); 64 DCHECK(stability_provider);
62 } 65 }
63 66
64 ExternalMetrics::~ExternalMetrics() { 67 ExternalMetrics::~ExternalMetrics() {
65 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
66 } 68 }
gfhuang 2017/06/27 00:34:54 should we add a sequence_checker?
Ilya Sherman 2017/06/27 19:17:16 Done.
67 69
68 void ExternalMetrics::StopAndDestroy() { 70 void ExternalMetrics::StopAndDestroy() {
69 content::BrowserThread::DeleteSoon(
70 content::BrowserThread::FILE, FROM_HERE, this);
71 } 71 }
72 72
gfhuang 2017/06/27 00:34:54 Are above 2 changes safe? Now the object could be
Ilya Sherman 2017/06/27 19:17:16 Sorry, I missed that |this| was actually used with
73 void ExternalMetrics::Start() { 73 void ExternalMetrics::Start() {
74 bool result = content::BrowserThread::PostDelayedTask( 74 ScheduleCollection();
75 content::BrowserThread::FILE,
76 FROM_HERE,
77 base::Bind(&ExternalMetrics::CollectEventsAndReschedule,
78 weak_factory_.GetWeakPtr()),
79 base::TimeDelta::FromSeconds(kExternalMetricsCollectionIntervalSeconds));
80 DCHECK(result);
81 } 75 }
82 76
83 void ExternalMetrics::ProcessExternalEvents(const base::Closure& cb) { 77 void ExternalMetrics::ProcessExternalEvents(const base::Closure& cb) {
84 content::BrowserThread::PostTaskAndReply( 78 // Note that CollectEvents accesses a global singleton, and thus scheduling
85 content::BrowserThread::FILE, FROM_HERE, 79 // with CONTINUE_ON_SHUTDOWN might not be safe.
86 base::Bind( 80 base::PostTaskWithTraitsAndReply(
87 base::IgnoreResult(&ExternalMetrics::CollectEvents), 81 FROM_HERE,
88 weak_factory_.GetWeakPtr()), 82 {base::MayBlock(), base::TaskPriority::BACKGROUND,
83 base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
84 base::Bind(base::IgnoreResult(&ExternalMetrics::CollectEvents),
85 weak_factory_.GetWeakPtr()),
gfhuang 2017/06/27 00:34:54 nit. BindOnce
Ilya Sherman 2017/06/27 19:17:16 Done.
89 cb); 86 cb);
90 } 87 }
gfhuang 2017/06/27 00:55:01 I think another issue is here. because ScheduleCo
Ilya Sherman 2017/06/27 19:17:16 Yes, that's a good point, thanks! I got much too
91 88
92 void ExternalMetrics::RecordCrash(const std::string& crash_kind) { 89 void ExternalMetrics::RecordCrash(const std::string& crash_kind) {
93 content::BrowserThread::PostTask( 90 content::BrowserThread::PostTask(
94 content::BrowserThread::UI, 91 content::BrowserThread::UI,
95 FROM_HERE, 92 FROM_HERE,
96 base::Bind(&CastStabilityMetricsProvider::LogExternalCrash, 93 base::Bind(&CastStabilityMetricsProvider::LogExternalCrash,
97 base::Unretained(stability_provider_), 94 base::Unretained(stability_provider_),
98 crash_kind)); 95 crash_kind));
99 } 96 }
100 97
101 void ExternalMetrics::RecordSparseHistogram( 98 void ExternalMetrics::RecordSparseHistogram(
102 const ::metrics::MetricSample& sample) { 99 const ::metrics::MetricSample& sample) {
103 CHECK_EQ(::metrics::MetricSample::SPARSE_HISTOGRAM, sample.type()); 100 CHECK_EQ(::metrics::MetricSample::SPARSE_HISTOGRAM, sample.type());
104 base::HistogramBase* counter = base::SparseHistogram::FactoryGet( 101 base::HistogramBase* counter = base::SparseHistogram::FactoryGet(
105 sample.name(), base::HistogramBase::kUmaTargetedHistogramFlag); 102 sample.name(), base::HistogramBase::kUmaTargetedHistogramFlag);
106 counter->Add(sample.sample()); 103 counter->Add(sample.sample());
107 } 104 }
108 105
109 int ExternalMetrics::CollectEvents() { 106 int ExternalMetrics::CollectEvents() {
107 base::ThreadRestrictions::AssertIOAllowed();
108
110 std::vector<std::unique_ptr<::metrics::MetricSample>> samples; 109 std::vector<std::unique_ptr<::metrics::MetricSample>> samples;
111 ::metrics::SerializationUtils::ReadAndTruncateMetricsFromFile( 110 ::metrics::SerializationUtils::ReadAndTruncateMetricsFromFile(
112 uma_events_file_, &samples); 111 uma_events_file_, &samples);
113 112
114 for (auto it = samples.begin(); it != samples.end(); ++it) { 113 for (auto it = samples.begin(); it != samples.end(); ++it) {
115 const ::metrics::MetricSample& sample = **it; 114 const ::metrics::MetricSample& sample = **it;
116 115
117 switch (sample.type()) { 116 switch (sample.type()) {
118 case ::metrics::MetricSample::CRASH: 117 case ::metrics::MetricSample::CRASH:
119 RecordCrash(sample.name()); 118 RecordCrash(sample.name());
(...skipping 25 matching lines...) Expand all
145 case ::metrics::MetricSample::SPARSE_HISTOGRAM: 144 case ::metrics::MetricSample::SPARSE_HISTOGRAM:
146 RecordSparseHistogram(sample); 145 RecordSparseHistogram(sample);
147 break; 146 break;
148 } 147 }
149 } 148 }
150 149
151 return samples.size(); 150 return samples.size();
152 } 151 }
153 152
154 void ExternalMetrics::CollectEventsAndReschedule() { 153 void ExternalMetrics::CollectEventsAndReschedule() {
155 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
156 CollectEvents(); 154 CollectEvents();
157 bool result = content::BrowserThread::PostDelayedTask( 155 ScheduleCollection();
158 content::BrowserThread::FILE, 156 }
157
158 void ExternalMetrics::ScheduleCollection() {
159 // Note that CollectEvents accesses a global singleton, and thus scheduling
160 // with CONTINUE_ON_SHUTDOWN might not be safe.
161 base::PostDelayedTaskWithTraits(
159 FROM_HERE, 162 FROM_HERE,
163 {base::MayBlock(), base::TaskPriority::BACKGROUND,
164 base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
160 base::Bind(&ExternalMetrics::CollectEventsAndReschedule, 165 base::Bind(&ExternalMetrics::CollectEventsAndReschedule,
161 weak_factory_.GetWeakPtr()), 166 weak_factory_.GetWeakPtr()),
162 base::TimeDelta::FromSeconds(kExternalMetricsCollectionIntervalSeconds)); 167 base::TimeDelta::FromSeconds(kExternalMetricsCollectionIntervalSeconds));
163 DCHECK(result);
164 } 168 }
165 169
166 } // namespace metrics 170 } // namespace metrics
167 } // namespace chromecast 171 } // namespace chromecast
OLDNEW
« no previous file with comments | « chromecast/browser/metrics/external_metrics.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698