Skip to content

Commit 8fea231

Browse files
authored
Merge pull request #52 from elyezer/check-stats
Add tests to verify stats reported by receptor
2 parents f64096c + ae86a56 commit 8fea231

6 files changed

Lines changed: 144 additions & 3 deletions

File tree

.github/workflows/tester.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ jobs:
2424
python ./test/perf/node_utils.py file ./test/perf/topology-random.yaml&
2525
python ./test/perf/node_utils.py dot-compare graph_controller.dot last-topology_graph.dot --wait 40
2626
python ./test/perf/node_utils.py ping ./test/perf/topology-random.yaml --count 100 --validate 0.1
27+
python ./test/perf/node_utils.py check-stats last-topology.yaml
2728
kill `pidof python`
2829
rm -Rf /tmp/receptor
2930
rm graph_controller.dot
@@ -38,6 +39,7 @@ jobs:
3839
python ./test/perf/node_utils.py file ./test/perf/topology-flat.yaml&
3940
python ./test/perf/node_utils.py dot-compare graph_controller.dot last-topology_graph.dot --wait 40
4041
python ./test/perf/node_utils.py ping ./test/perf/topology-flat.yaml --count 100 --validate 0.1
42+
python ./test/perf/node_utils.py check-stats last-topology.yaml
4143
kill `pidof python`
4244
rm -Rf /tmp/receptor
4345
rm graph_controller.dot
@@ -52,6 +54,7 @@ jobs:
5254
python ./test/perf/node_utils.py file ./test/perf/topology-tree.yaml&
5355
python ./test/perf/node_utils.py dot-compare graph_controller.dot last-topology_graph.dot --wait 40
5456
python ./test/perf/node_utils.py ping ./test/perf/topology-tree.yaml --count 100 --validate 0.1
57+
python ./test/perf/node_utils.py check-stats last-topology.yaml
5558
kill `pidof python`
5659
rm -Rf /tmp/receptor
5760
rm graph_controller.dot
@@ -78,4 +81,4 @@ jobs:
7881
pip install .
7982
- name: pytest unit tests
8083
run: |
81-
pytest
84+
pytest

test/perf/node_utils.py

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
from time import sleep
99

1010
import click
11+
import requests
1112
import yaml
13+
from prometheus_client.parser import text_string_to_metric_families
1214
from pyparsing import alphanums
1315
from pyparsing import Group
1416
from pyparsing import OneOrMore
@@ -19,6 +21,14 @@
1921

2022
DEBUG = False
2123

24+
RECEPTOR_METRICS = (
25+
"active_work",
26+
"connected_peers",
27+
"incoming_messages",
28+
"route_events",
29+
"work_events",
30+
)
31+
2232

2333
class Conn:
2434
def __init__(self, a, b):
@@ -65,7 +75,10 @@ def random_port(tcp=True):
6575
procs = []
6676

6777

68-
Node = namedtuple("Node", ["name", "controller", "listen_port", "connections"])
78+
Node = namedtuple('Node', [
79+
"name", "controller", "listen_port", "connections", "stats_enable",
80+
"stats_port"
81+
])
6982

7083

7184
def generate_random_mesh(controller_port, node_count, conn_method):
@@ -91,6 +104,8 @@ def do_it(topology, profile=False):
91104
"listen_port": node_data.listen_port if node_data.controller else None,
92105
"controller": node_data.controller,
93106
"connections": node_data.connections,
107+
"stats_enable": node_data.stats_enable,
108+
"stats_port": node_data.stats_port,
94109
}
95110
yaml.dump(data, f)
96111
with open("last-topology_graph.dot", "w") as f:
@@ -131,6 +146,11 @@ def do_it(topology, profile=False):
131146
f"--listen-port={node.listen_port}",
132147
]
133148
)
149+
if node.stats_enable:
150+
starter.extend([
151+
"--stats-enable",
152+
f"--stats-port={node.stats_port}",
153+
])
134154
op = subprocess.Popen(" ".join(starter), shell=True)
135155
procs.append(op)
136156
f.write(f"{' '.join(starter)}\n")
@@ -155,6 +175,11 @@ def do_it(topology, profile=False):
155175
peer_string,
156176
]
157177
)
178+
if node.stats_enable:
179+
starter.extend([
180+
"--stats-enable",
181+
f"--stats-port={node.stats_port}",
182+
])
158183
op = subprocess.Popen(" ".join(starter), shell=True)
159184
procs.append(op)
160185
f.write(f"{' '.join(starter)}\n")
@@ -177,6 +202,8 @@ def load_topology(filename):
177202
definition["controller"],
178203
definition.get("listen_port", None) or random_port(),
179204
definition["connections"],
205+
definition.get("stats_enable", False),
206+
definition.get("stats_port", None) or random_port(),
180207
)
181208
return topology
182209

@@ -331,5 +358,37 @@ def dot_compare(filename_one, filename_two, wait):
331358
sys.exit(127)
332359

333360

361+
@main.command("check-stats")
362+
@click.option("--debug", is_flag=True, default=False)
363+
@click.option("--profile", is_flag=True, default=False)
364+
@click.argument("filename", type=click.File("r"))
365+
def check_stats(filename, debug, profile):
366+
topology = load_topology(filename)
367+
failures = []
368+
369+
for node in topology.values():
370+
if not node.stats_enable:
371+
continue
372+
stats = requests.get(f'http://localhost:{node.stats_port}/metrics')
373+
metrics = {
374+
metric.name: metric
375+
for metric in text_string_to_metric_families(stats.text)
376+
if metric.name in RECEPTOR_METRICS
377+
}
378+
expected_connected_peers = len([
379+
n for n in topology.values() if node.name in n.connections
380+
]) + len(node.connections)
381+
connected_peers = metrics['connected_peers'].samples[0].value
382+
if expected_connected_peers != connected_peers:
383+
failures.append(
384+
f"Node '{node.name}' was expected to have "
385+
f"{expected_connected_peers} connections, but it reported to "
386+
f" have {connected_peers}"
387+
)
388+
if failures:
389+
print('\n'.join(failures))
390+
sys.exit(127)
391+
392+
334393
if __name__ == "__main__":
335394
main()

test/perf/requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
click
2-
pyyaml
32
pyparsing
3+
pyyaml
4+
requests

test/perf/topology-flat.yaml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,75 +4,101 @@ nodes:
44
controller: true
55
listen_port: 8888
66
name: controller
7+
stats_enable: true
8+
stats_port: null
79
node1:
810
connections:
911
- controller
1012
controller: false
1113
listen_port: null
1214
name: node1
15+
stats_enable: true
16+
stats_port: null
1317
node10:
1418
connections:
1519
- controller
1620
controller: false
1721
listen_port: null
1822
name: node10
23+
stats_enable: true
24+
stats_port: null
1925
node11:
2026
connections:
2127
- controller
2228
controller: false
2329
listen_port: null
2430
name: node11
31+
stats_enable: true
32+
stats_port: null
2533
node12:
2634
connections:
2735
- controller
2836
controller: false
2937
listen_port: null
3038
name: node12
39+
stats_enable: true
40+
stats_port: null
3141
node2:
3242
connections:
3343
- controller
3444
controller: false
3545
listen_port: null
3646
name: node2
47+
stats_enable: true
48+
stats_port: null
3749
node3:
3850
connections:
3951
- controller
4052
controller: false
4153
listen_port: null
4254
name: node3
55+
stats_enable: true
56+
stats_port: null
4357
node4:
4458
connections:
4559
- controller
4660
controller: false
4761
listen_port: null
4862
name: node4
63+
stats_enable: true
64+
stats_port: null
4965
node5:
5066
connections:
5167
- controller
5268
controller: false
5369
listen_port: null
5470
name: node5
71+
stats_enable: true
72+
stats_port: null
5573
node6:
5674
connections:
5775
- controller
5876
controller: false
5977
listen_port: null
6078
name: node6
79+
stats_enable: true
80+
stats_port: null
6181
node7:
6282
connections:
6383
- controller
6484
controller: false
6585
listen_port: null
6686
name: node7
87+
stats_enable: true
88+
stats_port: null
6789
node8:
6890
connections:
6991
- controller
7092
controller: false
7193
listen_port: null
7294
name: node8
95+
stats_enable: true
96+
stats_port: null
7397
node9:
7498
connections:
7599
- controller
76100
controller: false
77101
listen_port: null
78102
name: node9
103+
stats_enable: true
104+
stats_port: null

test/perf/topology-random.yaml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,83 +4,109 @@ nodes:
44
controller: true
55
listen_port: 8888
66
name: controller
7+
stats_enable: true
8+
stats_port: null
79
node1:
810
connections:
911
- controller
1012
controller: false
1113
listen_port: null
1214
name: node1
15+
stats_enable: true
16+
stats_port: null
1317
node10:
1418
connections:
1519
- node12
1620
- node4
1721
controller: false
1822
listen_port: null
1923
name: node10
24+
stats_enable: true
25+
stats_port: null
2026
node11:
2127
connections:
2228
- node1
2329
controller: false
2430
listen_port: null
2531
name: node11
32+
stats_enable: true
33+
stats_port: null
2634
node12:
2735
connections:
2836
- node11
2937
- controller
3038
controller: false
3139
listen_port: null
3240
name: node12
41+
stats_enable: true
42+
stats_port: null
3343
node2:
3444
connections:
3545
- node1
3646
controller: false
3747
listen_port: null
3848
name: node2
49+
stats_enable: true
50+
stats_port: null
3951
node3:
4052
connections:
4153
- node6
4254
- node4
4355
controller: false
4456
listen_port: null
4557
name: node3
58+
stats_enable: true
59+
stats_port: null
4660
node4:
4761
connections:
4862
- node7
4963
- node2
5064
controller: false
5165
listen_port: null
5266
name: node4
67+
stats_enable: true
68+
stats_port: null
5369
node5:
5470
connections:
5571
- node8
5672
- node12
5773
controller: false
5874
listen_port: null
5975
name: node5
76+
stats_enable: true
77+
stats_port: null
6078
node6:
6179
connections:
6280
- node10
6381
- node3
6482
controller: false
6583
listen_port: null
6684
name: node6
85+
stats_enable: true
86+
stats_port: null
6787
node7:
6888
connections:
6989
- node3
7090
- node1
7191
controller: false
7292
listen_port: null
7393
name: node7
94+
stats_enable: true
95+
stats_port: null
7496
node8:
7597
connections:
7698
- node1
7799
controller: false
78100
listen_port: null
79101
name: node8
102+
stats_enable: true
103+
stats_port: null
80104
node9:
81105
connections:
82106
- node10
83107
- node5
84108
controller: false
85109
listen_port: null
86110
name: node9
111+
stats_enable: true
112+
stats_port: null

0 commit comments

Comments
 (0)