aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEtienne Pierre-doray <etiennep@google.com>2024-05-15 16:21:31 +0000
committerEtienne Pierre-doray <etiennep@google.com>2024-05-15 16:21:31 +0000
commit387cf2223e953b3fd3005a1a08cfa1f8b96c838f (patch)
tree5c341830dd0a2f7698d0b5fb59a3c715e57242d0
parent1f233121a8e6ce9b91e111aeff5118f9efb48823 (diff)
downloadperfetto-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.h5
-rw-r--r--include/perfetto/tracing/track.h116
-rw-r--r--protos/perfetto/trace/perfetto_trace.proto9
-rw-r--r--protos/perfetto/trace/track_event/track_descriptor.proto9
-rw-r--r--src/trace_processor/importers/proto/track_event_parser.cc5
-rw-r--r--src/trace_processor/importers/proto/track_event_tokenizer.cc2
-rw-r--r--src/tracing/test/api_integrationtest.cc11
-rw-r--r--src/tracing/track.cc7
-rw-r--r--src/tracing/track_event_state_tracker.cc6
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()) {