Commit 2c3eb17e authored by Oystein Eftevaag's avatar Oystein Eftevaag Committed by Commit Bot

Perfetto: Serialize ConvertableToTraceFormat to a JSON string field

This will act as a fallback while derived types are converted
to their own optimized proto messages.

Dependent on https://android-review.googlesource.com/c/platform/external/perfetto/+/699955
being rolled into third_party/perfetto first.

Bug: 839063
Change-Id: I00fc5a639a770d06fbf08c60fb43d12871aa69c7
Reviewed-on: https://chromium-review.googlesource.com/1087643Reviewed-by: default avatarPrimiano Tucci <primiano@chromium.org>
Reviewed-by: default avatarSami Kyöstilä <skyostil@chromium.org>
Commit-Queue: oysteine <oysteine@chromium.org>
Cr-Commit-Position: refs/heads/master@{#565080}
parent 1073af05
......@@ -146,6 +146,10 @@ class BASE_EXPORT TraceEvent {
const char* arg_name(size_t index) const { return arg_names_[index]; }
const TraceValue& arg_value(size_t index) const { return arg_values_[index]; }
const ConvertableToTraceFormat* arg_convertible_value(size_t index) const {
return convertable_values_[index].get();
}
#if defined(OS_ANDROID)
void SendToATrace();
#endif
......
......@@ -162,6 +162,11 @@ void OutputJSONFromTraceEventProto(
TraceEvent::AppendValueAsJSON(TRACE_VALUE_TYPE_STRING, value, out);
continue;
}
if (arg.has_json_value()) {
*out += arg.json_value();
continue;
}
}
*out += "}}";
......
......@@ -431,4 +431,35 @@ TEST_F(JSONTraceExporterTest, TestEventWithPointerArgs) {
EXPECT_EQ("0x2", trace_event->GetKnownArgAsString("foo2"));
}
TEST_F(JSONTraceExporterTest, TestEventWithConvertableArgs) {
CreateJSONTraceExporter("foo");
service()->WaitForTracingEnabled();
StopAndFlush();
perfetto::protos::TracePacket trace_packet_proto;
auto* new_trace_event =
trace_packet_proto.mutable_chrome_events()->add_trace_events();
SetTestPacketBasicData(new_trace_event);
{
auto* new_arg = new_trace_event->add_args();
new_arg->set_name("foo1");
new_arg->set_json_value("\"conv_value1\"");
}
{
auto* new_arg = new_trace_event->add_args();
new_arg->set_name("foo2");
new_arg->set_json_value("\"conv_value2\"");
}
FinalizePacket(trace_packet_proto);
service()->WaitForTracingDisabled();
auto* trace_event = ValidateAndGetBasicTestPacket();
EXPECT_EQ("conv_value1", trace_event->GetKnownArgAsString("foo1"));
EXPECT_EQ("conv_value2", trace_event->GetKnownArgAsString("foo2"));
}
} // namespace tracing
......@@ -90,16 +90,16 @@ class TraceEventDataSource::ThreadLocalEventSink {
for (int i = 0;
i < base::trace_event::kTraceMaxNumArgs && trace_event.arg_name(i);
++i) {
// TODO(oysteine): Support ConvertableToTraceFormat serialized into a JSON
// string.
auto type = trace_event.arg_type(i);
auto* new_arg = new_trace_event->add_args();
new_arg->set_name(trace_event.arg_name(i));
if (type == TRACE_VALUE_TYPE_CONVERTABLE) {
std::string json = trace_event.arg_convertible_value(i)->ToString();
new_arg->set_json_value(json.c_str());
continue;
}
auto* new_arg = new_trace_event->add_args();
new_arg->set_name(trace_event.arg_name(i));
auto& value = trace_event.arg_value(i);
switch (type) {
case TRACE_VALUE_TYPE_BOOL:
......
......@@ -339,6 +339,49 @@ TEST_F(TraceEventDataSourceTest, EventWithPointerArgs) {
EXPECT_EQ(static_cast<uintptr_t>(0xF00D), trace_args[1].pointer_value());
}
TEST_F(TraceEventDataSourceTest, EventWithConvertableArgs) {
static const char kArgValue1[] = "\"conv_value1\"";
static const char kArgValue2[] = "\"conv_value2\"";
CreateTraceEventDataSource();
int num_calls = 0;
class Convertable : public base::trace_event::ConvertableToTraceFormat {
public:
explicit Convertable(int* num_calls, const char* arg_value)
: num_calls_(num_calls), arg_value_(arg_value) {}
~Convertable() override = default;
void AppendAsTraceFormat(std::string* out) const override {
(*num_calls_)++;
out->append(arg_value_);
}
private:
int* num_calls_;
const char* arg_value_;
};
std::unique_ptr<Convertable> conv1(new Convertable(&num_calls, kArgValue1));
std::unique_ptr<Convertable> conv2(new Convertable(&num_calls, kArgValue2));
TRACE_EVENT_INSTANT2(kCategoryGroup, "bar", TRACE_EVENT_SCOPE_THREAD,
"foo_arg1", std::move(conv1), "foo_arg2",
std::move(conv2));
EXPECT_EQ(2, num_calls);
auto trace_events = producer_client()->GetChromeTraceEvents();
EXPECT_EQ(trace_events.size(), 1);
auto trace_args = trace_events[0].args();
EXPECT_EQ(trace_args.size(), 2);
EXPECT_EQ(kArgValue1, trace_args[0].json_value());
EXPECT_EQ(kArgValue2, trace_args[1].json_value());
}
TEST_F(TraceEventDataSourceTest, CompleteTraceEventsIntoSeparateBeginAndEnd) {
static const char kEventName[] = "bar";
......
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