Commit 953295e5 authored by Eric Seckler's avatar Eric Seckler Committed by Commit Bot

perfetto: Emit trace config in TraceEventMetadataSource

If tracing via the new perfetto Consumer API, TracingController won't
emit metadata. Emit the config in the TraceEventMetadataSource instead.

Bug: 950293, 950620
Change-Id: I535e6884e18a167d68788c46827b7bde43a24f8a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1559170
Commit-Queue: Eric Seckler <eseckler@chromium.org>
Auto-Submit: Eric Seckler <eseckler@chromium.org>
Reviewed-by: default avatarSami Kyöstilä <skyostil@chromium.org>
Cr-Commit-Position: refs/heads/master@{#648988}
parent c8ffa6c4
......@@ -40,6 +40,7 @@
#include "services/service_manager/public/cpp/connector.h"
#include "services/tracing/public/cpp/trace_event_agent.h"
#include "services/tracing/public/cpp/traced_process_impl.h"
#include "services/tracing/public/cpp/tracing_features.h"
#include "services/tracing/public/mojom/constants.mojom.h"
#include "v8/include/v8-version-string.h"
......@@ -220,7 +221,7 @@ TracingControllerImpl::GenerateMetadataDict() const {
// this does not happen; however, if the service manager is teared down during
// tracing, e.g. at Chrome shutdown, tracing controller may finish flushing
// traces without waiting for tracing agents.
if (trace_config_) {
if (trace_config_ && !tracing::TracingUsesPerfettoBackend()) {
DCHECK(IsTracing());
metadata_dict->SetString("trace-config", trace_config_->ToString());
}
......
......@@ -76,6 +76,9 @@ perfetto::TraceConfig GetDefaultPerfettoConfig(
perfetto_config.add_data_sources()->mutable_config();
trace_metadata_config->set_name(tracing::mojom::kMetaDataSourceName);
trace_metadata_config->set_target_buffer(0);
auto* metadata_chrome_config = trace_metadata_config->mutable_chrome_config();
metadata_chrome_config->set_trace_config(chrome_config_string);
// TODO(ssid): Also set privacy_filtering_enabled here.
return perfetto_config;
}
......
......@@ -23,6 +23,7 @@
#include "services/tracing/public/cpp/perfetto/thread_local_event_sink.h"
#include "services/tracing/public/cpp/perfetto/traced_value_proto_writer.h"
#include "services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h"
#include "services/tracing/public/cpp/trace_event_args_whitelist.h"
#include "services/tracing/public/mojom/constants.mojom.h"
#include "third_party/perfetto/include/perfetto/tracing/core/shared_memory_arbiter.h"
#include "third_party/perfetto/include/perfetto/tracing/core/startup_trace_writer.h"
......@@ -42,7 +43,11 @@ using ChromeEventBundleHandle =
TraceEventMetadataSource::TraceEventMetadataSource()
: DataSourceBase(mojom::kMetaDataSourceName),
origin_task_runner_(base::SequencedTaskRunnerHandle::Get()) {}
origin_task_runner_(base::SequencedTaskRunnerHandle::Get()) {
AddGeneratorFunction(base::BindRepeating(
&TraceEventMetadataSource::GenerateTraceConfigMetadataDict,
base::Unretained(this)));
}
TraceEventMetadataSource::~TraceEventMetadataSource() = default;
......@@ -52,6 +57,30 @@ void TraceEventMetadataSource::AddGeneratorFunction(
generator_functions_.push_back(generator);
}
std::unique_ptr<base::DictionaryValue>
TraceEventMetadataSource::GenerateTraceConfigMetadataDict() {
if (chrome_config_.empty()) {
return nullptr;
}
base::trace_event::TraceConfig parsed_chrome_config(chrome_config_);
auto metadata_dict = std::make_unique<base::DictionaryValue>();
// If argument filtering is enabled, we need to check if the trace config is
// whitelisted before emitting it.
// TODO(eseckler): Figure out a way to solve this without calling directly
// into IsMetadataWhitelisted().
if (!parsed_chrome_config.IsArgumentFilterEnabled() ||
IsMetadataWhitelisted("trace-config")) {
metadata_dict->SetString("trace-config", chrome_config_);
} else {
metadata_dict->SetString("trace-config", "__stripped__");
}
chrome_config_ = std::string();
return metadata_dict;
}
void TraceEventMetadataSource::GenerateMetadata(
std::unique_ptr<perfetto::TraceWriter> trace_writer) {
DCHECK(origin_task_runner_->RunsTasksInCurrentSequence());
......@@ -91,6 +120,7 @@ void TraceEventMetadataSource::StartTracing(
// sense to emit the metadata on startup, so the UI can display it right away.
privacy_filtering_enabled_ =
data_source_config.chrome_config().privacy_filtering_enabled();
chrome_config_ = data_source_config.chrome_config().trace_config();
trace_writer_ =
producer_client->CreateTraceWriter(data_source_config.target_buffer());
}
......@@ -107,6 +137,7 @@ void TraceEventMetadataSource::StopTracing(
std::move(stop_complete_callback));
} else {
trace_writer_.reset();
chrome_config_ = std::string();
std::move(stop_complete_callback).Run();
}
}
......
......@@ -51,11 +51,13 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventMetadataSource
private:
void GenerateMetadata(std::unique_ptr<perfetto::TraceWriter> trace_writer);
std::unique_ptr<base::DictionaryValue> GenerateTraceConfigMetadataDict();
std::vector<MetadataGeneratorFunction> generator_functions_;
scoped_refptr<base::SequencedTaskRunner> origin_task_runner_;
std::unique_ptr<perfetto::TraceWriter> trace_writer_;
bool privacy_filtering_enabled_ = false;
std::string chrome_config_;
DISALLOW_COPY_AND_ASSIGN(TraceEventMetadataSource);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment