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

Side by Side Diff: content/browser/tracing/background_tracing_manager_impl.cc

Issue 1181213002: Slow Reports - Embed Metadata in Traces (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments addressed. Created 5 years, 6 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "content/browser/tracing/background_tracing_manager_impl.h" 5 #include "content/browser/tracing/background_tracing_manager_impl.h"
6 6
7 #include "base/json/json_writer.h"
7 #include "base/macros.h" 8 #include "base/macros.h"
8 #include "base/metrics/histogram_macros.h" 9 #include "base/metrics/histogram_macros.h"
10 #include "base/strings/string_split.h"
9 #include "base/time/time.h" 11 #include "base/time/time.h"
10 #include "content/public/browser/background_tracing_preemptive_config.h" 12 #include "content/public/browser/background_tracing_preemptive_config.h"
11 #include "content/public/browser/background_tracing_reactive_config.h" 13 #include "content/public/browser/background_tracing_reactive_config.h"
12 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
13 #include "content/public/browser/content_browser_client.h" 15 #include "content/public/browser/content_browser_client.h"
14 #include "content/public/browser/tracing_delegate.h" 16 #include "content/public/browser/tracing_delegate.h"
15 #include "content/public/common/content_client.h" 17 #include "content/public/common/content_client.h"
16 18
17 namespace content { 19 namespace content {
18 20
19 namespace { 21 namespace {
20 22
21 base::LazyInstance<BackgroundTracingManagerImpl>::Leaky g_controller = 23 base::LazyInstance<BackgroundTracingManagerImpl>::Leaky g_controller =
22 LAZY_INSTANCE_INITIALIZER; 24 LAZY_INSTANCE_INITIALIZER;
23 25
26 const char kMetaDataConfigKey[] = "config";
27 const char kMetaDataVersionKey[] = "version";
28
24 // These values are used for a histogram. Do not reorder. 29 // These values are used for a histogram. Do not reorder.
25 enum BackgroundTracingMetrics { 30 enum BackgroundTracingMetrics {
26 SCENARIO_ACTIVATION_REQUESTED = 0, 31 SCENARIO_ACTIVATION_REQUESTED = 0,
27 SCENARIO_ACTIVATED_SUCCESSFULLY = 1, 32 SCENARIO_ACTIVATED_SUCCESSFULLY = 1,
28 RECORDING_ENABLED = 2, 33 RECORDING_ENABLED = 2,
29 PREEMPTIVE_TRIGGERED = 3, 34 PREEMPTIVE_TRIGGERED = 3,
30 REACTIVE_TRIGGERED = 4, 35 REACTIVE_TRIGGERED = 4,
31 FINALIZATION_ALLOWED = 5, 36 FINALIZATION_ALLOWED = 5,
32 FINALIZATION_DISALLOWED = 6, 37 FINALIZATION_DISALLOWED = 6,
33 FINALIZATION_STARTED = 7, 38 FINALIZATION_STARTED = 7,
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 } 368 }
364 369
365 void BackgroundTracingManagerImpl::OnFinalizeStarted( 370 void BackgroundTracingManagerImpl::OnFinalizeStarted(
366 scoped_refptr<base::RefCountedString> file_contents) { 371 scoped_refptr<base::RefCountedString> file_contents) {
367 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 372 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
368 373
369 RecordBackgroundTracingMetric(FINALIZATION_STARTED); 374 RecordBackgroundTracingMetric(FINALIZATION_STARTED);
370 UMA_HISTOGRAM_MEMORY_KB("Tracing.Background.FinalizingTraceSizeInKB", 375 UMA_HISTOGRAM_MEMORY_KB("Tracing.Background.FinalizingTraceSizeInKB",
371 file_contents->size() / 1024); 376 file_contents->size() / 1024);
372 377
373 if (!receive_callback_.is_null()) 378 if (!receive_callback_.is_null()) {
379 std::map<std::string, std::string> metadata;
380
381 auto metadata_dict = GenerateMetadataDict();
382 if (metadata_dict) {
383 for (base::DictionaryValue::Iterator it(*metadata_dict); !it.IsAtEnd();
384 it.Advance()) {
385 std::string value;
386 if (!it.value().GetAsString(&value))
387 continue;
388 metadata.insert(std::make_pair(it.key(), value));
389 }
390 }
391
374 receive_callback_.Run( 392 receive_callback_.Run(
375 file_contents, 393 file_contents, metadata,
376 base::Bind(&BackgroundTracingManagerImpl::OnFinalizeComplete, 394 base::Bind(&BackgroundTracingManagerImpl::OnFinalizeComplete,
377 base::Unretained(this))); 395 base::Unretained(this)));
396 }
378 } 397 }
379 398
380 void BackgroundTracingManagerImpl::OnFinalizeComplete() { 399 void BackgroundTracingManagerImpl::OnFinalizeComplete() {
381 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { 400 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
382 BrowserThread::PostTask( 401 BrowserThread::PostTask(
383 BrowserThread::UI, FROM_HERE, 402 BrowserThread::UI, FROM_HERE,
384 base::Bind(&BackgroundTracingManagerImpl::OnFinalizeComplete, 403 base::Bind(&BackgroundTracingManagerImpl::OnFinalizeComplete,
385 base::Unretained(this))); 404 base::Unretained(this)));
386 return; 405 return;
387 } 406 }
388 407
389 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 408 CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
390 409
391 is_gathering_ = false; 410 is_gathering_ = false;
392 411
393 if (!idle_callback_.is_null()) 412 if (!idle_callback_.is_null())
394 idle_callback_.Run(); 413 idle_callback_.Run();
395 414
396 // Now that a trace has completed, we may need to enable recording again. 415 // Now that a trace has completed, we may need to enable recording again.
397 EnableRecordingIfConfigNeedsIt(); 416 EnableRecordingIfConfigNeedsIt();
398 RecordBackgroundTracingMetric(FINALIZATION_COMPLETE); 417 RecordBackgroundTracingMetric(FINALIZATION_COMPLETE);
399 } 418 }
400 419
420 scoped_ptr<base::DictionaryValue>
421 BackgroundTracingManagerImpl::GenerateMetadataDict() const {
422 // Grab the product version.
423 std::string product_version = GetContentClient()->GetProduct();
424 std::vector<std::string> product_components;
425 base::SplitString(product_version, '/', &product_components);
426 DCHECK_EQ(2U, product_components.size());
427 if (product_components.size() != 2U)
428 return nullptr;
429
430 product_version = product_components[1];
oystein (OOO til 10th of July) 2015/06/12 19:29:16 Is it worth cutting out the "Chrome/" part? Could
shatch 2015/06/12 20:53:47 Done.
431
432 // Serialize the config into json.
433 scoped_ptr<base::DictionaryValue> config_dict(new base::DictionaryValue());
434
435 BackgroundTracingConfig::IntoDict(config_.get(), config_dict.get());
436
437 std::string config_string;
438 if (!base::JSONWriter::Write(*config_dict.get(), &config_string))
439 return nullptr;
440
441 scoped_ptr<base::DictionaryValue> metadata_dict(new base::DictionaryValue());
442 metadata_dict->SetString(kMetaDataConfigKey, config_string);
443 metadata_dict->SetString(kMetaDataVersionKey, product_version);
444
445 return metadata_dict.Pass();
446 }
447
401 void BackgroundTracingManagerImpl::BeginFinalizing( 448 void BackgroundTracingManagerImpl::BeginFinalizing(
402 StartedFinalizingCallback callback) { 449 StartedFinalizingCallback callback) {
403 is_gathering_ = true; 450 is_gathering_ = true;
404 is_tracing_ = false; 451 is_tracing_ = false;
405 452
406 bool is_allowed_finalization = 453 bool is_allowed_finalization =
407 !delegate_ || (config_ && 454 !delegate_ || (config_ &&
408 delegate_->IsAllowedToEndBackgroundScenario( 455 delegate_->IsAllowedToEndBackgroundScenario(
409 *config_.get(), requires_anonymized_data_)); 456 *config_.get(), requires_anonymized_data_));
410 457
411 scoped_refptr<TracingControllerImpl::TraceDataSink> trace_data_sink; 458 scoped_refptr<TracingControllerImpl::TraceDataSink> trace_data_sink;
412 if (is_allowed_finalization) { 459 if (is_allowed_finalization) {
413 trace_data_sink = content::TracingController::CreateCompressedStringSink( 460 trace_data_sink = content::TracingController::CreateCompressedStringSink(
414 data_endpoint_wrapper_); 461 data_endpoint_wrapper_);
415 RecordBackgroundTracingMetric(FINALIZATION_ALLOWED); 462 RecordBackgroundTracingMetric(FINALIZATION_ALLOWED);
463
464 auto metadata_dict = GenerateMetadataDict();
465 if (metadata_dict) {
466 std::string results;
467 if (base::JSONWriter::Write(*metadata_dict.get(), &results))
dsinclair 2015/06/12 19:38:51 This is going to produce strange levels of encodin
shatch 2015/06/12 20:53:48 Ah didn't think about the double encoding, checked
468 trace_data_sink->SetMetadata(results);
469 }
416 } else { 470 } else {
417 RecordBackgroundTracingMetric(FINALIZATION_DISALLOWED); 471 RecordBackgroundTracingMetric(FINALIZATION_DISALLOWED);
418 } 472 }
419 473
420 content::TracingController::GetInstance()->DisableRecording(trace_data_sink); 474 content::TracingController::GetInstance()->DisableRecording(trace_data_sink);
421 475
422 if (!callback.is_null()) 476 if (!callback.is_null())
423 callback.Run(is_allowed_finalization); 477 callback.Run(is_allowed_finalization);
424 } 478 }
425 479
426 std::string 480 std::string
427 BackgroundTracingManagerImpl::GetCategoryFilterStringForCategoryPreset( 481 BackgroundTracingManagerImpl::GetCategoryFilterStringForCategoryPreset(
428 BackgroundTracingConfig::CategoryPreset preset) const { 482 BackgroundTracingConfig::CategoryPreset preset) const {
429 switch (preset) { 483 switch (preset) {
430 case BackgroundTracingConfig::CategoryPreset::BENCHMARK: 484 case BackgroundTracingConfig::CategoryPreset::BENCHMARK:
431 return "benchmark," 485 return "benchmark,"
432 "disabled-by-default-toplevel.flow," 486 "disabled-by-default-toplevel.flow,"
433 "disabled-by-default-ipc.flow"; 487 "disabled-by-default-ipc.flow";
434 case BackgroundTracingConfig::CategoryPreset::BENCHMARK_DEEP: 488 case BackgroundTracingConfig::CategoryPreset::BENCHMARK_DEEP:
435 return "*,disabled-by-default-blink.debug.layout"; 489 return "*,disabled-by-default-blink.debug.layout";
436 } 490 }
437 NOTREACHED(); 491 NOTREACHED();
438 return ""; 492 return "";
439 } 493 }
440 494
441 } // namspace content 495 } // namspace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698