@@ -254,6 +254,7 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
254254 Dictionary of metric names to values
255255 """
256256 metrics = {}
257+ scenario = None # Will be detected from file
257258
258259 try :
259260 with open (summary_file , 'r' ) as f :
@@ -267,6 +268,13 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
267268 orig_line = line # Keep original for debugging
268269 line = line .strip ()
269270
271+ # Detect scenario early from "Scenario : Server" or "Scenario : Offline"
272+ if scenario is None and 'Scenario :' in line :
273+ scenario_str = line .split (':' , 1 )[1 ].strip () if ':' in line else ''
274+ scenario = 'Server' if 'Server' in scenario_str else 'Offline'
275+ metrics ['loadgen_scenario_server' ] = 1.0 if scenario == 'Server' else 0.0
276+ self .logger .info (f"Detected scenario from summary file: { scenario } " )
277+
270278 # Check for section headers - they appear before separator lines
271279 if 'Additional Stats' in line :
272280 in_additional_stats = True
@@ -297,7 +305,12 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
297305 if len (parts ) == 2 :
298306 try :
299307 value = float (parts [1 ].strip ())
300- metrics ['loadgen_samples_per_second' ] = value
308+ # Store both specific and generic names
309+ if 'completed' in line .lower ():
310+ metrics ['loadgen_completed_samples_per_second' ] = value
311+ metrics ['loadgen_samples_per_second' ] = value # Generic alias
312+ else :
313+ metrics ['loadgen_samples_per_second' ] = value
301314 except ValueError :
302315 pass
303316
@@ -308,11 +321,16 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
308321 if len (parts ) == 2 :
309322 try :
310323 value = float (parts [1 ].strip ())
311- metrics ['loadgen_tokens_per_second' ] = value
324+ # Store both specific and generic names
325+ if 'completed' in line .lower ():
326+ metrics ['loadgen_completed_tokens_per_second' ] = value
327+ metrics ['loadgen_tokens_per_second' ] = value # Generic alias
328+ else :
329+ metrics ['loadgen_tokens_per_second' ] = value
312330 except ValueError :
313331 pass
314332
315- # Extract Scheduled samples per second (Server scenario) - in Additional Stats
333+ # Extract Scheduled samples per second (Server scenario only ) - in Additional Stats
316334 if in_additional_stats and 'Scheduled samples per second' in line :
317335 parts = line .split (':' , 1 )
318336 if len (parts ) == 2 :
@@ -323,6 +341,7 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
323341 pass
324342
325343 # Extract latency metrics (Additional Stats section)
344+ # Note: Server scenario also has "Completed tokens per second" repeated here
326345 if in_additional_stats :
327346 # Min/Max/Mean latency
328347 if 'Min latency (ns)' in line and ':' in line :
@@ -376,7 +395,8 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
376395 except ValueError :
377396 pass
378397
379- # First Token latency metrics (Server scenario)
398+ # First Token latency metrics (Server scenario only)
399+ # These only appear in Server scenario summaries
380400 if 'Min First Token latency (ns)' in line and ':' in line :
381401 parts = line .split (':' , 1 )
382402 if len (parts ) == 2 :
@@ -428,7 +448,8 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
428448 except ValueError :
429449 pass
430450
431- # Time to Output Token metrics (Server scenario)
451+ # Time to Output Token metrics (Server scenario only)
452+ # These only appear in Server scenario summaries
432453 if 'Min Time to Output Token (ns)' in line and ':' in line :
433454 parts = line .split (':' , 1 )
434455 if len (parts ) == 2 :
@@ -517,8 +538,17 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
517538 except (ValueError , IndexError ):
518539 pass
519540
541+ # Log scenario-specific metrics summary
520542 if metrics :
521- self .logger .info (f"Extracted { len (metrics )} LoadGen metrics from summary file" )
543+ scenario_detected = scenario or "Unknown"
544+ # Count Server-specific metrics
545+ server_metrics = [k for k in metrics .keys () if any (term in k .lower () for term in ['ttft' , 'tpot' , 'scheduled' , 'completed_samples' , 'completed_tokens' ])]
546+ self .logger .info (f"Extracted { len (metrics )} LoadGen metrics from summary file (Scenario: { scenario_detected } )" )
547+ if server_metrics and scenario_detected == 'Server' :
548+ self .logger .info (f"Server-specific metrics found: { len (server_metrics )} metrics including TTFT, TPOT, Scheduled, and Completed throughput" )
549+ # List key Server metrics
550+ key_server_metrics = [k for k in server_metrics if any (term in k for term in ['ttft' , 'tpot' , 'scheduled' , 'completed' ])]
551+ self .logger .debug (f"Server metrics: { sorted (key_server_metrics )} " )
522552 else :
523553 self .logger .warning ("No metrics extracted from summary file" )
524554
0 commit comments