perf data: Add tracepoint fields when converting to JSON
authorDmitrii Dolgov <9erthalion6@gmail.com>
Wed, 9 Nov 2022 10:39:32 +0000 (11:39 +0100)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 10 Nov 2022 18:35:37 +0000 (15:35 -0300)
When converting recorded data into JSON format, perf data omits probe
variables. Add them to the output in the format "field name": "field value"
using tep_print_field:

    $ perf data convert --to-json output.json

    // output.json
    {
        "linux-perf-json-version": 1,
        "headers": { ... },
        "samples": [
            {
            "timestamp": 29182079082999,
            "pid": 309194,
                    [...]
            "__probe_ip": "0x93ee35",
            "query_string_string": "select 2;",
            "nxids": "0"
            }
        ]
    }

Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com>
Acked-by: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Link: https://lore.kernel.org/r/20221109103932.65675-1-9erthalion6@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/data-convert-json.c

index 613d6ae826633f098a2d0476335a97afd161e169..57db59068cb68f6b7fab8f208abcb636da9dea63 100644 (file)
@@ -217,6 +217,26 @@ static int process_sample_event(struct perf_tool *tool,
        }
        output_json_format(out, false, 3, "]");
 
+       if (sample->raw_data) {
+               int i;
+               struct tep_format_field **fields;
+
+               fields = tep_event_fields(evsel->tp_format);
+               if (fields) {
+                       i = 0;
+                       while (fields[i]) {
+                               struct trace_seq s;
+
+                               trace_seq_init(&s);
+                               tep_print_field(&s, sample->raw_data, fields[i]);
+                               output_json_key_string(out, true, 3, fields[i]->name, s.buffer);
+
+                               i++;
+                       }
+                       free(fields);
+               }
+       }
+
        output_json_format(out, false, 2, "}");
        return 0;
 }