Commit 0cc1e8f1 authored by Andrew Shulaev's avatar Andrew Shulaev Committed by Commit Bot

Include extension descriptor into the trace

Change-Id: I23657194899a2258e39596056b03a53b2082aa2c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2403484
Commit-Queue: Andrew Shulaev <ddrone@google.com>
Reviewed-by: default avatarEric Seckler <eseckler@chromium.org>
Cr-Commit-Position: refs/heads/master@{#818436}
parent 7b66ed1c
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<grit base_dir="." latest_public_release="0" current_release="1"> <grit base_dir="." latest_public_release="0" current_release="1">
<outputs> <outputs>
<output filename="grit/tracing_proto_resources.h" type="rc_header" /> <output filename="grit/tracing_proto_resources.h" type="rc_header">
<emit emit_type="prepend"></emit>
</output>
<output filename="tracing_proto_resources.pak" type="data_package" /> <output filename="tracing_proto_resources.pak" type="data_package" />
</outputs> </outputs>
<release seq="1"> <release seq="1">
......
...@@ -89,6 +89,7 @@ template("chrome_extra_paks") { ...@@ -89,6 +89,7 @@ template("chrome_extra_paks") {
]) ])
output = "${invoker.output_dir}/resources.pak" output = "${invoker.output_dir}/resources.pak"
sources = [ sources = [
"$root_gen_dir/base/tracing/protos/tracing_proto_resources.pak",
"$root_gen_dir/chrome/browser_resources.pak", "$root_gen_dir/chrome/browser_resources.pak",
"$root_gen_dir/chrome/chrome_unscaled_resources.pak", "$root_gen_dir/chrome/chrome_unscaled_resources.pak",
"$root_gen_dir/chrome/common_resources.pak", "$root_gen_dir/chrome/common_resources.pak",
...@@ -104,6 +105,7 @@ template("chrome_extra_paks") { ...@@ -104,6 +105,7 @@ template("chrome_extra_paks") {
"$root_gen_dir/ui/resources/webui_resources.pak", "$root_gen_dir/ui/resources/webui_resources.pak",
] ]
deps = [ deps = [
"//base/tracing/protos:chrome_track_event_resources",
"//chrome/app/theme:chrome_unscaled_resources", "//chrome/app/theme:chrome_unscaled_resources",
"//chrome/browser:resources", "//chrome/browser:resources",
"//chrome/common:resources", "//chrome/common:resources",
......
...@@ -48,6 +48,7 @@ source_set("browser") { ...@@ -48,6 +48,7 @@ source_set("browser") {
"//base:base_static", "//base:base_static",
"//base:clang_profiling_buildflags", "//base:clang_profiling_buildflags",
"//base/third_party/dynamic_annotations", "//base/third_party/dynamic_annotations",
"//base/tracing/protos:chrome_track_event_resources",
"//build:branding_buildflags", "//build:branding_buildflags",
"//build:chromecast_buildflags", "//build:chromecast_buildflags",
"//build:chromeos_buildflags", "//build:chromeos_buildflags",
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "base/system/sys_info.h" #include "base/system/sys_info.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "base/trace_event/trace_config.h" #include "base/trace_event/trace_config.h"
#include "base/tracing/protos/grit/tracing_proto_resources.h"
#include "base/values.h" #include "base/values.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "components/tracing/common/trace_startup_config.h" #include "components/tracing/common/trace_startup_config.h"
...@@ -42,10 +43,14 @@ ...@@ -42,10 +43,14 @@
#include "net/base/network_change_notifier.h" #include "net/base/network_change_notifier.h"
#include "services/tracing/public/cpp/perfetto/perfetto_config.h" #include "services/tracing/public/cpp/perfetto/perfetto_config.h"
#include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h" #include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h"
#include "services/tracing/public/cpp/perfetto/trace_event_data_source.h"
#include "services/tracing/public/cpp/trace_event_agent.h" #include "services/tracing/public/cpp/trace_event_agent.h"
#include "services/tracing/public/cpp/traced_process_impl.h" #include "services/tracing/public/cpp/traced_process_impl.h"
#include "services/tracing/public/cpp/tracing_features.h" #include "services/tracing/public/cpp/tracing_features.h"
#include "services/tracing/public/mojom/constants.mojom.h" #include "services/tracing/public/mojom/constants.mojom.h"
#include "third_party/perfetto/include/perfetto/protozero/message.h"
#include "third_party/perfetto/protos/perfetto/trace/extension_descriptor.pbzero.h"
#include "third_party/perfetto/protos/perfetto/trace/trace_packet.pbzero.h"
#include "v8/include/v8-version-string.h" #include "v8/include/v8-version-string.h"
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
...@@ -219,6 +224,9 @@ void TracingControllerImpl::AddAgents() { ...@@ -219,6 +224,9 @@ void TracingControllerImpl::AddAgents() {
base::BindRepeating(&TracingDelegate::GenerateMetadataDict, base::BindRepeating(&TracingDelegate::GenerateMetadataDict,
base::Unretained(delegate_.get()))); base::Unretained(delegate_.get())));
} }
tracing::TraceEventMetadataSource::GetInstance()->AddGeneratorFunction(
base::BindRepeating(&TracingControllerImpl::GenerateMetadataPacket,
base::Unretained(this)));
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
tracing::PerfettoTracedProcess::Get()->AddDataSource( tracing::PerfettoTracedProcess::Get()->AddDataSource(
tracing::JavaHeapProfiler::GetInstance()); tracing::JavaHeapProfiler::GetInstance());
...@@ -233,6 +241,23 @@ void TracingControllerImpl::ConnectToServiceIfNeeded() { ...@@ -233,6 +241,23 @@ void TracingControllerImpl::ConnectToServiceIfNeeded() {
} }
} }
void TracingControllerImpl::GenerateMetadataPacket(
perfetto::protos::pbzero::TracePacket* handle,
bool privacy_filtering_enabled) {
if (privacy_filtering_enabled)
return;
auto* extension_descriptor = handle->BeginNestedMessage<protozero::Message>(
perfetto::protos::pbzero::TracePacket::kExtensionDescriptorFieldNumber);
scoped_refptr<base::RefCountedMemory> descriptor_bytes(
GetContentClient()->GetDataResourceBytes(chrome_track_event_descriptor));
if (!descriptor_bytes)
return;
extension_descriptor->AppendBytes(
perfetto::protos::pbzero::ExtensionDescriptor::kExtensionSetFieldNumber,
descriptor_bytes->data(), descriptor_bytes->size());
}
// Can be called on any thread. // Can be called on any thread.
std::unique_ptr<base::DictionaryValue> std::unique_ptr<base::DictionaryValue>
TracingControllerImpl::GenerateMetadataDict() { TracingControllerImpl::GenerateMetadataDict() {
......
...@@ -21,6 +21,14 @@ ...@@ -21,6 +21,14 @@
#include "mojo/public/cpp/system/data_pipe_drainer.h" #include "mojo/public/cpp/system/data_pipe_drainer.h"
#include "services/tracing/public/mojom/perfetto_service.mojom.h" #include "services/tracing/public/mojom/perfetto_service.mojom.h"
namespace perfetto {
namespace protos {
namespace pbzero {
class TracePacket;
} // namespace pbzero
} // namespace protos
} // namespace perfetto
namespace base { namespace base {
namespace trace_event { namespace trace_event {
...@@ -100,6 +108,8 @@ class TracingControllerImpl : public TracingController, ...@@ -100,6 +108,8 @@ class TracingControllerImpl : public TracingController,
void AddAgents(); void AddAgents();
void ConnectToServiceIfNeeded(); void ConnectToServiceIfNeeded();
std::unique_ptr<base::DictionaryValue> GenerateMetadataDict(); std::unique_ptr<base::DictionaryValue> GenerateMetadataDict();
void GenerateMetadataPacket(perfetto::protos::pbzero::TracePacket* packet,
bool privacy_filtering_enabled);
// mojo::DataPipeDrainer::Client // mojo::DataPipeDrainer::Client
void OnDataAvailable(const void* data, size_t num_bytes) override; void OnDataAvailable(const void* data, size_t num_bytes) override;
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "services/tracing/public/mojom/constants.mojom.h" #include "services/tracing/public/mojom/constants.mojom.h"
#include "third_party/perfetto/include/perfetto/ext/tracing/core/shared_memory_arbiter.h" #include "third_party/perfetto/include/perfetto/ext/tracing/core/shared_memory_arbiter.h"
#include "third_party/perfetto/include/perfetto/ext/tracing/core/trace_writer.h" #include "third_party/perfetto/include/perfetto/ext/tracing/core/trace_writer.h"
#include "third_party/perfetto/include/perfetto/protozero/message.h"
#include "third_party/perfetto/include/perfetto/tracing/track.h" #include "third_party/perfetto/include/perfetto/tracing/track.h"
#include "third_party/perfetto/include/perfetto/tracing/track_event_interned_data_index.h" #include "third_party/perfetto/include/perfetto/tracing/track_event_interned_data_index.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"
...@@ -170,6 +171,13 @@ void TraceEventMetadataSource::AddGeneratorFunction( ...@@ -170,6 +171,13 @@ void TraceEventMetadataSource::AddGeneratorFunction(
GenerateMetadataFromGenerator(generator); GenerateMetadataFromGenerator(generator);
} }
void TraceEventMetadataSource::AddGeneratorFunction(
PacketGeneratorFunction generator) {
DCHECK(origin_task_runner_->RunsTasksInCurrentSequence());
packet_generator_functions_.push_back(generator);
GenerateMetadataPacket(generator);
}
std::unique_ptr<base::DictionaryValue> std::unique_ptr<base::DictionaryValue>
TraceEventMetadataSource::GenerateTraceConfigMetadataDict() { TraceEventMetadataSource::GenerateTraceConfigMetadataDict() {
AutoLockWithDeferredTaskPosting lock(lock_); AutoLockWithDeferredTaskPosting lock(lock_);
...@@ -211,6 +219,22 @@ void TraceEventMetadataSource::GenerateMetadataFromGenerator( ...@@ -211,6 +219,22 @@ void TraceEventMetadataSource::GenerateMetadataFromGenerator(
generator.Run(chrome_metadata, privacy_filtering_enabled_); generator.Run(chrome_metadata, privacy_filtering_enabled_);
} }
void TraceEventMetadataSource::GenerateMetadataPacket(
const TraceEventMetadataSource::PacketGeneratorFunction& generator) {
DCHECK(origin_task_runner_->RunsTasksInCurrentSequence());
perfetto::TraceWriter::TracePacketHandle trace_packet;
{
AutoLockWithDeferredTaskPosting lock(lock_);
if (!emit_metadata_at_start_ || !trace_writer_)
return;
trace_packet = trace_writer_->NewTracePacket();
}
trace_packet->set_timestamp(
TRACE_TIME_TICKS_NOW().since_origin().InNanoseconds());
trace_packet->set_timestamp_clock_id(kTraceClockId);
generator.Run(trace_packet.get(), privacy_filtering_enabled_);
}
void TraceEventMetadataSource::GenerateJsonMetadataFromGenerator( void TraceEventMetadataSource::GenerateJsonMetadataFromGenerator(
const TraceEventMetadataSource::JsonMetadataGeneratorFunction& generator, const TraceEventMetadataSource::JsonMetadataGeneratorFunction& generator,
ChromeEventBundle* event_bundle) { ChromeEventBundle* event_bundle) {
...@@ -288,16 +312,29 @@ void TraceEventMetadataSource::GenerateMetadata( ...@@ -288,16 +312,29 @@ void TraceEventMetadataSource::GenerateMetadata(
json_generators, json_generators,
std::unique_ptr< std::unique_ptr<
std::vector<TraceEventMetadataSource::MetadataGeneratorFunction>> std::vector<TraceEventMetadataSource::MetadataGeneratorFunction>>
proto_generators) { proto_generators,
std::unique_ptr<
std::vector<TraceEventMetadataSource::PacketGeneratorFunction>>
packet_generators) {
DCHECK(origin_task_runner_->RunsTasksInCurrentSequence()); DCHECK(origin_task_runner_->RunsTasksInCurrentSequence());
TracePacketHandle trace_packet;
perfetto::TraceWriter* trace_writer;
bool privacy_filtering_enabled; bool privacy_filtering_enabled;
{ {
AutoLockWithDeferredTaskPosting lock(lock_); AutoLockWithDeferredTaskPosting lock(lock_);
trace_packet = trace_writer_->NewTracePacket(); trace_writer = trace_writer_.get();
privacy_filtering_enabled = privacy_filtering_enabled_; privacy_filtering_enabled = privacy_filtering_enabled_;
} }
for (auto& generator : *packet_generators) {
TracePacketHandle generator_trace_packet = trace_writer->NewTracePacket();
generator_trace_packet->set_timestamp(
TRACE_TIME_TICKS_NOW().since_origin().InNanoseconds());
generator_trace_packet->set_timestamp_clock_id(kTraceClockId);
generator.Run(generator_trace_packet.get(), privacy_filtering_enabled);
}
TracePacketHandle trace_packet = trace_writer_->NewTracePacket();
trace_packet->set_timestamp( trace_packet->set_timestamp(
TRACE_TIME_TICKS_NOW().since_origin().InNanoseconds()); TRACE_TIME_TICKS_NOW().since_origin().InNanoseconds());
trace_packet->set_timestamp_clock_id(kTraceClockId); trace_packet->set_timestamp_clock_id(kTraceClockId);
...@@ -324,6 +361,8 @@ void TraceEventMetadataSource::StartTracing( ...@@ -324,6 +361,8 @@ void TraceEventMetadataSource::StartTracing(
std::make_unique<std::vector<JsonMetadataGeneratorFunction>>(); std::make_unique<std::vector<JsonMetadataGeneratorFunction>>();
auto proto_generators = auto proto_generators =
std::make_unique<std::vector<MetadataGeneratorFunction>>(); std::make_unique<std::vector<MetadataGeneratorFunction>>();
auto packet_generators =
std::make_unique<std::vector<PacketGeneratorFunction>>();
{ {
AutoLockWithDeferredTaskPosting lock(lock_); AutoLockWithDeferredTaskPosting lock(lock_);
privacy_filtering_enabled_ = privacy_filtering_enabled_ =
...@@ -338,6 +377,7 @@ void TraceEventMetadataSource::StartTracing( ...@@ -338,6 +377,7 @@ void TraceEventMetadataSource::StartTracing(
emit_metadata_at_start_ = true; emit_metadata_at_start_ = true;
*json_generators = json_generator_functions_; *json_generators = json_generator_functions_;
*proto_generators = generator_functions_; *proto_generators = generator_functions_;
*packet_generators = packet_generator_functions_;
break; break;
} }
case TraceRecordMode::RECORD_CONTINUOUSLY: case TraceRecordMode::RECORD_CONTINUOUSLY:
...@@ -353,7 +393,8 @@ void TraceEventMetadataSource::StartTracing( ...@@ -353,7 +393,8 @@ void TraceEventMetadataSource::StartTracing(
FROM_HERE, FROM_HERE,
base::BindOnce(&TraceEventMetadataSource::GenerateMetadata, base::BindOnce(&TraceEventMetadataSource::GenerateMetadata,
base::Unretained(this), std::move(json_generators), base::Unretained(this), std::move(json_generators),
std::move(proto_generators))); std::move(proto_generators),
std::move(packet_generators)));
} }
void TraceEventMetadataSource::StopTracing( void TraceEventMetadataSource::StopTracing(
...@@ -371,9 +412,13 @@ void TraceEventMetadataSource::StopTracing( ...@@ -371,9 +412,13 @@ void TraceEventMetadataSource::StopTracing(
auto proto_generators = auto proto_generators =
std::make_unique<std::vector<MetadataGeneratorFunction>>(); std::make_unique<std::vector<MetadataGeneratorFunction>>();
*proto_generators = generator_functions_; *proto_generators = generator_functions_;
auto packet_generators =
std::make_unique<std::vector<PacketGeneratorFunction>>();
*packet_generators = packet_generator_functions_;
maybe_generate_task = base::BindOnce( maybe_generate_task = base::BindOnce(
&TraceEventMetadataSource::GenerateMetadata, base::Unretained(this), &TraceEventMetadataSource::GenerateMetadata, base::Unretained(this),
std::move(json_generators), std::move(proto_generators)); std::move(json_generators), std::move(proto_generators),
std::move(packet_generators));
} }
} }
// Even when not generating metadata, make sure the metadata generate task // Even when not generating metadata, make sure the metadata generate task
......
...@@ -71,12 +71,17 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventMetadataSource ...@@ -71,12 +71,17 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventMetadataSource
perfetto::protos::pbzero::ChromeMetadataPacket*, perfetto::protos::pbzero::ChromeMetadataPacket*,
bool /* privacy_filtering_enabled */)>; bool /* privacy_filtering_enabled */)>;
using PacketGeneratorFunction =
base::RepeatingCallback<void(perfetto::protos::pbzero::TracePacket*,
bool /* privacy_filtering_enabled */)>;
// Any callbacks passed here will be called when tracing. Note that if tracing // Any callbacks passed here will be called when tracing. Note that if tracing
// is enabled while calling this method, the callback may be invoked // is enabled while calling this method, the callback may be invoked
// directly. // 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);
void AddGeneratorFunction(PacketGeneratorFunction generator);
// For background tracing, the legacy crash uploader needs // For background tracing, the legacy crash uploader needs
// metadata fields to be uploaded as POST args in addition to being // metadata fields to be uploaded as POST args in addition to being
// embedded in the trace. TODO(oysteine): Remove when only the // embedded in the trace. TODO(oysteine): Remove when only the
...@@ -102,18 +107,26 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventMetadataSource ...@@ -102,18 +107,26 @@ class COMPONENT_EXPORT(TRACING_CPP) TraceEventMetadataSource
void GenerateMetadata( void GenerateMetadata(
std::unique_ptr<std::vector<JsonMetadataGeneratorFunction>> std::unique_ptr<std::vector<JsonMetadataGeneratorFunction>>
json_generators, json_generators,
std::unique_ptr<std::vector<MetadataGeneratorFunction>> proto_generators); std::unique_ptr<std::vector<MetadataGeneratorFunction>> proto_generators,
std::unique_ptr<std::vector<PacketGeneratorFunction>> packet_generators);
void GenerateMetadataFromGenerator( void GenerateMetadataFromGenerator(
const MetadataGeneratorFunction& generator); const MetadataGeneratorFunction& generator);
void GenerateJsonMetadataFromGenerator( void GenerateJsonMetadataFromGenerator(
const JsonMetadataGeneratorFunction& generator, const JsonMetadataGeneratorFunction& generator,
perfetto::protos::pbzero::ChromeEventBundle* event_bundle); perfetto::protos::pbzero::ChromeEventBundle* event_bundle);
void GenerateMetadataPacket(
const TraceEventMetadataSource::PacketGeneratorFunction& generator);
std::unique_ptr<base::DictionaryValue> GenerateTraceConfigMetadataDict(); std::unique_ptr<base::DictionaryValue> GenerateTraceConfigMetadataDict();
// All members are protected by |lock_|. // All members are protected by |lock_|.
// TODO(crbug.com/1138893): Change annotations to GUARDED_BY
base::Lock lock_; base::Lock lock_;
std::vector<JsonMetadataGeneratorFunction> json_generator_functions_; std::vector<JsonMetadataGeneratorFunction> json_generator_functions_
std::vector<MetadataGeneratorFunction> generator_functions_; GUARDED_BY_FIXME(lock_);
std::vector<MetadataGeneratorFunction> generator_functions_
GUARDED_BY_FIXME(lock_);
std::vector<PacketGeneratorFunction> packet_generator_functions_
GUARDED_BY_FIXME(lock_);
const scoped_refptr<base::SequencedTaskRunner> origin_task_runner_; const scoped_refptr<base::SequencedTaskRunner> origin_task_runner_;
......
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