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

Side by Side Diff: base/metrics/statistics_recorder.cc

Issue 1880803003: Display histograms from subprocesses in chrome://histograms (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebased Created 4 years, 8 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 "base/metrics/statistics_recorder.h" 5 #include "base/metrics/statistics_recorder.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <set>
8 9
9 #include "base/at_exit.h" 10 #include "base/at_exit.h"
10 #include "base/debug/leak_annotations.h" 11 #include "base/debug/leak_annotations.h"
11 #include "base/json/string_escape.h" 12 #include "base/json/string_escape.h"
12 #include "base/logging.h" 13 #include "base/logging.h"
13 #include "base/metrics/histogram.h" 14 #include "base/metrics/histogram.h"
14 #include "base/metrics/metrics_hashes.h" 15 #include "base/metrics/metrics_hashes.h"
15 #include "base/metrics/persistent_histogram_allocator.h" 16 #include "base/metrics/persistent_histogram_allocator.h"
16 #include "base/stl_util.h" 17 #include "base/stl_util.h"
17 #include "base/strings/stringprintf.h" 18 #include "base/strings/stringprintf.h"
18 #include "base/synchronization/lock.h" 19 #include "base/synchronization/lock.h"
19 #include "base/values.h" 20 #include "base/values.h"
20 21
21 namespace { 22 namespace {
22 23
23 // Initialize histogram statistics gathering system. 24 // Initialize histogram statistics gathering system.
24 base::LazyInstance<base::StatisticsRecorder>::Leaky g_statistics_recorder_ = 25 base::LazyInstance<base::StatisticsRecorder>::Leaky g_statistics_recorder_ =
25 LAZY_INSTANCE_INITIALIZER; 26 LAZY_INSTANCE_INITIALIZER;
26 27
27 bool HistogramNameLesser(const base::HistogramBase* a, 28 bool HistogramNameLesser(const base::HistogramBase* a,
28 const base::HistogramBase* b) { 29 const base::HistogramBase* b) {
29 return a->histogram_name() < b->histogram_name(); 30 return a->histogram_name() < b->histogram_name();
30 } 31 }
31 32
33 base::LazyInstance<std::set<base::StatisticsRecorder::MetricsDisplay*>>::Leaky
34 g_metrics_displays_ = LAZY_INSTANCE_INITIALIZER;
35
32 } // namespace 36 } // namespace
33 37
34 namespace base { 38 namespace base {
35 39
36 StatisticsRecorder::HistogramIterator::HistogramIterator( 40 StatisticsRecorder::HistogramIterator::HistogramIterator(
37 const HistogramMap::iterator& iter, bool include_persistent) 41 const HistogramMap::iterator& iter, bool include_persistent)
38 : iter_(iter), 42 : iter_(iter),
39 include_persistent_(include_persistent) { 43 include_persistent_(include_persistent) {
40 } 44 }
41 45
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 // static 200 // static
197 void StatisticsRecorder::WriteHTMLGraph(const std::string& query, 201 void StatisticsRecorder::WriteHTMLGraph(const std::string& query,
198 std::string* output) { 202 std::string* output) {
199 if (!IsActive()) 203 if (!IsActive())
200 return; 204 return;
201 205
202 Histograms snapshot; 206 Histograms snapshot;
203 GetSnapshot(query, &snapshot); 207 GetSnapshot(query, &snapshot);
204 std::sort(snapshot.begin(), snapshot.end(), &HistogramNameLesser); 208 std::sort(snapshot.begin(), snapshot.end(), &HistogramNameLesser);
205 for (const HistogramBase* histogram : snapshot) { 209 for (const HistogramBase* histogram : snapshot) {
206 histogram->WriteHTMLGraph(output); 210 histogram->WriteHTMLGraph(nullptr, output);
207 output->append("<br><hr><br>"); 211 output->append("<br><hr><br>");
208 } 212 }
213
214 for (auto display : g_metrics_displays_.Get()) {
215 output->append("<hr size=10 noshade><br><hr><br>\n<p>");
216 display->WriteTitleString(output);
217 output->append("</p>\n");
218 display->WriteGraphs(query, true, output);
219 }
209 } 220 }
210 221
211 // static 222 // static
212 void StatisticsRecorder::WriteGraph(const std::string& query, 223 void StatisticsRecorder::WriteGraph(const std::string& query,
213 std::string* output) { 224 std::string* output) {
214 if (!IsActive()) 225 if (!IsActive())
215 return; 226 return;
216 if (query.length()) 227 if (query.length())
217 StringAppendF(output, "Collections of histograms for %s\n", query.c_str()); 228 StringAppendF(output, "Collections of histograms for %s\n", query.c_str());
218 else 229 else
219 output->append("Collections of all histograms\n"); 230 output->append("Collections of all histograms\n");
220 231
221 Histograms snapshot; 232 Histograms snapshot;
222 GetSnapshot(query, &snapshot); 233 GetSnapshot(query, &snapshot);
223 std::sort(snapshot.begin(), snapshot.end(), &HistogramNameLesser); 234 std::sort(snapshot.begin(), snapshot.end(), &HistogramNameLesser);
224 for (const HistogramBase* histogram : snapshot) { 235 for (const HistogramBase* histogram : snapshot) {
225 histogram->WriteAscii(output); 236 histogram->WriteAscii(nullptr, output);
226 output->append("\n"); 237 output->append("\n");
227 } 238 }
239
240 for (auto display : g_metrics_displays_.Get()) {
241 output->append(
242 "########################################"
243 "########################################\n\n");
244 display->WriteTitleString(output);
245 output->append("\n\n");
246 display->WriteGraphs(query, false, output);
247 }
228 } 248 }
229 249
230 // static 250 // static
231 std::string StatisticsRecorder::ToJSON(const std::string& query) { 251 std::string StatisticsRecorder::ToJSON(const std::string& query) {
232 if (!IsActive()) 252 if (!IsActive())
233 return std::string(); 253 return std::string();
234 254
235 std::string output("{"); 255 std::string output("{");
236 if (!query.empty()) { 256 if (!query.empty()) {
237 output += "\"query\":"; 257 output += "\"query\":";
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 if (!lock_) 414 if (!lock_)
395 return 0; 415 return 0;
396 416
397 base::AutoLock auto_lock(*lock_); 417 base::AutoLock auto_lock(*lock_);
398 if (!histograms_) 418 if (!histograms_)
399 return 0; 419 return 0;
400 return histograms_->size(); 420 return histograms_->size();
401 } 421 }
402 422
403 // static 423 // static
424 void StatisticsRecorder::RegisterMetricsDisplay(MetricsDisplay* display) {
425 DCHECK(!ContainsKey(g_metrics_displays_.Get(), display));
426 g_metrics_displays_.Get().insert(display);
427 }
428
429 // static
430 void StatisticsRecorder::DeregisterMetricsDisplay(MetricsDisplay* display) {
431 DCHECK(ContainsKey(g_metrics_displays_.Get(), display));
432 g_metrics_displays_.Get().erase(display);
433 }
434
435 // static
404 void StatisticsRecorder::ForgetHistogramForTesting(base::StringPiece name) { 436 void StatisticsRecorder::ForgetHistogramForTesting(base::StringPiece name) {
405 if (histograms_) 437 if (histograms_)
406 histograms_->erase(name); 438 histograms_->erase(name);
407 } 439 }
408 440
409 // static 441 // static
410 void StatisticsRecorder::UninitializeForTesting() { 442 void StatisticsRecorder::UninitializeForTesting() {
411 // Stop now if it's never been initialized. 443 // Stop now if it's never been initialized.
412 if (lock_ == NULL || histograms_ == NULL) 444 if (lock_ == NULL || histograms_ == NULL)
413 return; 445 return;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 // static 517 // static
486 StatisticsRecorder::HistogramMap* StatisticsRecorder::histograms_ = NULL; 518 StatisticsRecorder::HistogramMap* StatisticsRecorder::histograms_ = NULL;
487 // static 519 // static
488 StatisticsRecorder::CallbackMap* StatisticsRecorder::callbacks_ = NULL; 520 StatisticsRecorder::CallbackMap* StatisticsRecorder::callbacks_ = NULL;
489 // static 521 // static
490 StatisticsRecorder::RangesMap* StatisticsRecorder::ranges_ = NULL; 522 StatisticsRecorder::RangesMap* StatisticsRecorder::ranges_ = NULL;
491 // static 523 // static
492 base::Lock* StatisticsRecorder::lock_ = NULL; 524 base::Lock* StatisticsRecorder::lock_ = NULL;
493 525
494 } // namespace base 526 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698