Index: content/browser/tracing/background_tracing_manager_impl.cc |
diff --git a/content/browser/tracing/background_tracing_manager_impl.cc b/content/browser/tracing/background_tracing_manager_impl.cc |
index 74d63800e6a63aa4c7a6225d162dcd5494e79298..7c06cbbd2a13db7f21caa44c40d0cac8e9d1ec35 100644 |
--- a/content/browser/tracing/background_tracing_manager_impl.cc |
+++ b/content/browser/tracing/background_tracing_manager_impl.cc |
@@ -4,8 +4,10 @@ |
#include "content/browser/tracing/background_tracing_manager_impl.h" |
+#include "base/json/json_writer.h" |
#include "base/macros.h" |
#include "base/metrics/histogram_macros.h" |
+#include "base/strings/string_split.h" |
#include "base/time/time.h" |
#include "content/public/browser/background_tracing_preemptive_config.h" |
#include "content/public/browser/background_tracing_reactive_config.h" |
@@ -21,6 +23,9 @@ namespace { |
base::LazyInstance<BackgroundTracingManagerImpl>::Leaky g_controller = |
LAZY_INSTANCE_INITIALIZER; |
+const char kMetaDataConfigKey[] = "config"; |
+const char kMetaDataVersionKey[] = "version"; |
+ |
// These values are used for a histogram. Do not reorder. |
enum BackgroundTracingMetrics { |
SCENARIO_ACTIVATION_REQUESTED = 0, |
@@ -370,11 +375,25 @@ void BackgroundTracingManagerImpl::OnFinalizeStarted( |
UMA_HISTOGRAM_MEMORY_KB("Tracing.Background.FinalizingTraceSizeInKB", |
file_contents->size() / 1024); |
- if (!receive_callback_.is_null()) |
+ if (!receive_callback_.is_null()) { |
+ std::map<std::string, std::string> metadata; |
+ |
+ auto metadata_dict = GenerateMetadataDict(); |
+ if (metadata_dict) { |
+ for (base::DictionaryValue::Iterator it(*metadata_dict); !it.IsAtEnd(); |
+ it.Advance()) { |
+ std::string value; |
+ if (!it.value().GetAsString(&value)) |
+ continue; |
+ metadata.insert(std::make_pair(it.key(), value)); |
+ } |
+ } |
+ |
receive_callback_.Run( |
- file_contents, |
+ file_contents, metadata, |
base::Bind(&BackgroundTracingManagerImpl::OnFinalizeComplete, |
base::Unretained(this))); |
+ } |
} |
void BackgroundTracingManagerImpl::OnFinalizeComplete() { |
@@ -398,6 +417,34 @@ void BackgroundTracingManagerImpl::OnFinalizeComplete() { |
RecordBackgroundTracingMetric(FINALIZATION_COMPLETE); |
} |
+scoped_ptr<base::DictionaryValue> |
+BackgroundTracingManagerImpl::GenerateMetadataDict() const { |
+ // Grab the product version. |
+ std::string product_version = GetContentClient()->GetProduct(); |
+ std::vector<std::string> product_components; |
+ base::SplitString(product_version, '/', &product_components); |
+ DCHECK_EQ(2U, product_components.size()); |
+ if (product_components.size() != 2U) |
+ return nullptr; |
+ |
+ 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.
|
+ |
+ // Serialize the config into json. |
+ scoped_ptr<base::DictionaryValue> config_dict(new base::DictionaryValue()); |
+ |
+ BackgroundTracingConfig::IntoDict(config_.get(), config_dict.get()); |
+ |
+ std::string config_string; |
+ if (!base::JSONWriter::Write(*config_dict.get(), &config_string)) |
+ return nullptr; |
+ |
+ scoped_ptr<base::DictionaryValue> metadata_dict(new base::DictionaryValue()); |
+ metadata_dict->SetString(kMetaDataConfigKey, config_string); |
+ metadata_dict->SetString(kMetaDataVersionKey, product_version); |
+ |
+ return metadata_dict.Pass(); |
+} |
+ |
void BackgroundTracingManagerImpl::BeginFinalizing( |
StartedFinalizingCallback callback) { |
is_gathering_ = true; |
@@ -413,6 +460,13 @@ void BackgroundTracingManagerImpl::BeginFinalizing( |
trace_data_sink = content::TracingController::CreateCompressedStringSink( |
data_endpoint_wrapper_); |
RecordBackgroundTracingMetric(FINALIZATION_ALLOWED); |
+ |
+ auto metadata_dict = GenerateMetadataDict(); |
+ if (metadata_dict) { |
+ std::string results; |
+ 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
|
+ trace_data_sink->SetMetadata(results); |
+ } |
} else { |
RecordBackgroundTracingMetric(FINALIZATION_DISALLOWED); |
} |