* [PATCH v2 0/3] Write json and csv test output to test files
@ 2023-04-08 5:44 Ian Rogers
2023-04-08 5:44 ` [PATCH v2 1/3] perf test: Write CSV output to a file Ian Rogers
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Ian Rogers @ 2023-04-08 5:44 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
Ian Rogers, Adrian Hunter, Thomas Richter, Sumanth Korikkar,
Athira Rajeev, linux-perf-users, linux-kernel
Avoid problems where debug/warning messages would break output
formatting.
v2. move the XXX with mktemp to the end of the template as required.
Ian Rogers (3):
perf test: Write CSV output to a file
perf stat: Don't write "started on" for json output
perf test: Write Json output to a file
tools/perf/builtin-stat.c | 6 +-
.../tests/shell/lib/perf_json_output_lint.py | 3 +-
tools/perf/tests/shell/stat+csv_output.sh | 58 ++++++++++++++-----
tools/perf/tests/shell/stat+json_output.sh | 48 +++++++++++----
4 files changed, 84 insertions(+), 31 deletions(-)
--
2.40.0.577.gac1e443424-goog
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/3] perf test: Write CSV output to a file
2023-04-08 5:44 [PATCH v2 0/3] Write json and csv test output to test files Ian Rogers
@ 2023-04-08 5:44 ` Ian Rogers
2023-04-08 5:44 ` [PATCH v2 2/3] perf stat: Don't write "started on" for json output Ian Rogers
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Ian Rogers @ 2023-04-08 5:44 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
Ian Rogers, Adrian Hunter, Thomas Richter, Sumanth Korikkar,
Athira Rajeev, linux-perf-users, linux-kernel
Write the CSV output to a file, then sanity check this output. This
avoids problems with debug/warning/error output corrupting the file
format.
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/tests/shell/stat+csv_output.sh | 58 ++++++++++++++++-------
1 file changed, 42 insertions(+), 16 deletions(-)
diff --git a/tools/perf/tests/shell/stat+csv_output.sh b/tools/perf/tests/shell/stat+csv_output.sh
index 324fc9e6edd7..fb78b6251a4e 100755
--- a/tools/perf/tests/shell/stat+csv_output.sh
+++ b/tools/perf/tests/shell/stat+csv_output.sh
@@ -9,6 +9,20 @@ set -e
skip_test=0
csv_sep=@
+stat_output=$(mktemp /tmp/__perf_test.stat_output.csv.XXXXX)
+
+cleanup() {
+ rm -f "${stat_output}"
+
+ trap - EXIT TERM INT
+}
+
+trap_cleanup() {
+ cleanup
+ exit 1
+}
+trap trap_cleanup EXIT TERM INT
+
function commachecker()
{
local -i cnt=0
@@ -30,9 +44,11 @@ function commachecker()
while read line
do
- # Check for lines beginning with Failed
- x=${line:0:6}
- [ "$x" = "Failed" ] && continue
+ # Ignore initial "started on" comment.
+ x=${line:0:1}
+ [ "$x" = "#" ] && continue
+ # Ignore initial blank line.
+ [ "$line" = "" ] && continue
# Count the number of commas
x=$(echo $line | tr -d -c $csv_sep)
@@ -42,7 +58,7 @@ function commachecker()
echo "wrong number of fields. expected $exp in $line" 1>&2
exit 1;
}
- done
+ done < "${stat_output}"
return 0
}
@@ -55,7 +71,8 @@ function ParanoidAndNotRoot()
check_no_args()
{
echo -n "Checking CSV output: no args "
- perf stat -x$csv_sep true 2>&1 | commachecker --no-args
+ perf stat -x$csv_sep -o "${stat_output}" true
+ commachecker --no-args
echo "[Success]"
}
@@ -67,27 +84,29 @@ check_system_wide()
echo "[Skip] paranoid and not root"
return
fi
- perf stat -x$csv_sep -a true 2>&1 | commachecker --system-wide
+ perf stat -x$csv_sep -a -o "${stat_output}" true
+ commachecker --system-wide
echo "[Success]"
}
check_system_wide_no_aggr()
{
- echo -n "Checking CSV output: system wide "
+ echo -n "Checking CSV output: system wide no aggregation "
if ParanoidAndNotRoot 0
then
echo "[Skip] paranoid and not root"
return
fi
- echo -n "Checking CSV output: system wide no aggregation "
- perf stat -x$csv_sep -A -a --no-merge true 2>&1 | commachecker --system-wide-no-aggr
+ perf stat -x$csv_sep -A -a --no-merge -o "${stat_output}" true
+ commachecker --system-wide-no-aggr
echo "[Success]"
}
check_interval()
{
echo -n "Checking CSV output: interval "
- perf stat -x$csv_sep -I 1000 true 2>&1 | commachecker --interval
+ perf stat -x$csv_sep -I 1000 -o "${stat_output}" true
+ commachecker --interval
echo "[Success]"
}
@@ -95,7 +114,8 @@ check_interval()
check_event()
{
echo -n "Checking CSV output: event "
- perf stat -x$csv_sep -e cpu-clock true 2>&1 | commachecker --event
+ perf stat -x$csv_sep -e cpu-clock -o "${stat_output}" true
+ commachecker --event
echo "[Success]"
}
@@ -107,7 +127,8 @@ check_per_core()
echo "[Skip] paranoid and not root"
return
fi
- perf stat -x$csv_sep --per-core -a true 2>&1 | commachecker --per-core
+ perf stat -x$csv_sep --per-core -a -o "${stat_output}" true
+ commachecker --per-core
echo "[Success]"
}
@@ -119,7 +140,8 @@ check_per_thread()
echo "[Skip] paranoid and not root"
return
fi
- perf stat -x$csv_sep --per-thread -a true 2>&1 | commachecker --per-thread
+ perf stat -x$csv_sep --per-thread -a -o "${stat_output}" true
+ commachecker --per-thread
echo "[Success]"
}
@@ -131,7 +153,8 @@ check_per_die()
echo "[Skip] paranoid and not root"
return
fi
- perf stat -x$csv_sep --per-die -a true 2>&1 | commachecker --per-die
+ perf stat -x$csv_sep --per-die -a -o "${stat_output}" true
+ commachecker --per-die
echo "[Success]"
}
@@ -143,7 +166,8 @@ check_per_node()
echo "[Skip] paranoid and not root"
return
fi
- perf stat -x$csv_sep --per-node -a true 2>&1 | commachecker --per-node
+ perf stat -x$csv_sep --per-node -a -o "${stat_output}" true
+ commachecker --per-node
echo "[Success]"
}
@@ -155,7 +179,8 @@ check_per_socket()
echo "[Skip] paranoid and not root"
return
fi
- perf stat -x$csv_sep --per-socket -a true 2>&1 | commachecker --per-socket
+ perf stat -x$csv_sep --per-socket -a -o "${stat_output}" true
+ commachecker --per-socket
echo "[Success]"
}
@@ -202,4 +227,5 @@ then
else
echo "[Skip] Skipping tests for system_wide_no_aggr, per_core, per_die and per_socket since socket id exposed via topology is invalid"
fi
+cleanup
exit 0
--
2.40.0.577.gac1e443424-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/3] perf stat: Don't write "started on" for json output
2023-04-08 5:44 [PATCH v2 0/3] Write json and csv test output to test files Ian Rogers
2023-04-08 5:44 ` [PATCH v2 1/3] perf test: Write CSV output to a file Ian Rogers
@ 2023-04-08 5:44 ` Ian Rogers
2023-04-08 5:44 ` [PATCH v2 3/3] perf test: Write Json output to a file Ian Rogers
2023-04-10 22:16 ` [PATCH v2 0/3] Write json and csv test output to test files Arnaldo Carvalho de Melo
3 siblings, 0 replies; 5+ messages in thread
From: Ian Rogers @ 2023-04-08 5:44 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
Ian Rogers, Adrian Hunter, Thomas Richter, Sumanth Korikkar,
Athira Rajeev, linux-perf-users, linux-kernel
Json files don't support comments. Disable the "started on" comment
when writing json output to file.
Signed-off-by: Ian Rogers <irogers@google.com>
---
tools/perf/builtin-stat.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 38133afda7fc..40770926a230 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -2272,8 +2272,10 @@ int cmd_stat(int argc, const char **argv)
perror("failed to create output file");
return -1;
}
- clock_gettime(CLOCK_REALTIME, &tm);
- fprintf(output, "# started on %s\n", ctime(&tm.tv_sec));
+ if (!stat_config.json_output) {
+ clock_gettime(CLOCK_REALTIME, &tm);
+ fprintf(output, "# started on %s\n", ctime(&tm.tv_sec));
+ }
} else if (output_fd > 0) {
mode = append_file ? "a" : "w";
output = fdopen(output_fd, mode);
--
2.40.0.577.gac1e443424-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 3/3] perf test: Write Json output to a file
2023-04-08 5:44 [PATCH v2 0/3] Write json and csv test output to test files Ian Rogers
2023-04-08 5:44 ` [PATCH v2 1/3] perf test: Write CSV output to a file Ian Rogers
2023-04-08 5:44 ` [PATCH v2 2/3] perf stat: Don't write "started on" for json output Ian Rogers
@ 2023-04-08 5:44 ` Ian Rogers
2023-04-10 22:16 ` [PATCH v2 0/3] Write json and csv test output to test files Arnaldo Carvalho de Melo
3 siblings, 0 replies; 5+ messages in thread
From: Ian Rogers @ 2023-04-08 5:44 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
Ian Rogers, Adrian Hunter, Thomas Richter, Sumanth Korikkar,
Athira Rajeev, linux-perf-users, linux-kernel
Write the Json output to a file, then sanity check this output. This
avoids problems with debug/warning/error output corrupting the file
format.
Signed-off-by: Ian Rogers <irogers@google.com>
---
.../tests/shell/lib/perf_json_output_lint.py | 3 +-
tools/perf/tests/shell/stat+json_output.sh | 48 ++++++++++++++-----
2 files changed, 38 insertions(+), 13 deletions(-)
diff --git a/tools/perf/tests/shell/lib/perf_json_output_lint.py b/tools/perf/tests/shell/lib/perf_json_output_lint.py
index 97598d14e532..61f3059ca54b 100644
--- a/tools/perf/tests/shell/lib/perf_json_output_lint.py
+++ b/tools/perf/tests/shell/lib/perf_json_output_lint.py
@@ -17,9 +17,10 @@ ap.add_argument('--per-thread', action='store_true')
ap.add_argument('--per-die', action='store_true')
ap.add_argument('--per-node', action='store_true')
ap.add_argument('--per-socket', action='store_true')
+ap.add_argument('--file', type=argparse.FileType('r'), default=sys.stdin)
args = ap.parse_args()
-Lines = sys.stdin.readlines()
+Lines = args.file.readlines()
def isfloat(num):
try:
diff --git a/tools/perf/tests/shell/stat+json_output.sh b/tools/perf/tests/shell/stat+json_output.sh
index 2c4212c641ed..f3e4967cc72e 100755
--- a/tools/perf/tests/shell/stat+json_output.sh
+++ b/tools/perf/tests/shell/stat+json_output.sh
@@ -23,6 +23,20 @@ then
fi
fi
+stat_output=$(mktemp /tmp/__perf_test.stat_output.json.XXXXX)
+
+cleanup() {
+ rm -f "${stat_output}"
+
+ trap - EXIT TERM INT
+}
+
+trap_cleanup() {
+ cleanup
+ exit 1
+}
+trap trap_cleanup EXIT TERM INT
+
# Return true if perf_event_paranoid is > $1 and not running as root.
function ParanoidAndNotRoot()
{
@@ -32,7 +46,8 @@ function ParanoidAndNotRoot()
check_no_args()
{
echo -n "Checking json output: no args "
- perf stat -j true 2>&1 | $PYTHON $pythonchecker --no-args
+ perf stat -j -o "${stat_output}" true
+ $PYTHON $pythonchecker --no-args --file "${stat_output}"
echo "[Success]"
}
@@ -44,27 +59,29 @@ check_system_wide()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j -a true 2>&1 | $PYTHON $pythonchecker --system-wide
+ perf stat -j -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --system-wide --file "${stat_output}"
echo "[Success]"
}
check_system_wide_no_aggr()
{
- echo -n "Checking json output: system wide "
+ echo -n "Checking json output: system wide no aggregation "
if ParanoidAndNotRoot 0
then
echo "[Skip] paranoia and not root"
return
fi
- echo -n "Checking json output: system wide no aggregation "
- perf stat -j -A -a --no-merge true 2>&1 | $PYTHON $pythonchecker --system-wide-no-aggr
+ perf stat -j -A -a --no-merge -o "${stat_output}" true
+ $PYTHON $pythonchecker --system-wide-no-aggr --file "${stat_output}"
echo "[Success]"
}
check_interval()
{
echo -n "Checking json output: interval "
- perf stat -j -I 1000 true 2>&1 | $PYTHON $pythonchecker --interval
+ perf stat -j -I 1000 -o "${stat_output}" true
+ $PYTHON $pythonchecker --interval --file "${stat_output}"
echo "[Success]"
}
@@ -72,7 +89,8 @@ check_interval()
check_event()
{
echo -n "Checking json output: event "
- perf stat -j -e cpu-clock true 2>&1 | $PYTHON $pythonchecker --event
+ perf stat -j -e cpu-clock -o "${stat_output}" true
+ $PYTHON $pythonchecker --event --file "${stat_output}"
echo "[Success]"
}
@@ -84,7 +102,8 @@ check_per_core()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j --per-core -a true 2>&1 | $PYTHON $pythonchecker --per-core
+ perf stat -j --per-core -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --per-core --file "${stat_output}"
echo "[Success]"
}
@@ -96,7 +115,8 @@ check_per_thread()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j --per-thread -a true 2>&1 | $PYTHON $pythonchecker --per-thread
+ perf stat -j --per-thread -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --per-thread --file "${stat_output}"
echo "[Success]"
}
@@ -108,7 +128,8 @@ check_per_die()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j --per-die -a true 2>&1 | $PYTHON $pythonchecker --per-die
+ perf stat -j --per-die -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --per-die --file "${stat_output}"
echo "[Success]"
}
@@ -120,7 +141,8 @@ check_per_node()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j --per-node -a true 2>&1 | $PYTHON $pythonchecker --per-node
+ perf stat -j --per-node -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --per-node --file "${stat_output}"
echo "[Success]"
}
@@ -132,7 +154,8 @@ check_per_socket()
echo "[Skip] paranoia and not root"
return
fi
- perf stat -j --per-socket -a true 2>&1 | $PYTHON $pythonchecker --per-socket
+ perf stat -j --per-socket -a -o "${stat_output}" true
+ $PYTHON $pythonchecker --per-socket --file "${stat_output}"
echo "[Success]"
}
@@ -179,4 +202,5 @@ then
else
echo "[Skip] Skipping tests for system_wide_no_aggr, per_core, per_die and per_socket since socket id exposed via topology is invalid"
fi
+cleanup
exit 0
--
2.40.0.577.gac1e443424-goog
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 0/3] Write json and csv test output to test files
2023-04-08 5:44 [PATCH v2 0/3] Write json and csv test output to test files Ian Rogers
` (2 preceding siblings ...)
2023-04-08 5:44 ` [PATCH v2 3/3] perf test: Write Json output to a file Ian Rogers
@ 2023-04-10 22:16 ` Arnaldo Carvalho de Melo
3 siblings, 0 replies; 5+ messages in thread
From: Arnaldo Carvalho de Melo @ 2023-04-10 22:16 UTC (permalink / raw)
To: Ian Rogers
Cc: Peter Zijlstra, Ingo Molnar, Mark Rutland, Alexander Shishkin,
Jiri Olsa, Namhyung Kim, Adrian Hunter, Thomas Richter,
Sumanth Korikkar, Athira Rajeev, linux-perf-users, linux-kernel
Em Fri, Apr 07, 2023 at 10:44:53PM -0700, Ian Rogers escreveu:
> Avoid problems where debug/warning messages would break output
> formatting.
>
> v2. move the XXX with mktemp to the end of the template as required.
Thanks, applied.
- Arnaldo
> Ian Rogers (3):
> perf test: Write CSV output to a file
> perf stat: Don't write "started on" for json output
> perf test: Write Json output to a file
>
> tools/perf/builtin-stat.c | 6 +-
> .../tests/shell/lib/perf_json_output_lint.py | 3 +-
> tools/perf/tests/shell/stat+csv_output.sh | 58 ++++++++++++++-----
> tools/perf/tests/shell/stat+json_output.sh | 48 +++++++++++----
> 4 files changed, 84 insertions(+), 31 deletions(-)
>
> --
> 2.40.0.577.gac1e443424-goog
>
--
- Arnaldo
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-04-10 22:16 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-08 5:44 [PATCH v2 0/3] Write json and csv test output to test files Ian Rogers
2023-04-08 5:44 ` [PATCH v2 1/3] perf test: Write CSV output to a file Ian Rogers
2023-04-08 5:44 ` [PATCH v2 2/3] perf stat: Don't write "started on" for json output Ian Rogers
2023-04-08 5:44 ` [PATCH v2 3/3] perf test: Write Json output to a file Ian Rogers
2023-04-10 22:16 ` [PATCH v2 0/3] Write json and csv test output to test files Arnaldo Carvalho de Melo
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.