diff --git a/qa/1136 b/qa/1136 index ee99a6c6e6..1ea38de1fc 100755 --- a/qa/1136 +++ b/qa/1136 @@ -68,15 +68,24 @@ pmrep -z -a $tmp.archive.f -p -I -r -u $metrics echo "=== pmrep csv output" pmrep $log -o csv -p -I -r -u $metrics +echo "=== pmrep csv output (units via -U)" +pmrep $log -o csv -p -I -r -u -U $metrics + echo "=== pmrep csv output - filter" pmrep $log -o csv -p -I -r -u -i '.*sdb.*' -i '.*sdd.*' $metrics +echo "=== pmrep csv output (no units)" +pmrep $log -o csv -p -I -r -u $metrics + echo "=== pmrep stdout output" pmrep $log -o stdout -p -I -r -u $metrics echo "=== pmrep stdout output - filter" pmrep $log -o stdout -p -I -r -u -i '.*sdb.*' -i '.*sdd.*' $metrics +echo "=== pmrep stdout output (no units)" +pmrep $log -o stdout -p -I -r -u -U $metrics + echo "=== pmrep colxrow output" pmrep $log -o stdout -p -I -r -u -X test $metrics diff --git a/qa/1136.out b/qa/1136.out index 2939480a8b..d28af4b425 100644 --- a/qa/1136.out +++ b/qa/1136.out @@ -71,6 +71,28 @@ Time,"disk.dev.read-sda","disk.dev.read-sdb","disk.dev.read-sdc","disk.dev.read- 1970-01-01 00:00:17,,17,,,,,,,,,, 1970-01-01 00:00:18,,18,,,,,18,,,,, 1970-01-01 00:00:19,,19,,,,,19,,,,, +=== pmrep csv output (units via -U) +Time,"disk.dev.read-sda(count)","disk.dev.read-sdb(count)","disk.dev.read-sdc(count)","disk.dev.read-sdd(count)","disk.dev.read-sde(count)","disk.dev.write-sda(count)","disk.dev.write-sdb(count)","disk.dev.write-sdc(count)","disk.dev.write-sdd(count)","disk.dev.write-sde(count)","mem.util.free(Kbyte)","mem.util.used(Kbyte)" +1970-01-01 00:00:00,0,0,,,,0,0,,,,, +1970-01-01 00:00:01,1,1,,,,1,1,,,,, +1970-01-01 00:00:02,2,2,2,2,,2,2,2,2,,,2 +1970-01-01 00:00:03,3,3,3,3,,3,3,3,3,,,3 +1970-01-01 00:00:04,,4,,4,,,4,,4,,,4 +1970-01-01 00:00:05,,5,,5,,,5,,5,,,5 +1970-01-01 00:00:06,,6,,6,6,,6,,6,,, +1970-01-01 00:00:07,,7,,7,7,,7,,7,,, +1970-01-01 00:00:08,8,8,8,8,8,8,8,8,8,8,,8 +1970-01-01 00:00:09,9,9,9,9,9,9,9,9,9,9,,9 +1970-01-01 00:00:10,10,10,10,10,10,10,10,10,10,10,,10 +1970-01-01 00:00:11,11,11,11,11,11,11,11,11,11,11,,11 +1970-01-01 00:00:12,12,12,12,12,12,12,12,12,12,12,,12 +1970-01-01 00:00:13,13,,13,,,13,,13,,,,13 +1970-01-01 00:00:14,14,,14,,,14,,14,,,,14 +1970-01-01 00:00:15,,,,,,,,,,,15, +1970-01-01 00:00:16,,,,,,,,,,,16, +1970-01-01 00:00:17,,17,,,,,,,,,, +1970-01-01 00:00:18,,18,,,,,18,,,,, +1970-01-01 00:00:19,,19,,,,,19,,,,, === pmrep csv output - filter Time,"disk.dev.read-sdb","disk.dev.read-sdd","disk.dev.write-sdb","disk.dev.write-sdd","mem.util.free","mem.util.used" 1970-01-01 00:00:00,0,,0,,, @@ -93,6 +115,28 @@ Time,"disk.dev.read-sdb","disk.dev.read-sdd","disk.dev.write-sdb","disk.dev.writ 1970-01-01 00:00:17,17,,,,, 1970-01-01 00:00:18,18,,18,,, 1970-01-01 00:00:19,19,,19,,, +=== pmrep csv output (no units) +Time,"disk.dev.read-sda","disk.dev.read-sdb","disk.dev.read-sdc","disk.dev.read-sdd","disk.dev.read-sde","disk.dev.write-sda","disk.dev.write-sdb","disk.dev.write-sdc","disk.dev.write-sdd","disk.dev.write-sde","mem.util.free","mem.util.used" +1970-01-01 00:00:00,0,0,,,,0,0,,,,, +1970-01-01 00:00:01,1,1,,,,1,1,,,,, +1970-01-01 00:00:02,2,2,2,2,,2,2,2,2,,,2 +1970-01-01 00:00:03,3,3,3,3,,3,3,3,3,,,3 +1970-01-01 00:00:04,,4,,4,,,4,,4,,,4 +1970-01-01 00:00:05,,5,,5,,,5,,5,,,5 +1970-01-01 00:00:06,,6,,6,6,,6,,6,,, +1970-01-01 00:00:07,,7,,7,7,,7,,7,,, +1970-01-01 00:00:08,8,8,8,8,8,8,8,8,8,8,,8 +1970-01-01 00:00:09,9,9,9,9,9,9,9,9,9,9,,9 +1970-01-01 00:00:10,10,10,10,10,10,10,10,10,10,10,,10 +1970-01-01 00:00:11,11,11,11,11,11,11,11,11,11,11,,11 +1970-01-01 00:00:12,12,12,12,12,12,12,12,12,12,12,,12 +1970-01-01 00:00:13,13,,13,,,13,,13,,,,13 +1970-01-01 00:00:14,14,,14,,,14,,14,,,,14 +1970-01-01 00:00:15,,,,,,,,,,,15, +1970-01-01 00:00:16,,,,,,,,,,,16, +1970-01-01 00:00:17,,17,,,,,,,,,, +1970-01-01 00:00:18,,18,,,,,18,,,,, +1970-01-01 00:00:19,,19,,,,,19,,,,, === pmrep stdout output d.d.read d.d.read d.d.read d.d.read d.d.read d.d.write d.d.write d.d.write d.d.write d.d.write m.u.free m.u.used sda sdb sdc sdd sde sda sdb sdc sdd sde @@ -141,6 +185,29 @@ Time,"disk.dev.read-sdb","disk.dev.read-sdd","disk.dev.write-sdb","disk.dev.writ 00:00:17 17 N/A N/A N/A N/A N/A 00:00:18 18 N/A 18 N/A N/A N/A 00:00:19 19 N/A 19 N/A N/A N/A +=== pmrep stdout output (no units) + d.d.read d.d.read d.d.read d.d.read d.d.read d.d.write d.d.write d.d.write d.d.write d.d.write m.u.free m.u.used + sda sdb sdc sdd sde sda sdb sdc sdd sde +00:00:00 0 0 N/A N/A N/A 0 0 N/A N/A N/A N/A N/A +00:00:01 1 1 N/A N/A N/A 1 1 N/A N/A N/A N/A N/A +00:00:02 2 2 2 2 N/A 2 2 2 2 N/A N/A 2 +00:00:03 3 3 3 3 N/A 3 3 3 3 N/A N/A 3 +00:00:04 N/A 4 N/A 4 N/A N/A 4 N/A 4 N/A N/A 4 +00:00:05 N/A 5 N/A 5 N/A N/A 5 N/A 5 N/A N/A 5 +00:00:06 N/A 6 N/A 6 6 N/A 6 N/A 6 N/A N/A N/A +00:00:07 N/A 7 N/A 7 7 N/A 7 N/A 7 N/A N/A N/A +00:00:08 8 8 8 8 8 8 8 8 8 8 N/A 8 +00:00:09 9 9 9 9 9 9 9 9 9 9 N/A 9 +00:00:10 10 10 10 10 10 10 10 10 10 10 N/A 10 +00:00:11 11 11 11 11 11 11 11 11 11 11 N/A 11 +00:00:12 12 12 12 12 12 12 12 12 12 12 N/A 12 +00:00:13 13 N/A 13 N/A N/A 13 N/A 13 N/A N/A N/A 13 +00:00:14 14 N/A 14 N/A N/A 14 N/A 14 N/A N/A N/A 14 +00:00:15 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A 15 N/A +00:00:16 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A 16 N/A +00:00:17 N/A 17 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A +00:00:18 N/A 18 N/A N/A N/A N/A 18 N/A N/A N/A N/A N/A +00:00:19 N/A 19 N/A N/A N/A N/A 19 N/A N/A N/A N/A N/A === pmrep colxrow output test d.d.read d.d.write m.u.free m.u.used count count Kbyte Kbyte diff --git a/qa/1169 b/qa/1169 index 211b3f19bc..6322377d3d 100755 --- a/qa/1169 +++ b/qa/1169 @@ -77,15 +77,23 @@ pmrep $log -p -u -X test -1 -S @00:00:02 -s 2 -J 3 -e 'a = 100 * rate(disk.dev.r echo "== csv test" pmrep $log -p -u -o csv -1 disk.dev.read disk.dev.write mem.util.used | _archive_filter +echo "== csv test with units in header (-U)" +pmrep $log -p -u -o csv -1 -U disk.dev.read disk.dev.write mem.util.used | _archive_filter + echo "== csv test with extended header" pmrep $log -p -u -o csv -1 -x -C disk.dev.read disk.dev.write mem.util.used | _archive_filter echo "== csv test with repeating header" pmrep $log -p -u -o csv -1 -E 3 disk.dev.read disk.dev.write mem.util.used | _archive_filter +echo "== csv test with repeating header with units (-U)" +pmrep $log -p -u -o csv -1 -E 3 -U disk.dev.read disk.dev.write mem.util.used | _archive_filter + echo "== csv test with extended/repeating header" pmrep $log -p -u -o csv -1 -x -E 3 disk.dev.read disk.dev.write mem.util.used | _archive_filter +echo "== csv test with extended/repeating header with units (-U)" +pmrep $log -p -u -o csv -1 -x -E 3 disk.dev.read disk.dev.write mem.util.used -U | _archive_filter echo "== fixed header test" pmrep $log -p -u -X test -7 disk.dev.read disk.dev.write mem.util.used | _archive_filter diff --git a/qa/1169.out b/qa/1169.out index cb424c52a2..9d18230d45 100644 --- a/qa/1169.out +++ b/qa/1169.out @@ -965,6 +965,36 @@ Time,"disk.dev.read-sdb" 1970-01-01 00:00:18,1.000 Time,"disk.dev.read-sdb","disk.dev.write-sdb" 1970-01-01 00:00:19,1.000,1.000 +== csv test with units in header (-U) +1970-01-01 00:00:00 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)" +1970-01-01 00:00:01,1.000,1.000,1.000,1.000 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:02,1.000,1.000,1.000,1.000,2 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.read-sdc(count/s)","disk.dev.read-sdd(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdc(count/s)","disk.dev.write-sdd(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:03,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,3 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:04,1.000,1.000,1.000,1.000,4 +1970-01-01 00:00:05,1.000,1.000,1.000,1.000,5 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)" +1970-01-01 00:00:06,1.000,1.000,1.000,1.000 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)" +1970-01-01 00:00:07,1.000,1.000,1.000,1.000,1.000 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:08,1.000,1.000,1.000,1.000,1.000,8 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.read-sdc(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdc(count/s)","disk.dev.write-sdd(count/s)","disk.dev.write-sde(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:09,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,9 +1970-01-01 00:00:10,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,10 +1970-01-01 00:00:11,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,11 +1970-01-01 00:00:12,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,12 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdc(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdc(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:13,1.000,1.000,1.000,1.000,13 +1970-01-01 00:00:14,1.000,1.000,1.000,1.000,14 +1970-01-01 00:00:17 +Time,"disk.dev.read-sdb(count/s)" +1970-01-01 00:00:18,1.000 +Time,"disk.dev.read-sdb(count/s)","disk.dev.write-sdb(count/s)" +1970-01-01 00:00:19,1.000,1.000 == csv test with extended header # # archive: QAPATH/archives/dyninsts @@ -1008,6 +1038,37 @@ Time,"disk.dev.read-sdb" 1970-01-01 00:00:18,1.000 Time,"disk.dev.read-sdb","disk.dev.write-sdb" 1970-01-01 00:00:19,1.000,1.000 +== csv test with repeating header with units (-U) +1970-01-01 00:00:00 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)" +1970-01-01 00:00:01,1.000,1.000,1.000,1.000 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:02,1.000,1.000,1.000,1.000,2 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.read-sdc(count/s)","disk.dev.read-sdd(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdc(count/s)","disk.dev.write-sdd(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:03,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,3 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:04,1.000,1.000,1.000,1.000,4 +1970-01-01 00:00:05,1.000,1.000,1.000,1.000,5 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)" +1970-01-01 00:00:06,1.000,1.000,1.000,1.000 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)" +1970-01-01 00:00:07,1.000,1.000,1.000,1.000,1.000 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:08,1.000,1.000,1.000,1.000,1.000,8 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.read-sdc(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdc(count/s)","disk.dev.write-sdd(count/s)","disk.dev.write-sde(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:09,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,9 +1970-01-01 00:00:10,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,10 +1970-01-01 00:00:11,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,11 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.read-sdc(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdc(count/s)","disk.dev.write-sdd(count/s)","disk.dev.write-sde(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:12,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,12 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdc(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdc(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:13,1.000,1.000,1.000,1.000,13 +1970-01-01 00:00:14,1.000,1.000,1.000,1.000,14 +1970-01-01 00:00:17 +Time,"disk.dev.read-sdb(count/s)" +1970-01-01 00:00:18,1.000 +Time,"disk.dev.read-sdb(count/s)","disk.dev.write-sdb(count/s)" +1970-01-01 00:00:19,1.000,1.000 == csv test with extended/repeating header # # archive: QAPATH/archives/dyninsts @@ -1050,6 +1111,48 @@ Time,"disk.dev.read-sdb" 1970-01-01 00:00:18,1.000 Time,"disk.dev.read-sdb","disk.dev.write-sdb" 1970-01-01 00:00:19,1.000,1.000 +== csv test with extended/repeating header with units (-U) +# +# archive: QAPATH/archives/dyninsts +# host: localhost +# timezone: UTC+0 +# start: Thu Jan 1 00:00:00 1970 +# end: Thu Jan 1 00:00:19 1970 +# metrics: 3 (11 instances present in archive) +# samples: N/A +# interval: N/A +# duration: 00:00:19 +# +1970-01-01 00:00:00 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)" +1970-01-01 00:00:01,1.000,1.000,1.000,1.000 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:02,1.000,1.000,1.000,1.000,2 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.read-sdc(count/s)","disk.dev.read-sdd(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdc(count/s)","disk.dev.write-sdd(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:03,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,3 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:04,1.000,1.000,1.000,1.000,4 +1970-01-01 00:00:05,1.000,1.000,1.000,1.000,5 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)" +1970-01-01 00:00:06,1.000,1.000,1.000,1.000 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)" +1970-01-01 00:00:07,1.000,1.000,1.000,1.000,1.000 +Time,"disk.dev.read-sdb(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdd(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:08,1.000,1.000,1.000,1.000,1.000,8 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.read-sdc(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdc(count/s)","disk.dev.write-sdd(count/s)","disk.dev.write-sde(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:09,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,9 +1970-01-01 00:00:10,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,10 +1970-01-01 00:00:11,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,11 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdb(count/s)","disk.dev.read-sdc(count/s)","disk.dev.read-sdd(count/s)","disk.dev.read-sde(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdb(count/s)","disk.dev.write-sdc(count/s)","disk.dev.write-sdd(count/s)","disk.dev.write-sde(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:12,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000,12 +Time,"disk.dev.read-sda(count/s)","disk.dev.read-sdc(count/s)","disk.dev.write-sda(count/s)","disk.dev.write-sdc(count/s)","mem.util.used(Kbyte)" +1970-01-01 00:00:13,1.000,1.000,1.000,1.000,13 +1970-01-01 00:00:14,1.000,1.000,1.000,1.000,14 +1970-01-01 00:00:17 +Time,"disk.dev.read-sdb(count/s)" +1970-01-01 00:00:18,1.000 +Time,"disk.dev.read-sdb(count/s)","disk.dev.write-sdb(count/s)" +1970-01-01 00:00:19,1.000,1.000 == fixed header test test d.d.read d.d.write m.u.used count/s count/s Kbyte diff --git a/qa/1929 b/qa/1929 new file mode 100755 index 0000000000..4641571eed --- /dev/null +++ b/qa/1929 @@ -0,0 +1,66 @@ +#!/bin/sh +# PCP QA Test No. 1929 +# csv output containing units tests with pmrep +# +# Copyright (c) 2026 Oracle and/or its affiliates. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# + +seq=`basename $0` +echo "QA output created by $seq" + +. ./common.python + +$python -c "from pcp import pmapi" >/dev/null 2>&1 +[ $? -eq 0 ] || _notrun "python pcp pmapi module not installed" +$python -c "from collections import OrderedDict" >/dev/null 2>&1 +[ $? -eq 0 ] || _notrun "python collections OrderedDict module not installed" + +which pmrep >/dev/null 2>&1 || _notrun "pmrep not installed" + +status=1 # failure is the default! +trap "cd $here; _cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -f $tmp.* +} + +_msg_filter() +{ + sed \ + -e "s,Recording .* metrics.*,Recording metrics...,g" \ + #end +} + +_odd_filter() +{ + sed \ + -e '/00:00:06/s@N/A N/A N/A N/A@N/A 6 N/A 6@' \ + # end +} + +log="--archive $here/archives/dyninsts -z" +metrics="disk.dev.read disk.dev.write mem.util.free mem.util.used" + +# real QA test starts here +echo "== csv header includes units row for archive" +pmrep $log -o archive -F $tmp.archive.a -p -I -r -u $metrics | _msg_filter +pmrep -z -a $tmp.archive.a -p -I -r -u $metrics \ +| _odd_filter + +echo "=== pmrep archive output - filter" +pmrep $log -o archive -F $tmp.archive.f -p -I -r -u -i '.*sdb.*' -i '.*sdd.*' $metrics | _msg_filter +pmrep -z -a $tmp.archive.f -p -I -r -u $metrics + +echo "=== pmrep csv output with units header (-U)" +pmrep $log -o csv -p -I -r -u -U $metrics + +echo "=== pmrep csv output - filter with units header" +pmrep $log -o csv -p -I -r -u -i '.*sdb.*' -i '.*sdd.*' $metrics -U + +echo "=== pmrep csv output - filter without units header" +pmrep $log -o csv -p -I -r -u -i '.*sdb.*' -i '.*sdd.*' $metrics +# success, all done +status=0 +exit diff --git a/qa/1929.out b/qa/1929.out new file mode 100644 index 0000000000..57af90a00a --- /dev/null +++ b/qa/1929.out @@ -0,0 +1,117 @@ +QA output created by 1929 +== csv header includes units row for archive +Recording metrics... + d.d.read d.d.read d.d.read d.d.read d.d.read d.d.write d.d.write d.d.write d.d.write d.d.write m.u.free m.u.used + sda sdb sdc sdd sde sda sdb sdc sdd sde + count count count count count count count count count count Kbyte Kbyte +00:00:00 0 0 N/A N/A N/A 0 0 N/A N/A N/A N/A N/A +00:00:01 1 1 N/A N/A N/A 1 1 N/A N/A N/A N/A N/A +00:00:02 2 2 2 2 N/A 2 2 2 2 N/A N/A 2 +00:00:03 3 3 3 3 N/A 3 3 3 3 N/A N/A 3 +00:00:04 N/A 4 N/A 4 N/A N/A 4 N/A 4 N/A N/A 4 +00:00:05 N/A 5 N/A 5 N/A N/A 5 N/A 5 N/A N/A 5 +00:00:06 N/A 6 N/A 6 6 N/A 6 N/A 6 N/A N/A N/A +00:00:07 N/A 7 N/A 7 7 N/A 7 N/A 7 N/A N/A N/A +00:00:08 8 8 8 8 8 8 8 8 8 8 N/A 8 +00:00:09 9 9 9 9 9 9 9 9 9 9 N/A 9 +00:00:10 10 10 10 10 10 10 10 10 10 10 N/A 10 +00:00:11 11 11 11 11 11 11 11 11 11 11 N/A 11 +00:00:12 12 12 12 12 12 12 12 12 12 12 N/A 12 +00:00:13 13 N/A 13 N/A N/A 13 N/A 13 N/A N/A N/A 13 +00:00:14 14 N/A 14 N/A N/A 14 N/A 14 N/A N/A N/A 14 +00:00:15 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A 15 N/A +00:00:16 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A 16 N/A +00:00:17 N/A 17 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A +00:00:18 N/A 18 N/A N/A N/A N/A 18 N/A N/A N/A N/A N/A +00:00:19 N/A 19 N/A N/A N/A N/A 19 N/A N/A N/A N/A N/A +=== pmrep archive output - filter +Recording metrics... + d.d.read d.d.read d.d.write d.d.write m.u.free m.u.used + sdb sdd sdb sdd + count count count count Kbyte Kbyte +00:00:00 0 N/A 0 N/A N/A N/A +00:00:01 1 N/A 1 N/A N/A N/A +00:00:02 2 2 2 2 N/A 2 +00:00:03 3 3 3 3 N/A 3 +00:00:04 4 4 4 4 N/A 4 +00:00:05 5 5 5 5 N/A 5 +00:00:06 6 6 6 6 N/A N/A +00:00:07 7 7 7 7 N/A N/A +00:00:08 8 8 8 8 N/A 8 +00:00:09 9 9 9 9 N/A 9 +00:00:10 10 10 10 10 N/A 10 +00:00:11 11 11 11 11 N/A 11 +00:00:12 12 12 12 12 N/A 12 +00:00:13 N/A N/A N/A N/A N/A 13 +00:00:14 N/A N/A N/A N/A N/A 14 +00:00:15 N/A N/A N/A N/A 15 N/A +00:00:16 N/A N/A N/A N/A 16 N/A +00:00:17 17 N/A N/A N/A N/A N/A +00:00:18 18 N/A 18 N/A N/A N/A +00:00:19 19 N/A 19 N/A N/A N/A +=== pmrep csv output with units header (-U) +Time,"disk.dev.read-sda(count)","disk.dev.read-sdb(count)","disk.dev.read-sdc(count)","disk.dev.read-sdd(count)","disk.dev.read-sde(count)","disk.dev.write-sda(count)","disk.dev.write-sdb(count)","disk.dev.write-sdc(count)","disk.dev.write-sdd(count)","disk.dev.write-sde(count)","mem.util.free(Kbyte)","mem.util.used(Kbyte)" +1970-01-01 00:00:00,0,0,,,,0,0,,,,, +1970-01-01 00:00:01,1,1,,,,1,1,,,,, +1970-01-01 00:00:02,2,2,2,2,,2,2,2,2,,,2 +1970-01-01 00:00:03,3,3,3,3,,3,3,3,3,,,3 +1970-01-01 00:00:04,,4,,4,,,4,,4,,,4 +1970-01-01 00:00:05,,5,,5,,,5,,5,,,5 +1970-01-01 00:00:06,,6,,6,6,,6,,6,,, +1970-01-01 00:00:07,,7,,7,7,,7,,7,,, +1970-01-01 00:00:08,8,8,8,8,8,8,8,8,8,8,,8 +1970-01-01 00:00:09,9,9,9,9,9,9,9,9,9,9,,9 +1970-01-01 00:00:10,10,10,10,10,10,10,10,10,10,10,,10 +1970-01-01 00:00:11,11,11,11,11,11,11,11,11,11,11,,11 +1970-01-01 00:00:12,12,12,12,12,12,12,12,12,12,12,,12 +1970-01-01 00:00:13,13,,13,,,13,,13,,,,13 +1970-01-01 00:00:14,14,,14,,,14,,14,,,,14 +1970-01-01 00:00:15,,,,,,,,,,,15, +1970-01-01 00:00:16,,,,,,,,,,,16, +1970-01-01 00:00:17,,17,,,,,,,,,, +1970-01-01 00:00:18,,18,,,,,18,,,,, +1970-01-01 00:00:19,,19,,,,,19,,,,, +=== pmrep csv output - filter with units header +Time,"disk.dev.read-sdb(count)","disk.dev.read-sdd(count)","disk.dev.write-sdb(count)","disk.dev.write-sdd(count)","mem.util.free(Kbyte)","mem.util.used(Kbyte)" +1970-01-01 00:00:00,0,,0,,, +1970-01-01 00:00:01,1,,1,,, +1970-01-01 00:00:02,2,2,2,2,,2 +1970-01-01 00:00:03,3,3,3,3,,3 +1970-01-01 00:00:04,4,4,4,4,,4 +1970-01-01 00:00:05,5,5,5,5,,5 +1970-01-01 00:00:06,6,6,6,6,, +1970-01-01 00:00:07,7,7,7,7,, +1970-01-01 00:00:08,8,8,8,8,,8 +1970-01-01 00:00:09,9,9,9,9,,9 +1970-01-01 00:00:10,10,10,10,10,,10 +1970-01-01 00:00:11,11,11,11,11,,11 +1970-01-01 00:00:12,12,12,12,12,,12 +1970-01-01 00:00:13,,,,,,13 +1970-01-01 00:00:14,,,,,,14 +1970-01-01 00:00:15,,,,,15, +1970-01-01 00:00:16,,,,,16, +1970-01-01 00:00:17,17,,,,, +1970-01-01 00:00:18,18,,18,,, +1970-01-01 00:00:19,19,,19,,, +=== pmrep csv output - filter without units header +Time,"disk.dev.read-sdb","disk.dev.read-sdd","disk.dev.write-sdb","disk.dev.write-sdd","mem.util.free","mem.util.used" +1970-01-01 00:00:00,0,,0,,, +1970-01-01 00:00:01,1,,1,,, +1970-01-01 00:00:02,2,2,2,2,,2 +1970-01-01 00:00:03,3,3,3,3,,3 +1970-01-01 00:00:04,4,4,4,4,,4 +1970-01-01 00:00:05,5,5,5,5,,5 +1970-01-01 00:00:06,6,6,6,6,, +1970-01-01 00:00:07,7,7,7,7,, +1970-01-01 00:00:08,8,8,8,8,,8 +1970-01-01 00:00:09,9,9,9,9,,9 +1970-01-01 00:00:10,10,10,10,10,,10 +1970-01-01 00:00:11,11,11,11,11,,11 +1970-01-01 00:00:12,12,12,12,12,,12 +1970-01-01 00:00:13,,,,,,13 +1970-01-01 00:00:14,,,,,,14 +1970-01-01 00:00:15,,,,,15, +1970-01-01 00:00:16,,,,,16, +1970-01-01 00:00:17,17,,,,, +1970-01-01 00:00:18,18,,18,,, +1970-01-01 00:00:19,19,,19,,, diff --git a/qa/group b/qa/group index d0672bea81..4cf278cd26 100644 --- a/qa/group +++ b/qa/group @@ -2300,6 +2300,7 @@ telnet-probe 1914 atop local 1921 pmda.sockets local 1927 pmda.sockets local +1929 pmrep local 1931 pmda.bpf local 1936 other local pmclient 1937 pmlogrewrite pmda.xfs local pmlogdump diff --git a/src/pmrep/pmrep.1 b/src/pmrep/pmrep.1 index adc408954a..f92279fe11 100644 --- a/src/pmrep/pmrep.1 +++ b/src/pmrep/pmrep.1 @@ -699,6 +699,12 @@ and \fB\-k\fR, \fB\-\-extended\-csv\fR Write extended CSV output, similar to .BR sadf (1). +Use +.BR \-U +or +.BR \-\-csv\-unit\-info +to append unit strings to metric names in the CSV header using the form +.RI metric "(unit)" . .TP \fB\-K\fR \fIspec\fR, \fB\-\-spec\-local\fR=\fIspec\fR When fetching metrics from a local context (see @@ -813,6 +819,16 @@ Requires .TP .I csv Print metrics in CSV format (subject to formatting options). +For CSV output, unit strings are omitted by default. Use +.BR \-U +or +.BR \-\-csv\-unit\-info +to include unit strings inline with metric names (e.g. +.IR metric "(unit)" ). +.BR \-U +also suppresses unit strings from +.I stdout +headers. .TP .I stdout Print metrics to stdout (format subject to formatting options). @@ -980,8 +996,12 @@ or to disable). .RE .TP -\fB\-U\fR, \fB\-\-no\-unit\-info\fR -Omit unit information from headers. +\fB\-U\fR, \fB\-\-csv\-unit\-info\fR +Include unit information in CSV headers; \fB\-U\fR also omits unit information from stdout headers. +.TP +\fB\-\-csv\-unit\-info\fR +Same as +.BR \-U . .TP \fB\-v\fR, \fB\-\-omit\-flat\fR Report only set-valued metrics with instances (e.g. disk.dev.read) and @@ -1323,4 +1343,3 @@ and .\" +ok+ sp {from .sp in troff macro} un {from (un)available)} .\" +ok+ Dderive {from -Dderive} .\" +ok+ PCP_DISCRETE_ONCE {from pmrep-only env var} - diff --git a/src/pmrep/pmrep.py b/src/pmrep/pmrep.py index 755ca5fd50..5dd244efef 100755 --- a/src/pmrep/pmrep.py +++ b/src/pmrep/pmrep.py @@ -149,6 +149,8 @@ def __init__(self): self.outfile = None # Internal + # CSV unit strings are off by default; enable with -U/--csv-unit-info + self.csv_unitinfo = 0 self.format = None # stdout format self.writer = None self.pmi = None @@ -203,7 +205,7 @@ def options(self): opts.pmSetLongOptionHeader("Reporting options") opts.pmSetLongOption("no-header", 0, "H", "", "omit headers") - opts.pmSetLongOption("no-unit-info", 0, "U", "", "omit unit info from headers") + opts.pmSetLongOption("csv-unit-info", 0, "U", "", "include unit info in CSV headers; suppress stdout units") opts.pmSetLongOption("no-inst-info", 0, "", "", "omit instance info from headers") opts.pmSetLongOption("no-globals", 0, "G", "", "omit global metrics") opts.pmSetLongOption("timestamps", 0, "p", "", "print timestamps") @@ -299,7 +301,10 @@ def option(self, opt, optarg, _index): elif opt == 'H': self.header = 0 elif opt == 'U': - self.unitinfo = 0 + self.unitinfo = 0 # hide units on stdout + self.csv_unitinfo = 1 # show units on csv + elif opt == 'csv-unit-info': + self.csv_unitinfo = 1 elif opt == 'G': self.globals = 0 elif opt == 'p': @@ -916,12 +921,17 @@ def write_header_csv(self, results=()): """ Write info header for CSV output """ if not self.header: return + csv_unitinfo = self.csv_unitinfo if self.extcsv: self.writer.write("Host,Interval,") self.writer.write("Time") for i, metric in enumerate(self.metrics): for j, n in self.get_results_iter(i, metric, results): name = metric + unit_txt = "" + if csv_unitinfo: + raw_unit = self.metrics[metric][2][0] + unit_txt = "" if raw_unit is None else str(raw_unit) if not self.dynamic_header: if self.pmconfig.descs[i].contents.indom != PM_INDOM_NULL: # Always mark metrics with instance domain @@ -932,18 +942,18 @@ def write_header_csv(self, results=()): else: if self.pmconfig.descs[i].contents.indom != PM_INDOM_NULL: name += "-" + n[1] - if self.delimiter: - name = name.replace(self.delimiter, " ") - name = name.replace("\n", " ").replace("\"", " ") - self.writer.write(self.delimiter + "\"" + name + "\"") + if csv_unitinfo and unit_txt: + name += "(" + unit_txt + ")" + name_field = self.sanitize_csv_header_field(name) + self.writer.write(self.delimiter + "\"" + name_field + "\"") if self.include_labels: ins = j if not self.dynamic_header else n[0] labels = self.pmconfig.get_labels_str(metric, ins, self.dynamic_header, True) if self.delimiter: repl = ";" if self.delimiter == "," else "," labels = labels.replace(self.delimiter, repl) - labels = labels.replace("\n", " ").replace("\"", " ") - self.writer.write(self.delimiter + "\"" + labels + "\"") + label_field = self.sanitize_csv_header_field(labels) + self.writer.write(self.delimiter + "\"" + label_field + "\"") self.writer.write("\n") def write_header_stdout(self, repeat=False, results=()): @@ -1182,6 +1192,15 @@ def remove_delimiter(self, value): value = value.replace(self.delimiter, " ") return value + def sanitize_csv_header_field(self, value): + """Sanitize header strings for CSV output.""" + if value in (None, NO_VAL): + return "" + text = str(value) + if self.delimiter: + text = text.replace(self.delimiter, " ") + return text.replace("\n", " ").replace("\"", " ") + def write_csv(self, timestamp): """ Write results in CSV format """ if timestamp is None: