@@ -12,7 +12,7 @@ def __init__(self, rulefname, reportfname='', t=5, debug=False, datafname='', fu
12
12
self .reportfname = reportfname
13
13
self .rules = None
14
14
self .collectlist = metrics
15
- self .metrics = set ()
15
+ self .metrics = set (metrics )
16
16
self .tolerance = t
17
17
18
18
self .workloads = [x for x in workload .split ("," ) if x ]
@@ -148,6 +148,7 @@ def pos_val_test(self):
148
148
self .errlist .append ("Metric '%s' is not collected" % (name ))
149
149
elif val < 0 :
150
150
negmetric .add ("{0}(={1:.4f})" .format (name , val ))
151
+ self .collectlist [0 ].append (name )
151
152
else :
152
153
pcnt += 1
153
154
tcnt += 1
@@ -266,6 +267,7 @@ def single_test(self, rule:dict):
266
267
passcnt += 1
267
268
else :
268
269
faillist .append ({'MetricName' :m ['Name' ], 'CollectedValue' :result })
270
+ self .collectlist [0 ].append (m ['Name' ])
269
271
270
272
self .totalcnt += totalcnt
271
273
self .passedcnt += passcnt
@@ -348,17 +350,20 @@ def collect_perf(self, data_file: str, workload: str):
348
350
if rule ["TestType" ] == "RelationshipTest" :
349
351
metrics = [m ["Name" ] for m in rule ["Metrics" ]]
350
352
if not any (m not in collectlist [0 ] for m in metrics ):
351
- collectlist [rule ["RuleIndex" ]] = set (metrics )
353
+ collectlist [rule ["RuleIndex" ]] = [ "," . join ( list ( set (metrics )))]
352
354
353
355
for idx , metrics in collectlist .items ():
354
356
if idx == 0 : wl = "sleep 0.5" .split ()
355
357
else : wl = workload .split ()
356
358
for metric in metrics :
357
359
command = [tool , 'stat' , '-j' , '-M' , f"{ metric } " , "-a" ]
358
360
command .extend (wl )
361
+ print (" " .join (command ))
359
362
cmd = subprocess .run (command , stderr = subprocess .PIPE , encoding = 'utf-8' )
360
363
data = [x + '}' for x in cmd .stderr .split ('}\n ' ) if x ]
361
364
self .convert (data , idx )
365
+ self .collectlist = dict ()
366
+ self .collectlist [0 ] = list ()
362
367
# End of Collector and Converter
363
368
364
369
# Start of Rule Generator
@@ -386,6 +391,20 @@ def parse_perf_metrics(self):
386
391
387
392
return
388
393
394
+ def remove_unsupported_rules (self , rules , skiplist : set = None ):
395
+ for m in skiplist :
396
+ self .metrics .discard (m )
397
+ new_rules = []
398
+ for rule in rules :
399
+ add_rule = True
400
+ for m in rule ["Metrics" ]:
401
+ if m ["Name" ] not in self .metrics :
402
+ add_rule = False
403
+ break
404
+ if add_rule :
405
+ new_rules .append (rule )
406
+ return new_rules
407
+
389
408
def create_rules (self ):
390
409
"""
391
410
Create full rules which includes:
@@ -394,7 +413,10 @@ def create_rules(self):
394
413
395
414
Reindex all the rules to avoid repeated RuleIndex
396
415
"""
397
- self .rules = self .read_json (self .rulefname )['RelationshipRules' ]
416
+ data = self .read_json (self .rulefname )
417
+ rules = data ['RelationshipRules' ]
418
+ skiplist = set (data ['SkipList' ])
419
+ self .rules = self .remove_unsupported_rules (rules , skiplist )
398
420
pctgrule = {'RuleIndex' :0 ,
399
421
'TestType' :'SingleMetricTest' ,
400
422
'RangeLower' :'0' ,
@@ -453,7 +475,8 @@ def test(self):
453
475
454
476
The final report is written into a JSON file.
455
477
'''
456
- self .parse_perf_metrics ()
478
+ if not self .collectlist :
479
+ self .parse_perf_metrics ()
457
480
self .create_rules ()
458
481
for i in range (0 , len (self .workloads )):
459
482
self ._init_data ()
0 commit comments