Daniel Wagner | 1d44e98 | 2022-06-29 17:42:39 +0200 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | import argparse |
| 3 | import platform |
| 4 | import json |
| 5 | |
| 6 | # Transform rtla hist out data into the same format as rt-tests |
| 7 | # framework is producing. |
| 8 | |
| 9 | |
| 10 | def parse_args(): |
| 11 | parser = argparse.ArgumentParser() |
| 12 | parser.add_argument( |
| 13 | "-r", |
| 14 | "--result-file", |
| 15 | dest="result_file", |
| 16 | required=True, |
| 17 | default="./result.txt", |
| 18 | help="Specify test result file.", |
| 19 | ) |
| 20 | parser.add_argument( |
| 21 | "-t", |
| 22 | "--test-name", |
| 23 | required=True, |
| 24 | help="Specify test name.", |
| 25 | ) |
| 26 | parser.add_argument( |
| 27 | "-o", |
| 28 | "--output", |
| 29 | dest="output", |
| 30 | help="Specify output file.", |
| 31 | ) |
| 32 | |
| 33 | args = parser.parse_args() |
| 34 | return args |
| 35 | |
| 36 | |
| 37 | def get_sysinfo(): |
| 38 | sysinfo = {} |
| 39 | |
| 40 | uname = platform.uname() |
| 41 | sysinfo["sysname"] = uname.system |
| 42 | sysinfo["nodename"] = uname.node |
| 43 | sysinfo["release"] = uname.release |
| 44 | sysinfo["version"] = uname.version |
| 45 | sysinfo["machine"] = uname.machine |
| 46 | |
| 47 | realtime = 0 |
| 48 | try: |
| 49 | with open("/sys/kernel/realtime", "r") as rfl: |
| 50 | realtime = int(rfl.read(1)) |
| 51 | except IOError: |
| 52 | pass |
| 53 | sysinfo["realtime"] = realtime |
| 54 | |
| 55 | return sysinfo |
| 56 | |
| 57 | |
Daniel Wagner | e523bea | 2024-09-16 16:13:01 +0200 | [diff] [blame^] | 58 | def get_field_name(col): |
| 59 | if col[0].endswith(":"): |
| 60 | return col[0][:-1] |
| 61 | return None |
| 62 | |
| 63 | |
Daniel Wagner | 1d44e98 | 2022-06-29 17:42:39 +0200 | [diff] [blame] | 64 | def parse_histogram(col, sel, i, hist): |
| 65 | if i not in hist: |
| 66 | hist[i] = {} |
| 67 | hist[i]["histogram"] = {} |
| 68 | |
Daniel Wagner | e523bea | 2024-09-16 16:13:01 +0200 | [diff] [blame^] | 69 | name = get_field_name(col) |
| 70 | if name: |
Daniel Wagner | 1d44e98 | 2022-06-29 17:42:39 +0200 | [diff] [blame] | 71 | hist[i][name] = int(col[sel]) |
| 72 | else: |
| 73 | hist[i]["histogram"][col[0]] = int(col[sel]) |
| 74 | |
| 75 | |
| 76 | def parse_osnoise(result_file): |
| 77 | data = {} |
| 78 | threads = {} |
Daniel Wagner | e523bea | 2024-09-16 16:13:01 +0200 | [diff] [blame^] | 79 | num_cols = 0 |
| 80 | |
Daniel Wagner | 1d44e98 | 2022-06-29 17:42:39 +0200 | [diff] [blame] | 81 | for line in result_file.readlines(): |
| 82 | if line.startswith(" "): |
| 83 | continue |
| 84 | |
| 85 | col = line.split() |
Daniel Wagner | e523bea | 2024-09-16 16:13:01 +0200 | [diff] [blame^] | 86 | name = get_field_name(col) |
| 87 | if name == "ALL": |
| 88 | break |
Daniel Wagner | 1d44e98 | 2022-06-29 17:42:39 +0200 | [diff] [blame] | 89 | |
| 90 | num_cols = len(col) - 1 |
| 91 | |
| 92 | for i, sel in zip(range(0, num_cols), range(1, len(col), 1)): |
| 93 | parse_histogram(col, sel, i, threads) |
| 94 | |
| 95 | data["file_version"] = 2 |
| 96 | data["return_code"] = 0 |
| 97 | data["sysinfo"] = get_sysinfo() |
| 98 | data["num_threads"] = num_cols |
| 99 | data["resolution_in_ns"] = 0 |
| 100 | data["thread"] = threads |
| 101 | |
| 102 | return data |
| 103 | |
| 104 | |
Daniel Wagner | ccd0ff9 | 2022-06-30 09:45:08 +0200 | [diff] [blame] | 105 | def parse_timerlat(result_file): |
| 106 | data = {} |
| 107 | threads = {} |
| 108 | irqs = {} |
| 109 | num_cols = 0 |
Daniel Wagner | e523bea | 2024-09-16 16:13:01 +0200 | [diff] [blame^] | 110 | |
Daniel Wagner | ccd0ff9 | 2022-06-30 09:45:08 +0200 | [diff] [blame] | 111 | for line in result_file.readlines(): |
| 112 | if line.startswith(" "): |
| 113 | continue |
| 114 | |
| 115 | col = line.split() |
Daniel Wagner | e523bea | 2024-09-16 16:13:01 +0200 | [diff] [blame^] | 116 | name = get_field_name(col) |
| 117 | if name == "ALL": |
| 118 | break |
Daniel Wagner | ccd0ff9 | 2022-06-30 09:45:08 +0200 | [diff] [blame] | 119 | |
| 120 | num_cols = len(col) - 1 |
| 121 | |
| 122 | for i, sel in zip(range(0, num_cols), range(1, len(col), 2)): |
| 123 | parse_histogram(col, sel, i, irqs) |
| 124 | for i, sel in zip(range(0, num_cols), range(2, len(col), 2)): |
| 125 | parse_histogram(col, sel, i, threads) |
| 126 | |
| 127 | data["file_version"] = 2 |
| 128 | data["return_code"] = 0 |
| 129 | data["sysinfo"] = get_sysinfo() |
| 130 | data["num_threads"] = num_cols / 2 |
| 131 | data["num_irqs"] = num_cols / 2 |
| 132 | data["resolution_in_ns"] = 0 |
| 133 | data["thread"] = threads |
| 134 | data["irq"] = irqs |
| 135 | |
| 136 | return data |
| 137 | |
| 138 | |
Daniel Wagner | 1d44e98 | 2022-06-29 17:42:39 +0200 | [diff] [blame] | 139 | def main(args): |
| 140 | with open(args.result_file, "r") as infile: |
| 141 | if args.test_name == "osnoise": |
| 142 | data = parse_osnoise(infile) |
Daniel Wagner | ccd0ff9 | 2022-06-30 09:45:08 +0200 | [diff] [blame] | 143 | else: |
| 144 | data = parse_timerlat(infile) |
Daniel Wagner | 1d44e98 | 2022-06-29 17:42:39 +0200 | [diff] [blame] | 145 | |
| 146 | if args.output: |
| 147 | with open(args.output, "w") as outfile: |
| 148 | outfile.write(json.dumps(data, indent=2)) |
| 149 | else: |
| 150 | print(json.dumps(data, indent=2)) |
| 151 | |
| 152 | |
| 153 | if __name__ == "__main__": |
| 154 | main(parse_args()) |