From ef3712e1afb4bdbe128773867b2f0f646a628d9e Mon Sep 17 00:00:00 2001 From: ArthurChenCoding Date: Tue, 24 Mar 2026 14:00:06 -0400 Subject: [PATCH 1/5] fix overwritten issue for pull and periodic html Signed-off-by: ArthurChenCoding --- orion/run_test.py | 4 ++++ orion/visualization.py | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/orion/run_test.py b/orion/run_test.py index f8a8d1f3..0a785025 100644 --- a/orion/run_test.py +++ b/orion/run_test.py @@ -459,9 +459,12 @@ def analyze(test, kwargs, is_pull = False) -> AnalyzeResult: viz_algorithm = expanded_algorithm if expanded_algorithm is not None else algorithm _, change_points_by_metric = viz_algorithm.get_analysis_results() acked_entries = [] + filename_suffix = "" ack_map = viz_algorithm.options.get("ackMap") if ack_map is not None: acked_entries = ack_map.get("ack", []) + if kwargs.get("pr_analysis"): + filename_suffix = test["metadata"].get("jobType", "") viz_data = VizData( test_name=test["name"], dataframe=viz_algorithm.dataframe.copy(), @@ -470,6 +473,7 @@ def analyze(test, kwargs, is_pull = False) -> AnalyzeResult: uuid_field=test["uuid_field"], version_field=test["version_field"], acked_entries=acked_entries, + filename_suffix=filename_suffix, ) return AnalyzeResult(result_output, regression_flag, regression_data, average_values, viz_data) diff --git a/orion/visualization.py b/orion/visualization.py index 714ed75d..a3203f35 100644 --- a/orion/visualization.py +++ b/orion/visualization.py @@ -26,6 +26,7 @@ def __init__( uuid_field: str, version_field: str, acked_entries: list = None, + filename_suffix: str = "", ): self.test_name = test_name self.dataframe = dataframe @@ -34,6 +35,7 @@ def __init__( self.uuid_field = uuid_field self.version_field = version_field self.acked_entries = acked_entries or [] + self.filename_suffix = filename_suffix def _prepare_timestamps(df: pd.DataFrame): @@ -399,7 +401,8 @@ def generate_test_html(viz_data: VizData, output_base_path: str) -> str: logger = SingletonLogger.get_logger("Orion") fig = _build_test_figure(viz_data) - output_file = f"{output_base_path}_{viz_data.test_name}_viz.html" + suffix = f"_{viz_data.filename_suffix}" if viz_data.filename_suffix else "" + output_file = f"{output_base_path}_{viz_data.test_name}{suffix}_viz.html" fig.write_html( output_file, include_plotlyjs="cdn", full_html=True, default_width="100%", From 4ad0afc575f8e83631d5af0c6fb5bb020f70e5ef Mon Sep 17 00:00:00 2001 From: ArthurChenCoding Date: Tue, 24 Mar 2026 16:48:03 -0400 Subject: [PATCH 2/5] pylint fix Signed-off-by: ArthurChenCoding --- orion/visualization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/orion/visualization.py b/orion/visualization.py index a3203f35..8a4d2757 100644 --- a/orion/visualization.py +++ b/orion/visualization.py @@ -14,7 +14,7 @@ from orion.logger import SingletonLogger -class VizData: # pylint: disable=too-few-public-methods +class VizData: # pylint: disable=too-few-public-methods,too-many-instance-attributes """Container for all data needed to visualize one test's results.""" def __init__( From ec5b67c4af7d93b38bb49339bca662b2b2fa7fb5 Mon Sep 17 00:00:00 2001 From: ArthurChenCoding Date: Fri, 27 Mar 2026 14:19:52 -0400 Subject: [PATCH 3/5] move viz filename handling to caller Signed-off-by: ArthurChenCoding --- main.py | 23 ++++++++++++++++++++--- orion/run_test.py | 9 +++------ orion/visualization.py | 8 ++------ 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/main.py b/main.py index 87f489c4..7598e75c 100644 --- a/main.py +++ b/main.py @@ -28,6 +28,15 @@ "ignore", category=UserWarning, message=".*Connecting to.*verify_certs=False.*" ) + +def build_viz_output_file( + output_base_path: str, test_name: str, run_type: str = "" +) -> str: + """Build the output path for a visualization HTML file.""" + suffix = f"_{run_type}" if run_type else "" + return f"{output_base_path}_{test_name}{suffix}_viz.html" + + class Dictionary(click.ParamType): """Class to define a custom click type for dictionaries @@ -277,9 +286,17 @@ def main(**kwargs): if kwargs.get("viz"): try: output_base_path = str(Path(kwargs['save_output_path']).with_suffix('')) - all_viz_data = results.viz_data - for viz_data in all_viz_data: - generate_test_html(viz_data, output_base_path) + for viz_data in results.viz_data: + run_type = "periodic" if is_pull else "" + output_file = build_viz_output_file( + output_base_path, viz_data.test_name, run_type + ) + generate_test_html(viz_data, output_file) + for viz_data in results_pull.viz_data: + output_file = build_viz_output_file( + output_base_path, viz_data.test_name, "pull" + ) + generate_test_html(viz_data, output_file) except Exception as e: # pylint: disable=broad-except logger.warning("Visualization generation failed: %s", e) diff --git a/orion/run_test.py b/orion/run_test.py index 0a785025..03dd28ca 100644 --- a/orion/run_test.py +++ b/orion/run_test.py @@ -83,6 +83,7 @@ def run(**kwargs: dict[str, Any]) -> Tuple[TestResults, TestResults]: result_output_pull, regression_flag_pull, regression_data_pull = {}, False, [] average_values_df_pull, average_values_df = "", "" all_viz_data = [] + all_viz_data_pull = [] pr = 0 for test in config["tests"]: # Create fingerprint Matcher @@ -114,7 +115,7 @@ def run(**kwargs: dict[str, Any]) -> Tuple[TestResults, TestResults]: regression_data = periodic_result.regression_data average_values_df = periodic_result.average_values if pull_result.viz_data is not None: - all_viz_data.append(pull_result.viz_data) + all_viz_data_pull.append(pull_result.viz_data) if periodic_result.viz_data is not None: all_viz_data.append(periodic_result.viz_data) else: @@ -129,7 +130,7 @@ def run(**kwargs: dict[str, Any]) -> Tuple[TestResults, TestResults]: regression_data=regression_data_pull, average_values=average_values_df_pull, pr=pr, - viz_data=[], + viz_data=all_viz_data_pull, ) results = TestResults( output=result_output, @@ -459,12 +460,9 @@ def analyze(test, kwargs, is_pull = False) -> AnalyzeResult: viz_algorithm = expanded_algorithm if expanded_algorithm is not None else algorithm _, change_points_by_metric = viz_algorithm.get_analysis_results() acked_entries = [] - filename_suffix = "" ack_map = viz_algorithm.options.get("ackMap") if ack_map is not None: acked_entries = ack_map.get("ack", []) - if kwargs.get("pr_analysis"): - filename_suffix = test["metadata"].get("jobType", "") viz_data = VizData( test_name=test["name"], dataframe=viz_algorithm.dataframe.copy(), @@ -473,7 +471,6 @@ def analyze(test, kwargs, is_pull = False) -> AnalyzeResult: uuid_field=test["uuid_field"], version_field=test["version_field"], acked_entries=acked_entries, - filename_suffix=filename_suffix, ) return AnalyzeResult(result_output, regression_flag, regression_data, average_values, viz_data) diff --git a/orion/visualization.py b/orion/visualization.py index 8a4d2757..510531fe 100644 --- a/orion/visualization.py +++ b/orion/visualization.py @@ -26,7 +26,6 @@ def __init__( uuid_field: str, version_field: str, acked_entries: list = None, - filename_suffix: str = "", ): self.test_name = test_name self.dataframe = dataframe @@ -35,7 +34,6 @@ def __init__( self.uuid_field = uuid_field self.version_field = version_field self.acked_entries = acked_entries or [] - self.filename_suffix = filename_suffix def _prepare_timestamps(df: pd.DataFrame): @@ -388,12 +386,12 @@ def _sort_key(m): return fig -def generate_test_html(viz_data: VizData, output_base_path: str) -> str: +def generate_test_html(viz_data: VizData, output_file: str) -> str: """Generate a self-contained HTML file for one test. Args: viz_data: VizData container with all needed data. - output_base_path: Base path for output files (without extension). + output_file: Full output path for the generated HTML file. Returns: str: Path to the generated HTML file. @@ -401,8 +399,6 @@ def generate_test_html(viz_data: VizData, output_base_path: str) -> str: logger = SingletonLogger.get_logger("Orion") fig = _build_test_figure(viz_data) - suffix = f"_{viz_data.filename_suffix}" if viz_data.filename_suffix else "" - output_file = f"{output_base_path}_{viz_data.test_name}{suffix}_viz.html" fig.write_html( output_file, include_plotlyjs="cdn", full_html=True, default_width="100%", From 4fa1e70ca1c21354c9a31a150736a8d2c8ba5764 Mon Sep 17 00:00:00 2001 From: ArthurChenCoding Date: Tue, 31 Mar 2026 12:27:38 -0400 Subject: [PATCH 4/5] add defensive measure Signed-off-by: ArthurChenCoding --- main.py | 11 ++++--- pr2975_payload-node-density_periodic_viz.html | 32 +++++++++++++++++++ pr2975_payload-node-density_pull_viz.html | 32 +++++++++++++++++++ pr2975_table_payload-node-density.txt | 9 ++++++ 4 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 pr2975_payload-node-density_periodic_viz.html create mode 100644 pr2975_payload-node-density_pull_viz.html create mode 100644 pr2975_table_payload-node-density.txt diff --git a/main.py b/main.py index 7598e75c..40262244 100644 --- a/main.py +++ b/main.py @@ -292,11 +292,12 @@ def main(**kwargs): output_base_path, viz_data.test_name, run_type ) generate_test_html(viz_data, output_file) - for viz_data in results_pull.viz_data: - output_file = build_viz_output_file( - output_base_path, viz_data.test_name, "pull" - ) - generate_test_html(viz_data, output_file) + if is_pull: + for viz_data in results_pull.viz_data: + output_file = build_viz_output_file( + output_base_path, viz_data.test_name, "pull" + ) + generate_test_html(viz_data, output_file) except Exception as e: # pylint: disable=broad-except logger.warning("Visualization generation failed: %s", e) diff --git a/pr2975_payload-node-density_periodic_viz.html b/pr2975_payload-node-density_periodic_viz.html new file mode 100644 index 00000000..735de4a4 --- /dev/null +++ b/pr2975_payload-node-density_periodic_viz.html @@ -0,0 +1,32 @@ + + + +
+
+ + + + + \ No newline at end of file diff --git a/pr2975_payload-node-density_pull_viz.html b/pr2975_payload-node-density_pull_viz.html new file mode 100644 index 00000000..b116e5c0 --- /dev/null +++ b/pr2975_payload-node-density_pull_viz.html @@ -0,0 +1,32 @@ + + + +
+
+ + + + + \ No newline at end of file diff --git a/pr2975_table_payload-node-density.txt b/pr2975_table_payload-node-density.txt new file mode 100644 index 00000000..28918e75 --- /dev/null +++ b/pr2975_table_payload-node-density.txt @@ -0,0 +1,9 @@ +time uuid ocpVersion podReadyLatency_P99 containersStartedLatency_P99 apiserverCPU_avg ovnCPU_avg etcdCPU_avg +------------------- ------------------------------------ -------------------------------------------------------- --------------------- ------------------------------ ------------------ ------------ ------------- +2026-03-25 17:02:04 4e5aeeb6-d86e-4e12-a510-b45a4bb471a0 4.22.0-0.ci-2026-03-25-144026-test-ci-op-4n14h862-latest 3000 2765 8.697 2.81423 5.68223 +2026-03-30 14:42:15 eae1f6f5-0202-4cb4-82b9-e22200352a6f 4.22.0-0.ci-2026-03-30-123448-test-ci-op-gy736m6s-latest 3000 2302 11.6108 3.21708 5.88442 + +time uuid ocpVersion kubelet_avg buildUrl +------------------- ------------------------------------ -------------------------------------------------------- ------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +2026-03-25 17:02:04 4e5aeeb6-d86e-4e12-a510-b45a4bb471a0 4.22.0-0.ci-2026-03-25-144026-test-ci-op-4n14h862-latest 23.0222 https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift_release/2975/pull-ci-openshift-ovn-kubernetes-master-qe-perfscale-payload-control-plane-6nodes/2036802660954279936 +2026-03-30 14:42:15 eae1f6f5-0202-4cb4-82b9-e22200352a6f 4.22.0-0.ci-2026-03-30-123448-test-ci-op-gy736m6s-latest 24.3319 https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift_release/2975/pull-ci-openshift-ovn-kubernetes-master-qe-perfscale-payload-control-plane-6nodes/2038590107992199168 \ No newline at end of file From b8019dcde88549d36e89a5c84d27cb6cf4e09e47 Mon Sep 17 00:00:00 2001 From: ArthurChenCoding Date: Tue, 31 Mar 2026 12:34:22 -0400 Subject: [PATCH 5/5] remove local test files Signed-off-by: ArthurChenCoding --- pr2975_payload-node-density_periodic_viz.html | 32 ------------------- pr2975_payload-node-density_pull_viz.html | 32 ------------------- pr2975_table_payload-node-density.txt | 9 ------ 3 files changed, 73 deletions(-) delete mode 100644 pr2975_payload-node-density_periodic_viz.html delete mode 100644 pr2975_payload-node-density_pull_viz.html delete mode 100644 pr2975_table_payload-node-density.txt diff --git a/pr2975_payload-node-density_periodic_viz.html b/pr2975_payload-node-density_periodic_viz.html deleted file mode 100644 index 735de4a4..00000000 --- a/pr2975_payload-node-density_periodic_viz.html +++ /dev/null @@ -1,32 +0,0 @@ - - - -
-
- - - - - \ No newline at end of file diff --git a/pr2975_payload-node-density_pull_viz.html b/pr2975_payload-node-density_pull_viz.html deleted file mode 100644 index b116e5c0..00000000 --- a/pr2975_payload-node-density_pull_viz.html +++ /dev/null @@ -1,32 +0,0 @@ - - - -
-
- - - - - \ No newline at end of file diff --git a/pr2975_table_payload-node-density.txt b/pr2975_table_payload-node-density.txt deleted file mode 100644 index 28918e75..00000000 --- a/pr2975_table_payload-node-density.txt +++ /dev/null @@ -1,9 +0,0 @@ -time uuid ocpVersion podReadyLatency_P99 containersStartedLatency_P99 apiserverCPU_avg ovnCPU_avg etcdCPU_avg -------------------- ------------------------------------ -------------------------------------------------------- --------------------- ------------------------------ ------------------ ------------ ------------- -2026-03-25 17:02:04 4e5aeeb6-d86e-4e12-a510-b45a4bb471a0 4.22.0-0.ci-2026-03-25-144026-test-ci-op-4n14h862-latest 3000 2765 8.697 2.81423 5.68223 -2026-03-30 14:42:15 eae1f6f5-0202-4cb4-82b9-e22200352a6f 4.22.0-0.ci-2026-03-30-123448-test-ci-op-gy736m6s-latest 3000 2302 11.6108 3.21708 5.88442 - -time uuid ocpVersion kubelet_avg buildUrl -------------------- ------------------------------------ -------------------------------------------------------- ------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -2026-03-25 17:02:04 4e5aeeb6-d86e-4e12-a510-b45a4bb471a0 4.22.0-0.ci-2026-03-25-144026-test-ci-op-4n14h862-latest 23.0222 https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift_release/2975/pull-ci-openshift-ovn-kubernetes-master-qe-perfscale-payload-control-plane-6nodes/2036802660954279936 -2026-03-30 14:42:15 eae1f6f5-0202-4cb4-82b9-e22200352a6f 4.22.0-0.ci-2026-03-30-123448-test-ci-op-gy736m6s-latest 24.3319 https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift_release/2975/pull-ci-openshift-ovn-kubernetes-master-qe-perfscale-payload-control-plane-6nodes/2038590107992199168 \ No newline at end of file