diff --git a/simlib/blendnet-sims/scripts/batch.py b/simlib/blendnet-sims/scripts/batch.py index fdc31fc..e2d4022 100644 --- a/simlib/blendnet-sims/scripts/batch.py +++ b/simlib/blendnet-sims/scripts/batch.py @@ -178,6 +178,10 @@ if __name__ == "__main__": "max_latency_msg_persistent_index", "max_latency_msg_temporal_latency_sec", "max_latency_msg_temporal_index", + "min_conn_latency_sec", + "avg_conn_latency_sec", + "med_conn_latency_sec", + "max_conn_latency_sec", "min_bandwidth_kbps", "avg_bandwidth_kbps", "max_bandwidth_kbps", @@ -262,6 +266,18 @@ if __name__ == "__main__": map(str, latency_analysis.max_latency_analysis.temporal_indices) ) ) + csv_row.append( + float(latency_analysis.conn_latency_analysis.min_ms) / 1000.0 + ) + csv_row.append( + float(latency_analysis.conn_latency_analysis.avg_ms) / 1000.0 + ) + csv_row.append( + float(latency_analysis.conn_latency_analysis.med_ms) / 1000.0 + ) + csv_row.append( + float(latency_analysis.conn_latency_analysis.max_ms) / 1000.0 + ) bandwidth_res = bandwidth_result(log_path, args.step_duration) csv_row.append(bandwidth_res["min"] * 8 / 1000.0) diff --git a/simlib/blendnet-sims/scripts/latency.py b/simlib/blendnet-sims/scripts/latency.py index 6485c38..412e238 100755 --- a/simlib/blendnet-sims/scripts/latency.py +++ b/simlib/blendnet-sims/scripts/latency.py @@ -17,6 +17,7 @@ class LatencyAnalysis: max_latency_analysis: "MessageLatencyAnalysis" avg_latency_ms: int median_latency_ms: int + conn_latency_analysis: "ConnectionLatencyAnalysis" @classmethod def build(cls, input_stream: Iterable[tuple[str, dict]]) -> "LatencyAnalysis": @@ -35,17 +36,18 @@ class LatencyAnalysis: message_ids = pd.Series(message_ids) return cls( - int(latencies.count()), - int(latencies.min()), - MessageLatencyAnalysis.build( + total_messages=int(latencies.count()), + min_latency_ms=int(latencies.min()), + min_latency_analysis=MessageLatencyAnalysis.build( messages[str(message_ids[latencies.idxmin()])] ), - int(latencies.max()), - MessageLatencyAnalysis.build( + max_latency_ms=int(latencies.max()), + max_latency_analysis=MessageLatencyAnalysis.build( messages[str(message_ids[latencies.idxmax()])] ), - int(latencies.mean()), - int(latencies.median()), + avg_latency_ms=int(latencies.mean()), + median_latency_ms=int(latencies.median()), + conn_latency_analysis=ConnectionLatencyAnalysis.build(messages), ) @@ -82,6 +84,32 @@ class MessageLatencyAnalysis: return analysis +@dataclass +class ConnectionLatencyAnalysis: + min_ms: int + avg_ms: int + med_ms: int + max_ms: int + + @classmethod + def build( + cls, + messages: dict[str, dict], + ) -> "ConnectionLatencyAnalysis": + latencies = [] + for message in messages.values(): + for event in message["history"]: + if "NetworkReceived" in event["event_type"]: + latencies.append(event["duration_from_prev"]) + latencies = pd.Series(latencies) + return cls( + int(latencies.min()), + int(latencies.mean()), + int(latencies.median()), + int(latencies.max()), + ) + + def build_argument_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description="Log analysis for nomos-simulations.") parser.add_argument(