Skip to content

Commit ae86a56

Browse files
committed
Add tests to verify stats reported by receptor
Add tests to verify that stats reported by receptor are accurate. Currently tests only check for the expected number of connected nodes.
1 parent f64096c commit ae86a56

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)