Commit 1d2c953e authored by ssid's avatar ssid Committed by Commit Bot

Add metadata at beginning of trace for discard buffer mode

Trace metadata is almost always discarded in discard buffer mode of
perfetto tracing. For this case, add metadata at beginning of the trace.
Handles cases when generators are added while tracing.

Change-Id: I911794fba1e7b460ca1a7a3a54599a8c05678d75
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1812248
Commit-Queue: ssid <ssid@chromium.org>
Reviewed-by: default avatarEric Seckler <eseckler@chromium.org>
Cr-Commit-Position: refs/heads/master@{#699493}
parent 2da1b7ab
...@@ -234,9 +234,6 @@ class TracingControllerTest : public ContentBrowserTest { ...@@ -234,9 +234,6 @@ class TracingControllerTest : public ContentBrowserTest {
Navigate(shell()); Navigate(shell());
TracingControllerImpl* controller = TracingControllerImpl::GetInstance(); TracingControllerImpl* controller = TracingControllerImpl::GetInstance();
tracing::TraceEventAgent::GetInstance()->AddMetadataGeneratorFunction(
base::Bind(&TracingControllerTest::GenerateMetadataDict,
base::Unretained(this)));
{ {
base::RunLoop run_loop; base::RunLoop run_loop;
...@@ -266,6 +263,9 @@ class TracingControllerTest : public ContentBrowserTest { ...@@ -266,6 +263,9 @@ class TracingControllerTest : public ContentBrowserTest {
metadata_ = std::make_unique<base::DictionaryValue>(); metadata_ = std::make_unique<base::DictionaryValue>();
metadata_->SetString("not-whitelisted", "this_not_found"); metadata_->SetString("not-whitelisted", "this_not_found");
tracing::TraceEventAgent::GetInstance()->AddMetadataGeneratorFunction(
base::Bind(&TracingControllerTest::GenerateMetadataDict,
base::Unretained(this)));
bool result = controller->StopTracing(trace_data_endpoint); bool result = controller->StopTracing(trace_data_endpoint);
ASSERT_TRUE(result); ASSERT_TRUE(result);
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "base/trace_event/trace_config.h" #include "base/trace_event/trace_config.h"
#include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h" #include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h"
#include "third_party/perfetto/protos/perfetto/trace/chrome/chrome_metadata.pbzero.h" #include "third_party/perfetto/protos/perfetto/trace/chrome/chrome_metadata.pbzero.h"
#include "third_party/perfetto/protos/perfetto/trace/chrome/chrome_trace_event.pbzero.h"
namespace perfetto { namespace perfetto {
class StartupTraceWriter; class StartupTraceWriter;
...@@ -60,7 +61,9 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventMetadataSource ...@@ -60,7 +61,9 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventMetadataSource
perfetto::protos::pbzero::ChromeMetadataPacket*, perfetto::protos::pbzero::ChromeMetadataPacket*,
bool /* privacy_filtering_enabled */)>; bool /* privacy_filtering_enabled */)>;
// Any callbacks passed here will be called when tracing starts. // Any callbacks passed here will be called when tracing. Note that if tracing
// is enabled while calling this method, the callback may be invoked
// directly.
void AddGeneratorFunction(JsonMetadataGeneratorFunction generator); void AddGeneratorFunction(JsonMetadataGeneratorFunction generator);
// Same as above, but for filling in proto format. // Same as above, but for filling in proto format.
void AddGeneratorFunction(MetadataGeneratorFunction generator); void AddGeneratorFunction(MetadataGeneratorFunction generator);
...@@ -81,15 +84,29 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventMetadataSource ...@@ -81,15 +84,29 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventMetadataSource
TraceEventMetadataSource(); TraceEventMetadataSource();
~TraceEventMetadataSource() override; ~TraceEventMetadataSource() override;
void GenerateMetadata(std::unique_ptr<perfetto::TraceWriter> trace_writer); void GenerateMetadata(
std::unique_ptr<std::vector<JsonMetadataGeneratorFunction>>
json_generators,
std::unique_ptr<std::vector<MetadataGeneratorFunction>> proto_generators);
void GenerateMetadataFromGenerator(
const MetadataGeneratorFunction& generator);
void GenerateJsonMetadataFromGenerator(
const JsonMetadataGeneratorFunction& generator,
perfetto::protos::pbzero::ChromeEventBundle* event_bundle);
std::unique_ptr<base::DictionaryValue> GenerateTraceConfigMetadataDict(); std::unique_ptr<base::DictionaryValue> GenerateTraceConfigMetadataDict();
// All members are protected by |lock_|.
base::Lock lock_;
std::vector<JsonMetadataGeneratorFunction> json_generator_functions_; std::vector<JsonMetadataGeneratorFunction> json_generator_functions_;
std::vector<MetadataGeneratorFunction> generator_functions_; std::vector<MetadataGeneratorFunction> generator_functions_;
scoped_refptr<base::SequencedTaskRunner> origin_task_runner_;
const scoped_refptr<base::SequencedTaskRunner> origin_task_runner_;
std::unique_ptr<perfetto::TraceWriter> trace_writer_; std::unique_ptr<perfetto::TraceWriter> trace_writer_;
bool privacy_filtering_enabled_ = false; bool privacy_filtering_enabled_ = false;
std::string chrome_config_; std::string chrome_config_;
std::unique_ptr<base::trace_event::TraceConfig> parsed_chrome_config_;
bool emit_metadata_at_start_ = false;
DISALLOW_COPY_AND_ASSIGN(TraceEventMetadataSource); DISALLOW_COPY_AND_ASSIGN(TraceEventMetadataSource);
}; };
......
...@@ -486,24 +486,76 @@ void MetadataHasNamedValue(const google::protobuf::RepeatedPtrField< ...@@ -486,24 +486,76 @@ void MetadataHasNamedValue(const google::protobuf::RepeatedPtrField<
NOTREACHED(); NOTREACHED();
} }
TEST_F(TraceEventDataSourceTest, MetadataSourceBasicTypes) { std::unique_ptr<base::DictionaryValue> AddJsonMetadataGenerator() {
auto metadata = std::make_unique<base::DictionaryValue>();
metadata->SetInteger("foo_int", 42);
metadata->SetString("foo_str", "bar");
metadata->SetBoolean("foo_bool", true);
auto child_dict = std::make_unique<base::DictionaryValue>();
child_dict->SetString("child_str", "child_val");
metadata->Set("child_dict", std::move(child_dict));
return metadata;
}
TEST_F(TraceEventDataSourceTest, MetadataGeneratorBeforeTracing) {
auto* metadata_source = TraceEventMetadataSource::GetInstance();
metadata_source->AddGeneratorFunction(
base::BindRepeating(&AddJsonMetadataGenerator));
metadata_source->StartTracing(producer_client(),
perfetto::DataSourceConfig());
base::RunLoop wait_for_stop;
metadata_source->StopTracing(wait_for_stop.QuitClosure());
wait_for_stop.Run();
auto metadata = producer_client()->GetChromeMetadata();
EXPECT_EQ(4, metadata.size());
MetadataHasNamedValue(metadata, "foo_int", 42);
MetadataHasNamedValue(metadata, "foo_str", "bar");
MetadataHasNamedValue(metadata, "foo_bool", true);
auto child_dict = std::make_unique<base::DictionaryValue>();
child_dict->SetString("child_str", "child_val");
MetadataHasNamedValue(metadata, "child_dict", *child_dict);
}
TEST_F(TraceEventDataSourceTest, MetadataGeneratorWhileTracing) {
auto* metadata_source = TraceEventMetadataSource::GetInstance();
metadata_source->StartTracing(producer_client(),
perfetto::DataSourceConfig());
metadata_source->AddGeneratorFunction(
base::BindRepeating(&AddJsonMetadataGenerator));
base::RunLoop wait_for_stop;
metadata_source->StopTracing(wait_for_stop.QuitClosure());
wait_for_stop.Run();
auto metadata = producer_client()->GetChromeMetadata();
EXPECT_EQ(4, metadata.size());
MetadataHasNamedValue(metadata, "foo_int", 42);
MetadataHasNamedValue(metadata, "foo_str", "bar");
MetadataHasNamedValue(metadata, "foo_bool", true);
auto child_dict = std::make_unique<base::DictionaryValue>();
child_dict->SetString("child_str", "child_val");
MetadataHasNamedValue(metadata, "child_dict", *child_dict);
}
TEST_F(TraceEventDataSourceTest, MultipleMetadataGenerators) {
auto* metadata_source = TraceEventMetadataSource::GetInstance(); auto* metadata_source = TraceEventMetadataSource::GetInstance();
metadata_source->AddGeneratorFunction(base::BindRepeating([]() { metadata_source->AddGeneratorFunction(base::BindRepeating([]() {
auto metadata = std::make_unique<base::DictionaryValue>(); auto metadata = std::make_unique<base::DictionaryValue>();
metadata->SetInteger("foo_int", 42); metadata->SetInteger("before_int", 42);
metadata->SetString("foo_str", "bar");
metadata->SetBoolean("foo_bool", true);
auto child_dict = std::make_unique<base::DictionaryValue>();
child_dict->SetString("child_str", "child_val");
metadata->Set("child_dict", std::move(child_dict));
return metadata; return metadata;
})); }));
CreateTraceEventDataSource();
metadata_source->StartTracing(producer_client(), metadata_source->StartTracing(producer_client(),
perfetto::DataSourceConfig()); perfetto::DataSourceConfig());
metadata_source->AddGeneratorFunction(
base::BindRepeating(&AddJsonMetadataGenerator));
base::RunLoop wait_for_stop; base::RunLoop wait_for_stop;
metadata_source->StopTracing(wait_for_stop.QuitClosure()); metadata_source->StopTracing(wait_for_stop.QuitClosure());
...@@ -518,6 +570,10 @@ TEST_F(TraceEventDataSourceTest, MetadataSourceBasicTypes) { ...@@ -518,6 +570,10 @@ TEST_F(TraceEventDataSourceTest, MetadataSourceBasicTypes) {
auto child_dict = std::make_unique<base::DictionaryValue>(); auto child_dict = std::make_unique<base::DictionaryValue>();
child_dict->SetString("child_str", "child_val"); child_dict->SetString("child_str", "child_val");
MetadataHasNamedValue(metadata, "child_dict", *child_dict); MetadataHasNamedValue(metadata, "child_dict", *child_dict);
metadata = producer_client()->GetChromeMetadata(1);
EXPECT_EQ(1, metadata.size());
MetadataHasNamedValue(metadata, "before_int", 42);
} }
TEST_F(TraceEventDataSourceTest, BasicTraceEvent) { TEST_F(TraceEventDataSourceTest, BasicTraceEvent) {
......
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