Skip to content

Commit 0b5e8dc

Browse files
committed
trace_processor: add support for print_args(arg_set_id)
Add a helper function to print the entire set of args at once as a JSON object, reusing existing functionality for exporting arg sets to json. This makes it easier to inspect arg sets at a glance and would enable simplifying the UI code by removing the logic which constructs arg tree in javascript.
1 parent 36e2b7c commit 0b5e8dc

File tree

16 files changed

+884
-98
lines changed

16 files changed

+884
-98
lines changed

Android.bp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2743,6 +2743,7 @@ cc_test {
27432743
":perfetto_src_trace_processor_tables_tables",
27442744
":perfetto_src_trace_processor_trace_summary_trace_summary",
27452745
":perfetto_src_trace_processor_types_types",
2746+
":perfetto_src_trace_processor_util_args_utils",
27462747
":perfetto_src_trace_processor_util_build_id",
27472748
":perfetto_src_trace_processor_util_bump_allocator",
27482749
":perfetto_src_trace_processor_util_descriptors",
@@ -14866,6 +14867,7 @@ filegroup {
1486614867
filegroup {
1486714868
name: "perfetto_src_trace_processor_perfetto_sql_intrinsics_functions_functions",
1486814869
srcs: [
14870+
"src/trace_processor/perfetto_sql/intrinsics/functions/args.cc",
1486914871
"src/trace_processor/perfetto_sql/intrinsics/functions/base64.cc",
1487014872
"src/trace_processor/perfetto_sql/intrinsics/functions/counter_intervals.cc",
1487114873
"src/trace_processor/perfetto_sql/intrinsics/functions/create_function.cc",
@@ -15536,6 +15538,14 @@ filegroup {
1553615538
name: "perfetto_src_trace_processor_unittests",
1553715539
}
1553815540

15541+
// GN: //src/trace_processor/util:args_utils
15542+
filegroup {
15543+
name: "perfetto_src_trace_processor_util_args_utils",
15544+
srcs: [
15545+
"src/trace_processor/util/args_utils.cc",
15546+
],
15547+
}
15548+
1553915549
// GN: //src/trace_processor/util:build_id
1554015550
filegroup {
1554115551
name: "perfetto_src_trace_processor_util_build_id",
@@ -17507,6 +17517,7 @@ cc_test {
1750717517
":perfetto_src_trace_processor_types_types",
1750817518
":perfetto_src_trace_processor_types_unittests",
1750917519
":perfetto_src_trace_processor_unittests",
17520+
":perfetto_src_trace_processor_util_args_utils",
1751017521
":perfetto_src_trace_processor_util_build_id",
1751117522
":perfetto_src_trace_processor_util_bump_allocator",
1751217523
":perfetto_src_trace_processor_util_descriptors",
@@ -18326,6 +18337,7 @@ cc_library_static {
1832618337
":perfetto_src_trace_processor_tables_tables",
1832718338
":perfetto_src_trace_processor_trace_summary_trace_summary",
1832818339
":perfetto_src_trace_processor_types_types",
18340+
":perfetto_src_trace_processor_util_args_utils",
1832918341
":perfetto_src_trace_processor_util_build_id",
1833018342
":perfetto_src_trace_processor_util_bump_allocator",
1833118343
":perfetto_src_trace_processor_util_descriptors",
@@ -18659,6 +18671,7 @@ cc_binary {
1865918671
":perfetto_src_trace_processor_tables_tables",
1866018672
":perfetto_src_trace_processor_trace_summary_trace_summary",
1866118673
":perfetto_src_trace_processor_types_types",
18674+
":perfetto_src_trace_processor_util_args_utils",
1866218675
":perfetto_src_trace_processor_util_build_id",
1866318676
":perfetto_src_trace_processor_util_bump_allocator",
1866418677
":perfetto_src_trace_processor_util_descriptors",
@@ -19103,6 +19116,7 @@ cc_binary_host {
1910319116
":perfetto_src_trace_processor_tables_tables",
1910419117
":perfetto_src_trace_processor_trace_summary_trace_summary",
1910519118
":perfetto_src_trace_processor_types_types",
19119+
":perfetto_src_trace_processor_util_args_utils",
1910619120
":perfetto_src_trace_processor_util_build_id",
1910719121
":perfetto_src_trace_processor_util_bump_allocator",
1910819122
":perfetto_src_trace_processor_util_descriptors",

BUILD

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ perfetto_cc_library(
406406
":src_trace_processor_tables_tables_python",
407407
":src_trace_processor_trace_summary_trace_summary",
408408
":src_trace_processor_types_types",
409+
":src_trace_processor_util_args_utils",
409410
":src_trace_processor_util_build_id",
410411
":src_trace_processor_util_bump_allocator",
411412
":src_trace_processor_util_descriptors",
@@ -2771,6 +2772,8 @@ perfetto_filegroup(
27712772
perfetto_filegroup(
27722773
name = "src_trace_processor_perfetto_sql_intrinsics_functions_functions",
27732774
srcs = [
2775+
"src/trace_processor/perfetto_sql/intrinsics/functions/args.cc",
2776+
"src/trace_processor/perfetto_sql/intrinsics/functions/args.h",
27742777
"src/trace_processor/perfetto_sql/intrinsics/functions/base64.cc",
27752778
"src/trace_processor/perfetto_sql/intrinsics/functions/base64.h",
27762779
"src/trace_processor/perfetto_sql/intrinsics/functions/clock_functions.h",
@@ -3669,6 +3672,15 @@ perfetto_filegroup(
36693672
],
36703673
)
36713674

3675+
# GN target: //src/trace_processor/util:args_utils
3676+
perfetto_filegroup(
3677+
name = "src_trace_processor_util_args_utils",
3678+
srcs = [
3679+
"src/trace_processor/util/args_utils.cc",
3680+
"src/trace_processor/util/args_utils.h",
3681+
],
3682+
)
3683+
36723684
# GN target: //src/trace_processor/util:build_id
36733685
perfetto_filegroup(
36743686
name = "src_trace_processor_util_build_id",
@@ -7513,6 +7525,7 @@ perfetto_cc_library(
75137525
":src_trace_processor_tables_tables_python",
75147526
":src_trace_processor_trace_summary_trace_summary",
75157527
":src_trace_processor_types_types",
7528+
":src_trace_processor_util_args_utils",
75167529
":src_trace_processor_util_build_id",
75177530
":src_trace_processor_util_bump_allocator",
75187531
":src_trace_processor_util_descriptors",
@@ -7723,6 +7736,7 @@ perfetto_cc_binary(
77237736
":src_trace_processor_tables_tables_python",
77247737
":src_trace_processor_trace_summary_trace_summary",
77257738
":src_trace_processor_types_types",
7739+
":src_trace_processor_util_args_utils",
77267740
":src_trace_processor_util_build_id",
77277741
":src_trace_processor_util_bump_allocator",
77287742
":src_trace_processor_util_descriptors",
@@ -7919,6 +7933,7 @@ perfetto_cc_binary(
79197933
":src_trace_processor_tables_tables_python",
79207934
":src_trace_processor_trace_summary_trace_summary",
79217935
":src_trace_processor_types_types",
7936+
":src_trace_processor_util_args_utils",
79227937
":src_trace_processor_util_build_id",
79237938
":src_trace_processor_util_bump_allocator",
79247939
":src_trace_processor_util_descriptors",

src/trace_processor/BUILD.gn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ source_set("export_json") {
6969
"storage",
7070
"tables",
7171
"types",
72+
"util:args_utils",
7273
"util:json_parser",
7374
]
7475
public_deps = [ "../../include/perfetto/ext/trace_processor:export_json" ]

src/trace_processor/export_json.cc

Lines changed: 25 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
#include "src/trace_processor/trace_processor_storage_impl.h"
5959
#include "src/trace_processor/types/trace_processor_context.h"
6060
#include "src/trace_processor/types/variadic.h"
61+
#include "src/trace_processor/util/args_utils.h"
6162

6263
#if PERFETTO_BUILDFLAG(PERFETTO_TP_JSON)
6364
#include <json/config.h>
@@ -530,18 +531,20 @@ class JsonExporter {
530531
inf_value_(Json::StaticString("Infinity")),
531532
neg_inf_value_(Json::StaticString("-Infinity")) {
532533
const auto& arg_table = storage_->arg_table();
533-
Json::Value* cur_args_ptr = nullptr;
534+
ArgSet arg_set;
534535
uint32_t cur_args_set_id = std::numeric_limits<uint32_t>::max();
535536
for (auto it = arg_table.IterateRows(); it; ++it) {
536537
ArgSetId set_id = it.arg_set_id();
537538
if (set_id != cur_args_set_id) {
538-
cur_args_ptr =
539-
args_sets_.Insert(set_id, Json::Value(Json::objectValue)).first;
539+
args_sets_[cur_args_set_id] = ArgNodeToJson(arg_set.root());
540+
arg_set = ArgSet();
540541
cur_args_set_id = set_id;
541542
}
542-
const char* key = storage->GetString(it.key()).c_str();
543-
Variadic value = storage_->GetArgValue(it.row_number().row_number());
544-
AppendArg(cur_args_ptr, key, VariadicToJson(value));
543+
arg_set.AppendArg(storage->GetString(it.key()).ToStdString(),
544+
storage_->GetArgValue(it.row_number().row_number()));
545+
}
546+
if (cur_args_set_id != std::numeric_limits<uint32_t>::max()) {
547+
args_sets_[cur_args_set_id] = ArgNodeToJson(arg_set.root());
545548
}
546549
PostprocessArgs();
547550
}
@@ -594,45 +597,26 @@ class JsonExporter {
594597
PERFETTO_FATAL("Not reached"); // For gcc.
595598
}
596599

597-
static void AppendArg(Json::Value* target,
598-
const std::string& key,
599-
const Json::Value& value) {
600-
for (base::StringSplitter parts(key, '.'); parts.Next();) {
601-
if (PERFETTO_UNLIKELY(!target->isNull() && !target->isObject())) {
602-
PERFETTO_DLOG("Malformed arguments. Can't append %s to %s.",
603-
key.c_str(), target->toStyledString().c_str());
604-
return;
600+
Json::Value ArgNodeToJson(const ArgNode& node) {
601+
switch (node.GetType()) {
602+
case ArgNode::Type::kPrimitive:
603+
return VariadicToJson(node.GetPrimitiveValue());
604+
case ArgNode::Type::kArray: {
605+
Json::Value result(Json::arrayValue);
606+
for (const auto& child : node.GetArray()) {
607+
result.append(ArgNodeToJson(child));
608+
}
609+
return result;
605610
}
606-
std::string key_part = parts.cur_token();
607-
size_t bracketpos = key_part.find('[');
608-
if (bracketpos == std::string::npos) { // A single item
609-
target = &(*target)[key_part];
610-
} else { // A list item
611-
target = &(*target)[key_part.substr(0, bracketpos)];
612-
while (bracketpos != std::string::npos) {
613-
// We constructed this string from an int earlier in trace_processor
614-
// so it shouldn't be possible for this (or the StringToUInt32
615-
// below) to fail.
616-
std::string s =
617-
key_part.substr(bracketpos + 1, key_part.find(']', bracketpos) -
618-
bracketpos - 1);
619-
if (PERFETTO_UNLIKELY(!target->isNull() && !target->isArray())) {
620-
PERFETTO_DLOG("Malformed arguments. Can't append %s to %s.",
621-
key.c_str(), target->toStyledString().c_str());
622-
return;
623-
}
624-
std::optional<uint32_t> index = base::StringToUInt32(s);
625-
if (PERFETTO_UNLIKELY(!index)) {
626-
PERFETTO_ELOG("Expected to be able to extract index from %s",
627-
key_part.c_str());
628-
return;
629-
}
630-
target = &(*target)[index.value()];
631-
bracketpos = key_part.find('[', bracketpos + 1);
611+
case ArgNode::Type::kDict: {
612+
Json::Value result(Json::objectValue);
613+
for (const auto& [key, value] : node.GetDict()) {
614+
result[key] = ArgNodeToJson(value);
632615
}
616+
return result;
633617
}
634618
}
635-
*target = value;
619+
PERFETTO_FATAL("Not reached"); // For gcc.
636620
}
637621

638622
void PostprocessArgs() {

src/trace_processor/perfetto_sql/intrinsics/functions/BUILD.gn

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ assert(enable_perfetto_trace_processor_sqlite)
1919

2020
source_set("functions") {
2121
sources = [
22+
"args.cc",
23+
"args.h",
2224
"base64.cc",
2325
"base64.h",
2426
"clock_functions.h",
@@ -81,6 +83,7 @@ source_set("functions") {
8183
"../../../storage",
8284
"../../../tables",
8385
"../../../types",
86+
"../../../util:args_utils",
8487
"../../../util:glob",
8588
"../../../util:profile_builder",
8689
"../../../util:regex",

0 commit comments

Comments
 (0)