Skip to content

Commit 76e9b94

Browse files
Enabled machine metrics from Redis (memory,cpu) to be pushed to RedisTimeSeries (#255)
* Enabled machine metrics from Redis (memory,cpu) to be pushed to RedisTimeSeries exporter * Bumping version to 0.6.0
1 parent c926325 commit 76e9b94

File tree

7 files changed

+146
-6
lines changed

7 files changed

+146
-6
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.5.27"
3+
version = "0.6.0"
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]>","Redis Performance Group <[email protected]>"]
66
readme = "README.md"

redisbench_admin/run/common.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ def common_exporter_logic(
244244
used_ts
245245
)
246246
)
247-
assert used_ts != None
247+
assert used_ts is not None
248248
if (
249249
artifact_version is not None
250250
and artifact_version != ""

redisbench_admin/run/metrics.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# All rights reserved.
55
#
66
import logging
7+
import datetime as dt
78

89
from jsonpath_ng import parse
910

@@ -81,3 +82,32 @@ def extract_results_table(
8182
"Unable to find metric path {} in result dict".format(jsonpath)
8283
)
8384
return results_matrix
85+
86+
87+
def collect_redis_metrics(redis_conns, sections=["memory", "cpu"]):
88+
start_time = dt.datetime.utcnow()
89+
start_time_ms = int((start_time - dt.datetime(1970, 1, 1)).total_seconds() * 1000)
90+
res = []
91+
overall = {}
92+
for conn in redis_conns:
93+
conn_res = {}
94+
for section in sections:
95+
info = conn.info(section)
96+
conn_res[section] = info
97+
if section not in overall:
98+
overall[section] = {}
99+
for k, v in info.items():
100+
if type(v) is float or type(v) is int:
101+
if k not in overall[section]:
102+
overall[section][k] = 0
103+
overall[section][k] += v
104+
105+
res.append(conn_res)
106+
107+
kv_overall = {}
108+
for sec, kv_detail in overall.items():
109+
for k, metric_value in kv_detail.items():
110+
metric_name = "{}_{}".format(sec, k)
111+
kv_overall[metric_name] = metric_value
112+
113+
return start_time_ms, res, kv_overall

redisbench_admin/run_remote/run_remote.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
)
2323
from redisbench_admin.run.git import git_vars_crosscheck
2424
from redisbench_admin.run.grafana import generate_artifacts_table_grafana_redis
25+
from redisbench_admin.run.metrics import collect_redis_metrics
2526
from redisbench_admin.run.modules import redis_modules_check
2627
from redisbench_admin.run.redistimeseries import (
2728
timeseries_test_sucess_flow,
@@ -46,6 +47,8 @@
4647
get_run_full_filename,
4748
get_overall_dashboard_keynames,
4849
check_ec2_env,
50+
get_project_ts_tags,
51+
push_data_to_redistimeseries,
4952
)
5053

5154
from redisbench_admin.utils.utils import (
@@ -373,6 +376,12 @@ def run_remote_command_logic(args, project_name, project_version):
373376
db_ssh_port,
374377
)
375378

379+
(
380+
_,
381+
_,
382+
overall_start_time_metrics,
383+
) = collect_redis_metrics(redis_conns)
384+
376385
(
377386
start_time,
378387
start_time_ms,
@@ -497,6 +506,78 @@ def run_remote_command_logic(args, project_name, project_version):
497506
)
498507
)
499508

509+
(
510+
end_time_ms,
511+
_,
512+
overall_end_time_metrics,
513+
) = collect_redis_metrics(redis_conns)
514+
515+
sprefix = "ci.benchmarks.redislabs/" + "{triggering_env}/{github_org}/{github_repo}".format(
516+
triggering_env=tf_triggering_env,
517+
github_org=tf_github_org,
518+
github_repo=tf_github_repo,
519+
)
520+
logging.info(
521+
"Adding a total of {} server side metrics collected at the end of benchmark".format(
522+
len(list(overall_end_time_metrics.items()))
523+
)
524+
)
525+
timeseries_dict = {}
526+
by_variants = {}
527+
if tf_github_branch is not None:
528+
by_variants[
529+
"by.branch/{}".format(tf_github_branch)
530+
] = {"branch": tf_github_branch}
531+
if artifact_version is not None:
532+
by_variants[
533+
"by.version/{}".format(artifact_version)
534+
] = {"version": artifact_version}
535+
for (
536+
by_variant,
537+
variant_labels_dict,
538+
) in by_variants.items():
539+
for (
540+
metric_name,
541+
metric_value,
542+
) in overall_end_time_metrics.items():
543+
tsname_metric = (
544+
"{}/{}/{}/benchmark_end/{}".format(
545+
sprefix,
546+
test_name,
547+
by_variant,
548+
metric_name,
549+
)
550+
)
551+
552+
logging.debug(
553+
"Adding a redis server side metric collected at the end of benchmark."
554+
+ " metric_name={} metric_value={} time-series name: {}".format(
555+
metric_name,
556+
metric_value,
557+
tsname_metric,
558+
)
559+
)
560+
variant_labels_dict["test_name"] = test_name
561+
variant_labels_dict["metric"] = metric_name
562+
563+
timeseries_dict[tsname_metric] = {
564+
"labels": get_project_ts_tags(
565+
tf_github_org,
566+
tf_github_repo,
567+
setup_name,
568+
setup_type,
569+
tf_triggering_env,
570+
variant_labels_dict,
571+
None,
572+
None,
573+
),
574+
"data": {end_time_ms: metric_value},
575+
}
576+
if args.push_results_redistimeseries:
577+
push_data_to_redistimeseries(
578+
rts, timeseries_dict
579+
)
580+
500581
if setup_details["env"] is None:
501582
if args.keep_env_and_topo is False:
502583
shutdown_remote_redis(
@@ -573,6 +654,11 @@ def run_remote_command_logic(args, project_name, project_version):
573654
branch_tt_keyname,
574655
branch_target_table,
575656
) in branch_target_tables.items():
657+
if (
658+
"contains-target"
659+
not in branch_target_table
660+
):
661+
continue
576662
if (
577663
branch_target_table["contains-target"]
578664
is True

redisbench_admin/utils/remote.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,14 +548,14 @@ def push_data_to_redistimeseries(rts, time_series_dict: dict):
548548

549549
def exporter_create_ts(rts, time_series, timeseries_name):
550550
try:
551-
logging.info(
551+
logging.debug(
552552
"Creating timeseries named {} with labels {}".format(
553553
timeseries_name, time_series["labels"]
554554
)
555555
)
556556
rts.create(timeseries_name, labels=time_series["labels"])
557557
except redis.exceptions.ResponseError:
558-
logging.info(
558+
logging.debug(
559559
"Timeseries named {} already exists. Checking that the labels match.".format(
560560
timeseries_name
561561
)

tests/test_metrics.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
# All rights reserved.
55
#
66
import json
7+
import os
78

89
import yaml
10+
from redistimeseries.client import Client
911

1012
from redisbench_admin.run.common import merge_default_and_config_metrics
11-
from redisbench_admin.run.metrics import extract_results_table
13+
from redisbench_admin.run.metrics import extract_results_table, collect_redis_metrics
1214

1315

1416
def test_extract_results_table():
@@ -28,3 +30,25 @@ def test_extract_results_table():
2830
metrics,
2931
results_dict,
3032
)
33+
34+
35+
def test_collect_redis_metrics():
36+
rts_host = os.getenv("RTS_DATASINK_HOST", None)
37+
rts_port = 16379
38+
if rts_host is None:
39+
assert False
40+
rts = Client(port=rts_port, host=rts_host)
41+
rts.redis.ping()
42+
time_ms, metrics_arr, overall_metrics = collect_redis_metrics([rts.redis])
43+
assert len(metrics_arr) == 1
44+
assert len(metrics_arr[0].keys()) == 2
45+
assert "cpu" in metrics_arr[0].keys()
46+
assert "memory" in metrics_arr[0].keys()
47+
assert "allocator_active" in metrics_arr[0]["memory"]
48+
allocator_active = metrics_arr[0]["memory"]["allocator_active"]
49+
allocator_active_kv = overall_metrics["memory_allocator_active"]
50+
assert allocator_active == allocator_active_kv
51+
52+
_, _, overall_metrics = collect_redis_metrics([rts.redis, rts.redis])
53+
allocator_active_kv = overall_metrics["memory_allocator_active"]
54+
assert (2 * allocator_active) == allocator_active_kv

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ commands =
77
black --check redisbench_admin
88
flake8 redisbench_admin
99
coverage erase
10-
coverage run --include=redisbench_admin/* -m pytest -ra
10+
coverage run --include=redisbench_admin/* -m pytest -ra {posargs}
1111
coverage report -m
1212

1313
docker =

0 commit comments

Comments
 (0)