Skip to content

Commit 80a5393

Browse files
[add] Added extract tool. Enabled parsing redis-benchmark --csv format on export tool (#28)
1 parent 0eb4aad commit 80a5393

28 files changed

+606
-214
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "redisbench-admin"
3-
version = "0.1.29"
3+
version = "0.1.30"
44
description = "Redis benchmark run helper. A wrapper around Redis and Redis Modules benchmark tools ( ftsb_redisearch, memtier_benchmark, redis-benchmark, aibench, etc... )."
55
authors = ["filipecosta90 <[email protected]>"]
66
readme = "README.md"

redisbench_admin/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '0.1.6'
1+
__version__ = '0.1.30'

redisbench_admin/cli.py

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from redisbench_admin.compare.compare import compare_command_logic
1010
from redisbench_admin.export.args import create_export_arguments
1111
from redisbench_admin.export.export import export_command_logic
12+
from redisbench_admin.extract.args import create_extract_arguments
13+
from redisbench_admin.extract.extract import extract_command_logic
1214
from redisbench_admin.run.args import create_run_arguments
1315
from redisbench_admin.run.run import run_command_logic
1416

@@ -45,28 +47,21 @@ def main():
4547

4648
if requested_tool == "run":
4749
parser = create_run_arguments(parser)
50+
if requested_tool == "extract":
51+
parser = create_extract_arguments(parser)
4852
elif requested_tool == "compare":
4953
parser = create_compare_arguments(parser)
5054
elif requested_tool == "export":
5155
parser = create_export_arguments(parser)
5256
elif requested_tool == "--version":
53-
print("{project_name} {project_version}".format(project_name=project_name, project_version=project_version))
57+
print_version(project_name, project_version)
5458
sys.exit(0)
5559
elif requested_tool == "--help":
56-
print("{project_name} {project_version}".format(project_name=project_name, project_version=project_version))
57-
print("usage: {project_name} <tool> <args>...".format(project_name=project_name))
58-
print(
59-
"\t-) To know more on how to run benchmarks: {project_name} run --help".format(project_name=project_name))
60-
print(
61-
"\t-) To know more on how to compare benchmark results: {project_name} compare --help".format(
62-
project_name=project_name))
63-
print(
64-
"\t-) To know more on how to export benchmark results: {project_name} export --help".format(
65-
project_name=project_name))
60+
print_help(project_name, project_version)
6661
sys.exit(0)
6762
else:
68-
print("Invalid redisbench-admin <tool>. Requested tool: {}. Available tools: [run,export,compare]".format(
69-
requested_tool))
63+
valid_tool_options = ["run", "export", "compare", "retrieve"]
64+
print_invalid_tool_option(requested_tool, valid_tool_options)
7065
sys.exit(1)
7166

7267
argv = sys.argv[2:]
@@ -78,3 +73,27 @@ def main():
7873
compare_command_logic(args)
7974
if requested_tool == "export":
8075
export_command_logic(args)
76+
if requested_tool == "extract":
77+
extract_command_logic(args)
78+
79+
80+
def print_invalid_tool_option(requested_tool, valid_tool_options):
81+
print("Invalid redisbench-admin <tool>. Requested tool: {}. Available tools: {}".format(
82+
requested_tool, ",".join(valid_tool_options)))
83+
84+
85+
def print_version(project_name, project_version):
86+
print("{project_name} {project_version}".format(project_name=project_name, project_version=project_version))
87+
88+
89+
def print_help(project_name, project_version):
90+
print("{project_name} {project_version}".format(project_name=project_name, project_version=project_version))
91+
print("usage: {project_name} <tool> <args>...".format(project_name=project_name))
92+
print(
93+
"\t-) To know more on how to run benchmarks: {project_name} run --help".format(project_name=project_name))
94+
print(
95+
"\t-) To know more on how to compare benchmark results: {project_name} compare --help".format(
96+
project_name=project_name))
97+
print(
98+
"\t-) To know more on how to export benchmark results: {project_name} export --help".format(
99+
project_name=project_name))

redisbench_admin/export/args.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,18 @@ def create_export_arguments(parser):
55
help="comma separated list of steps to be analyzed given the benchmark result files")
66
parser.add_argument('--exporter', type=str, default="redistimeseries",
77
help="exporter to be used ( either csv or redistimeseries )")
8+
parser.add_argument('--results-format', type=str, default="redis-benchmark",
9+
help="results format of the the benchmark results files to read results from ( either memtier_benchmark, redis-benchmark, or ftsb_redisearch )")
810
parser.add_argument('--use-result', type=str, default="median-result",
911
help="for each key-metric, use either worst-result, best-result, or median-result")
10-
parser.add_argument('--extra-tags', type=str, default="", help='comma separated extra tags in the format of key1=value,key2=value,...')
12+
parser.add_argument('--extra-tags', type=str, default="",
13+
help='comma separated extra tags in the format of key1=value,key2=value,...')
1114
parser.add_argument('--host', type=str, default="localhost",
1215
help="redistimeseries host")
1316
parser.add_argument('--port', type=int, default=6379,
1417
help="redistimeseries port")
1518
parser.add_argument('--password', type=str, default=None,
1619
help="redistimeseries password")
20+
parser.add_argument('--input-tags-json', type=str, default="",
21+
help='input filename containing the extracted tags from redis.')
1722
return parser

redisbench_admin/export/common/__init__.py

Whitespace-only changes.
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
def get_timeserie_name(labels_kv_array):
2+
name = ""
3+
for label_kv in labels_kv_array:
4+
k = list(label_kv.keys())[0]
5+
v = list(label_kv.values())[0]
6+
k = prepare_tags(k)
7+
v = prepare_tags(v)
8+
if name != "":
9+
name += ":"
10+
name += "{k}={v}".format(k=k, v=v)
11+
return name
12+
13+
14+
def prepare_tags(k):
15+
if type(k) != str:
16+
k = "{}".format(k)
17+
k = k.replace(" ", "_")
18+
k = k.replace("(", "_")
19+
k = k.replace(")", "_")
20+
k = k.lower()
21+
return k
22+
23+
24+
def add_datapoint(time_series_dict, broader_ts_name, start_time_ms, metric_value, tags_array):
25+
if broader_ts_name not in time_series_dict:
26+
tags_dict = {}
27+
for tag_kv in tags_array:
28+
k = list(tag_kv.keys())[0]
29+
v = list(tag_kv.values())[0]
30+
tags_dict[k] = v
31+
time_series_dict[broader_ts_name] = {"index": [], "data": [], "tags-array": tags_array, "tags": tags_dict}
32+
time_series_dict[broader_ts_name]["index"].append(start_time_ms)
33+
time_series_dict[broader_ts_name]["data"].append(metric_value)
34+
35+
36+
def split_tags_string(extra_tags):
37+
result = []
38+
extra_tags = extra_tags.split(",")
39+
if len(extra_tags) > 0:
40+
for extra_tag in extra_tags:
41+
kv = extra_tag.split("=")
42+
if len(kv) == 2:
43+
k = prepare_tags(kv[0])
44+
v = prepare_tags(kv[1])
45+
result.append({k: v})
46+
return result
47+
48+
49+
def split_key_metrics_by_step(key_metrics_specs):
50+
key_metrics_by_step = {}
51+
for key_metric_spec in key_metrics_specs:
52+
step = None
53+
if "step" in key_metric_spec and "metric-name" in key_metric_spec:
54+
step = key_metric_spec["step"]
55+
metric_name = key_metric_spec["metric-name"]
56+
if step not in key_metrics_by_step:
57+
key_metrics_by_step[step] = {}
58+
key_metrics_by_step[step][metric_name] = key_metric_spec
59+
return key_metrics_by_step
60+
61+
62+
def get_or_None(dict, property):
63+
result = None
64+
if property in dict:
65+
result = dict[property]
66+
return result
67+
68+
69+
def get_kv_tags(deployment_type, extra_tags_array, git_sha, project, project_version, results_type, step,
70+
testcase_name):
71+
common_broader_kv_tags = [
72+
{"project": project}, {"use-case": testcase_name}, {"deployment-type": deployment_type},
73+
{"results-type": results_type}, {"step": step}]
74+
common_broader_kv_tags.extend(extra_tags_array)
75+
common_version_kv_tags = [
76+
{"project": project}, {"use-case": testcase_name}, {"deployment-type": deployment_type},
77+
{"results-type": results_type}, {"step": step}, {"version": project_version}]
78+
common_version_kv_tags.extend(extra_tags_array)
79+
common_git_sha_kv_tags = [
80+
{"project": project}, {"use-case": testcase_name}, {"deployment-type": deployment_type},
81+
{"results-type": results_type}, {"step": step}, {"version": project_version}, {"git_sha": git_sha}]
82+
return common_broader_kv_tags, common_git_sha_kv_tags, common_version_kv_tags

0 commit comments

Comments
 (0)