diff options
author | Etienne Pierre-doray <etiennep@google.com> | 2024-05-15 16:21:31 +0000 |
---|---|---|
committer | Etienne Pierre-doray <etiennep@google.com> | 2024-05-15 16:21:31 +0000 |
commit | 387cf2223e953b3fd3005a1a08cfa1f8b96c838f (patch) | |
tree | 5c341830dd0a2f7698d0b5fb59a3c715e57242d0 | |
parent | 1f233121a8e6ce9b91e111aeff5118f9efb48823 (diff) | |
download | perfetto-387cf2223e953b3fd3005a1a08cfa1f8b96c838f.tar.gz |
[counter] Filter out DynamicString for Track name.
For CounterTrack, use Static/DynamicString and filter out dynamic names
when requested.
For the general case, consider name as always dynamic.
Change-Id: Ia9ee95237600b208f625ec5b36367e3c2e13d2ba
-rw-r--r-- | include/perfetto/tracing/string_helpers.h | 5 | ||||
-rw-r--r-- | include/perfetto/tracing/track.h | 116 | ||||
-rw-r--r-- | protos/perfetto/trace/perfetto_trace.proto | 9 | ||||
-rw-r--r-- | protos/perfetto/trace/track_event/track_descriptor.proto | 9 | ||||
-rw-r--r-- | src/trace_processor/importers/proto/track_event_parser.cc | 5 | ||||
-rw-r--r-- | src/trace_processor/importers/proto/track_event_tokenizer.cc | 2 | ||||
-rw-r--r-- | src/tracing/test/api_integrationtest.cc | 11 | ||||
-rw-r--r-- | src/tracing/track.cc | 7 | ||||
-rw-r--r-- | src/tracing/track_event_state_tracker.cc | 6 |
9 files changed, 122 insertions, 48 deletions
diff --git a/include/perfetto/tracing/string_helpers.h b/include/perfetto/tracing/string_helpers.h index 0d2819a99..03fa9e4d7 100644 --- a/include/perfetto/tracing/string_helpers.h +++ b/include/perfetto/tracing/string_helpers.h @@ -38,6 +38,8 @@ class PERFETTO_EXPORT_COMPONENT StaticString { constexpr explicit StaticString(const char* str) : value(str) {} + operator bool() const { return !!value; } + const char* value; }; @@ -52,6 +54,9 @@ class PERFETTO_EXPORT_COMPONENT DynamicString { length = strlen(str); } DynamicString(const char* str, size_t len) : value(str), length(len) {} + constexpr DynamicString() : value(nullptr), length(0) {} + + operator bool() const { return !!value; } const char* value; size_t length; diff --git a/include/perfetto/tracing/track.h b/include/perfetto/tracing/track.h index f17ffbbeb..042fdebd0 100644 --- a/include/perfetto/tracing/track.h +++ b/include/perfetto/tracing/track.h @@ -25,6 +25,7 @@ #include "perfetto/tracing/internal/fnv1a.h" #include "perfetto/tracing/internal/tracing_muxer.h" #include "perfetto/tracing/platform.h" +#include "perfetto/tracing/string_helpers.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" #include "protos/perfetto/trace/track_event/counter_descriptor.gen.h" #include "protos/perfetto/trace/track_event/counter_descriptor.pbzero.h" @@ -205,71 +206,92 @@ class PERFETTO_EXPORT_COMPONENT CounterTrack : public Track { perfetto::protos::gen::CounterDescriptor::BuiltinCounterType; // |name| must outlive this object. - constexpr explicit CounterTrack(const char* name, + constexpr explicit CounterTrack(StaticString name, Track parent = MakeProcessTrack()) - : Track(internal::Fnv1a(name) ^ kCounterMagic, parent), - name_(name), - category_(nullptr) {} + : CounterTrack( + name, + perfetto::protos::pbzero::CounterDescriptor::UNIT_UNSPECIFIED, + nullptr, + parent) {} + + explicit CounterTrack(DynamicString name, Track parent = MakeProcessTrack()) + : CounterTrack( + name, + perfetto::protos::pbzero::CounterDescriptor::UNIT_UNSPECIFIED, + nullptr, + parent) {} // |unit_name| is a free-form description of the unit used by this counter. It // must outlive this object. - constexpr CounterTrack(const char* name, + template <class TrackEventName> + constexpr CounterTrack(TrackEventName&& name, const char* unit_name, Track parent = MakeProcessTrack()) - : Track(internal::Fnv1a(name) ^ kCounterMagic, parent), - name_(name), - category_(nullptr), - unit_name_(unit_name) {} - - constexpr CounterTrack(const char* name, + : CounterTrack( + std::forward<TrackEventName>(name), + perfetto::protos::pbzero::CounterDescriptor::UNIT_UNSPECIFIED, + unit_name, + parent) {} + + template <class TrackEventName> + constexpr CounterTrack(TrackEventName&& name, Unit unit, Track parent = MakeProcessTrack()) - : Track(internal::Fnv1a(name) ^ kCounterMagic, parent), - name_(name), - category_(nullptr), - unit_(unit) {} + : CounterTrack(std::forward<TrackEventName>(name), + unit, + nullptr, + parent) {} - static constexpr CounterTrack Global(const char* name, + template <class TrackEventName> + static constexpr CounterTrack Global(TrackEventName&& name, const char* unit_name) { - return CounterTrack(name, unit_name, Track()); + return CounterTrack(std::forward<TrackEventName>(name), unit_name, Track()); } - static constexpr CounterTrack Global(const char* name, Unit unit) { - return CounterTrack(name, unit, Track()); + template <class TrackEventName> + static constexpr CounterTrack Global(TrackEventName&& name, Unit unit) { + return CounterTrack(std::forward<TrackEventName>(name), unit, Track()); } - static constexpr CounterTrack Global(const char* name) { - return Global(name, nullptr); + template <class TrackEventName> + static constexpr CounterTrack Global(TrackEventName&& name) { + return Global(std::forward<TrackEventName>(name), nullptr); } constexpr CounterTrack set_unit(Unit unit) const { - return CounterTrack(uuid, parent_uuid, name_, category_, unit, unit_name_, - unit_multiplier_, is_incremental_, type_); + return CounterTrack(uuid, parent_uuid, static_name_, dynamic_name_, + category_, unit, unit_name_, unit_multiplier_, + is_incremental_, type_); } constexpr CounterTrack set_type(CounterType type) const { - return CounterTrack(uuid, parent_uuid, name_, category_, unit_, unit_name_, - unit_multiplier_, is_incremental_, type); + return CounterTrack(uuid, parent_uuid, static_name_, dynamic_name_, + category_, unit_, unit_name_, unit_multiplier_, + is_incremental_, type); } constexpr CounterTrack set_unit_name(const char* unit_name) const { - return CounterTrack(uuid, parent_uuid, name_, category_, unit_, unit_name, - unit_multiplier_, is_incremental_, type_); + return CounterTrack(uuid, parent_uuid, static_name_, dynamic_name_, + category_, unit_, unit_name, unit_multiplier_, + is_incremental_, type_); } constexpr CounterTrack set_unit_multiplier(int64_t unit_multiplier) const { - return CounterTrack(uuid, parent_uuid, name_, category_, unit_, unit_name_, - unit_multiplier, is_incremental_, type_); + return CounterTrack(uuid, parent_uuid, static_name_, dynamic_name_, + category_, unit_, unit_name_, unit_multiplier, + is_incremental_, type_); } constexpr CounterTrack set_category(const char* category) const { - return CounterTrack(uuid, parent_uuid, name_, category, unit_, unit_name_, - unit_multiplier_, is_incremental_, type_); + return CounterTrack(uuid, parent_uuid, static_name_, dynamic_name_, + category, unit_, unit_name_, unit_multiplier_, + is_incremental_, type_); } constexpr CounterTrack set_is_incremental(bool is_incremental = true) const { - return CounterTrack(uuid, parent_uuid, name_, category_, unit_, unit_name_, - unit_multiplier_, is_incremental, type_); + return CounterTrack(uuid, parent_uuid, static_name_, dynamic_name_, + category_, unit_, unit_name_, unit_multiplier_, + is_incremental, type_); } constexpr bool is_incremental() const { return is_incremental_; } @@ -278,9 +300,29 @@ class PERFETTO_EXPORT_COMPONENT CounterTrack : public Track { protos::gen::TrackDescriptor Serialize() const; private: + constexpr CounterTrack(StaticString name, + Unit unit, + const char* unit_name, + Track parent) + : Track(internal::Fnv1a(name.value) ^ kCounterMagic, parent), + static_name_(name), + category_(nullptr), + unit_(unit), + unit_name_(unit_name) {} + CounterTrack(DynamicString name, + Unit unit, + const char* unit_name, + Track parent) + : Track(internal::Fnv1a(name.value, name.length) ^ kCounterMagic, parent), + static_name_(nullptr), + dynamic_name_(name), + category_(nullptr), + unit_(unit), + unit_name_(unit_name) {} constexpr CounterTrack(uint64_t uuid_, uint64_t parent_uuid_, - const char* name, + StaticString static_name, + DynamicString dynamic_name, const char* category, Unit unit, const char* unit_name, @@ -288,7 +330,8 @@ class PERFETTO_EXPORT_COMPONENT CounterTrack : public Track { bool is_incremental, CounterType type) : Track(uuid_, parent_uuid_), - name_(name), + static_name_(static_name), + dynamic_name_(dynamic_name), category_(category), unit_(unit), unit_name_(unit_name), @@ -296,7 +339,8 @@ class PERFETTO_EXPORT_COMPONENT CounterTrack : public Track { is_incremental_(is_incremental), type_(type) {} - const char* const name_; + StaticString static_name_; + DynamicString dynamic_name_; const char* const category_; Unit unit_ = perfetto::protos::pbzero::CounterDescriptor::UNIT_UNSPECIFIED; const char* const unit_name_ = nullptr; diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto index e2801277d..79a483b9f 100644 --- a/protos/perfetto/trace/perfetto_trace.proto +++ b/protos/perfetto/trace/perfetto_trace.proto @@ -14645,7 +14645,7 @@ message CounterDescriptor { // |TrackEvent::track_uuid|. It is possible but not necessary to emit a // TrackDescriptor for this implicit track. // -// Next id: 10. +// Next id: 11. message TrackDescriptor { // Unique ID that identifies this track. This ID is global to the whole trace. // Producers should ensure that it is unlikely to clash with IDs emitted by @@ -14665,7 +14665,12 @@ message TrackDescriptor { // Name of the track. Optional - if unspecified, it may be derived from the // process/thread name (process/thread tracks), the first event's name (async // tracks), or counter name (counter tracks). - optional string name = 2; + oneof static_or_dynamic_name { + string name = 2; + // This field is only set by the SDK when perfetto::StaticString is + // provided. + string static_name = 10; + } // Associate the track with a process, making it the process-global track. // There should only be one such track per process (usually for instant diff --git a/protos/perfetto/trace/track_event/track_descriptor.proto b/protos/perfetto/trace/track_event/track_descriptor.proto index d6db23396..76890f2fc 100644 --- a/protos/perfetto/trace/track_event/track_descriptor.proto +++ b/protos/perfetto/trace/track_event/track_descriptor.proto @@ -37,7 +37,7 @@ package perfetto.protos; // |TrackEvent::track_uuid|. It is possible but not necessary to emit a // TrackDescriptor for this implicit track. // -// Next id: 10. +// Next id: 11. message TrackDescriptor { // Unique ID that identifies this track. This ID is global to the whole trace. // Producers should ensure that it is unlikely to clash with IDs emitted by @@ -57,7 +57,12 @@ message TrackDescriptor { // Name of the track. Optional - if unspecified, it may be derived from the // process/thread name (process/thread tracks), the first event's name (async // tracks), or counter name (counter tracks). - optional string name = 2; + oneof static_or_dynamic_name { + string name = 2; + // This field is only set by the SDK when perfetto::StaticString is + // provided. + string static_name = 10; + } // Associate the track with a process, making it the process-global track. // There should only be one such track per process (usually for instant diff --git a/src/trace_processor/importers/proto/track_event_parser.cc b/src/trace_processor/importers/proto/track_event_parser.cc index 09ef47433..c0122cf63 100644 --- a/src/trace_processor/importers/proto/track_event_parser.cc +++ b/src/trace_processor/importers/proto/track_event_parser.cc @@ -1621,9 +1621,10 @@ void TrackEventParser::ParseTrackDescriptor( } // Override the name with the most recent name seen (after sorting by ts). - if (decoder.has_name()) { + if (decoder.has_name() || decoder.has_static_name()) { auto* tracks = context_->storage->mutable_track_table(); - StringId name_id = context_->storage->InternString(decoder.name()); + StringId name_id = context_->storage->InternString( + decoder.has_name() ? decoder.name() : decoder.static_name()); tracks->mutable_name()->Set(*tracks->id().IndexOf(track_id), name_id); } } diff --git a/src/trace_processor/importers/proto/track_event_tokenizer.cc b/src/trace_processor/importers/proto/track_event_tokenizer.cc index d9ed33607..3d9e6f01f 100644 --- a/src/trace_processor/importers/proto/track_event_tokenizer.cc +++ b/src/trace_processor/importers/proto/track_event_tokenizer.cc @@ -92,6 +92,8 @@ ModuleResult TrackEventTokenizer::TokenizeTrackDescriptorPacket( StringId name_id = kNullStringId; if (track.has_name()) name_id = context_->storage->InternString(track.name()); + else if (track.has_static_name()) + name_id = context_->storage->InternString(track.static_name()); if (packet.has_trusted_pid()) { context_->process_tracker->UpdateTrustedPid( diff --git a/src/tracing/test/api_integrationtest.cc b/src/tracing/test/api_integrationtest.cc index 5e1e27758..5072c3d85 100644 --- a/src/tracing/test/api_integrationtest.cc +++ b/src/tracing/test/api_integrationtest.cc @@ -2485,7 +2485,7 @@ TEST_P(PerfettoApiTest, TrackEventThreadTime) { EXPECT_FALSE(found_counter_track_descriptor); found_counter_track_descriptor = true; thread_time_counter_uuid = packet.track_descriptor().uuid(); - EXPECT_EQ("thread_time", packet.track_descriptor().name()); + EXPECT_EQ("thread_time", packet.track_descriptor().static_name()); auto counter = packet.track_descriptor().counter(); EXPECT_EQ( perfetto::protos::gen:: @@ -5795,8 +5795,10 @@ TEST_P(PerfettoApiTest, CountersDeltaEncoding) { auto& desc = packet.track_descriptor(); if (!desc.has_counter()) continue; - counter_names[desc.uuid()] = desc.name(); - EXPECT_EQ((desc.name() != "Framerate3"), desc.counter().is_incremental()); + counter_names[desc.uuid()] = + desc.has_name() ? desc.name() : desc.static_name(); + EXPECT_EQ((desc.static_name() != "Framerate3"), + desc.counter().is_incremental()); } if (packet.has_track_event()) { auto event = packet.track_event(); @@ -5869,7 +5871,8 @@ TEST_P(PerfettoApiTest, Counters) { continue; } auto desc = packet.track_descriptor(); - counter_names[desc.uuid()] = desc.name(); + counter_names[desc.uuid()] = + desc.has_name() ? desc.name() : desc.static_name(); if (desc.name() == "Framerate") { EXPECT_EQ("fps", desc.counter().unit_name()); } else if (desc.name() == "Goats teleported") { diff --git a/src/tracing/track.cc b/src/tracing/track.cc index b7d979516..9b6125c4c 100644 --- a/src/tracing/track.cc +++ b/src/tracing/track.cc @@ -111,8 +111,13 @@ void ThreadTrack::Serialize(protos::pbzero::TrackDescriptor* desc) const { protos::gen::TrackDescriptor CounterTrack::Serialize() const { auto desc = Track::Serialize(); - desc.set_name(name_); auto* counter = desc.mutable_counter(); + if (static_name_) { + desc.set_static_name(static_name_.value); + } else { + desc.set_name(dynamic_name_.value); + } + if (category_) counter->add_categories(category_); if (unit_ != perfetto::protos::pbzero::CounterDescriptor::UNIT_UNSPECIFIED) diff --git a/src/tracing/track_event_state_tracker.cc b/src/tracing/track_event_state_tracker.cc index 157429235..e65d86fe9 100644 --- a/src/tracing/track_event_state_tracker.cc +++ b/src/tracing/track_event_state_tracker.cc @@ -246,7 +246,11 @@ void TrackEventStateTracker::UpdateIncrementalState( track.index = static_cast<uint32_t>(session_state->tracks.size() + 1); track.uuid = track_descriptor.uuid(); - track.name = track_descriptor.name().ToStdString(); + if (track_descriptor.has_name()) { + track.name = track_descriptor.name().ToStdString(); + } else if (track_descriptor.has_static_name()) { + track.name = track_descriptor.static_name().ToStdString(); + } track.pid = 0; track.tid = 0; if (track_descriptor.has_process()) { |