├── .coveragerc ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── CSV-cassandra-235115-W2-med-RAW-2024-10-11_22-14-47-bulk-200x20.csv ├── CSV-cassandra-235115-W2-med-RAW-2024-10-11_22-14-47-bulk-200x20.png ├── EXE-Calc-2023-05-06_18-22-19-bulk-1x10-plan-128x4.png ├── EXE-NoSQL-2023-05-04_19-33-30-bulk-1x50-plan-8x2.png ├── PRF-Calc-2023-05-06_18-22-19-bulk-1x10.png ├── PRF-NoSQL_igz_nonprod-2023-04-23_14-41-18-bulk-100x50.png ├── TXT-cassandra-163551-W1-low-RAW-2024-10-11_14-36-07-bulk-200x10.png └── TXT-cassandra-163551-W1-low-RAW-2024-10-11_14-36-07-bulk-200x10.txt ├── cover.bat ├── coverage.svg ├── dependencies.py ├── dev-requirements.txt ├── input ├── perf_gil_impact_percentile.txt ├── perf_test.txt ├── perf_test_random.txt ├── prf_cassandra-W1-low-2024-10-07.txt ├── prf_cassandra-W1-low-percentile-three-lines.txt ├── prf_cassandra-W2-med-percentile-one-line.txt ├── prf_cassandra-without-std.txt ├── prf_cassandra-write-min-2024-08-29.txt └── prf_cassandra_02.txt ├── main.py ├── publish.bat ├── pyproject.toml ├── qgate_graph ├── .gitignore ├── __init__.py ├── circle_queue.py ├── file_marker.py ├── graph_base.py ├── graph_executor.py ├── graph_performance.py ├── graph_performance_csv.py ├── graph_performance_txt.py ├── graph_setup.py ├── percentile_item.py └── version.py ├── requirements.txt └── tests ├── __init__.py ├── test_basic.py ├── test_executor.py ├── test_minmax.py ├── test_performance_csv.py ├── test_performance_txt.py └── test_support.py /.coveragerc: -------------------------------------------------------------------------------- 1 | # .coveragerc to control coverage.py 2 | [run] 3 | source = ./ 4 | parallel = True 5 | concurrency = multiprocessing,thread 6 | 7 | [report] 8 | # Regexes for lines to exclude from consideration 9 | exclude_lines = 10 | # Have to re-enable the standard pragma 11 | pragma: no cover 12 | 13 | # Don't complain about missing debug-only code: 14 | def __repr__ 15 | if self\.debug 16 | 17 | # Don't complain if tests don't hit defensive assertion code: 18 | raise AssertionError 19 | raise NotImplementedError 20 | raise CoverageWarning 21 | 22 | # Don't complain if non-runnable code isn't run: 23 | if 0: 24 | if __name__ == .__main__.: 25 | def __main__\(\): 26 | 27 | omit: 28 | ./tests/* 29 | setup.py 30 | dependencies.py 31 | main.py 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /output/ 2 | /__pycache__/ 3 | /qgate_graph/__pycache__/ 4 | *.pyc 5 | qgate_graph/__pycache__/ 6 | /qgate_graph.egg-info/ 7 | /dist/ 8 | /build/ 9 | /.idea/ 10 | .idea/misc.xml 11 | /.idea/ 12 | /.coverage 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) 2 | [![PyPI version fury.io](https://badge.fury.io/py/qgate-graph.svg)](https://pypi.python.org/pypi/qgate-graph/) 3 | ![coverage](https://github.com/george0st/qgate-graph/blob/main/coverage.svg?raw=true) 4 | ![GitHub commit activity](https://img.shields.io/github/commit-activity/w/george0st/qgate-graph) 5 | ![GitHub release](https://img.shields.io/github/v/release/george0st/qgate-graph) 6 | 7 | # QGate-Graph 8 | 9 | The QGate graph generates graphical outputs based on performance tests (QGate Perf). Key benefits: 10 | - provide graphs about Performance/Throughput and Response time (on typically client side) 11 | - provide graphs about Executors in time 12 | 13 | It is a quick way, how you can identify real performance for your python solution. 14 | 15 | NOTE: These graphs only visualize outputs from performance tests (QGate Perf), it is not replacement of 16 | detail views from Grafana, Prometheus, etc. in detail of CPU, GPU, RAM, I/O etc. on 17 | side of testing system. 18 | 19 | ## Usage 20 | 21 | ```python 22 | from qgate_graph.graph_performance_txt import GraphPerformanceTxt 23 | from qgate_graph.graph_performance_csv import GraphPerformanceCsv 24 | from qgate_graph.graph_performance import GraphPerformance 25 | from qgate_graph.graph_executor import GraphExecutor 26 | import logging 27 | 28 | # setup login level 29 | logging.basicConfig() 30 | logging.getLogger().setLevel(logging.INFO) 31 | 32 | # generate performance/throughput graphs 33 | graph=GraphPerformance() 34 | graph.generate_from_dir() 35 | 36 | # generate executors in time graphs 37 | graph=GraphExecutor() 38 | graph.generate_from_dir() 39 | 40 | # generate performance/throughput graphs in TXT form 41 | graph=GraphPerformanceTxt() 42 | graph.generate_from_dir() 43 | 44 | # generate performance/throughput graphs in CSV form 45 | graph=GraphPerformanceCsv() 46 | graph.generate_from_dir() 47 | ``` 48 | 49 | ## Sample of outputs 50 | #### Performance/Throughput & Response time 51 | ![graph](https://github.com/george0st/qgate-graph/blob/main/assets/PRF-Calc-2023-05-06_18-22-19-bulk-1x10.png?raw=true) 52 | ![graph](https://github.com/george0st/qgate-graph/blob/main/assets/PRF-NoSQL_igz_nonprod-2023-04-23_14-41-18-bulk-100x50.png?raw=true) 53 | 54 | #### Executors in time 55 | ![graph](https://github.com/george0st/qgate-graph/blob/main/assets/EXE-Calc-2023-05-06_18-22-19-bulk-1x10-plan-128x4.png?raw=true) 56 | ![graph](https://github.com/george0st/qgate-graph/blob/main/assets/EXE-NoSQL-2023-05-04_19-33-30-bulk-1x50-plan-8x2.png?raw=true) 57 | 58 | #### Performance/Throughput & Response time in [TXT form](https://github.com/george0st/qgate-graph/blob/main/assets/TXT-cassandra-163551-W1-low-RAW-2024-10-11_14-36-07-bulk-200x10.txt?raw=true) 59 | ![Performance in TXT](https://github.com/george0st/qgate-graph/blob/main/assets/TXT-cassandra-163551-W1-low-RAW-2024-10-11_14-36-07-bulk-200x10.png?raw=true) 60 | 61 | #### Performance/Throughput & Response time in [CSV form](https://github.com/george0st/qgate-graph/blob/main/assets/CSV-cassandra-235115-W2-med-RAW-2024-10-11_22-14-47-bulk-200x20.csv?raw=true) 62 | ![Performance in CSV](https://github.com/george0st/qgate-graph/blob/main/assets/CSV-cassandra-235115-W2-med-RAW-2024-10-11_22-14-47-bulk-200x20.png?raw=true) 63 | -------------------------------------------------------------------------------- /assets/CSV-cassandra-235115-W2-med-RAW-2024-10-11_22-14-47-bulk-200x20.csv: -------------------------------------------------------------------------------- 1 | Executors,Label,Performance 95ph,Performance,Avrg 95ph,Avrg,Std 95ph,Std 2 | 1,executors,12.119769243812948,11.886338485925235,0.08250982175345398,0.08413019713212044,0.008441452052820247,0.012635450146549548 3 | 2,executors,25.10855667659488,24.40453942767166,0.07965412053590139,0.08195196659733939,0.009953163365916416,0.015193689593762934 4 | 4,executors,51.69394688566224,48.83542137218587,0.07737849866343702,0.08190776054771984,0.011154698281816722,0.02502357886036158 5 | 8,executors,93.57600402171546,87.43234817418187,0.08549200282311159,0.09149931537996073,0.02405215435836206,0.03604955123962975 6 | 16,executors,116.55857178915466,108.17245460532513,0.13727004161429457,0.14791196204594909,0.05997522050680289,0.07583073097918652 7 | 32,executors,131.68658163508675,120.20022627144164,0.24300122003830554,0.26622246057787063,0.13762642081171883,0.16945315579382966 8 | 64,executors,145.1638166401926,136.68879195342467,0.4408812160032436,0.4682168821991445,0.20639351015604093,0.2364887076852793 9 | 96,executors,159.59400010518942,151.7396534434021,0.601526372775454,0.6326625758098715,0.24170046730267633,0.2797152225956949 10 | 128,executors,154.47048983100382,148.77606163987178,0.8286372377017548,0.860353464052823,0.26614263852588527,0.30138551323054585 11 | -------------------------------------------------------------------------------- /assets/CSV-cassandra-235115-W2-med-RAW-2024-10-11_22-14-47-bulk-200x20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george0st/qgate-graph/0df35659acbb873bb110f2dd8ea7cd2302007748/assets/CSV-cassandra-235115-W2-med-RAW-2024-10-11_22-14-47-bulk-200x20.png -------------------------------------------------------------------------------- /assets/EXE-Calc-2023-05-06_18-22-19-bulk-1x10-plan-128x4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george0st/qgate-graph/0df35659acbb873bb110f2dd8ea7cd2302007748/assets/EXE-Calc-2023-05-06_18-22-19-bulk-1x10-plan-128x4.png -------------------------------------------------------------------------------- /assets/EXE-NoSQL-2023-05-04_19-33-30-bulk-1x50-plan-8x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george0st/qgate-graph/0df35659acbb873bb110f2dd8ea7cd2302007748/assets/EXE-NoSQL-2023-05-04_19-33-30-bulk-1x50-plan-8x2.png -------------------------------------------------------------------------------- /assets/PRF-Calc-2023-05-06_18-22-19-bulk-1x10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george0st/qgate-graph/0df35659acbb873bb110f2dd8ea7cd2302007748/assets/PRF-Calc-2023-05-06_18-22-19-bulk-1x10.png -------------------------------------------------------------------------------- /assets/PRF-NoSQL_igz_nonprod-2023-04-23_14-41-18-bulk-100x50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george0st/qgate-graph/0df35659acbb873bb110f2dd8ea7cd2302007748/assets/PRF-NoSQL_igz_nonprod-2023-04-23_14-41-18-bulk-100x50.png -------------------------------------------------------------------------------- /assets/TXT-cassandra-163551-W1-low-RAW-2024-10-11_14-36-07-bulk-200x10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george0st/qgate-graph/0df35659acbb873bb110f2dd8ea7cd2302007748/assets/TXT-cassandra-163551-W1-low-RAW-2024-10-11_14-36-07-bulk-200x10.png -------------------------------------------------------------------------------- /assets/TXT-cassandra-163551-W1-low-RAW-2024-10-11_14-36-07-bulk-200x10.txt: -------------------------------------------------------------------------------- 1 | +-----------+------------+-------------------+--------------------+----------------------+----------------------+----------------------+----------------------+ 2 | | Executors | Label | Performance 95ph | Performance | Avrg 95ph | Avrg | Std 95ph | Std | 3 | +-----------+------------+-------------------+--------------------+----------------------+----------------------+----------------------+----------------------+ 4 | | 8 | 1x threads | 417.813479143004 | 369.3477278895531 | 0.019147299930124706 | 0.021659805640911533 | 0.007234194351173806 | 0.015685206332100604 | 5 | | 16 | 1x threads | 553.0232279407262 | 483.3257166102057 | 0.02893187698386315 | 0.03310396995263494 | 0.01010985705629794 | 0.025079983410206945 | 6 | | 32 | 1x threads | 582.3727218657733 | 507.3863618677734 | 0.05494762855217562 | 0.06306830929038512 | 0.019314080961258393 | 0.04372604530533347 | 7 | | 16 | 2x threads | 497.6357232725118 | 436.99013480246316 | 0.032152032604858216 | 0.0366140988680045 | 0.01211965692516811 | 0.026189628292961283 | 8 | | 32 | 2x threads | 528.8024672179596 | 466.4871027709959 | 0.060514089823280603 | 0.06859782362666773 | 0.021975603144957386 | 0.04407117332419274 | 9 | | 64 | 2x threads | 572.3368800764835 | 517.9375647829788 | 0.11182225403934733 | 0.12356701724621318 | 0.04195060868364207 | 0.06832390356957063 | 10 | | 24 | 3x threads | 535.8640263402423 | 466.1869307828533 | 0.04478748118979236 | 0.05148149468647167 | 0.016587257605940733 | 0.03660941804402335 | 11 | | 48 | 3x threads | 577.8045090808254 | 513.8116108342024 | 0.0830730796413456 | 0.09341945372170408 | 0.0323879163064731 | 0.05823847435735166 | 12 | | 96 | 3x threads | 545.8771967498346 | 511.2541788761131 | 0.17586373010557357 | 0.1877735262937825 | 0.066531572645569 | 0.08473679437835895 | 13 | +-----------+------------+-------------------+--------------------+----------------------+----------------------+----------------------+----------------------+ -------------------------------------------------------------------------------- /cover.bat: -------------------------------------------------------------------------------- 1 | rem Setting based on 'https://coverage.readthedocs.io/en/7.3.2/' 2 | 3 | coverage erase 4 | coverage run -m unittest discover 5 | coverage combine 6 | coverage report -m 7 | coverage-badge -f -o coverage.svg 8 | -------------------------------------------------------------------------------- /coverage.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | coverage 17 | coverage 18 | 99% 19 | 99% 20 | 21 | 22 | -------------------------------------------------------------------------------- /dependencies.py: -------------------------------------------------------------------------------- 1 | import os 2 | import typing 3 | 4 | def base_requirements() -> typing.List[str]: 5 | return list(_load_dependencies_from_file("requirements.txt")) 6 | 7 | def dev_requirements() -> typing.List[str]: 8 | return list(_load_dependencies_from_file("dev-requirements.txt")) 9 | 10 | def extra_requirements() -> typing.Dict[str, typing.List[str]]: 11 | extras_require = { 12 | } 13 | return extras_require 14 | 15 | def _is_ignored(line: str) -> bool: 16 | line = line.strip() 17 | return (not line) or (line[0] == "#") or line.startswith("git+") 18 | 19 | def _extract_package_from_egg(line: str) -> str: 20 | if "#egg=" in line: 21 | _, package = line.split("#egg=") 22 | return f"{package} @ {line}" 23 | return line 24 | 25 | def _load_dependencies_from_file(path: str, parent_dir: str = None) -> typing.List[str]: 26 | parent_dir = parent_dir or os.path.dirname(__file__) 27 | with open(f"{parent_dir}/{path}") as fp: 28 | return [ 29 | _extract_package_from_egg(line.strip()) 30 | for line in fp 31 | if not _is_ignored(line) 32 | ] 33 | 34 | def _get_extra_dependencies( 35 | include: typing.List[str] = None, 36 | exclude: typing.List[str] = None, 37 | base_deps: typing.List[str] = None, 38 | extras_require: typing.Dict[str, typing.List[str]] = None, 39 | ) -> typing.List[str]: 40 | include = include or [] 41 | exclude = exclude or [] 42 | base_deps = base_deps or [] 43 | extras_require = extras_require or {} 44 | extra_deps = set(base_deps) 45 | for extra_key, requirement_list in extras_require.items(): 46 | if extra_key not in exclude and (not include or extra_key in include): 47 | extra_deps.update(requirement_list) 48 | return list(sorted(extra_deps)) 49 | -------------------------------------------------------------------------------- /dev-requirements.txt: -------------------------------------------------------------------------------- 1 | click~=8.1 2 | 3 | matplotlib>=3.5.0,<=3.9.2 4 | 5 | # numpy higher version need python>=3.10 (not 3.9) 6 | numpy>=1.24.3,<=2.1.3 7 | 8 | prettytable==3.11.0 9 | 10 | coverage>=7 11 | coverage-badge>=1 12 | 13 | -------------------------------------------------------------------------------- /input/perf_gil_impact_percentile.txt: -------------------------------------------------------------------------------- 1 | ############### 2024-10-18 06:26:48.103622 ############### 2 | {"type":"headr","label":"GIL_impact","bulk":[1,10],"duration":1,"percentile":0.9,"cpu":12,"mem":"15.2 GB","mem_free":"2.9 GB","host":"HCI-L3204/172.23.112.1","now":"2024-10-18 06:26:48.103622"} 3 | {"type":"detail","processid":28796,"calls_90":73886,"avrg_90":9.28218238879005e-06,"min_90":7.2999391704797745e-06,"max_90":1.2199976481497288e-05,"st-dev_90":1.5504113713186287e-06,"total_90":0.6858233279781416,"calls":82095,"avrg":9.969992579464478e-06,"min":7.2999391704797745e-06,"max":0.001089800032787025,"st-dev":9.926936153337876e-06,"total":0.8184865408111364,"initexec":"2024-10-18 06:26:49.437703","startexec":"2024-10-18 06:26:49.437703","endexec":"2024-10-18 06:26:50.447639"} 4 | {"type":"detail","processid":13296,"calls_90":71775,"avrg_90":9.436781729987713e-06,"min_90":7.2999391704797745e-06,"max_90":1.2400094419717789e-05,"st-dev_90":1.631204344467602e-06,"total_90":0.6773250086698681,"calls":79750,"avrg":1.022757179918334e-05,"min":7.2999391704797745e-06,"max":0.003838100004941225,"st-dev":1.6809570810073316e-05,"total":0.8156488509848714,"initexec":"2024-10-18 06:26:49.431964","startexec":"2024-10-18 06:26:49.431964","endexec":"2024-10-18 06:26:50.437636"} 5 | {"type":"detail","processid":34408,"calls_90":76123,"avrg_90":8.93041791613276e-06,"min_90":7.0999376475811005e-06,"max_90":1.2199976481497288e-05,"st-dev_90":1.4444318449307255e-06,"total_90":0.6798102030297741,"calls":84581,"avrg":9.719212596751311e-06,"min":7.0999376475811005e-06,"max":0.0024772000033408403,"st-dev":1.5354614572105147e-05,"total":0.8220607206458226,"initexec":"2024-10-18 06:26:49.479421","startexec":"2024-10-18 06:26:49.479421","endexec":"2024-10-18 06:26:50.485329"} 6 | {"type":"detail","processid":7456,"calls_90":75814,"avrg_90":9.12450595571667e-06,"min_90":7.2999391704797745e-06,"max_90":1.7399899661540985e-05,"st-dev_90":1.5475463275655218e-06,"total_90":0.6917652945267037,"calls":84237,"avrg":9.788886485911994e-06,"min":7.2999391704797745e-06,"max":0.0009055000264197588,"st-dev":8.440684877270826e-06,"total":0.8245864309137687,"initexec":"2024-10-18 06:26:49.451719","startexec":"2024-10-18 06:26:49.451719","endexec":"2024-10-18 06:26:50.457772"} 7 | {"type":"core","plan_executors":4,"plan_executors_detail":[4,1],"real_executors":4,"group":"","total_calls_90":297598,"total_call_per_sec_raw_90":435091.3344838062,"total_call_per_sec_90":435091.3344838062,"avrg_time_90":9.193471997656798e-06,"std_deviation_90":1.5433984720706196e-06,"min_90":7.0999376475811005e-06,"max_90":1.7399899661540985e-05,"total_calls":330663,"total_call_per_sec_raw":402965.1844400049,"total_call_per_sec":402965.1844400049,"avrg_time":9.926415865327781e-06,"std_deviation":1.2632951603196792e-05,"min":7.0999376475811005e-06,"max":0.003838100004941225,"endexec":"2024-10-18 06:26:50.581013"} 8 | ############### State: OK, Duration: 2 sec (2.5 seconds) ############### 9 | ############### 2024-10-18 06:26:50.697075 ############### 10 | {"type":"headr","label":"GIL_impact","bulk":[1,10],"duration":1,"percentile":0.95,"cpu":12,"mem":"15.2 GB","mem_free":"2.9 GB","host":"HCI-L3204/172.23.112.1","now":"2024-10-18 06:26:50.697075"} 11 | {"type":"detail","processid":16552,"calls_95":15883,"avrg_95":4.9436094733893865e-05,"min_95":9.09995287656784e-06,"max_95":0.00011739996261894703,"st-dev_95":2.5031917075088525e-05,"total_95":0.7851934926584363,"calls":16718,"avrg":5.430893610889042e-05,"min":9.09995287656784e-06,"max":0.00046769995242357254,"st-dev":3.352971385795046e-05,"total":0.90793679386843,"initexec":"2024-10-18 06:26:51.958925","startexec":"2024-10-18 06:26:51.960001","endexec":"2024-10-18 06:26:52.965246"} 12 | {"type":"detail","processid":16552,"calls_95":15921,"avrg_95":4.935850125541116e-05,"min_95":8.800067007541656e-06,"max_95":0.00011439993977546692,"st-dev_95":2.4849540379122412e-05,"total_95":0.785836698487401,"calls":16758,"avrg":5.426288325267753e-05,"min":8.800067007541656e-06,"max":0.0013072999427095056,"st-dev":3.579075964852232e-05,"total":0.9093373975483701,"initexec":"2024-10-18 06:26:51.960518","startexec":"2024-10-18 06:26:51.960518","endexec":"2024-10-18 06:26:52.966788"} 13 | {"type":"detail","processid":32284,"calls_95":15713,"avrg_95":5.0139558757413794e-05,"min_95":8.599949069321156e-06,"max_95":0.00011770008131861687,"st-dev_95":2.4470565904627166e-05,"total_95":0.7878428867552429,"calls":16540,"avrg":5.51116375402945e-05,"min":8.599949069321156e-06,"max":0.0012700000079348683,"st-dev":3.551343731849067e-05,"total":0.911546484916471,"initexec":"2024-10-18 06:26:51.984188","startexec":"2024-10-18 06:26:51.984188","endexec":"2024-10-18 06:26:52.991112"} 14 | {"type":"detail","processid":32284,"calls_95":15834,"avrg_95":4.9727327183046145e-05,"min_95":8.79995059221983e-06,"max_95":0.00011709996033459902,"st-dev_95":2.4524557053828552e-05,"total_95":0.7873824986163527,"calls":16667,"avrg":5.466496657001015e-05,"min":8.79995059221983e-06,"max":0.0006014000391587615,"st-dev":3.3822171029970184e-05,"total":0.9111009978223592,"initexec":"2024-10-18 06:26:51.985187","startexec":"2024-10-18 06:26:51.985187","endexec":"2024-10-18 06:26:52.990800"} 15 | {"type":"detail","processid":7076,"calls_95":15760,"avrg_95":4.9791091334767316e-05,"min_95":8.499948307871819e-06,"max_95":0.00011729996185749769,"st-dev_95":2.4512645183528515e-05,"total_95":0.7847075994359329,"calls":16589,"avrg":5.476363843263221e-05,"min":8.499948307871819e-06,"max":0.0014908999437466264,"st-dev":3.559626501137762e-05,"total":0.9084739979589358,"initexec":"2024-10-18 06:26:52.003182","startexec":"2024-10-18 06:26:52.003182","endexec":"2024-10-18 06:26:53.007681"} 16 | {"type":"detail","processid":7076,"calls_95":15591,"avrg_95":5.045349848692095e-05,"min_95":9.599956683814526e-06,"max_95":0.0001218999968841672,"st-dev_95":2.4906209824027573e-05,"total_95":0.7866204949095845,"calls":16411,"avrg":5.5402632109581585e-05,"min":9.599956683814526e-06,"max":0.000597700010985136,"st-dev":3.420816970059563e-05,"total":0.9092125955503434,"initexec":"2024-10-18 06:26:52.004179","startexec":"2024-10-18 06:26:52.004179","endexec":"2024-10-18 06:26:53.007487"} 17 | {"type":"detail","processid":29336,"calls_95":15657,"avrg_95":4.9893970190769694e-05,"min_95":9.299954399466515e-06,"max_95":0.00011869997251778841,"st-dev_95":2.539127489379609e-05,"total_95":0.7811898912768811,"calls":16481,"avrg":5.488740935632118e-05,"min":9.299954399466515e-06,"max":0.0012237000046297908,"st-dev":3.5838392491381726e-05,"total":0.9045993936015293,"initexec":"2024-10-18 06:26:52.038375","startexec":"2024-10-18 06:26:52.038375","endexec":"2024-10-18 06:26:53.038817"} 18 | {"type":"detail","processid":29336,"calls_95":15991,"avrg_95":4.870400903941591e-05,"min_95":8.999952115118504e-06,"max_95":0.00011619995348155499,"st-dev_95":2.4618625272080484e-05,"total_95":0.7788258085492998,"calls":16832,"avrg":5.38818504976816e-05,"min":8.999952115118504e-06,"max":0.0013601999962702394,"st-dev":3.795932293362317e-05,"total":0.9069393075769767,"initexec":"2024-10-18 06:26:52.039377","startexec":"2024-10-18 06:26:52.039377","endexec":"2024-10-18 06:26:53.041180"} 19 | {"type":"core","plan_executors":8,"plan_executors_detail":[4,2],"real_executors":8,"group":"","total_calls_95":126350,"total_call_per_sec_raw_95":161004.64848584958,"total_call_per_sec_95":161004.64848584958,"avrg_time_95":4.9688006372704864e-05,"std_deviation_95":2.4788166948262412e-05,"min_95":8.499948307871819e-06,"max_95":0.0001218999968841672,"total_calls":132996,"total_call_per_sec_raw":146357.98874821325,"total_call_per_sec":146357.98874821325,"avrg_time":5.466049423351115e-05,"std_deviation":3.528227899898897e-05,"min":8.499948307871819e-06,"max":0.0014908999437466264,"endexec":"2024-10-18 06:26:53.142234"} 20 | ############### State: OK, Duration: 2 sec (2.5 seconds) ############### 21 | -------------------------------------------------------------------------------- /input/perf_test.txt: -------------------------------------------------------------------------------- 1 | ############### 2023-10-15 15:09:20.638004 ############### 2 | {"type": "headr", "label": "test_aus_ger", "bulk": [10, 10], "cpu": 12, "mem": "15.2 GB", "mem_free": "5.5 GB", "host": "HCI-L3204/192.168.0.150", "now": "2023-10-15 15:09:20.638004"} 3 | {"type": "detail", "processid": 22584, "calls": 3, "avrg": 1.5525914827982585, "min": 1.5468697547912598, "max": 1.5577421188354492, "st-dev": 0.004456955949661175, "total": 4.657774448394775, "initexec": "2023-10-15 15:09:25.108762", "startexec": "2023-10-15 15:09:25.108762", "endexec": "2023-10-15 15:09:29.766728"} 4 | {"type": "detail", "processid": 22584, "calls": 3, "avrg": 1.5523206392923992, "min": 1.5472447872161865, "max": 1.5567386150360107, "st-dev": 0.003903655775454965, "total": 4.656961917877197, "initexec": "2023-10-15 15:09:25.109766", "startexec": "2023-10-15 15:09:25.109766", "endexec": "2023-10-15 15:09:29.766728"} 5 | {"type": "core", "plan_executors": 2, "plan_executors_detail": [1, 2], "real_executors": 2, "group": "Austria perf", "total_calls": 6, "total_call_per_sec": 12.882812275236457, "avrg_time": 1.5524560610453289, "std_deviation": 0.00418030586255807, "endexec": "2023-10-15 15:09:29.995688"} 6 | {"type": "detail", "processid": 16996, "calls": 3, "avrg": 1.5441840489705403, "min": 1.5338585376739502, "max": 1.555255651473999, "st-dev": 0.008751251674657167, "total": 4.632552146911621, "initexec": "2023-10-15 15:09:34.116625", "startexec": "2023-10-15 15:09:34.117641", "endexec": "2023-10-15 15:09:38.750193"} 7 | {"type": "detail", "processid": 16996, "calls": 3, "avrg": 1.5438524881998699, "min": 1.5328688621520996, "max": 1.5549719333648682, "st-dev": 0.00902405209735379, "total": 4.631557464599609, "initexec": "2023-10-15 15:09:34.118630", "startexec": "2023-10-15 15:09:34.118630", "endexec": "2023-10-15 15:09:38.750347"} 8 | {"type": "detail", "processid": 29944, "calls": 3, "avrg": 1.550087292989095, "min": 1.5439579486846924, "max": 1.5554416179656982, "st-dev": 0.004720109903927106, "total": 4.650261878967285, "initexec": "2023-10-15 15:09:34.209362", "startexec": "2023-10-15 15:09:34.209362", "endexec": "2023-10-15 15:09:38.859785"} 9 | {"type": "detail", "processid": 29944, "calls": 3, "avrg": 1.5443461736043294, "min": 1.5340380668640137, "max": 1.5546238422393799, "st-dev": 0.008404135165101665, "total": 4.633038520812988, "initexec": "2023-10-15 15:09:34.210493", "startexec": "2023-10-15 15:09:34.210493", "endexec": "2023-10-15 15:09:38.843697"} 10 | {"type": "core", "plan_executors": 4, "plan_executors_detail": [2, 2], "real_executors": 4, "group": "Austria perf", "total_calls": 12, "total_call_per_sec": 25.8796241474028, "avrg_time": 1.5456175009409585, "std_deviation": 0.007724887210259932, "endexec": "2023-10-15 15:09:39.049110"} 11 | {"type": "detail", "processid": 4540, "calls": 3, "avrg": 1.5482202370961506, "min": 1.544433832168579, "max": 1.5518999099731445, "st-dev": 0.003048947713985023, "total": 4.644660711288452, "initexec": "2023-10-15 15:09:44.112204", "startexec": "2023-10-15 15:09:44.112204", "endexec": "2023-10-15 15:09:48.756954"} 12 | {"type": "detail", "processid": 4540, "calls": 3, "avrg": 1.5478750069936116, "min": 1.544522762298584, "max": 1.5517666339874268, "st-dev": 0.0029817913194687285, "total": 4.643625020980835, "initexec": "2023-10-15 15:09:44.113196", "startexec": "2023-10-15 15:09:44.113196", "endexec": "2023-10-15 15:09:48.756821"} 13 | {"type": "detail", "processid": 21904, "calls": 3, "avrg": 1.545782168706258, "min": 1.5412583351135254, "max": 1.5508184432983398, "st-dev": 0.003919682296623854, "total": 4.637346506118774, "initexec": "2023-10-15 15:09:44.165955", "startexec": "2023-10-15 15:09:44.165955", "endexec": "2023-10-15 15:09:48.803492"} 14 | {"type": "detail", "processid": 21904, "calls": 3, "avrg": 1.5502629280090332, "min": 1.5452373027801514, "max": 1.5546090602874756, "st-dev": 0.0038560552119400165, "total": 4.6507887840271, "initexec": "2023-10-15 15:09:44.167947", "startexec": "2023-10-15 15:09:44.167947", "endexec": "2023-10-15 15:09:48.818736"} 15 | {"type": "detail", "processid": 32716, "calls": 3, "avrg": 1.5484203497568767, "min": 1.546208381652832, "max": 1.5506925582885742, "st-dev": 0.0018311529531921987, "total": 4.64526104927063, "initexec": "2023-10-15 15:09:44.267105", "startexec": "2023-10-15 15:09:44.267105", "endexec": "2023-10-15 15:09:48.912366"} 16 | {"type": "detail", "processid": 32716, "calls": 3, "avrg": 1.548022747039795, "min": 1.546208381652832, "max": 1.5506925582885742, "st-dev": 0.0019280042776591794, "total": 4.644068241119385, "initexec": "2023-10-15 15:09:44.268111", "startexec": "2023-10-15 15:09:44.268111", "endexec": "2023-10-15 15:09:48.912366"} 17 | {"type": "detail", "processid": 16976, "calls": 3, "avrg": 1.5470701853434246, "min": 1.5445315837860107, "max": 1.5514800548553467, "st-dev": 0.003130127299703863, "total": 4.641210556030273, "initexec": "2023-10-15 15:09:44.394912", "startexec": "2023-10-15 15:09:44.394912", "endexec": "2023-10-15 15:09:49.036123"} 18 | {"type": "detail", "processid": 16976, "calls": 3, "avrg": 1.546739101409912, "min": 1.544205665588379, "max": 1.5514800548553467, "st-dev": 0.00335499978606262, "total": 4.640217304229736, "initexec": "2023-10-15 15:09:44.395905", "startexec": "2023-10-15 15:09:44.395905", "endexec": "2023-10-15 15:09:49.036123"} 19 | {"type": "core", "plan_executors": 8, "plan_executors_detail": [4, 2], "real_executors": 8, "group": "Austria perf", "total_calls": 24, "total_call_per_sec": 51.68629474505174, "avrg_time": 1.5477990905443828, "std_deviation": 0.0030063451073294354, "endexec": "2023-10-15 15:09:49.170053"} 20 | {"type": "detail", "processid": 18172, "calls": 3, "avrg": 1.5506466229756672, "min": 1.538569450378418, "max": 1.5576608180999756, "st-dev": 0.00857692198241168, "total": 4.651939868927002, "initexec": "2023-10-15 15:09:53.504571", "startexec": "2023-10-15 15:09:53.504571", "endexec": "2023-10-15 15:09:58.156565"} 21 | {"type": "detail", "processid": 18172, "calls": 3, "avrg": 1.5550049940745037, "min": 1.5518028736114502, "max": 1.5578553676605225, "st-dev": 0.002483406994787777, "total": 4.665014982223511, "initexec": "2023-10-15 15:09:53.506567", "startexec": "2023-10-15 15:09:53.506567", "endexec": "2023-10-15 15:09:58.171694"} 22 | {"type": "detail", "processid": 18172, "calls": 3, "avrg": 1.5546894073486328, "min": 1.5508043766021729, "max": 1.558032751083374, "st-dev": 0.002975726020555731, "total": 4.664068222045898, "initexec": "2023-10-15 15:09:53.507566", "startexec": "2023-10-15 15:09:53.507566", "endexec": "2023-10-15 15:09:58.171759"} 23 | {"type": "detail", "processid": 18172, "calls": 3, "avrg": 1.5543968677520752, "min": 1.5498011112213135, "max": 1.558032751083374, "st-dev": 0.0034284098475290637, "total": 4.663190603256226, "initexec": "2023-10-15 15:09:53.508569", "startexec": "2023-10-15 15:09:53.508569", "endexec": "2023-10-15 15:09:58.171759"} 24 | {"type": "core", "plan_executors": 4, "plan_executors_detail": [1, 4], "real_executors": 4, "group": "Germany perf", "total_calls": 12, "total_call_per_sec": 25.74525310264132, "avrg_time": 1.5536844730377197, "std_deviation": 0.004366116211321063, "endexec": "2023-10-15 15:09:58.374092"} 25 | {"type": "detail", "processid": 7252, "calls": 3, "avrg": 1.5601996580759685, "min": 1.557936429977417, "max": 1.5638923645019531, "st-dev": 0.0026332293521569316, "total": 4.680598974227905, "initexec": "2023-10-15 15:10:02.569011", "startexec": "2023-10-15 15:10:02.569011", "endexec": "2023-10-15 15:10:07.249610"} 26 | {"type": "detail", "processid": 7252, "calls": 3, "avrg": 1.5595282713572185, "min": 1.55775785446167, "max": 1.5628905296325684, "st-dev": 0.0023785931186768414, "total": 4.678584814071655, "initexec": "2023-10-15 15:10:02.570023", "startexec": "2023-10-15 15:10:02.570023", "endexec": "2023-10-15 15:10:07.248608"} 27 | {"type": "detail", "processid": 7252, "calls": 3, "avrg": 1.5595192909240723, "min": 1.5567576885223389, "max": 1.5638923645019531, "st-dev": 0.0031276753718149555, "total": 4.678557872772217, "initexec": "2023-10-15 15:10:02.571023", "startexec": "2023-10-15 15:10:02.571023", "endexec": "2023-10-15 15:10:07.249610"} 28 | {"type": "detail", "processid": 7252, "calls": 3, "avrg": 1.5588347911834717, "min": 1.555757999420166, "max": 1.563002347946167, "st-dev": 0.00305641103305421, "total": 4.676504373550415, "initexec": "2023-10-15 15:10:02.572023", "startexec": "2023-10-15 15:10:02.572023", "endexec": "2023-10-15 15:10:07.248608"} 29 | {"type": "detail", "processid": 21788, "calls": 3, "avrg": 1.556294282277425, "min": 1.5476429462432861, "max": 1.5626850128173828, "st-dev": 0.00634553357909491, "total": 4.668882846832275, "initexec": "2023-10-15 15:10:02.610662", "startexec": "2023-10-15 15:10:02.610662", "endexec": "2023-10-15 15:10:07.279608"} 30 | {"type": "detail", "processid": 21788, "calls": 3, "avrg": 1.5559802055358887, "min": 1.5468251705169678, "max": 1.5626850128173828, "st-dev": 0.0067025548075566, "total": 4.667940616607666, "initexec": "2023-10-15 15:10:02.611668", "startexec": "2023-10-15 15:10:02.611668", "endexec": "2023-10-15 15:10:07.279608"} 31 | {"type": "detail", "processid": 21788, "calls": 3, "avrg": 1.5556289354960124, "min": 1.5457713603973389, "max": 1.5626850128173828, "st-dev": 0.0071835089797716405, "total": 4.666886806488037, "initexec": "2023-10-15 15:10:02.612682", "startexec": "2023-10-15 15:10:02.612682", "endexec": "2023-10-15 15:10:07.279608"} 32 | {"type": "detail", "processid": 21788, "calls": 3, "avrg": 1.5553141434987385, "min": 1.5448269844055176, "max": 1.5626850128173828, "st-dev": 0.007616243219116012, "total": 4.665942430496216, "initexec": "2023-10-15 15:10:02.613666", "startexec": "2023-10-15 15:10:02.613666", "endexec": "2023-10-15 15:10:07.279608"} 33 | {"type": "core", "plan_executors": 8, "plan_executors_detail": [2, 4], "real_executors": 8, "group": "Germany perf", "total_calls": 24, "total_call_per_sec": 51.35900922500767, "avrg_time": 1.5576624472935996, "std_deviation": 0.004880468682655263, "endexec": "2023-10-15 15:10:07.503113"} 34 | {"type": "detail", "processid": 33212, "calls": 3, "avrg": 1.5425766309102376, "min": 1.5305869579315186, "max": 1.5583276748657227, "st-dev": 0.011633221901793497, "total": 4.627729892730713, "initexec": "2023-10-15 15:10:11.988749", "startexec": "2023-10-15 15:10:11.988749", "endexec": "2023-10-15 15:10:16.616479"} 35 | {"type": "detail", "processid": 33212, "calls": 3, "avrg": 1.5421895186106365, "min": 1.5308642387390137, "max": 1.5581421852111816, "st-dev": 0.011606926721829286, "total": 4.626568555831909, "initexec": "2023-10-15 15:10:11.989880", "startexec": "2023-10-15 15:10:11.989880", "endexec": "2023-10-15 15:10:16.616479"} 36 | {"type": "detail", "processid": 33212, "calls": 3, "avrg": 1.5418580373128254, "min": 1.5305869579315186, "max": 1.5586731433868408, "st-dev": 0.012117772824376193, "total": 4.625574111938477, "initexec": "2023-10-15 15:10:11.990905", "startexec": "2023-10-15 15:10:11.990905", "endexec": "2023-10-15 15:10:16.616479"} 37 | {"type": "detail", "processid": 33212, "calls": 3, "avrg": 1.5415249665578206, "min": 1.5308642387390137, "max": 1.5580503940582275, "st-dev": 0.0118481443561604, "total": 4.624574899673462, "initexec": "2023-10-15 15:10:11.990905", "startexec": "2023-10-15 15:10:11.991904", "endexec": "2023-10-15 15:10:16.616479"} 38 | {"type": "detail", "processid": 10152, "calls": 3, "avrg": 1.5389223098754883, "min": 1.527355432510376, "max": 1.5484821796417236, "st-dev": 0.008740935141216832, "total": 4.616766929626465, "initexec": "2023-10-15 15:10:12.316526", "startexec": "2023-10-15 15:10:12.316526", "endexec": "2023-10-15 15:10:16.933375"} 39 | {"type": "detail", "processid": 10152, "calls": 3, "avrg": 1.5385409990946453, "min": 1.527355432510376, "max": 1.5481939315795898, "st-dev": 0.008576031962246747, "total": 4.6156229972839355, "initexec": "2023-10-15 15:10:12.317674", "startexec": "2023-10-15 15:10:12.317674", "endexec": "2023-10-15 15:10:16.933375"} 40 | {"type": "detail", "processid": 10152, "calls": 3, "avrg": 1.5378937721252441, "min": 1.527355432510376, "max": 1.5481939315795898, "st-dev": 0.00850894855259476, "total": 4.613681316375732, "initexec": "2023-10-15 15:10:12.319694", "startexec": "2023-10-15 15:10:12.319694", "endexec": "2023-10-15 15:10:16.934385"} 41 | {"type": "detail", "processid": 10152, "calls": 3, "avrg": 1.537383794784546, "min": 1.5271062850952148, "max": 1.548271894454956, "st-dev": 0.008651603704363596, "total": 4.612151384353638, "initexec": "2023-10-15 15:10:12.320682", "startexec": "2023-10-15 15:10:12.320682", "endexec": "2023-10-15 15:10:16.933126"} 42 | {"type": "detail", "processid": 34484, "calls": 3, "avrg": 1.5378076235453289, "min": 1.5270662307739258, "max": 1.5476195812225342, "st-dev": 0.008416568614408643, "total": 4.613422870635986, "initexec": "2023-10-15 15:10:12.396897", "startexec": "2023-10-15 15:10:12.396897", "endexec": "2023-10-15 15:10:17.010320"} 43 | {"type": "detail", "processid": 34484, "calls": 3, "avrg": 1.5375657081604004, "min": 1.527343988418579, "max": 1.5476195812225342, "st-dev": 0.008278326935190884, "total": 4.612697124481201, "initexec": "2023-10-15 15:10:12.397900", "startexec": "2023-10-15 15:10:12.397900", "endexec": "2023-10-15 15:10:17.010597"} 44 | {"type": "detail", "processid": 34484, "calls": 3, "avrg": 1.5372328758239746, "min": 1.527343988418579, "max": 1.5476195812225342, "st-dev": 0.008284957571956828, "total": 4.611698627471924, "initexec": "2023-10-15 15:10:12.398899", "startexec": "2023-10-15 15:10:12.398899", "endexec": "2023-10-15 15:10:17.010597"} 45 | {"type": "detail", "processid": 34484, "calls": 3, "avrg": 1.5369010766347249, "min": 1.527343988418579, "max": 1.5476195812225342, "st-dev": 0.00831811604788905, "total": 4.610703229904175, "initexec": "2023-10-15 15:10:12.399894", "startexec": "2023-10-15 15:10:12.399894", "endexec": "2023-10-15 15:10:17.010597"} 46 | {"type": "detail", "processid": 34132, "calls": 3, "avrg": 1.539608637491862, "min": 1.5271878242492676, "max": 1.5474002361297607, "st-dev": 0.008877222516039633, "total": 4.618825912475586, "initexec": "2023-10-15 15:10:12.438071", "startexec": "2023-10-15 15:10:12.438071", "endexec": "2023-10-15 15:10:17.056897"} 47 | {"type": "detail", "processid": 34132, "calls": 3, "avrg": 1.5392696062723796, "min": 1.5271878242492676, "max": 1.547658920288086, "st-dev": 0.008755652773948087, "total": 4.617808818817139, "initexec": "2023-10-15 15:10:12.439089", "startexec": "2023-10-15 15:10:12.439089", "endexec": "2023-10-15 15:10:17.056897"} 48 | {"type": "detail", "processid": 34132, "calls": 3, "avrg": 1.5389410654703777, "min": 1.5271878242492676, "max": 1.5474002361297607, "st-dev": 0.008574130632544337, "total": 4.616823196411133, "initexec": "2023-10-15 15:10:12.440074", "startexec": "2023-10-15 15:10:12.440074", "endexec": "2023-10-15 15:10:17.056897"} 49 | {"type": "detail", "processid": 34132, "calls": 3, "avrg": 1.5386061668395996, "min": 1.5271878242492676, "max": 1.5474002361297607, "st-dev": 0.00845775802728547, "total": 4.615818500518799, "initexec": "2023-10-15 15:10:12.441079", "startexec": "2023-10-15 15:10:12.441079", "endexec": "2023-10-15 15:10:17.056897"} 50 | {"type": "core", "plan_executors": 16, "plan_executors_detail": [4, 4], "real_executors": 16, "group": "Germany perf", "total_calls": 48, "total_call_per_sec": 103.95169615994652, "avrg_time": 1.5391764243443808, "std_deviation": 0.009352894892740266, "endexec": "2023-10-15 15:10:17.224968"} 51 | ############### State: OK, Duration: 56.6 seconds ############### 52 | 53 | ############### 2023-10-15 15:10:17.481709 ############### 54 | {"type": "headr", "label": "test_aus_ger", "bulk": [100, 10], "cpu": 12, "mem": "15.2 GB", "mem_free": "5.6 GB", "host": "HCI-L3204/192.168.0.150", "now": "2023-10-15 15:10:17.481709"} 55 | {"type": "detail", "processid": 26184, "calls": 1, "avrg": 15.54035210609436, "min": 15.54035210609436, "max": 15.54035210609436, "st-dev": 0.0, "total": 15.54035210609436, "initexec": "2023-10-15 15:10:21.347494", "startexec": "2023-10-15 15:10:21.347494", "endexec": "2023-10-15 15:10:36.887846"} 56 | {"type": "detail", "processid": 26184, "calls": 1, "avrg": 15.539600610733032, "min": 15.539600610733032, "max": 15.539600610733032, "st-dev": 0.0, "total": 15.539600610733032, "initexec": "2023-10-15 15:10:21.348510", "startexec": "2023-10-15 15:10:21.348510", "endexec": "2023-10-15 15:10:36.888111"} 57 | {"type": "core", "plan_executors": 2, "plan_executors_detail": [1, 2], "real_executors": 2, "group": "Austria perf", "total_calls": 2, "total_call_per_sec": 12.870032449677149, "avrg_time": 15.539976358413696, "std_deviation": 0.0, "endexec": "2023-10-15 15:10:37.113937"} 58 | {"type": "detail", "processid": 29192, "calls": 1, "avrg": 15.531012058258057, "min": 15.531012058258057, "max": 15.531012058258057, "st-dev": 0.0, "total": 15.531012058258057, "initexec": "2023-10-15 15:10:41.349915", "startexec": "2023-10-15 15:10:41.349915", "endexec": "2023-10-15 15:10:56.880927"} 59 | {"type": "detail", "processid": 29192, "calls": 1, "avrg": 15.74760627746582, "min": 15.74760627746582, "max": 15.74760627746582, "st-dev": 0.0, "total": 15.74760627746582, "initexec": "2023-10-15 15:10:41.350800", "startexec": "2023-10-15 15:10:41.350800", "endexec": "2023-10-15 15:10:57.098407"} 60 | {"type": "detail", "processid": 13308, "calls": 1, "avrg": 15.509647369384766, "min": 15.509647369384766, "max": 15.509647369384766, "st-dev": 0.0, "total": 15.509647369384766, "initexec": "2023-10-15 15:10:41.387280", "startexec": "2023-10-15 15:10:41.387280", "endexec": "2023-10-15 15:10:56.896927"} 61 | {"type": "detail", "processid": 13308, "calls": 1, "avrg": 15.539268493652344, "min": 15.539268493652344, "max": 15.539268493652344, "st-dev": 0.0, "total": 15.539268493652344, "initexec": "2023-10-15 15:10:41.388460", "startexec": "2023-10-15 15:10:41.388460", "endexec": "2023-10-15 15:10:56.927729"} 62 | {"type": "core", "plan_executors": 4, "plan_executors_detail": [2, 2], "real_executors": 4, "group": "Austria perf", "total_calls": 4, "total_call_per_sec": 25.67083746482957, "avrg_time": 15.581883549690247, "std_deviation": 0.0, "endexec": "2023-10-15 15:10:57.278553"} 63 | {"type": "detail", "processid": 18188, "calls": 1, "avrg": 15.521625995635986, "min": 15.521625995635986, "max": 15.521625995635986, "st-dev": 0.0, "total": 15.521625995635986, "initexec": "2023-10-15 15:11:01.925355", "startexec": "2023-10-15 15:11:01.925355", "endexec": "2023-10-15 15:11:17.446981"} 64 | {"type": "detail", "processid": 18188, "calls": 1, "avrg": 15.520511627197266, "min": 15.520511627197266, "max": 15.520511627197266, "st-dev": 0.0, "total": 15.520511627197266, "initexec": "2023-10-15 15:11:01.926469", "startexec": "2023-10-15 15:11:01.926469", "endexec": "2023-10-15 15:11:17.446981"} 65 | {"type": "detail", "processid": 9416, "calls": 1, "avrg": 15.51462721824646, "min": 15.51462721824646, "max": 15.51462721824646, "st-dev": 0.0, "total": 15.51462721824646, "initexec": "2023-10-15 15:11:02.025836", "startexec": "2023-10-15 15:11:02.025836", "endexec": "2023-10-15 15:11:17.540463"} 66 | {"type": "detail", "processid": 9416, "calls": 1, "avrg": 15.513601541519165, "min": 15.513601541519165, "max": 15.513601541519165, "st-dev": 0.0, "total": 15.513601541519165, "initexec": "2023-10-15 15:11:02.026821", "startexec": "2023-10-15 15:11:02.026821", "endexec": "2023-10-15 15:11:17.540463"} 67 | {"type": "detail", "processid": 6592, "calls": 1, "avrg": 15.51905345916748, "min": 15.51905345916748, "max": 15.51905345916748, "st-dev": 0.0, "total": 15.51905345916748, "initexec": "2023-10-15 15:11:02.222985", "startexec": "2023-10-15 15:11:02.222985", "endexec": "2023-10-15 15:11:17.742039"} 68 | {"type": "detail", "processid": 6592, "calls": 1, "avrg": 15.518070697784424, "min": 15.518070697784424, "max": 15.518070697784424, "st-dev": 0.0, "total": 15.518070697784424, "initexec": "2023-10-15 15:11:02.223968", "startexec": "2023-10-15 15:11:02.223968", "endexec": "2023-10-15 15:11:17.742039"} 69 | {"type": "detail", "processid": 21020, "calls": 1, "avrg": 15.527265071868896, "min": 15.527265071868896, "max": 15.527265071868896, "st-dev": 0.0, "total": 15.527265071868896, "initexec": "2023-10-15 15:11:02.308668", "startexec": "2023-10-15 15:11:02.308668", "endexec": "2023-10-15 15:11:17.835933"} 70 | {"type": "detail", "processid": 21020, "calls": 1, "avrg": 15.525723934173584, "min": 15.525723934173584, "max": 15.525723934173584, "st-dev": 0.0, "total": 15.525723934173584, "initexec": "2023-10-15 15:11:02.310209", "startexec": "2023-10-15 15:11:02.310209", "endexec": "2023-10-15 15:11:17.835933"} 71 | {"type": "core", "plan_executors": 8, "plan_executors_detail": [4, 2], "real_executors": 8, "group": "Austria perf", "total_calls": 8, "total_call_per_sec": 51.546192664710524, "avrg_time": 15.520059943199158, "std_deviation": 0.0, "endexec": "2023-10-15 15:11:18.103698"} 72 | {"type": "detail", "processid": 30796, "calls": 1, "avrg": 15.53689694404602, "min": 15.53689694404602, "max": 15.53689694404602, "st-dev": 0.0, "total": 15.53689694404602, "initexec": "2023-10-15 15:11:22.625093", "startexec": "2023-10-15 15:11:22.625093", "endexec": "2023-10-15 15:11:38.161990"} 73 | {"type": "detail", "processid": 30796, "calls": 1, "avrg": 15.535881519317627, "min": 15.535881519317627, "max": 15.535881519317627, "st-dev": 0.0, "total": 15.535881519317627, "initexec": "2023-10-15 15:11:22.626109", "startexec": "2023-10-15 15:11:22.626109", "endexec": "2023-10-15 15:11:38.161990"} 74 | {"type": "detail", "processid": 30796, "calls": 1, "avrg": 15.534881353378296, "min": 15.534881353378296, "max": 15.534881353378296, "st-dev": 0.0, "total": 15.534881353378296, "initexec": "2023-10-15 15:11:22.627109", "startexec": "2023-10-15 15:11:22.627109", "endexec": "2023-10-15 15:11:38.161990"} 75 | {"type": "detail", "processid": 30796, "calls": 1, "avrg": 15.533845663070679, "min": 15.533845663070679, "max": 15.533845663070679, "st-dev": 0.0, "total": 15.533845663070679, "initexec": "2023-10-15 15:11:22.628094", "startexec": "2023-10-15 15:11:22.628094", "endexec": "2023-10-15 15:11:38.161990"} 76 | {"type": "core", "plan_executors": 4, "plan_executors_detail": [1, 4], "real_executors": 4, "group": "Germany perf", "total_calls": 4, "total_call_per_sec": 25.747686472124148, "avrg_time": 15.535376369953156, "std_deviation": 0.0, "endexec": "2023-10-15 15:11:38.384152"} 77 | {"type": "detail", "processid": 25856, "calls": 1, "avrg": 15.458805561065674, "min": 15.458805561065674, "max": 15.458805561065674, "st-dev": 0.0, "total": 15.458805561065674, "initexec": "2023-10-15 15:11:42.423574", "startexec": "2023-10-15 15:11:42.423574", "endexec": "2023-10-15 15:11:57.882380"} 78 | {"type": "detail", "processid": 25856, "calls": 1, "avrg": 15.457831144332886, "min": 15.457831144332886, "max": 15.457831144332886, "st-dev": 0.0, "total": 15.457831144332886, "initexec": "2023-10-15 15:11:42.424549", "startexec": "2023-10-15 15:11:42.424549", "endexec": "2023-10-15 15:11:57.882380"} 79 | {"type": "detail", "processid": 25856, "calls": 1, "avrg": 15.456815242767334, "min": 15.456815242767334, "max": 15.456815242767334, "st-dev": 0.0, "total": 15.456815242767334, "initexec": "2023-10-15 15:11:42.425565", "startexec": "2023-10-15 15:11:42.425565", "endexec": "2023-10-15 15:11:57.882380"} 80 | {"type": "detail", "processid": 25856, "calls": 1, "avrg": 15.456841230392456, "min": 15.456841230392456, "max": 15.456841230392456, "st-dev": 0.0, "total": 15.456841230392456, "initexec": "2023-10-15 15:11:42.426564", "startexec": "2023-10-15 15:11:42.426564", "endexec": "2023-10-15 15:11:57.883405"} 81 | {"type": "detail", "processid": 4536, "calls": 1, "avrg": 15.462128400802612, "min": 15.462128400802612, "max": 15.462128400802612, "st-dev": 0.0, "total": 15.462128400802612, "initexec": "2023-10-15 15:11:42.528396", "startexec": "2023-10-15 15:11:42.528396", "endexec": "2023-10-15 15:11:57.990525"} 82 | {"type": "detail", "processid": 4536, "calls": 1, "avrg": 15.462134599685669, "min": 15.462134599685669, "max": 15.462134599685669, "st-dev": 0.0, "total": 15.462134599685669, "initexec": "2023-10-15 15:11:42.529378", "startexec": "2023-10-15 15:11:42.529378", "endexec": "2023-10-15 15:11:57.991513"} 83 | {"type": "detail", "processid": 4536, "calls": 1, "avrg": 15.460129499435425, "min": 15.460129499435425, "max": 15.460129499435425, "st-dev": 0.0, "total": 15.460129499435425, "initexec": "2023-10-15 15:11:42.530395", "startexec": "2023-10-15 15:11:42.530395", "endexec": "2023-10-15 15:11:57.990525"} 84 | {"type": "detail", "processid": 4536, "calls": 1, "avrg": 15.45914626121521, "min": 15.45914626121521, "max": 15.45914626121521, "st-dev": 0.0, "total": 15.45914626121521, "initexec": "2023-10-15 15:11:42.531379", "startexec": "2023-10-15 15:11:42.531379", "endexec": "2023-10-15 15:11:57.990525"} 85 | {"type": "core", "plan_executors": 8, "plan_executors_detail": [2, 4], "real_executors": 8, "group": "Germany perf", "total_calls": 8, "total_call_per_sec": 51.74902321390517, "avrg_time": 15.459228992462158, "std_deviation": 0.0, "endexec": "2023-10-15 15:11:58.250481"} 86 | {"type": "detail", "processid": 13072, "calls": 1, "avrg": 15.435987949371338, "min": 15.435987949371338, "max": 15.435987949371338, "st-dev": 0.0, "total": 15.435987949371338, "initexec": "2023-10-15 15:12:04.225181", "startexec": "2023-10-15 15:12:04.225181", "endexec": "2023-10-15 15:12:19.661170"} 87 | {"type": "detail", "processid": 13072, "calls": 1, "avrg": 15.434791803359985, "min": 15.434791803359985, "max": 15.434791803359985, "st-dev": 0.0, "total": 15.434791803359985, "initexec": "2023-10-15 15:12:04.226171", "startexec": "2023-10-15 15:12:04.226171", "endexec": "2023-10-15 15:12:19.660963"} 88 | {"type": "detail", "processid": 13072, "calls": 1, "avrg": 15.432854652404785, "min": 15.432854652404785, "max": 15.432854652404785, "st-dev": 0.0, "total": 15.432854652404785, "initexec": "2023-10-15 15:12:04.227312", "startexec": "2023-10-15 15:12:04.228315", "endexec": "2023-10-15 15:12:19.661170"} 89 | {"type": "detail", "processid": 13072, "calls": 1, "avrg": 15.430846452713013, "min": 15.430846452713013, "max": 15.430846452713013, "st-dev": 0.0, "total": 15.430846452713013, "initexec": "2023-10-15 15:12:04.230323", "startexec": "2023-10-15 15:12:04.230323", "endexec": "2023-10-15 15:12:19.661170"} 90 | {"type": "detail", "processid": 24500, "calls": 1, "avrg": 15.432725191116333, "min": 15.432725191116333, "max": 15.432725191116333, "st-dev": 0.0, "total": 15.432725191116333, "initexec": "2023-10-15 15:12:04.289851", "startexec": "2023-10-15 15:12:04.289851", "endexec": "2023-10-15 15:12:19.722576"} 91 | {"type": "detail", "processid": 24500, "calls": 1, "avrg": 15.431721448898315, "min": 15.431721448898315, "max": 15.431721448898315, "st-dev": 0.0, "total": 15.431721448898315, "initexec": "2023-10-15 15:12:04.290855", "startexec": "2023-10-15 15:12:04.290855", "endexec": "2023-10-15 15:12:19.722576"} 92 | {"type": "detail", "processid": 24500, "calls": 1, "avrg": 15.4306001663208, "min": 15.4306001663208, "max": 15.4306001663208, "st-dev": 0.0, "total": 15.4306001663208, "initexec": "2023-10-15 15:12:04.291976", "startexec": "2023-10-15 15:12:04.291976", "endexec": "2023-10-15 15:12:19.722576"} 93 | {"type": "detail", "processid": 24500, "calls": 1, "avrg": 15.430595397949219, "min": 15.430595397949219, "max": 15.430595397949219, "st-dev": 0.0, "total": 15.430595397949219, "initexec": "2023-10-15 15:12:04.292984", "startexec": "2023-10-15 15:12:04.292984", "endexec": "2023-10-15 15:12:19.723579"} 94 | {"type": "detail", "processid": 22244, "calls": 1, "avrg": 15.440333366394043, "min": 15.440333366394043, "max": 15.440333366394043, "st-dev": 0.0, "total": 15.440333366394043, "initexec": "2023-10-15 15:12:04.422116", "startexec": "2023-10-15 15:12:04.422116", "endexec": "2023-10-15 15:12:19.862449"} 95 | {"type": "detail", "processid": 22244, "calls": 1, "avrg": 15.438881635665894, "min": 15.438881635665894, "max": 15.438881635665894, "st-dev": 0.0, "total": 15.438881635665894, "initexec": "2023-10-15 15:12:04.423247", "startexec": "2023-10-15 15:12:04.423247", "endexec": "2023-10-15 15:12:19.862396"} 96 | {"type": "detail", "processid": 22244, "calls": 1, "avrg": 15.438193798065186, "min": 15.438193798065186, "max": 15.438193798065186, "st-dev": 0.0, "total": 15.438193798065186, "initexec": "2023-10-15 15:12:04.424256", "startexec": "2023-10-15 15:12:04.424256", "endexec": "2023-10-15 15:12:19.862449"} 97 | {"type": "detail", "processid": 22244, "calls": 1, "avrg": 15.437854766845703, "min": 15.437854766845703, "max": 15.437854766845703, "st-dev": 0.0, "total": 15.437854766845703, "initexec": "2023-10-15 15:12:04.425254", "startexec": "2023-10-15 15:12:04.425254", "endexec": "2023-10-15 15:12:19.863109"} 98 | {"type": "detail", "processid": 17752, "calls": 1, "avrg": 15.431012630462646, "min": 15.431012630462646, "max": 15.431012630462646, "st-dev": 0.0, "total": 15.431012630462646, "initexec": "2023-10-15 15:12:04.557888", "startexec": "2023-10-15 15:12:04.557888", "endexec": "2023-10-15 15:12:19.988901"} 99 | {"type": "detail", "processid": 17752, "calls": 1, "avrg": 15.444249868392944, "min": 15.444249868392944, "max": 15.444249868392944, "st-dev": 0.0, "total": 15.444249868392944, "initexec": "2023-10-15 15:12:04.560338", "startexec": "2023-10-15 15:12:04.560338", "endexec": "2023-10-15 15:12:20.004588"} 100 | {"type": "detail", "processid": 17752, "calls": 1, "avrg": 15.457846879959106, "min": 15.457846879959106, "max": 15.457846879959106, "st-dev": 0.0, "total": 15.457846879959106, "initexec": "2023-10-15 15:12:04.561875", "startexec": "2023-10-15 15:12:04.561875", "endexec": "2023-10-15 15:12:20.019722"} 101 | {"type": "detail", "processid": 17752, "calls": 1, "avrg": 15.456568241119385, "min": 15.456568241119385, "max": 15.456568241119385, "st-dev": 0.0, "total": 15.456568241119385, "initexec": "2023-10-15 15:12:04.563153", "startexec": "2023-10-15 15:12:04.563153", "endexec": "2023-10-15 15:12:20.019722"} 102 | {"type": "core", "plan_executors": 16, "plan_executors_detail": [4, 4], "real_executors": 16, "group": "Germany perf", "total_calls": 16, "total_call_per_sec": 103.64159972926397, "avrg_time": 15.437816515564919, "std_deviation": 0.0, "endexec": "2023-10-15 15:12:20.238897"} 103 | ############### State: OK, Duration: 122.8 seconds ############### 104 | -------------------------------------------------------------------------------- /input/perf_test_random.txt: -------------------------------------------------------------------------------- 1 | ############### 2024-09-25 20:43:58.226380 ############### 2 | {"type": "headr", "label": "test_random", "bulk": [1, 1], "duration": 4, "cpu": 12, "mem": "15.2 GB", "mem_free": "3.4 GB", "host": "HCI-L3204/172.23.112.1", "now": "2024-09-25 20:43:58.226380"} 3 | {"type": "detail", "processid": 19892, "calls": 3086, "avrg": 0.0012962998157187244, "min": 0.0010097026824951172, "max": 0.004643917083740234, "st-dev": 0.0002598754054699346, "total": 4.000381231307983, "initexec": "2024-09-25 20:43:59.815756", "startexec": "2024-09-25 20:44:00.787924", "endexec": "2024-09-25 20:44:04.789102"} 4 | {"type": "detail", "processid": 19892, "calls": 3069, "avrg": 0.0013030665283600877, "min": 0.001050710678100586, "max": 0.004643917083740234, "st-dev": 0.00026054432600654373, "total": 3.9991111755371094, "initexec": "2024-09-25 20:43:59.815756", "startexec": "2024-09-25 20:44:00.787924", "endexec": "2024-09-25 20:44:04.788004"} 5 | {"type": "detail", "processid": 19892, "calls": 3068, "avrg": 0.0013032850883463992, "min": 0.0010275840759277344, "max": 0.004403829574584961, "st-dev": 0.0002617688648540515, "total": 3.998478651046753, "initexec": "2024-09-25 20:43:59.815756", "startexec": "2024-09-25 20:44:00.788517", "endexec": "2024-09-25 20:44:04.788545"} 6 | {"type": "detail", "processid": 19892, "calls": 3036, "avrg": 0.0013176060633854117, "min": 0.001050710678100586, "max": 0.004019021987915039, "st-dev": 0.00026461919964094793, "total": 4.00025200843811, "initexec": "2024-09-25 20:43:59.816812", "startexec": "2024-09-25 20:44:00.787386", "endexec": "2024-09-25 20:44:04.788545"} 7 | {"type": "detail", "processid": 21860, "calls": 3072, "avrg": 0.0013020237286885579, "min": 0.001033782958984375, "max": 0.004403829574584961, "st-dev": 0.00026049797315345625, "total": 3.99981689453125, "initexec": "2024-09-25 20:43:59.819329", "startexec": "2024-09-25 20:44:00.787924", "endexec": "2024-09-25 20:44:04.788545"} 8 | {"type": "detail", "processid": 21860, "calls": 3024, "avrg": 0.001322502023959286, "min": 0.0010459423065185547, "max": 0.004948854446411133, "st-dev": 0.0002693194154248041, "total": 3.999246120452881, "initexec": "2024-09-25 20:43:59.819329", "startexec": "2024-09-25 20:44:00.788517", "endexec": "2024-09-25 20:44:04.788545"} 9 | {"type": "detail", "processid": 21860, "calls": 3065, "avrg": 0.0013049821869195188, "min": 0.0010275840759277344, "max": 0.004019021987915039, "st-dev": 0.00026039018893335485, "total": 3.999770402908325, "initexec": "2024-09-25 20:43:59.820327", "startexec": "2024-09-25 20:44:00.787386", "endexec": "2024-09-25 20:44:04.788004"} 10 | {"type": "detail", "processid": 21860, "calls": 3110, "avrg": 0.0012861549279314145, "min": 0.001028299331665039, "max": 0.004643917083740234, "st-dev": 0.00026234427187897015, "total": 3.999941825866699, "initexec": "2024-09-25 20:43:59.820327", "startexec": "2024-09-25 20:44:00.787924", "endexec": "2024-09-25 20:44:04.788545"} 11 | {"type": "detail", "processid": 26304, "calls": 3087, "avrg": 0.0012960088728004803, "min": 0.0010540485382080078, "max": 0.004403829574584961, "st-dev": 0.000257953177188009, "total": 4.000779390335083, "initexec": "2024-09-25 20:43:59.864292", "startexec": "2024-09-25 20:44:00.788517", "endexec": "2024-09-25 20:44:04.789638"} 12 | {"type": "detail", "processid": 26304, "calls": 3082, "avrg": 0.0012978647994500024, "min": 0.0010437965393066406, "max": 0.004643917083740234, "st-dev": 0.00025936719700025534, "total": 4.000019311904907, "initexec": "2024-09-25 20:43:59.865353", "startexec": "2024-09-25 20:44:00.787386", "endexec": "2024-09-25 20:44:04.788545"} 13 | {"type": "detail", "processid": 26304, "calls": 0, "err": "Exception: Random exception"} 14 | {"type": "detail", "processid": 26304, "calls": 0, "err": "Exception: Random exception"} 15 | {"type": "detail", "processid": 12368, "calls": 0, "err": "Exception: Random exception"} 16 | {"type": "detail", "processid": 12368, "calls": 3096, "avrg": 0.0012919186621673348, "min": 0.001054525375366211, "max": 0.004019021987915039, "st-dev": 0.0002542887481595622, "total": 3.9997801780700684, "initexec": "2024-09-25 20:43:59.891008", "startexec": "2024-09-25 20:44:00.787386", "endexec": "2024-09-25 20:44:04.788004"} 17 | {"type": "detail", "processid": 12368, "calls": 3078, "avrg": 0.0012996104570702348, "min": 0.001056671142578125, "max": 0.004643917083740234, "st-dev": 0.00026144027372941147, "total": 4.000200986862183, "initexec": "2024-09-25 20:43:59.891008", "startexec": "2024-09-25 20:44:00.787386", "endexec": "2024-09-25 20:44:04.788545"} 18 | {"type": "detail", "processid": 12368, "calls": 3061, "avrg": 0.0013066698857593755, "min": 0.001028299331665039, "max": 0.004403829574584961, "st-dev": 0.0002632881434074456, "total": 3.9997165203094482, "initexec": "2024-09-25 20:43:59.891008", "startexec": "2024-09-25 20:44:00.787924", "endexec": "2024-09-25 20:44:04.788545"} 19 | {"type": "core", "plan_executors": 16, "plan_executors_detail": [4, 4], "real_executors": 13, "group": "", "total_calls": 39934, "total_call_per_sec": 9983.463461681627, "avrg_time": 0.001302153310812064, "std_deviation": 0.0002612074757574421, "endexec": "2024-09-25 20:44:04.965096"} 20 | {"type": "detail", "processid": 12844, "calls": 0, "err": "Exception: Random exception"} 21 | {"type": "detail", "processid": 12844, "calls": 3138, "avrg": 0.001274768146760453, "min": 0.0010342597961425781, "max": 0.003968954086303711, "st-dev": 0.00022543296787999926, "total": 4.000222444534302, "initexec": "2024-09-25 20:44:06.851400", "startexec": "2024-09-25 20:44:07.554890", "endexec": "2024-09-25 20:44:11.555847"} 22 | {"type": "detail", "processid": 12844, "calls": 3119, "avrg": 0.00128216222143586, "min": 0.0010569095611572266, "max": 0.004595279693603516, "st-dev": 0.0002301728923083808, "total": 3.9990639686584473, "initexec": "2024-09-25 20:44:06.851400", "startexec": "2024-09-25 20:44:07.554675", "endexec": "2024-09-25 20:44:11.554737"} 23 | {"type": "detail", "processid": 12844, "calls": 3144, "avrg": 0.0012718117570755742, "min": 0.0010628700256347656, "max": 0.004595279693603516, "st-dev": 0.00022464991816291237, "total": 3.9985761642456055, "initexec": "2024-09-25 20:44:06.851400", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 24 | {"type": "detail", "processid": 14812, "calls": 3137, "avrg": 0.001275005027447531, "min": 0.0010561943054199219, "max": 0.004595279693603516, "st-dev": 0.00022761829771330265, "total": 3.9996907711029053, "initexec": "2024-09-25 20:44:06.888547", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555847"} 25 | {"type": "detail", "processid": 14812, "calls": 3166, "avrg": 0.0012632678448212576, "min": 0.0010602474212646484, "max": 0.003968954086303711, "st-dev": 0.00021672884535549078, "total": 3.9995059967041016, "initexec": "2024-09-25 20:44:06.888547", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 26 | {"type": "detail", "processid": 14812, "calls": 3118, "avrg": 0.0012826277247753718, "min": 0.0010342597961425781, "max": 0.004595279693603516, "st-dev": 0.00023449093593286684, "total": 3.9992332458496094, "initexec": "2024-09-25 20:44:06.889534", "startexec": "2024-09-25 20:44:07.554675", "endexec": "2024-09-25 20:44:11.555284"} 27 | {"type": "detail", "processid": 14812, "calls": 3143, "avrg": 0.0012723893600400755, "min": 0.0010662078857421875, "max": 0.004595279693603516, "st-dev": 0.0002263463811392143, "total": 3.999119758605957, "initexec": "2024-09-25 20:44:06.889534", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 28 | {"type": "detail", "processid": 14128, "calls": 3168, "avrg": 0.0012624577590913484, "min": 0.0010614395141601562, "max": 0.004595279693603516, "st-dev": 0.00021790716583796815, "total": 3.9994661808013916, "initexec": "2024-09-25 20:44:06.919297", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 29 | {"type": "detail", "processid": 14128, "calls": 3148, "avrg": 0.0012708753915420784, "min": 0.0010578632354736328, "max": 0.003968954086303711, "st-dev": 0.00022150712614224847, "total": 4.000715732574463, "initexec": "2024-09-25 20:44:06.919819", "startexec": "2024-09-25 20:44:07.554831", "endexec": "2024-09-25 20:44:11.556398"} 30 | {"type": "detail", "processid": 14128, "calls": 0, "err": "Exception: Random exception"} 31 | {"type": "detail", "processid": 14128, "calls": 3109, "avrg": 0.0012865142448035111, "min": 0.0010590553283691406, "max": 0.004595279693603516, "st-dev": 0.00023254619095361268, "total": 3.999772787094116, "initexec": "2024-09-25 20:44:06.919819", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555847"} 32 | {"type": "detail", "processid": 27208, "calls": 3144, "avrg": 0.0012721914523127122, "min": 0.0010578632354736328, "max": 0.004869699478149414, "st-dev": 0.00023365067765869239, "total": 3.999769926071167, "initexec": "2024-09-25 20:44:06.936395", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555847"} 33 | {"type": "detail", "processid": 27208, "calls": 3136, "avrg": 0.0012752451762861135, "min": 0.0010595321655273438, "max": 0.004169464111328125, "st-dev": 0.00022922622986885352, "total": 3.999168872833252, "initexec": "2024-09-25 20:44:06.936395", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 34 | {"type": "detail", "processid": 27208, "calls": 3152, "avrg": 0.0012687282060003522, "min": 0.0010602474212646484, "max": 0.003968954086303711, "st-dev": 0.00021929696684507835, "total": 3.9990313053131104, "initexec": "2024-09-25 20:44:06.936395", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 35 | {"type": "detail", "processid": 27208, "calls": 0, "err": "Exception: Random exception"} 36 | {"type": "detail", "processid": 29520, "calls": 3123, "avrg": 0.0012808276642754489, "min": 0.0010602474212646484, "max": 0.003968954086303711, "st-dev": 0.00022773905480003137, "total": 4.000024795532227, "initexec": "2024-09-25 20:44:06.952560", "startexec": "2024-09-25 20:44:07.554890", "endexec": "2024-09-25 20:44:11.555847"} 37 | {"type": "detail", "processid": 29520, "calls": 3166, "avrg": 0.0012630025420246136, "min": 0.001062154769897461, "max": 0.003968954086303711, "st-dev": 0.00021653361800663207, "total": 3.9986660480499268, "initexec": "2024-09-25 20:44:06.952560", "startexec": "2024-09-25 20:44:07.554675", "endexec": "2024-09-25 20:44:11.554737"} 38 | {"type": "detail", "processid": 29520, "calls": 3134, "avrg": 0.0012762981687447184, "min": 0.0010666847229003906, "max": 0.004595279693603516, "st-dev": 0.00022716593121838673, "total": 3.9999184608459473, "initexec": "2024-09-25 20:44:06.952560", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555847"} 39 | {"type": "detail", "processid": 29520, "calls": 3128, "avrg": 0.0012783947045845753, "min": 0.0010578632354736328, "max": 0.003968954086303711, "st-dev": 0.0002264299433514484, "total": 3.9988186359405518, "initexec": "2024-09-25 20:44:06.952560", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 40 | {"type": "detail", "processid": 552, "calls": 3119, "avrg": 0.0012825617770347584, "min": 0.0010597705841064453, "max": 0.003968954086303711, "st-dev": 0.00022954420631874918, "total": 4.000310182571411, "initexec": "2024-09-25 20:44:06.968565", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.556398"} 41 | {"type": "detail", "processid": 552, "calls": 0, "err": "Exception: Random exception"} 42 | {"type": "detail", "processid": 552, "calls": 3128, "avrg": 0.0012786079703084648, "min": 0.0010559558868408203, "max": 0.003968954086303711, "st-dev": 0.00022653180332612757, "total": 3.999485731124878, "initexec": "2024-09-25 20:44:06.969557", "startexec": "2024-09-25 20:44:07.554890", "endexec": "2024-09-25 20:44:11.555284"} 43 | {"type": "detail", "processid": 552, "calls": 0, "err": "Exception: Random exception"} 44 | {"type": "detail", "processid": 30388, "calls": 3147, "avrg": 0.0012709669434990169, "min": 0.0010597705841064453, "max": 0.004595279693603516, "st-dev": 0.00022563980915498217, "total": 3.9997329711914062, "initexec": "2024-09-25 20:44:06.976152", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555847"} 45 | {"type": "detail", "processid": 16760, "calls": 3154, "avrg": 0.0012678802202378335, "min": 0.0010595321655273438, "max": 0.003968954086303711, "st-dev": 0.0002192356061374537, "total": 3.998894214630127, "initexec": "2024-09-25 20:44:06.978106", "startexec": "2024-09-25 20:44:07.554675", "endexec": "2024-09-25 20:44:11.554737"} 46 | {"type": "detail", "processid": 30388, "calls": 3160, "avrg": 0.001266003032273884, "min": 0.0010342597961425781, "max": 0.004595279693603516, "st-dev": 0.00022057362183492687, "total": 4.000569581985474, "initexec": "2024-09-25 20:44:06.976152", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.556398"} 47 | {"type": "detail", "processid": 30388, "calls": 3140, "avrg": 0.0012735706985376443, "min": 0.0010581016540527344, "max": 0.004595279693603516, "st-dev": 0.00022665114521856587, "total": 3.999011993408203, "initexec": "2024-09-25 20:44:06.976152", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 48 | {"type": "detail", "processid": 16760, "calls": 3152, "avrg": 0.0012688057374228075, "min": 0.0010638236999511719, "max": 0.003968954086303711, "st-dev": 0.00021999710001505008, "total": 3.9992756843566895, "initexec": "2024-09-25 20:44:06.978106", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 49 | {"type": "detail", "processid": 30388, "calls": 3128, "avrg": 0.0012786636876937984, "min": 0.0010614395141601562, "max": 0.003968954086303711, "st-dev": 0.00022589378335321797, "total": 3.999660015106201, "initexec": "2024-09-25 20:44:06.977119", "startexec": "2024-09-25 20:44:07.554890", "endexec": "2024-09-25 20:44:11.555284"} 50 | {"type": "detail", "processid": 16760, "calls": 3137, "avrg": 0.0012750006193258901, "min": 0.0010342597961425781, "max": 0.004595279693603516, "st-dev": 0.00022630634020558428, "total": 3.9996769428253174, "initexec": "2024-09-25 20:44:06.978106", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 51 | {"type": "detail", "processid": 16760, "calls": 3149, "avrg": 0.0012700929456985197, "min": 0.0010578632354736328, "max": 0.004595279693603516, "st-dev": 0.00022230376646163055, "total": 3.9995226860046387, "initexec": "2024-09-25 20:44:06.978106", "startexec": "2024-09-25 20:44:07.555149", "endexec": "2024-09-25 20:44:11.555284"} 52 | {"type": "core", "plan_executors": 32, "plan_executors_detail": [8, 4], "real_executors": 27, "group": "", "total_calls": 84787, "total_call_per_sec": 21198.811072097717, "avrg_time": 0.00127365633422423, "std_deviation": 0.00022518964167412618, "endexec": "2024-09-25 20:44:11.871170"} 53 | {"type": "detail", "processid": 17128, "calls": 3127, "avrg": 0.0012784706429242705, "min": 0.0010554790496826172, "max": 0.004302978515625, "st-dev": 0.00024058436586717947, "total": 3.9977777004241943, "initexec": "2024-09-25 20:44:14.669777", "startexec": "2024-09-25 20:44:14.669777", "endexec": "2024-09-25 20:44:18.669913"} 54 | {"type": "detail", "processid": 32564, "calls": 3203, "avrg": 0.0012484410387480441, "min": 0.0010502338409423828, "max": 0.0048105716705322266, "st-dev": 0.00019579641550900137, "total": 3.9987566471099854, "initexec": "2024-09-25 20:44:14.653029", "startexec": "2024-09-25 20:44:14.653029", "endexec": "2024-09-25 20:44:18.653984"} 55 | {"type": "detail", "processid": 17128, "calls": 0, "err": "Exception: Random exception"} 56 | {"type": "detail", "processid": 17128, "calls": 3205, "avrg": 0.001247975681203762, "min": 0.0010313987731933594, "max": 0.0048105716705322266, "st-dev": 0.00019499058557044728, "total": 3.9997620582580566, "initexec": "2024-09-25 20:44:14.670319", "startexec": "2024-09-25 20:44:14.670319", "endexec": "2024-09-25 20:44:18.671673"} 57 | {"type": "detail", "processid": 32564, "calls": 0, "err": "Exception: Random exception"} 58 | {"type": "detail", "processid": 17128, "calls": 3136, "avrg": 0.00127504933245328, "min": 0.0010519027709960938, "max": 0.005887269973754883, "st-dev": 0.0002550100518088118, "total": 3.9985547065734863, "initexec": "2024-09-25 20:44:14.670319", "startexec": "2024-09-25 20:44:14.670319", "endexec": "2024-09-25 20:44:18.670432"} 59 | {"type": "detail", "processid": 16196, "calls": 3168, "avrg": 0.0012621242139074537, "min": 0.0010454654693603516, "max": 0.004439592361450195, "st-dev": 0.00022920965784541667, "total": 3.9984095096588135, "initexec": "2024-09-25 20:44:14.724537", "startexec": "2024-09-25 20:44:14.724537", "endexec": "2024-09-25 20:44:18.724620"} 60 | {"type": "detail", "processid": 32564, "calls": 3167, "avrg": 0.0012625475806093834, "min": 0.0010547637939453125, "max": 0.0050296783447265625, "st-dev": 0.00023710591728354623, "total": 3.998488187789917, "initexec": "2024-09-25 20:44:14.655522", "startexec": "2024-09-25 20:44:14.655522", "endexec": "2024-09-25 20:44:18.656378"} 61 | {"type": "detail", "processid": 8892, "calls": 3172, "avrg": 0.0012608019430730563, "min": 0.0010547637939453125, "max": 0.003931283950805664, "st-dev": 0.00021243663602321544, "total": 3.9992637634277344, "initexec": "2024-09-25 20:44:14.756519", "startexec": "2024-09-25 20:44:14.756519", "endexec": "2024-09-25 20:44:18.757390"} 62 | {"type": "detail", "processid": 16196, "calls": 3161, "avrg": 0.0012650775668063671, "min": 0.0010313987731933594, "max": 0.003902435302734375, "st-dev": 0.00021876352693408352, "total": 3.9989101886749268, "initexec": "2024-09-25 20:44:14.725697", "startexec": "2024-09-25 20:44:14.725697", "endexec": "2024-09-25 20:44:18.726458"} 63 | {"type": "detail", "processid": 32564, "calls": 3127, "avrg": 0.0012791043163527685, "min": 0.001043558120727539, "max": 0.005528926849365234, "st-dev": 0.0002387104417888359, "total": 3.9997591972351074, "initexec": "2024-09-25 20:44:14.656540", "startexec": "2024-09-25 20:44:14.656540", "endexec": "2024-09-25 20:44:18.657617"} 64 | {"type": "detail", "processid": 16196, "calls": 0, "err": "Exception: Random exception"} 65 | {"type": "detail", "processid": 23688, "calls": 3211, "avrg": 0.0012457819231497243, "min": 0.0010302066802978516, "max": 0.004595518112182617, "st-dev": 0.00019103143351432343, "total": 4.000205755233765, "initexec": "2024-09-25 20:44:14.747764", "startexec": "2024-09-25 20:44:14.747764", "endexec": "2024-09-25 20:44:18.749235"} 66 | {"type": "detail", "processid": 8892, "calls": 3177, "avrg": 0.001258807772167231, "min": 0.001033782958984375, "max": 0.003902435302734375, "st-dev": 0.00021030317684409832, "total": 3.999232292175293, "initexec": "2024-09-25 20:44:14.756519", "startexec": "2024-09-25 20:44:14.756519", "endexec": "2024-09-25 20:44:18.756806"} 67 | {"type": "detail", "processid": 16196, "calls": 3162, "avrg": 0.0012645897874343553, "min": 0.0010302066802978516, "max": 0.004302978515625, "st-dev": 0.00021360598106340574, "total": 3.9986329078674316, "initexec": "2024-09-25 20:44:14.725697", "startexec": "2024-09-25 20:44:14.725697", "endexec": "2024-09-25 20:44:18.725803"} 68 | {"type": "detail", "processid": 23688, "calls": 3223, "avrg": 0.0012408692090362635, "min": 0.0010442733764648438, "max": 0.003370523452758789, "st-dev": 0.00017786630970620572, "total": 3.999321460723877, "initexec": "2024-09-25 20:44:14.748292", "startexec": "2024-09-25 20:44:14.748292", "endexec": "2024-09-25 20:44:18.749776"} 69 | {"type": "detail", "processid": 23688, "calls": 3182, "avrg": 0.0012568433954609332, "min": 0.0010476112365722656, "max": 0.004439592361450195, "st-dev": 0.0002081417276732088, "total": 3.9992756843566895, "initexec": "2024-09-25 20:44:14.748829", "startexec": "2024-09-25 20:44:14.748829", "endexec": "2024-09-25 20:44:18.749776"} 70 | {"type": "detail", "processid": 8892, "calls": 0, "err": "Exception: Random exception"} 71 | {"type": "detail", "processid": 10652, "calls": 3163, "avrg": 0.0012641720405455598, "min": 0.0010476112365722656, "max": 0.003383159637451172, "st-dev": 0.000201155041561426, "total": 3.9985761642456055, "initexec": "2024-09-25 20:44:14.807197", "startexec": "2024-09-25 20:44:14.807197", "endexec": "2024-09-25 20:44:18.807209"} 72 | {"type": "detail", "processid": 23688, "calls": 3167, "avrg": 0.001262786526163557, "min": 0.001035451889038086, "max": 0.003844022750854492, "st-dev": 0.0002086958294172919, "total": 3.9992449283599854, "initexec": "2024-09-25 20:44:14.749375", "startexec": "2024-09-25 20:44:14.749375", "endexec": "2024-09-25 20:44:18.750884"} 73 | {"type": "detail", "processid": 18148, "calls": 3184, "avrg": 0.0012566309478414717, "min": 0.0010313987731933594, "max": 0.003416776657104492, "st-dev": 0.0001945999202533011, "total": 4.001112937927246, "initexec": "2024-09-25 20:44:14.819512", "startexec": "2024-09-25 20:44:14.819512", "endexec": "2024-09-25 20:44:18.821650"} 74 | {"type": "detail", "processid": 8892, "calls": 3164, "avrg": 0.0012639954629649706, "min": 0.0010302066802978516, "max": 0.003955364227294922, "st-dev": 0.00021372149990751796, "total": 3.999281644821167, "initexec": "2024-09-25 20:44:14.758188", "startexec": "2024-09-25 20:44:14.758188", "endexec": "2024-09-25 20:44:18.758490"} 75 | {"type": "detail", "processid": 620, "calls": 0, "err": "Exception: Random exception"} 76 | {"type": "detail", "processid": 10652, "calls": 3171, "avrg": 0.0012615800693335122, "min": 0.001043558120727539, "max": 0.003383159637451172, "st-dev": 0.00020045187454065645, "total": 4.000470399856567, "initexec": "2024-09-25 20:44:14.807883", "startexec": "2024-09-25 20:44:14.807883", "endexec": "2024-09-25 20:44:18.809460"} 77 | {"type": "detail", "processid": 18148, "calls": 3173, "avrg": 0.0012606125767584896, "min": 0.0010361671447753906, "max": 0.004003047943115234, "st-dev": 0.00020097508403050035, "total": 3.9999237060546875, "initexec": "2024-09-25 20:44:14.820031", "startexec": "2024-09-25 20:44:14.820031", "endexec": "2024-09-25 20:44:18.821126"} 78 | {"type": "detail", "processid": 620, "calls": 3161, "avrg": 0.0012651379822704166, "min": 0.0010535717010498047, "max": 0.0029382705688476562, "st-dev": 0.00019894496148420657, "total": 3.999101161956787, "initexec": "2024-09-25 20:44:14.842425", "startexec": "2024-09-25 20:44:14.842425", "endexec": "2024-09-25 20:44:18.842751"} 79 | {"type": "detail", "processid": 18148, "calls": 3186, "avrg": 0.001255379932449063, "min": 0.0010409355163574219, "max": 0.0034668445587158203, "st-dev": 0.00019431899465316408, "total": 3.999640464782715, "initexec": "2024-09-25 20:44:14.820031", "startexec": "2024-09-25 20:44:14.820031", "endexec": "2024-09-25 20:44:18.821650"} 80 | {"type": "detail", "processid": 620, "calls": 0, "err": "Exception: Random exception"} 81 | {"type": "detail", "processid": 10652, "calls": 3174, "avrg": 0.0012597749273808557, "min": 0.0010302066802978516, "max": 0.0033991336822509766, "st-dev": 0.00019879524568085032, "total": 3.998525619506836, "initexec": "2024-09-25 20:44:14.807883", "startexec": "2024-09-25 20:44:14.807883", "endexec": "2024-09-25 20:44:18.808397"} 82 | {"type": "detail", "processid": 18148, "calls": 3214, "avrg": 0.0012441222980739022, "min": 0.001033782958984375, "max": 0.002220630645751953, "st-dev": 0.0001779762545183857, "total": 3.9986090660095215, "initexec": "2024-09-25 20:44:14.820593", "startexec": "2024-09-25 20:44:14.820593", "endexec": "2024-09-25 20:44:18.821126"} 83 | {"type": "detail", "processid": 620, "calls": 3202, "avrg": 0.0012491083681248339, "min": 0.001043558120727539, "max": 0.0019040107727050781, "st-dev": 0.0001827816714753749, "total": 3.9996449947357178, "initexec": "2024-09-25 20:44:14.842947", "startexec": "2024-09-25 20:44:14.843014", "endexec": "2024-09-25 20:44:18.843834"} 84 | {"type": "detail", "processid": 10652, "calls": 3160, "avrg": 0.0012658483619931377, "min": 0.001041412353515625, "max": 0.0033991336822509766, "st-dev": 0.0002049161613236493, "total": 4.000080823898315, "initexec": "2024-09-25 20:44:14.809011", "startexec": "2024-09-25 20:44:14.809011", "endexec": "2024-09-25 20:44:18.810626"} 85 | {"type": "detail", "processid": 21040, "calls": 3184, "avrg": 0.0012563497726641708, "min": 0.0010302066802978516, "max": 0.003444671630859375, "st-dev": 0.00019562664850907786, "total": 4.00021767616272, "initexec": "2024-09-25 20:44:14.890901", "startexec": "2024-09-25 20:44:14.890901", "endexec": "2024-09-25 20:44:18.892502"} 86 | {"type": "detail", "processid": 21040, "calls": 0, "err": "Exception: Random exception"} 87 | {"type": "detail", "processid": 21040, "calls": 3211, "avrg": 0.0012455831543748085, "min": 0.0010521411895751953, "max": 0.0022029876708984375, "st-dev": 0.00017839415757750566, "total": 3.9995675086975098, "initexec": "2024-09-25 20:44:14.891455", "startexec": "2024-09-25 20:44:14.891455", "endexec": "2024-09-25 20:44:18.892502"} 88 | {"type": "detail", "processid": 19288, "calls": 3172, "avrg": 0.001261119809457363, "min": 0.0010302066802978516, "max": 0.0027413368225097656, "st-dev": 0.00019788191633519767, "total": 4.000272035598755, "initexec": "2024-09-25 20:44:14.919971", "startexec": "2024-09-25 20:44:14.919971", "endexec": "2024-09-25 20:44:18.921348"} 89 | {"type": "detail", "processid": 19288, "calls": 3162, "avrg": 0.0012651844766605963, "min": 0.001050710678100586, "max": 0.0028078556060791016, "st-dev": 0.00020120167334182842, "total": 4.000513315200806, "initexec": "2024-09-25 20:44:14.919971", "startexec": "2024-09-25 20:44:14.919971", "endexec": "2024-09-25 20:44:18.921348"} 90 | {"type": "detail", "processid": 21040, "calls": 0, "err": "Exception: Random exception"} 91 | {"type": "detail", "processid": 22820, "calls": 3168, "avrg": 0.001262411776215139, "min": 0.0010302066802978516, "max": 0.003444671630859375, "st-dev": 0.0002003765025249036, "total": 3.9993205070495605, "initexec": "2024-09-25 20:44:14.924326", "startexec": "2024-09-25 20:44:14.924326", "endexec": "2024-09-25 20:44:18.925362"} 92 | {"type": "detail", "processid": 19288, "calls": 3225, "avrg": 0.0012403162874916728, "min": 0.0010309219360351562, "max": 0.0020318031311035156, "st-dev": 0.0001732055058290996, "total": 4.0000200271606445, "initexec": "2024-09-25 20:44:14.919971", "startexec": "2024-09-25 20:44:14.919971", "endexec": "2024-09-25 20:44:18.921348"} 93 | {"type": "detail", "processid": 19288, "calls": 3221, "avrg": 0.0012415485772905939, "min": 0.0010428428649902344, "max": 0.0022029876708984375, "st-dev": 0.00017658082101438595, "total": 3.999027967453003, "initexec": "2024-09-25 20:44:14.919971", "startexec": "2024-09-25 20:44:14.919971", "endexec": "2024-09-25 20:44:18.920306"} 94 | {"type": "detail", "processid": 22820, "calls": 0, "err": "Exception: Random exception"} 95 | {"type": "detail", "processid": 22820, "calls": 3229, "avrg": 0.0012387801855848683, "min": 0.0010459423065185547, "max": 0.0019545555114746094, "st-dev": 0.00017102357501864437, "total": 4.00002121925354, "initexec": "2024-09-25 20:44:14.924850", "startexec": "2024-09-25 20:44:14.924850", "endexec": "2024-09-25 20:44:18.926522"} 96 | {"type": "detail", "processid": 22820, "calls": 3153, "avrg": 0.0012684556517644871, "min": 0.0010547637939453125, "max": 0.003519296646118164, "st-dev": 0.00020810321269971023, "total": 3.9994406700134277, "initexec": "2024-09-25 20:44:14.925403", "startexec": "2024-09-25 20:44:14.925403", "endexec": "2024-09-25 20:44:18.926522"} 97 | {"type": "detail", "processid": 360, "calls": 3185, "avrg": 0.0012556331311140555, "min": 0.0010533332824707031, "max": 0.003519296646118164, "st-dev": 0.0001964562864368945, "total": 3.9991915225982666, "initexec": "2024-09-25 20:44:14.936810", "startexec": "2024-09-25 20:44:14.937351", "endexec": "2024-09-25 20:44:18.937556"} 98 | {"type": "detail", "processid": 360, "calls": 3175, "avrg": 0.0012597973891130582, "min": 0.0010442733764648438, "max": 0.003931283950805664, "st-dev": 0.00020435133061654976, "total": 3.99985671043396, "initexec": "2024-09-25 20:44:14.937442", "startexec": "2024-09-25 20:44:14.937442", "endexec": "2024-09-25 20:44:18.939159"} 99 | {"type": "detail", "processid": 360, "calls": 3154, "avrg": 0.0012683303732621042, "min": 0.0010302066802978516, "max": 0.0037107467651367188, "st-dev": 0.00021275915540371594, "total": 4.000313997268677, "initexec": "2024-09-25 20:44:14.937957", "startexec": "2024-09-25 20:44:14.937957", "endexec": "2024-09-25 20:44:18.939695"} 100 | {"type": "detail", "processid": 360, "calls": 0, "err": "Exception: Random exception"} 101 | {"type": "detail", "processid": 30652, "calls": 3178, "avrg": 0.0012590738120058034, "min": 0.0010361671447753906, "max": 0.0032541751861572266, "st-dev": 0.00019888183021035555, "total": 4.001336574554443, "initexec": "2024-09-25 20:44:14.948069", "startexec": "2024-09-25 20:44:14.948069", "endexec": "2024-09-25 20:44:18.950927"} 102 | {"type": "detail", "processid": 30652, "calls": 3216, "avrg": 0.0012435062014641454, "min": 0.001033782958984375, "max": 0.004058122634887695, "st-dev": 0.000182867756927856, "total": 3.9991159439086914, "initexec": "2024-09-25 20:44:14.948690", "startexec": "2024-09-25 20:44:14.948690", "endexec": "2024-09-25 20:44:18.950301"} 103 | {"type": "detail", "processid": 30652, "calls": 3225, "avrg": 0.0012401367897211118, "min": 0.0010540485382080078, "max": 0.0020852088928222656, "st-dev": 0.00017396243903792965, "total": 3.999441146850586, "initexec": "2024-09-25 20:44:14.949225", "startexec": "2024-09-25 20:44:14.949225", "endexec": "2024-09-25 20:44:18.949745"} 104 | {"type": "detail", "processid": 30652, "calls": 3152, "avrg": 0.001269303678256001, "min": 0.0010476112365722656, "max": 0.0032541751861572266, "st-dev": 0.00021044729183018616, "total": 4.000845193862915, "initexec": "2024-09-25 20:44:14.949793", "startexec": "2024-09-25 20:44:14.949793", "endexec": "2024-09-25 20:44:18.951943"} 105 | {"type": "detail", "processid": 3984, "calls": 3185, "avrg": 0.0012555524355949749, "min": 0.0010442733764648438, "max": 0.003519296646118164, "st-dev": 0.0002003204359526722, "total": 3.998934507369995, "initexec": "2024-09-25 20:44:14.958888", "startexec": "2024-09-25 20:44:14.958966", "endexec": "2024-09-25 20:44:18.958981"} 106 | {"type": "detail", "processid": 3984, "calls": 3169, "avrg": 0.0012622601077849273, "min": 0.0010542869567871094, "max": 0.0032541751861572266, "st-dev": 0.00020591584584812644, "total": 4.000102281570435, "initexec": "2024-09-25 20:44:14.959024", "startexec": "2024-09-25 20:44:14.959024", "endexec": "2024-09-25 20:44:18.960631"} 107 | {"type": "detail", "processid": 3984, "calls": 3187, "avrg": 0.0012553394270945688, "min": 0.0010302066802978516, "max": 0.003444671630859375, "st-dev": 0.00019414179510155737, "total": 4.000766754150391, "initexec": "2024-09-25 20:44:14.959543", "startexec": "2024-09-25 20:44:14.959599", "endexec": "2024-09-25 20:44:18.961188"} 108 | {"type": "detail", "processid": 3984, "calls": 3159, "avrg": 0.001266494586747747, "min": 0.0010313987731933594, "max": 0.0031549930572509766, "st-dev": 0.00020386328746018793, "total": 4.000856399536133, "initexec": "2024-09-25 20:44:14.959599", "startexec": "2024-09-25 20:44:14.959599", "endexec": "2024-09-25 20:44:18.961188"} 109 | {"type": "detail", "processid": 24756, "calls": 3209, "avrg": 0.0012462539589639095, "min": 0.0010542869567871094, "max": 0.002098560333251953, "st-dev": 0.00017734314351925678, "total": 3.9992289543151855, "initexec": "2024-09-25 20:44:15.009008", "startexec": "2024-09-25 20:44:15.009008", "endexec": "2024-09-25 20:44:19.009454"} 110 | {"type": "detail", "processid": 24756, "calls": 0, "err": "Exception: Random exception"} 111 | {"type": "detail", "processid": 24756, "calls": 3149, "avrg": 0.0012697220302907654, "min": 0.001033782958984375, "max": 0.0033347606658935547, "st-dev": 0.00021240105660746172, "total": 3.99835467338562, "initexec": "2024-09-25 20:44:15.009610", "startexec": "2024-09-25 20:44:15.009610", "endexec": "2024-09-25 20:44:19.009966"} 112 | {"type": "detail", "processid": 24756, "calls": 3158, "avrg": 0.0012664952709978332, "min": 0.001050710678100586, "max": 0.0028078556060791016, "st-dev": 0.00020296533190754357, "total": 3.9995920658111572, "initexec": "2024-09-25 20:44:15.010130", "startexec": "2024-09-25 20:44:15.010130", "endexec": "2024-09-25 20:44:19.010984"} 113 | {"type": "detail", "processid": 30152, "calls": 0, "err": "Exception: Random exception"} 114 | {"type": "detail", "processid": 30152, "calls": 3166, "avrg": 0.0012630436590632078, "min": 0.0010302066802978516, "max": 0.005052089691162109, "st-dev": 0.00021639759522228656, "total": 3.998796224594116, "initexec": "2024-09-25 20:44:15.058959", "startexec": "2024-09-25 20:44:15.058959", "endexec": "2024-09-25 20:44:19.059033"} 115 | {"type": "detail", "processid": 30152, "calls": 3155, "avrg": 0.0012678775847808307, "min": 0.001050710678100586, "max": 0.0033223628997802734, "st-dev": 0.00020690073260052263, "total": 4.0001537799835205, "initexec": "2024-09-25 20:44:15.058959", "startexec": "2024-09-25 20:44:15.058959", "endexec": "2024-09-25 20:44:19.060053"} 116 | {"type": "detail", "processid": 30152, "calls": 3176, "avrg": 0.0012593363934860421, "min": 0.0010535717010498047, "max": 0.003444671630859375, "st-dev": 0.00020011708106707456, "total": 3.99965238571167, "initexec": "2024-09-25 20:44:15.058959", "startexec": "2024-09-25 20:44:15.058959", "endexec": "2024-09-25 20:44:19.060053"} 117 | {"type": "core", "plan_executors": 64, "plan_executors_detail": [16, 4], "real_executors": 52, "group": "", "total_calls": 165263, "total_call_per_sec": 41318.05801931822, "avrg_time": 0.0012585296234321431, "std_deviation": 0.00020198798413228143, "endexec": "2024-09-25 20:44:19.200164"} 118 | ############### State: Error, Duration: 21.0 sec (21.0 seconds) ############### 119 | ############### 2024-09-25 20:44:19.371002 ############### 120 | {"type": "headr", "label": "test_random", "bulk": [1, 5], "duration": 4, "cpu": 12, "mem": "15.2 GB", "mem_free": "3.5 GB", "host": "HCI-L3204/172.23.112.1", "now": "2024-09-25 20:44:19.371002"} 121 | {"type": "detail", "processid": 13356, "calls": 0, "err": "Exception: Random exception"} 122 | {"type": "detail", "processid": 13356, "calls": 642, "avrg": 0.006239397874873746, "min": 0.005339384078979492, "max": 0.008322000503540039, "st-dev": 0.0005990910475542065, "total": 4.005693435668945, "initexec": "2024-09-25 20:44:20.900941", "startexec": "2024-09-25 20:44:21.931459", "endexec": "2024-09-25 20:44:25.937153"} 123 | {"type": "detail", "processid": 13356, "calls": 637, "avrg": 0.006279267920429703, "min": 0.005377292633056641, "max": 0.00820302963256836, "st-dev": 0.0006048385786626787, "total": 3.9998936653137207, "initexec": "2024-09-25 20:44:20.900941", "startexec": "2024-09-25 20:44:21.931982", "endexec": "2024-09-25 20:44:25.932260"} 124 | {"type": "detail", "processid": 13356, "calls": 640, "avrg": 0.006252049654722214, "min": 0.0054018497467041016, "max": 0.008336067199707031, "st-dev": 0.0006171766712265134, "total": 4.001311779022217, "initexec": "2024-09-25 20:44:20.900941", "startexec": "2024-09-25 20:44:21.931982", "endexec": "2024-09-25 20:44:25.933371"} 125 | {"type": "detail", "processid": 20216, "calls": 635, "avrg": 0.0063044150044598915, "min": 0.005482196807861328, "max": 0.008382320404052734, "st-dev": 0.0006324506656330098, "total": 4.003303527832031, "initexec": "2024-09-25 20:44:20.914569", "startexec": "2024-09-25 20:44:21.931982", "endexec": "2024-09-25 20:44:25.935542"} 126 | {"type": "detail", "processid": 20216, "calls": 649, "avrg": 0.006166716753426245, "min": 0.005476951599121094, "max": 0.008325576782226562, "st-dev": 0.0005696727294616433, "total": 4.002199172973633, "initexec": "2024-09-25 20:44:20.914569", "startexec": "2024-09-25 20:44:21.932669", "endexec": "2024-09-25 20:44:25.935008"} 127 | {"type": "detail", "processid": 20216, "calls": 651, "avrg": 0.006148012735510385, "min": 0.0054018497467041016, "max": 0.007965326309204102, "st-dev": 0.0005574098592982921, "total": 4.002356290817261, "initexec": "2024-09-25 20:44:20.915569", "startexec": "2024-09-25 20:44:21.931400", "endexec": "2024-09-25 20:44:25.933913"} 128 | {"type": "detail", "processid": 20216, "calls": 653, "avrg": 0.006134999291272477, "min": 0.005449056625366211, "max": 0.00800323486328125, "st-dev": 0.0005572975692423903, "total": 4.006154537200928, "initexec": "2024-09-25 20:44:20.915569", "startexec": "2024-09-25 20:44:21.931459", "endexec": "2024-09-25 20:44:25.937687"} 129 | {"type": "detail", "processid": 11020, "calls": 643, "avrg": 0.006227558174548587, "min": 0.0054895877838134766, "max": 0.008249044418334961, "st-dev": 0.0006030497134985975, "total": 4.004319906234741, "initexec": "2024-09-25 20:44:20.929149", "startexec": "2024-09-25 20:44:21.932669", "endexec": "2024-09-25 20:44:25.937153"} 130 | {"type": "detail", "processid": 11020, "calls": 637, "avrg": 0.006287181396125063, "min": 0.005349397659301758, "max": 0.008419275283813477, "st-dev": 0.0006333371110026657, "total": 4.004934549331665, "initexec": "2024-09-25 20:44:20.930151", "startexec": "2024-09-25 20:44:21.931400", "endexec": "2024-09-25 20:44:25.936622"} 131 | {"type": "detail", "processid": 11020, "calls": 647, "avrg": 0.006183151115405689, "min": 0.005394697189331055, "max": 0.008336782455444336, "st-dev": 0.0005873417095709525, "total": 4.0004987716674805, "initexec": "2024-09-25 20:44:20.930151", "startexec": "2024-09-25 20:44:21.931459", "endexec": "2024-09-25 20:44:25.932260"} 132 | {"type": "detail", "processid": 11020, "calls": 0, "err": "Exception: Random exception"} 133 | {"type": "detail", "processid": 13528, "calls": 636, "avrg": 0.0062946984602970145, "min": 0.005429506301879883, "max": 0.009900331497192383, "st-dev": 0.0006333227787227091, "total": 4.003428220748901, "initexec": "2024-09-25 20:44:20.936752", "startexec": "2024-09-25 20:44:21.931982", "endexec": "2024-09-25 20:44:25.935542"} 134 | {"type": "detail", "processid": 13528, "calls": 649, "avrg": 0.006164203623226501, "min": 0.005378246307373047, "max": 0.008157730102539062, "st-dev": 0.0005743999981698867, "total": 4.000568151473999, "initexec": "2024-09-25 20:44:20.936752", "startexec": "2024-09-25 20:44:21.931982", "endexec": "2024-09-25 20:44:25.932814"} 135 | {"type": "detail", "processid": 13528, "calls": 643, "avrg": 0.006220789385805976, "min": 0.005471467971801758, "max": 0.01005411148071289, "st-dev": 0.0006060972006261555, "total": 3.999967575073242, "initexec": "2024-09-25 20:44:20.936752", "startexec": "2024-09-25 20:44:21.932669", "endexec": "2024-09-25 20:44:25.932814"} 136 | {"type": "detail", "processid": 13528, "calls": 0, "err": "Exception: Random exception"} 137 | {"type": "core", "plan_executors": 16, "plan_executors_detail": [4, 4], "real_executors": 13, "group": "", "total_calls": 8362, "total_call_per_sec": 2088.935724264474, "avrg_time": 0.0062232647223156535, "std_deviation": 0.0005981142794361308, "endexec": "2024-09-25 20:44:26.123675"} 138 | {"type": "detail", "processid": 2552, "calls": 646, "avrg": 0.0061953041944710465, "min": 0.005514860153198242, "max": 0.008711814880371094, "st-dev": 0.0005822407742914211, "total": 4.002166509628296, "initexec": "2024-09-25 20:44:28.063030", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.716341"} 139 | {"type": "detail", "processid": 2552, "calls": 0, "err": "Exception: Random exception"} 140 | {"type": "detail", "processid": 25108, "calls": 0, "err": "Exception: Random exception"} 141 | {"type": "detail", "processid": 2552, "calls": 0, "err": "Exception: Random exception"} 142 | {"type": "detail", "processid": 2552, "calls": 648, "avrg": 0.006174597843193713, "min": 0.005506753921508789, "max": 0.008459091186523438, "st-dev": 0.0005758544155518621, "total": 4.001139402389526, "initexec": "2024-09-25 20:44:28.064030", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.715245"} 143 | {"type": "detail", "processid": 25108, "calls": 648, "avrg": 0.006176312764485677, "min": 0.00551915168762207, "max": 0.008439064025878906, "st-dev": 0.0005458387124614683, "total": 4.002250671386719, "initexec": "2024-09-25 20:44:28.061721", "startexec": "2024-09-25 20:44:28.715103", "endexec": "2024-09-25 20:44:32.717424"} 144 | {"type": "detail", "processid": 25108, "calls": 646, "avrg": 0.006192831432118136, "min": 0.005450248718261719, "max": 0.00839996337890625, "st-dev": 0.0005582333561892004, "total": 4.000569105148315, "initexec": "2024-09-25 20:44:28.063030", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.714688"} 145 | {"type": "detail", "processid": 25108, "calls": 0, "err": "Exception: Random exception"} 146 | {"type": "detail", "processid": 7232, "calls": 647, "avrg": 0.006189094260450124, "min": 0.005498170852661133, "max": 0.008212804794311523, "st-dev": 0.0005523746308505185, "total": 4.0043439865112305, "initexec": "2024-09-25 20:44:28.074035", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.718517"} 147 | {"type": "detail", "processid": 7232, "calls": 651, "avrg": 0.006147072245631533, "min": 0.005471706390380859, "max": 0.008252143859863281, "st-dev": 0.0005317805028926207, "total": 4.001744031906128, "initexec": "2024-09-25 20:44:28.076337", "startexec": "2024-09-25 20:44:28.713448", "endexec": "2024-09-25 20:44:32.715245"} 148 | {"type": "detail", "processid": 7232, "calls": 0, "err": "Exception: Random exception"} 149 | {"type": "detail", "processid": 7232, "calls": 648, "avrg": 0.006180752206731726, "min": 0.005498170852661133, "max": 0.008315801620483398, "st-dev": 0.0005871789816752694, "total": 4.005127429962158, "initexec": "2024-09-25 20:44:28.076399", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.719130"} 150 | {"type": "detail", "processid": 18936, "calls": 646, "avrg": 0.0061962519636833266, "min": 0.005456686019897461, "max": 0.009044408798217773, "st-dev": 0.0005608996119754581, "total": 4.002778768539429, "initexec": "2024-09-25 20:44:28.103852", "startexec": "2024-09-25 20:44:28.714554", "endexec": "2024-09-25 20:44:32.717424"} 151 | {"type": "detail", "processid": 18936, "calls": 646, "avrg": 0.006200529842553862, "min": 0.005507469177246094, "max": 0.0084381103515625, "st-dev": 0.0005679854095963676, "total": 4.005542278289795, "initexec": "2024-09-25 20:44:28.104857", "startexec": "2024-09-25 20:44:28.713448", "endexec": "2024-09-25 20:44:32.719130"} 152 | {"type": "detail", "processid": 18936, "calls": 650, "avrg": 0.006162791618934045, "min": 0.005533456802368164, "max": 0.008430719375610352, "st-dev": 0.0005704716726609122, "total": 4.005814552307129, "initexec": "2024-09-25 20:44:28.104857", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.720183"} 153 | {"type": "detail", "processid": 18936, "calls": 646, "avrg": 0.006198670841961084, "min": 0.005477428436279297, "max": 0.008277416229248047, "st-dev": 0.0005627406091841564, "total": 4.00434136390686, "initexec": "2024-09-25 20:44:28.104857", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.718517"} 154 | {"type": "detail", "processid": 14364, "calls": 646, "avrg": 0.006197141419992358, "min": 0.005461931228637695, "max": 0.008357763290405273, "st-dev": 0.0005754163789667971, "total": 4.0033533573150635, "initexec": "2024-09-25 20:44:28.135394", "startexec": "2024-09-25 20:44:28.714554", "endexec": "2024-09-25 20:44:32.717978"} 155 | {"type": "detail", "processid": 14364, "calls": 646, "avrg": 0.006195864810294042, "min": 0.0055234432220458984, "max": 0.008523702621459961, "st-dev": 0.0005718435632970127, "total": 4.002528667449951, "initexec": "2024-09-25 20:44:28.135394", "startexec": "2024-09-25 20:44:28.714554", "endexec": "2024-09-25 20:44:32.717424"} 156 | {"type": "detail", "processid": 7108, "calls": 0, "err": "Exception: Random exception"} 157 | {"type": "detail", "processid": 14364, "calls": 649, "avrg": 0.0061720828245894754, "min": 0.005494594573974609, "max": 0.008226394653320312, "st-dev": 0.00053606748630561, "total": 4.005681753158569, "initexec": "2024-09-25 20:44:28.136382", "startexec": "2024-09-25 20:44:28.713448", "endexec": "2024-09-25 20:44:32.719130"} 158 | {"type": "detail", "processid": 14364, "calls": 648, "avrg": 0.006181321026366434, "min": 0.005476474761962891, "max": 0.008489847183227539, "st-dev": 0.0005439082526594431, "total": 4.005496025085449, "initexec": "2024-09-25 20:44:28.136382", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.719643"} 159 | {"type": "detail", "processid": 7108, "calls": 0, "err": "Exception: Random exception"} 160 | {"type": "detail", "processid": 7108, "calls": 643, "avrg": 0.006221048939469072, "min": 0.005450248718261719, "max": 0.008478879928588867, "st-dev": 0.0005455309148316552, "total": 4.000134468078613, "initexec": "2024-09-25 20:44:28.140385", "startexec": "2024-09-25 20:44:28.714554", "endexec": "2024-09-25 20:44:32.714688"} 161 | {"type": "detail", "processid": 7108, "calls": 651, "avrg": 0.006144160316103981, "min": 0.005516529083251953, "max": 0.008421659469604492, "st-dev": 0.0005354672980963717, "total": 3.9998483657836914, "initexec": "2024-09-25 20:44:28.141400", "startexec": "2024-09-25 20:44:28.713448", "endexec": "2024-09-25 20:44:32.713572"} 162 | {"type": "detail", "processid": 29936, "calls": 0, "err": "Exception: Random exception"} 163 | {"type": "detail", "processid": 19684, "calls": 646, "avrg": 0.006193874052065445, "min": 0.0054781436920166016, "max": 0.008582115173339844, "st-dev": 0.0005538601968597333, "total": 4.001242637634277, "initexec": "2024-09-25 20:44:28.147401", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.715245"} 164 | {"type": "detail", "processid": 29936, "calls": 646, "avrg": 0.006201401214481508, "min": 0.005520820617675781, "max": 0.008469820022583008, "st-dev": 0.0005826338042703921, "total": 4.006105184555054, "initexec": "2024-09-25 20:44:28.150018", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.720183"} 165 | {"type": "detail", "processid": 29936, "calls": 649, "avrg": 0.006167589607885328, "min": 0.0055272579193115234, "max": 0.008606672286987305, "st-dev": 0.0005329404365890923, "total": 4.002765655517578, "initexec": "2024-09-25 20:44:28.150018", "startexec": "2024-09-25 20:44:28.714554", "endexec": "2024-09-25 20:44:32.717424"} 166 | {"type": "detail", "processid": 19684, "calls": 648, "avrg": 0.0061788879058979175, "min": 0.0055086612701416016, "max": 0.008281230926513672, "st-dev": 0.0005449477856485068, "total": 4.003919363021851, "initexec": "2024-09-25 20:44:28.147401", "startexec": "2024-09-25 20:44:28.714002", "endexec": "2024-09-25 20:44:32.717978"} 167 | {"type": "detail", "processid": 29936, "calls": 0, "err": "Exception: Random exception"} 168 | {"type": "detail", "processid": 19684, "calls": 644, "avrg": 0.006211021301909263, "min": 0.005493640899658203, "max": 0.008310079574584961, "st-dev": 0.0005548605199614643, "total": 3.9998977184295654, "initexec": "2024-09-25 20:44:28.147401", "startexec": "2024-09-25 20:44:28.714554", "endexec": "2024-09-25 20:44:32.714688"} 169 | {"type": "detail", "processid": 19684, "calls": 644, "avrg": 0.00621795580253838, "min": 0.005477428436279297, "max": 0.008478879928588867, "st-dev": 0.0005626731355547503, "total": 4.004363536834717, "initexec": "2024-09-25 20:44:28.147401", "startexec": "2024-09-25 20:44:28.714554", "endexec": "2024-09-25 20:44:32.719130"} 170 | {"type": "core", "plan_executors": 32, "plan_executors_detail": [8, 4], "real_executors": 23, "group": "", "total_calls": 14882, "total_call_per_sec": 3717.588154028626, "avrg_time": 0.006186806888513368, "std_deviation": 0.000558076019581308, "endexec": "2024-09-25 20:44:33.025476"} 171 | {"type": "detail", "processid": 5572, "calls": 586, "avrg": 0.006828318683767482, "min": 0.0054891109466552734, "max": 0.04897427558898926, "st-dev": 0.0023414382954923224, "total": 4.001394748687744, "initexec": "2024-09-25 20:44:35.877673", "startexec": "2024-09-25 20:44:35.877673", "endexec": "2024-09-25 20:44:39.880782"} 172 | {"type": "detail", "processid": 12032, "calls": 589, "avrg": 0.006800397749870054, "min": 0.0054891109466552734, "max": 0.03534054756164551, "st-dev": 0.002087644092261567, "total": 4.005434274673462, "initexec": "2024-09-25 20:44:35.891976", "startexec": "2024-09-25 20:44:35.892526", "endexec": "2024-09-25 20:44:39.898455"} 173 | {"type": "detail", "processid": 5572, "calls": 591, "avrg": 0.006769728942974368, "min": 0.005486011505126953, "max": 0.020965576171875, "st-dev": 0.001516913722651759, "total": 4.000909805297852, "initexec": "2024-09-25 20:44:35.882818", "startexec": "2024-09-25 20:44:35.882818", "endexec": "2024-09-25 20:44:39.883989"} 174 | {"type": "detail", "processid": 14840, "calls": 0, "err": "Exception: Random exception"} 175 | {"type": "detail", "processid": 12032, "calls": 587, "avrg": 0.006818896867144453, "min": 0.005489349365234375, "max": 0.02536606788635254, "st-dev": 0.001645978210607064, "total": 4.002692461013794, "initexec": "2024-09-25 20:44:35.892526", "startexec": "2024-09-25 20:44:35.892526", "endexec": "2024-09-25 20:44:39.895635"} 176 | {"type": "detail", "processid": 14840, "calls": 593, "avrg": 0.00674534366665562, "min": 0.005545616149902344, "max": 0.04907798767089844, "st-dev": 0.0020808370064510882, "total": 3.9999887943267822, "initexec": "2024-09-25 20:44:35.889239", "startexec": "2024-09-25 20:44:35.889239", "endexec": "2024-09-25 20:44:39.889605"} 177 | {"type": "detail", "processid": 14840, "calls": 594, "avrg": 0.006743760622711695, "min": 0.005489349365234375, "max": 0.048462867736816406, "st-dev": 0.002059765670150146, "total": 4.005793809890747, "initexec": "2024-09-25 20:44:35.889239", "startexec": "2024-09-25 20:44:35.889239", "endexec": "2024-09-25 20:44:39.895635"} 178 | {"type": "detail", "processid": 5572, "calls": 587, "avrg": 0.006824381712957379, "min": 0.005537271499633789, "max": 0.030057430267333984, "st-dev": 0.001680874487046195, "total": 4.0059120655059814, "initexec": "2024-09-25 20:44:35.882818", "startexec": "2024-09-25 20:44:35.882818", "endexec": "2024-09-25 20:44:39.890318"} 179 | {"type": "detail", "processid": 12032, "calls": 590, "avrg": 0.006790164365606793, "min": 0.0053863525390625, "max": 0.02089095115661621, "st-dev": 0.0015066542935929879, "total": 4.006196975708008, "initexec": "2024-09-25 20:44:35.892526", "startexec": "2024-09-25 20:44:35.892526", "endexec": "2024-09-25 20:44:39.900179"} 180 | {"type": "detail", "processid": 5572, "calls": 614, "avrg": 0.006526999830811342, "min": 0.005491495132446289, "max": 0.015217781066894531, "st-dev": 0.0008845814499375341, "total": 4.007577896118164, "initexec": "2024-09-25 20:44:35.882818", "startexec": "2024-09-25 20:44:35.882818", "endexec": "2024-09-25 20:44:39.890932"} 181 | {"type": "detail", "processid": 14840, "calls": 586, "avrg": 0.006829550648712054, "min": 0.005457878112792969, "max": 0.028955936431884766, "st-dev": 0.0016897971883337907, "total": 4.002116680145264, "initexec": "2024-09-25 20:44:35.903082", "startexec": "2024-09-25 20:44:35.903082", "endexec": "2024-09-25 20:44:39.905656"} 182 | {"type": "detail", "processid": 12032, "calls": 615, "avrg": 0.006506183670788276, "min": 0.00549626350402832, "max": 0.015116453170776367, "st-dev": 0.0009111394659596952, "total": 4.00130295753479, "initexec": "2024-09-25 20:44:35.893165", "startexec": "2024-09-25 20:44:35.893165", "endexec": "2024-09-25 20:44:39.895026"} 183 | {"type": "detail", "processid": 25656, "calls": 0, "err": "Exception: Random exception"} 184 | {"type": "detail", "processid": 25656, "calls": 595, "avrg": 0.006729641681959649, "min": 0.005479097366333008, "max": 0.049069881439208984, "st-dev": 0.002011954016853938, "total": 4.004136800765991, "initexec": "2024-09-25 20:44:36.117347", "startexec": "2024-09-25 20:44:36.117347", "endexec": "2024-09-25 20:44:40.122374"} 185 | {"type": "detail", "processid": 25656, "calls": 0, "err": "Exception: Random exception"} 186 | {"type": "detail", "processid": 25656, "calls": 601, "avrg": 0.006661247294675094, "min": 0.0055158138275146484, "max": 0.02100205421447754, "st-dev": 0.0011502466803545038, "total": 4.0034096240997314, "initexec": "2024-09-25 20:44:36.123903", "startexec": "2024-09-25 20:44:36.123903", "endexec": "2024-09-25 20:44:40.127546"} 187 | {"type": "detail", "processid": 32500, "calls": 609, "avrg": 0.006568590016983608, "min": 0.005431652069091797, "max": 0.02833271026611328, "st-dev": 0.0014609333871333145, "total": 4.000271320343018, "initexec": "2024-09-25 20:44:36.285514", "startexec": "2024-09-25 20:44:36.285514", "endexec": "2024-09-25 20:44:40.287347"} 188 | {"type": "detail", "processid": 32500, "calls": 602, "avrg": 0.006643940840052607, "min": 0.005446434020996094, "max": 0.03652811050415039, "st-dev": 0.0016416231310735659, "total": 3.99965238571167, "initexec": "2024-09-25 20:44:36.286064", "startexec": "2024-09-25 20:44:36.286064", "endexec": "2024-09-25 20:44:40.286142"} 189 | {"type": "detail", "processid": 32500, "calls": 602, "avrg": 0.006653565505018266, "min": 0.00557255744934082, "max": 0.04834771156311035, "st-dev": 0.0019292834138803859, "total": 4.005446434020996, "initexec": "2024-09-25 20:44:36.286064", "startexec": "2024-09-25 20:44:36.286064", "endexec": "2024-09-25 20:44:40.292157"} 190 | {"type": "detail", "processid": 32500, "calls": 606, "avrg": 0.0066061617911058685, "min": 0.005486726760864258, "max": 0.014148473739624023, "st-dev": 0.0009356111854666007, "total": 4.003334045410156, "initexec": "2024-09-25 20:44:36.287167", "startexec": "2024-09-25 20:44:36.287167", "endexec": "2024-09-25 20:44:40.291572"} 191 | {"type": "detail", "processid": 26176, "calls": 0, "err": "Exception: Random exception"} 192 | {"type": "detail", "processid": 26176, "calls": 604, "avrg": 0.006632559741569671, "min": 0.005532503128051758, "max": 0.04713153839111328, "st-dev": 0.0019050140948743467, "total": 4.006066083908081, "initexec": "2024-09-25 20:44:36.336380", "startexec": "2024-09-25 20:44:36.336380", "endexec": "2024-09-25 20:44:40.343700"} 193 | {"type": "detail", "processid": 26176, "calls": 607, "avrg": 0.006590517191753356, "min": 0.005452394485473633, "max": 0.048197031021118164, "st-dev": 0.0019093091138449997, "total": 4.000443935394287, "initexec": "2024-09-25 20:44:36.336980", "startexec": "2024-09-25 20:44:36.336980", "endexec": "2024-09-25 20:44:40.337890"} 194 | {"type": "detail", "processid": 3204, "calls": 0, "err": "Exception: Random exception"} 195 | {"type": "detail", "processid": 26176, "calls": 602, "avrg": 0.006649780115019839, "min": 0.005479097366333008, "max": 0.03346395492553711, "st-dev": 0.0015242560324703407, "total": 4.003167629241943, "initexec": "2024-09-25 20:44:36.337513", "startexec": "2024-09-25 20:44:36.338059", "endexec": "2024-09-25 20:44:40.341963"} 196 | {"type": "detail", "processid": 3204, "calls": 607, "avrg": 0.006601524902921925, "min": 0.005556821823120117, "max": 0.012683391571044922, "st-dev": 0.0008866436913173813, "total": 4.007125616073608, "initexec": "2024-09-25 20:44:36.360206", "startexec": "2024-09-25 20:44:36.360206", "endexec": "2024-09-25 20:44:40.368021"} 197 | {"type": "detail", "processid": 3204, "calls": 611, "avrg": 0.006556514437186933, "min": 0.00552058219909668, "max": 0.01307058334350586, "st-dev": 0.00086682050093156, "total": 4.006030321121216, "initexec": "2024-09-25 20:44:36.360206", "startexec": "2024-09-25 20:44:36.360206", "endexec": "2024-09-25 20:44:40.367966"} 198 | {"type": "detail", "processid": 22760, "calls": 615, "avrg": 0.006512577553105548, "min": 0.005431652069091797, "max": 0.013775110244750977, "st-dev": 0.0008520369586425696, "total": 4.005235195159912, "initexec": "2024-09-25 20:44:36.407840", "startexec": "2024-09-25 20:44:36.407840", "endexec": "2024-09-25 20:44:40.413416"} 199 | {"type": "detail", "processid": 22760, "calls": 0, "err": "Exception: Random exception"} 200 | {"type": "detail", "processid": 25564, "calls": 612, "avrg": 0.006539314790488848, "min": 0.0054891109466552734, "max": 0.012534141540527344, "st-dev": 0.0007915398250317988, "total": 4.002060651779175, "initexec": "2024-09-25 20:44:36.478714", "startexec": "2024-09-25 20:44:36.478714", "endexec": "2024-09-25 20:44:40.481597"} 201 | {"type": "detail", "processid": 22760, "calls": 0, "err": "Exception: Random exception"} 202 | {"type": "detail", "processid": 22760, "calls": 607, "avrg": 0.006591403307592653, "min": 0.005478382110595703, "max": 0.01425623893737793, "st-dev": 0.0008398160637804644, "total": 4.00098180770874, "initexec": "2024-09-25 20:44:36.409032", "startexec": "2024-09-25 20:44:36.409032", "endexec": "2024-09-25 20:44:40.410502"} 203 | {"type": "detail", "processid": 3204, "calls": 618, "avrg": 0.006481701887927009, "min": 0.005523681640625, "max": 0.017855167388916016, "st-dev": 0.000884544497368346, "total": 4.005691766738892, "initexec": "2024-09-25 20:44:36.360759", "startexec": "2024-09-25 20:44:36.360759", "endexec": "2024-09-25 20:44:40.366904"} 204 | {"type": "detail", "processid": 27852, "calls": 0, "err": "Exception: Random exception"} 205 | {"type": "detail", "processid": 25564, "calls": 614, "avrg": 0.006514531393392855, "min": 0.0054666996002197266, "max": 0.018680572509765625, "st-dev": 0.0009611250017635193, "total": 3.999922275543213, "initexec": "2024-09-25 20:44:36.479244", "startexec": "2024-09-25 20:44:36.479244", "endexec": "2024-09-25 20:44:40.479894"} 206 | {"type": "detail", "processid": 25564, "calls": 618, "avrg": 0.00648141756026876, "min": 0.0054857730865478516, "max": 0.020394563674926758, "st-dev": 0.0009966791152456608, "total": 4.005516052246094, "initexec": "2024-09-25 20:44:36.479244", "startexec": "2024-09-25 20:44:36.479244", "endexec": "2024-09-25 20:44:40.485518"} 207 | {"type": "detail", "processid": 27852, "calls": 619, "avrg": 0.006466625580302348, "min": 0.005486011505126953, "max": 0.015633821487426758, "st-dev": 0.0008301687602345001, "total": 4.002841234207153, "initexec": "2024-09-25 20:44:36.450280", "startexec": "2024-09-25 20:44:36.450280", "endexec": "2024-09-25 20:44:40.454018"} 208 | {"type": "detail", "processid": 27340, "calls": 613, "avrg": 0.00652342208252451, "min": 0.005479574203491211, "max": 0.012928485870361328, "st-dev": 0.0007747454992843065, "total": 3.9988577365875244, "initexec": "2024-09-25 20:44:36.482890", "startexec": "2024-09-25 20:44:36.482890", "endexec": "2024-09-25 20:44:40.483294"} 209 | {"type": "detail", "processid": 25564, "calls": 0, "err": "Exception: Random exception"} 210 | {"type": "detail", "processid": 27852, "calls": 607, "avrg": 0.0066006658890298405, "min": 0.005458831787109375, "max": 0.048377037048339844, "st-dev": 0.0019337404869061198, "total": 4.006604194641113, "initexec": "2024-09-25 20:44:36.450280", "startexec": "2024-09-25 20:44:36.450842", "endexec": "2024-09-25 20:44:40.457916"} 211 | {"type": "detail", "processid": 27852, "calls": 604, "avrg": 0.00662351641433918, "min": 0.005505800247192383, "max": 0.048377037048339844, "st-dev": 0.0019134377794280313, "total": 4.000603914260864, "initexec": "2024-09-25 20:44:36.450903", "startexec": "2024-09-25 20:44:36.450903", "endexec": "2024-09-25 20:44:40.452313"} 212 | {"type": "detail", "processid": 27340, "calls": 615, "avrg": 0.006515556816163102, "min": 0.0054492950439453125, "max": 0.016461849212646484, "st-dev": 0.0009081265433454945, "total": 4.007067441940308, "initexec": "2024-09-25 20:44:36.483519", "startexec": "2024-09-25 20:44:36.483519", "endexec": "2024-09-25 20:44:40.491262"} 213 | {"type": "detail", "processid": 27340, "calls": 617, "avrg": 0.006485458710978058, "min": 0.0054891109466552734, "max": 0.015825271606445312, "st-dev": 0.0008838120134375013, "total": 4.001528024673462, "initexec": "2024-09-25 20:44:36.487837", "startexec": "2024-09-25 20:44:36.487837", "endexec": "2024-09-25 20:44:40.490036"} 214 | {"type": "detail", "processid": 27340, "calls": 605, "avrg": 0.006610333229884628, "min": 0.005580902099609375, "max": 0.04775118827819824, "st-dev": 0.0018935574175705824, "total": 3.9992516040802, "initexec": "2024-09-25 20:44:36.487837", "startexec": "2024-09-25 20:44:36.487837", "endexec": "2024-09-25 20:44:40.488875"} 215 | {"type": "detail", "processid": 27924, "calls": 605, "avrg": 0.006620901675263712, "min": 0.005475044250488281, "max": 0.04648303985595703, "st-dev": 0.0018346005032617797, "total": 4.005645513534546, "initexec": "2024-09-25 20:44:36.570483", "startexec": "2024-09-25 20:44:36.570483", "endexec": "2024-09-25 20:44:40.576670"} 216 | {"type": "detail", "processid": 27924, "calls": 608, "avrg": 0.006586046595322459, "min": 0.005452394485473633, "max": 0.04591107368469238, "st-dev": 0.0018315253822622586, "total": 4.004316329956055, "initexec": "2024-09-25 20:44:36.571065", "startexec": "2024-09-25 20:44:36.571065", "endexec": "2024-09-25 20:44:40.576670"} 217 | {"type": "detail", "processid": 27924, "calls": 0, "err": "Exception: Random exception"} 218 | {"type": "detail", "processid": 27924, "calls": 611, "avrg": 0.006551608711529871, "min": 0.005589008331298828, "max": 0.011878013610839844, "st-dev": 0.0007720154569181024, "total": 4.003032922744751, "initexec": "2024-09-25 20:44:36.571585", "startexec": "2024-09-25 20:44:36.571585", "endexec": "2024-09-25 20:44:40.575023"} 219 | {"type": "detail", "processid": 3480, "calls": 609, "avrg": 0.006572909347333736, "min": 0.005482673645019531, "max": 0.04901885986328125, "st-dev": 0.0019513625139418308, "total": 4.002901792526245, "initexec": "2024-09-25 20:44:36.584606", "startexec": "2024-09-25 20:44:36.584606", "endexec": "2024-09-25 20:44:40.587734"} 220 | {"type": "detail", "processid": 3480, "calls": 610, "avrg": 0.0065679624432423075, "min": 0.0055789947509765625, "max": 0.04907798767089844, "st-dev": 0.0019425541036789367, "total": 4.006457090377808, "initexec": "2024-09-25 20:44:36.585128", "startexec": "2024-09-25 20:44:36.585128", "endexec": "2024-09-25 20:44:40.592586"} 221 | {"type": "detail", "processid": 3480, "calls": 0, "err": "Exception: Random exception"} 222 | {"type": "detail", "processid": 3480, "calls": 609, "avrg": 0.006572549957751445, "min": 0.005431652069091797, "max": 0.026409626007080078, "st-dev": 0.0011057846203469126, "total": 4.00268292427063, "initexec": "2024-09-25 20:44:36.585678", "startexec": "2024-09-25 20:44:36.585678", "endexec": "2024-09-25 20:44:40.588789"} 223 | {"type": "detail", "processid": 11520, "calls": 613, "avrg": 0.006542362163350788, "min": 0.005491495132446289, "max": 0.01595902442932129, "st-dev": 0.0008747734758433194, "total": 4.010468006134033, "initexec": "2024-09-25 20:44:36.608668", "startexec": "2024-09-25 20:44:36.608668", "endexec": "2024-09-25 20:44:40.619537"} 224 | {"type": "detail", "processid": 11520, "calls": 0, "err": "Exception: Random exception"} 225 | {"type": "detail", "processid": 11520, "calls": 0, "err": "Exception: Random exception"} 226 | {"type": "detail", "processid": 11520, "calls": 605, "avrg": 0.006613265187287134, "min": 0.0054895877838134766, "max": 0.048377037048339844, "st-dev": 0.0018972509697431817, "total": 4.001025438308716, "initexec": "2024-09-25 20:44:36.609286", "startexec": "2024-09-25 20:44:36.609286", "endexec": "2024-09-25 20:44:40.610622"} 227 | {"type": "detail", "processid": 24160, "calls": 611, "avrg": 0.006554204391379598, "min": 0.005458831787109375, "max": 0.014833927154541016, "st-dev": 0.0008931071558784983, "total": 4.004618883132935, "initexec": "2024-09-25 20:44:36.636394", "startexec": "2024-09-25 20:44:36.636394", "endexec": "2024-09-25 20:44:40.641512"} 228 | {"type": "detail", "processid": 24160, "calls": 610, "avrg": 0.006566502227157843, "min": 0.0055446624755859375, "max": 0.01433563232421875, "st-dev": 0.0008820426548006707, "total": 4.005566358566284, "initexec": "2024-09-25 20:44:36.637027", "startexec": "2024-09-25 20:44:36.637027", "endexec": "2024-09-25 20:44:40.643631"} 229 | {"type": "detail", "processid": 24160, "calls": 615, "avrg": 0.006510916764174051, "min": 0.005437612533569336, "max": 0.019030094146728516, "st-dev": 0.0009405266295998919, "total": 4.004213809967041, "initexec": "2024-09-25 20:44:36.637571", "startexec": "2024-09-25 20:44:36.637571", "endexec": "2024-09-25 20:44:40.642055"} 230 | {"type": "detail", "processid": 24160, "calls": 617, "avrg": 0.0064883904480277236, "min": 0.005502223968505859, "max": 0.015825271606445312, "st-dev": 0.0008771903775143433, "total": 4.0033369064331055, "initexec": "2024-09-25 20:44:36.637646", "startexec": "2024-09-25 20:44:36.637646", "endexec": "2024-09-25 20:44:40.641512"} 231 | {"type": "detail", "processid": 29860, "calls": 608, "avrg": 0.006587252805107518, "min": 0.005487918853759766, "max": 0.013786554336547852, "st-dev": 0.0008809194817299727, "total": 4.005049705505371, "initexec": "2024-09-25 20:44:36.687289", "startexec": "2024-09-25 20:44:36.687289", "endexec": "2024-09-25 20:44:40.693435"} 232 | {"type": "detail", "processid": 29860, "calls": 609, "avrg": 0.006567156373573642, "min": 0.005486726760864258, "max": 0.014288187026977539, "st-dev": 0.0008562448065810999, "total": 3.9993982315063477, "initexec": "2024-09-25 20:44:36.687289", "startexec": "2024-09-25 20:44:36.687289", "endexec": "2024-09-25 20:44:40.687386"} 233 | {"type": "detail", "processid": 29860, "calls": 614, "avrg": 0.006520559422744602, "min": 0.005489349365234375, "max": 0.018062353134155273, "st-dev": 0.000897618916396476, "total": 4.0036234855651855, "initexec": "2024-09-25 20:44:36.687903", "startexec": "2024-09-25 20:44:36.687903", "endexec": "2024-09-25 20:44:40.691880"} 234 | {"type": "detail", "processid": 29860, "calls": 616, "avrg": 0.0064928059454088085, "min": 0.005502223968505859, "max": 0.013585805892944336, "st-dev": 0.0008900373089490185, "total": 3.999568462371826, "initexec": "2024-09-25 20:44:36.687903", "startexec": "2024-09-25 20:44:36.687903", "endexec": "2024-09-25 20:44:40.687936"} 235 | {"type": "core", "plan_executors": 64, "plan_executors_detail": [16, 4], "real_executors": 51, "group": "", "total_calls": 30912, "total_call_per_sec": 7719.482380802797, "avrg_time": 0.006606660587350961, "std_deviation": 0.0013415334009837308, "endexec": "2024-09-25 20:44:40.942336"} 236 | ############### State: Error, Duration: 21.7 sec (21.7 seconds) ############### 237 | -------------------------------------------------------------------------------- /input/prf_cassandra-W1-low-2024-10-07.txt: -------------------------------------------------------------------------------- 1 | ############### 2024-10-07 09:06:51.706216 ############### 2 | {"type":"headr","label":"cassandra-110538-W1-low","bulk":[200,10],"duration":5,"cpu":12,"mem":"15.2 GB","mem_free":"5.2 GB","host":"HCI-L3204/172.31.128.1","now":"2024-10-07 09:06:51.706216"} 3 | {"type":"detail","processid":15392,"calls":100,"avrg":0.04605551800006651,"min":0.028453799997805618,"max":0.11998010000388604,"st-dev":0.01396245263836289,"total":4.605551800006651,"initexec":"2024-10-07 09:06:55.562050","startexec":"2024-10-07 09:06:55.562050","endexec":"2024-10-07 09:07:00.588229"} 4 | {"type":"detail","processid":22396,"calls":100,"avrg":0.04602383199991891,"min":0.03069359999790322,"max":0.1104017999896314,"st-dev":0.011682031904504744,"total":4.602383199991891,"initexec":"2024-10-07 09:06:55.567618","startexec":"2024-10-07 09:06:55.567618","endexec":"2024-10-07 09:07:00.572755"} 5 | {"type":"core","plan_executors":2,"plan_executors_detail":[2,1],"real_executors":2,"group":"1x threads","total_calls":200,"total_call_per_sec_raw":43.44079318544964,"total_call_per_sec":8688.158637089928,"avrg_time":0.046039674999992716,"std_deviation":0.012822242271433817,"endexec":"2024-10-07 09:07:00.757860"} 6 | {"type":"detail","processid":18716,"calls":100,"avrg":0.04663490700011607,"min":0.03173600000445731,"max":0.0762247000093339,"st-dev":0.009362514524340783,"total":4.663490700011607,"initexec":"2024-10-07 09:07:04.841761","startexec":"2024-10-07 09:07:04.842686","endexec":"2024-10-07 09:07:09.866037"} 7 | {"type":"detail","processid":23936,"calls":101,"avrg":0.04566342079243162,"min":0.0317265000048792,"max":0.09115889998793136,"st-dev":0.010489857830221768,"total":4.612005500035593,"initexec":"2024-10-07 09:07:04.727149","startexec":"2024-10-07 09:07:04.727149","endexec":"2024-10-07 09:07:09.744927"} 8 | {"type":"detail","processid":26484,"calls":100,"avrg":0.04640899100020761,"min":0.02922150000813417,"max":0.07789100000809412,"st-dev":0.009645959073947451,"total":4.640899100020761,"initexec":"2024-10-07 09:07:04.763005","startexec":"2024-10-07 09:07:04.763005","endexec":"2024-10-07 09:07:09.808944"} 9 | {"type":"detail","processid":14756,"calls":99,"avrg":0.04672212727342008,"min":0.028102800002670847,"max":0.09830240000155754,"st-dev":0.011520826558418714,"total":4.625490600068588,"initexec":"2024-10-07 09:07:06.153211","startexec":"2024-10-07 09:07:06.153211","endexec":"2024-10-07 09:07:11.184577"} 10 | {"type":"core","plan_executors":4,"plan_executors_detail":[4,1],"real_executors":4,"group":"1x threads","total_calls":400,"total_call_per_sec_raw":86.28618776270292,"total_call_per_sec":17257.237552540584,"avrg_time":0.046357361516543835,"std_deviation":0.01025478949673218,"endexec":"2024-10-07 09:07:11.288265"} 11 | {"type":"detail","processid":26320,"calls":92,"avrg":0.05117917608700025,"min":0.03329979999398347,"max":0.08824929999536835,"st-dev":0.011463905726367286,"total":4.708484200004023,"initexec":"2024-10-07 09:07:15.651431","startexec":"2024-10-07 09:07:15.651431","endexec":"2024-10-07 09:07:20.687817"} 12 | {"type":"detail","processid":24240,"calls":89,"avrg":0.05259281572944019,"min":0.0343661999941105,"max":0.09814919999917038,"st-dev":0.013721044315172154,"total":4.680760599920177,"initexec":"2024-10-07 09:07:15.655619","startexec":"2024-10-07 09:07:15.655619","endexec":"2024-10-07 09:07:20.698736"} 13 | {"type":"detail","processid":25556,"calls":89,"avrg":0.05300710786538188,"min":0.03525010000157636,"max":0.11532599999918602,"st-dev":0.01218421467419157,"total":4.717632600018987,"initexec":"2024-10-07 09:07:15.630542","startexec":"2024-10-07 09:07:15.630542","endexec":"2024-10-07 09:07:20.687817"} 14 | {"type":"detail","processid":17580,"calls":90,"avrg":0.05207137111137854,"min":0.03325950000726152,"max":0.09046620001026895,"st-dev":0.011410252689915206,"total":4.6864234000240685,"initexec":"2024-10-07 09:07:15.771499","startexec":"2024-10-07 09:07:15.772082","endexec":"2024-10-07 09:07:20.799933"} 15 | {"type":"detail","processid":10204,"calls":91,"avrg":0.05177729670358131,"min":0.034617699988302775,"max":0.0809097000019392,"st-dev":0.010413927299836022,"total":4.711734000025899,"initexec":"2024-10-07 09:07:15.707401","startexec":"2024-10-07 09:07:15.707401","endexec":"2024-10-07 09:07:20.757851"} 16 | {"type":"detail","processid":8088,"calls":89,"avrg":0.05243177078628332,"min":0.03580909999436699,"max":0.09469740001077298,"st-dev":0.011262617176973931,"total":4.666427599979215,"initexec":"2024-10-07 09:07:15.795103","startexec":"2024-10-07 09:07:15.795103","endexec":"2024-10-07 09:07:20.848306"} 17 | {"type":"detail","processid":22636,"calls":91,"avrg":0.05114112857260337,"min":0.03189720000955276,"max":0.09854589999304153,"st-dev":0.013006953439274152,"total":4.653842700106907,"initexec":"2024-10-07 09:07:15.779908","startexec":"2024-10-07 09:07:15.779908","endexec":"2024-10-07 09:07:20.816887"} 18 | {"type":"detail","processid":6692,"calls":91,"avrg":0.05155615714314051,"min":0.034627900007762946,"max":0.10299280000617728,"st-dev":0.012344785963422939,"total":4.691610300025786,"initexec":"2024-10-07 09:07:15.611446","startexec":"2024-10-07 09:07:15.611446","endexec":"2024-10-07 09:07:20.629854"} 19 | {"type":"core","plan_executors":8,"plan_executors_detail":[8,1],"real_executors":8,"group":"1x threads","total_calls":722,"total_call_per_sec_raw":153.93613840042053,"total_call_per_sec":30787.227680084106,"avrg_time":0.05196960299985117,"std_deviation":0.011975962660644157,"endexec":"2024-10-07 09:07:21.062796"} 20 | {"type":"detail","processid":23640,"calls":103,"avrg":0.04566810679626516,"min":0.029906899988418445,"max":0.0733089999994263,"st-dev":0.008534654889085913,"total":4.703815000015311,"initexec":"2024-10-07 09:07:25.924857","startexec":"2024-10-07 09:07:25.924857","endexec":"2024-10-07 09:07:30.965736"} 21 | {"type":"detail","processid":23640,"calls":103,"avrg":0.04535800000034992,"min":0.031079799999133684,"max":0.07677669999247883,"st-dev":0.008395430287359437,"total":4.671874000036041,"initexec":"2024-10-07 09:07:25.927857","startexec":"2024-10-07 09:07:25.927857","endexec":"2024-10-07 09:07:30.949673"} 22 | {"type":"detail","processid":25220,"calls":103,"avrg":0.045543181553971274,"min":0.030411900006583892,"max":0.07090340000286233,"st-dev":0.008835421695406137,"total":4.690947700059041,"initexec":"2024-10-07 09:07:25.776552","startexec":"2024-10-07 09:07:25.776552","endexec":"2024-10-07 09:07:30.780799"} 23 | {"type":"detail","processid":25220,"calls":103,"avrg":0.04587776699084766,"min":0.030559599996195175,"max":0.06830840000475291,"st-dev":0.008091521160615603,"total":4.725410000057309,"initexec":"2024-10-07 09:07:25.064519","startexec":"2024-10-07 09:07:25.064519","endexec":"2024-10-07 09:07:30.109702"} 24 | {"type":"core","plan_executors":4,"plan_executors_detail":[2,2],"real_executors":4,"group":"2x threads","total_calls":412,"total_call_per_sec_raw":87.69667435880164,"total_call_per_sec":17539.33487176033,"avrg_time":0.045611763835358504,"std_deviation":0.008464257008116772,"endexec":"2024-10-07 09:07:31.069278"} 25 | {"type":"detail","processid":15396,"calls":94,"avrg":0.04964498829754797,"min":0.03171759999531787,"max":0.13948789999994915,"st-dev":0.01422243578691758,"total":4.66662889996951,"initexec":"2024-10-07 09:07:34.815701","startexec":"2024-10-07 09:07:34.815701","endexec":"2024-10-07 09:07:39.845778"} 26 | {"type":"detail","processid":15396,"calls":94,"avrg":0.04935969468042071,"min":0.03159860000596382,"max":0.15094459999818355,"st-dev":0.015545536397231396,"total":4.639811299959547,"initexec":"2024-10-07 09:07:35.574969","startexec":"2024-10-07 09:07:35.574969","endexec":"2024-10-07 09:07:40.584693"} 27 | {"type":"detail","processid":23120,"calls":97,"avrg":0.04826705979354939,"min":0.03080180000688415,"max":0.18120450001151767,"st-dev":0.01839665764086543,"total":4.681904799974291,"initexec":"2024-10-07 09:07:34.639053","startexec":"2024-10-07 09:07:34.639053","endexec":"2024-10-07 09:07:39.672283"} 28 | {"type":"detail","processid":23120,"calls":93,"avrg":0.04979345376411783,"min":0.03315709999878891,"max":0.1678578999999445,"st-dev":0.01706315466786258,"total":4.6307912000629585,"initexec":"2024-10-07 09:07:34.665105","startexec":"2024-10-07 09:07:34.665105","endexec":"2024-10-07 09:07:39.675271"} 29 | {"type":"detail","processid":11272,"calls":94,"avrg":0.04951137659604973,"min":0.03337509999983013,"max":0.12471949998871423,"st-dev":0.014309165273725706,"total":4.654069400028675,"initexec":"2024-10-07 09:07:34.894474","startexec":"2024-10-07 09:07:34.894474","endexec":"2024-10-07 09:07:39.927223"} 30 | {"type":"detail","processid":13464,"calls":92,"avrg":0.050858267390772795,"min":0.03221029999258462,"max":0.17291449999902397,"st-dev":0.019469048090349838,"total":4.678960599951097,"initexec":"2024-10-07 09:07:36.161886","startexec":"2024-10-07 09:07:36.161886","endexec":"2024-10-07 09:07:41.201408"} 31 | {"type":"detail","processid":11272,"calls":93,"avrg":0.050105556988524105,"min":0.02993140000035055,"max":0.12435519999417011,"st-dev":0.015616502149596478,"total":4.659816799932742,"initexec":"2024-10-07 09:07:35.760460","startexec":"2024-10-07 09:07:35.760460","endexec":"2024-10-07 09:07:40.801450"} 32 | {"type":"detail","processid":13464,"calls":94,"avrg":0.049590146808731465,"min":0.03282089999993332,"max":0.15157210000324994,"st-dev":0.017434811225208402,"total":4.661473800020758,"initexec":"2024-10-07 09:07:36.214710","startexec":"2024-10-07 09:07:36.215487","endexec":"2024-10-07 09:07:41.234884"} 33 | {"type":"core","plan_executors":8,"plan_executors_detail":[4,2],"real_executors":8,"group":"2x threads","total_calls":751,"total_call_per_sec_raw":161.15607554093384,"total_call_per_sec":32231.215108186767,"avrg_time":0.04964131803996425,"std_deviation":0.016507163903969675,"endexec":"2024-10-07 09:07:41.397486"} 34 | {"type":"detail","processid":4808,"calls":63,"avrg":0.07603536349340594,"min":0.037539500001003034,"max":0.30178939999314025,"st-dev":0.038362812062918174,"total":4.790227900084574,"initexec":"2024-10-07 09:07:45.370739","startexec":"2024-10-07 09:07:45.370739","endexec":"2024-10-07 09:07:50.380435"} 35 | {"type":"detail","processid":4808,"calls":65,"avrg":0.07345459076952046,"min":0.04341980000026524,"max":0.1731519000022672,"st-dev":0.026196403630172668,"total":4.77454840001883,"initexec":"2024-10-07 09:07:45.371722","startexec":"2024-10-07 09:07:45.371722","endexec":"2024-10-07 09:07:50.376907"} 36 | {"type":"detail","processid":7160,"calls":66,"avrg":0.07201111212105554,"min":0.03520389999903273,"max":0.19540120000601746,"st-dev":0.03275279397038265,"total":4.7527333999896655,"initexec":"2024-10-07 09:07:46.552057","startexec":"2024-10-07 09:07:46.552057","endexec":"2024-10-07 09:07:51.589563"} 37 | {"type":"detail","processid":7160,"calls":66,"avrg":0.07116208181854966,"min":0.0369836000027135,"max":0.16323109999939334,"st-dev":0.02367702979142617,"total":4.696697400024277,"initexec":"2024-10-07 09:07:45.854876","startexec":"2024-10-07 09:07:45.855874","endexec":"2024-10-07 09:07:50.856209"} 38 | {"type":"detail","processid":11908,"calls":58,"avrg":0.0830944965509216,"min":0.0414355999964755,"max":0.4784448999998858,"st-dev":0.0605357523728548,"total":4.819480799953453,"initexec":"2024-10-07 09:07:45.376303","startexec":"2024-10-07 09:07:45.376303","endexec":"2024-10-07 09:07:50.412102"} 39 | {"type":"detail","processid":11908,"calls":57,"avrg":0.08365894561396553,"min":0.03542669999296777,"max":0.2628049000049941,"st-dev":0.042351134665695546,"total":4.768559899996035,"initexec":"2024-10-07 09:07:45.381053","startexec":"2024-10-07 09:07:45.381053","endexec":"2024-10-07 09:07:50.386971"} 40 | {"type":"detail","processid":20488,"calls":72,"avrg":0.06531409444485486,"min":0.032035399999585934,"max":0.23099480000382755,"st-dev":0.038461794550557156,"total":4.702614800029551,"initexec":"2024-10-07 09:07:47.791667","startexec":"2024-10-07 09:07:47.791667","endexec":"2024-10-07 09:07:52.822375"} 41 | {"type":"detail","processid":20488,"calls":41,"avrg":0.11809286341445929,"min":0.034459200003766455,"max":1.1893329000013182,"st-dev":0.175814602026869,"total":4.841807399992831,"initexec":"2024-10-07 09:07:45.909776","startexec":"2024-10-07 09:07:45.909776","endexec":"2024-10-07 09:07:50.955345"} 42 | {"type":"detail","processid":18716,"calls":62,"avrg":0.07693720645141683,"min":0.0421312999969814,"max":0.38750379999692086,"st-dev":0.045572291393402686,"total":4.770106799987843,"initexec":"2024-10-07 09:07:45.699542","startexec":"2024-10-07 09:07:45.699542","endexec":"2024-10-07 09:07:50.718927"} 43 | {"type":"detail","processid":18716,"calls":65,"avrg":0.0733231753851914,"min":0.04021890000149142,"max":0.281468400004087,"st-dev":0.03510123245719235,"total":4.7660064000374405,"initexec":"2024-10-07 09:07:46.427420","startexec":"2024-10-07 09:07:46.427420","endexec":"2024-10-07 09:07:51.445448"} 44 | {"type":"detail","processid":12000,"calls":66,"avrg":0.07139343484838416,"min":0.03960499999811873,"max":0.2582402000116417,"st-dev":0.03560526359758869,"total":4.711966699993354,"initexec":"2024-10-07 09:07:46.641522","startexec":"2024-10-07 09:07:46.641522","endexec":"2024-10-07 09:07:51.671095"} 45 | {"type":"detail","processid":12000,"calls":55,"avrg":0.08702097818128426,"min":0.042351100011728704,"max":0.3613508999987971,"st-dev":0.05322188314937286,"total":4.786153799970634,"initexec":"2024-10-07 09:07:45.661170","startexec":"2024-10-07 09:07:45.661170","endexec":"2024-10-07 09:07:50.695950"} 46 | {"type":"detail","processid":12396,"calls":62,"avrg":0.07589447258050636,"min":0.04209969998919405,"max":0.28731539999716915,"st-dev":0.04121787607345025,"total":4.705457299991394,"initexec":"2024-10-07 09:07:45.564410","startexec":"2024-10-07 09:07:45.564410","endexec":"2024-10-07 09:07:50.613500"} 47 | {"type":"detail","processid":12396,"calls":50,"avrg":0.09677865199977533,"min":0.03819530000328086,"max":0.5504195999965305,"st-dev":0.07970739191011685,"total":4.838932599988766,"initexec":"2024-10-07 09:07:45.474264","startexec":"2024-10-07 09:07:45.474264","endexec":"2024-10-07 09:07:50.511781"} 48 | {"type":"detail","processid":13720,"calls":63,"avrg":0.07559435396886705,"min":0.03436879999935627,"max":0.21452660000068136,"st-dev":0.031524424972456354,"total":4.762444300038624,"initexec":"2024-10-07 09:07:45.458672","startexec":"2024-10-07 09:07:45.458672","endexec":"2024-10-07 09:07:50.500646"} 49 | {"type":"detail","processid":13720,"calls":54,"avrg":0.08844654259290244,"min":0.03680599998915568,"max":0.47342829999979585,"st-dev":0.06857076343368242,"total":4.776113300016732,"initexec":"2024-10-07 09:07:46.393289","startexec":"2024-10-07 09:07:46.393289","endexec":"2024-10-07 09:07:51.414397"} 50 | {"type":"core","plan_executors":16,"plan_executors_detail":[8,2],"real_executors":16,"group":"2x threads","total_calls":965,"total_call_per_sec_raw":198.72499838333144,"total_call_per_sec":39744.99967666629,"avrg_time":0.0805132727646913,"std_deviation":0.05179209062863366,"endexec":"2024-10-07 09:07:52.982720"} 51 | {"type":"detail","processid":18792,"calls":94,"avrg":0.04893830531859458,"min":0.033581299998331815,"max":0.09517260000575334,"st-dev":0.011276540922350996,"total":4.600200699947891,"initexec":"2024-10-07 09:07:56.845508","startexec":"2024-10-07 09:07:56.845508","endexec":"2024-10-07 09:08:01.856151"} 52 | {"type":"detail","processid":368,"calls":94,"avrg":0.049052085106365106,"min":0.03587450001214165,"max":0.083844599997974,"st-dev":0.008950642862812611,"total":4.61089599999832,"initexec":"2024-10-07 09:07:56.654060","startexec":"2024-10-07 09:07:56.654060","endexec":"2024-10-07 09:08:01.699306"} 53 | {"type":"detail","processid":18792,"calls":94,"avrg":0.04908251595724265,"min":0.030841400002827868,"max":0.08695369999622926,"st-dev":0.010592247163155275,"total":4.613756499980809,"initexec":"2024-10-07 09:07:57.623043","startexec":"2024-10-07 09:07:57.623043","endexec":"2024-10-07 09:08:02.648250"} 54 | {"type":"detail","processid":18792,"calls":92,"avrg":0.05024133043432654,"min":0.030370499996934086,"max":0.09042340000451077,"st-dev":0.010898182773309882,"total":4.6222023999580415,"initexec":"2024-10-07 09:07:56.876613","startexec":"2024-10-07 09:07:56.876613","endexec":"2024-10-07 09:08:01.915828"} 55 | {"type":"detail","processid":368,"calls":97,"avrg":0.047408774226139413,"min":0.031212499990942888,"max":0.08508879999862984,"st-dev":0.009545346259721995,"total":4.598651099935523,"initexec":"2024-10-07 09:07:56.625604","startexec":"2024-10-07 09:07:56.626600","endexec":"2024-10-07 09:08:01.644382"} 56 | {"type":"detail","processid":368,"calls":91,"avrg":0.05129050219813387,"min":0.035504500003298745,"max":0.08110989999840967,"st-dev":0.010268151392730792,"total":4.6674357000301825,"initexec":"2024-10-07 09:07:57.291959","startexec":"2024-10-07 09:07:57.291959","endexec":"2024-10-07 09:08:02.340757"} 57 | {"type":"core","plan_executors":6,"plan_executors_detail":[2,3],"real_executors":6,"group":"3x threads","total_calls":562,"total_call_per_sec_raw":121.61606950259255,"total_call_per_sec":24323.21390051851,"avrg_time":0.049335585540133696,"std_deviation":0.010255185229013593,"endexec":"2024-10-07 09:08:02.749856"} 58 | {"type":"detail","processid":16708,"calls":73,"avrg":0.0644445109586965,"min":0.03239449999819044,"max":0.1693033000046853,"st-dev":0.022797214662903822,"total":4.704449299984844,"initexec":"2024-10-07 09:08:06.693648","startexec":"2024-10-07 09:08:06.693648","endexec":"2024-10-07 09:08:11.696036"} 59 | {"type":"detail","processid":16708,"calls":72,"avrg":0.06535551527829536,"min":0.0376679999899352,"max":0.21026780000829604,"st-dev":0.025867079778822504,"total":4.7055971000372665,"initexec":"2024-10-07 09:08:06.712852","startexec":"2024-10-07 09:08:06.712852","endexec":"2024-10-07 09:08:11.716173"} 60 | {"type":"detail","processid":16708,"calls":74,"avrg":0.06389751216173298,"min":0.03316219999396708,"max":0.1605273000022862,"st-dev":0.02271111870627519,"total":4.72841589996824,"initexec":"2024-10-07 09:08:06.697169","startexec":"2024-10-07 09:08:06.697169","endexec":"2024-10-07 09:08:11.734030"} 61 | {"type":"detail","processid":5624,"calls":75,"avrg":0.06285150533386817,"min":0.03476540000701789,"max":0.17572800000198185,"st-dev":0.019753669938072833,"total":4.713862900040112,"initexec":"2024-10-07 09:08:05.719099","startexec":"2024-10-07 09:08:05.719099","endexec":"2024-10-07 09:08:10.721184"} 62 | {"type":"detail","processid":5624,"calls":73,"avrg":0.06516471917881336,"min":0.032983299999614246,"max":0.17575470000156201,"st-dev":0.02143836580614885,"total":4.757024500053376,"initexec":"2024-10-07 09:08:06.250096","startexec":"2024-10-07 09:08:06.250096","endexec":"2024-10-07 09:08:11.287006"} 63 | {"type":"detail","processid":5624,"calls":71,"avrg":0.06710710985918897,"min":0.03887999999278691,"max":0.17697660000703763,"st-dev":0.02170376740292072,"total":4.764604800002417,"initexec":"2024-10-07 09:08:06.239226","startexec":"2024-10-07 09:08:06.239226","endexec":"2024-10-07 09:08:11.271748"} 64 | {"type":"detail","processid":23728,"calls":75,"avrg":0.062108029333952194,"min":0.034510199999203905,"max":0.18664640000497457,"st-dev":0.024275599761250138,"total":4.6581022000464145,"initexec":"2024-10-07 09:08:07.022204","startexec":"2024-10-07 09:08:07.022204","endexec":"2024-10-07 09:08:12.039177"} 65 | {"type":"detail","processid":23728,"calls":77,"avrg":0.06242691168853372,"min":0.029542100004618987,"max":0.1514140000072075,"st-dev":0.018693022113992847,"total":4.8068722000170965,"initexec":"2024-10-07 09:08:05.574396","startexec":"2024-10-07 09:08:05.574396","endexec":"2024-10-07 09:08:10.660205"} 66 | {"type":"detail","processid":23728,"calls":75,"avrg":0.06259228400090554,"min":0.037815799994859844,"max":0.16024209999886807,"st-dev":0.018223968357528073,"total":4.694421300067916,"initexec":"2024-10-07 09:08:06.312581","startexec":"2024-10-07 09:08:06.312581","endexec":"2024-10-07 09:08:11.319337"} 67 | {"type":"detail","processid":9932,"calls":73,"avrg":0.06451389863002688,"min":0.03599309999844991,"max":0.17541379999602214,"st-dev":0.021789916524646343,"total":4.709514599991962,"initexec":"2024-10-07 09:08:06.616257","startexec":"2024-10-07 09:08:06.616257","endexec":"2024-10-07 09:08:11.630760"} 68 | {"type":"detail","processid":9932,"calls":76,"avrg":0.06256409210618585,"min":0.0346245000109775,"max":0.19653389998711646,"st-dev":0.02126984762325256,"total":4.754871000070125,"initexec":"2024-10-07 09:08:05.932778","startexec":"2024-10-07 09:08:05.933779","endexec":"2024-10-07 09:08:11.007625"} 69 | {"type":"detail","processid":9932,"calls":71,"avrg":0.06636659577542188,"min":0.03431139999884181,"max":0.16743319999659434,"st-dev":0.02186166261367238,"total":4.712028300054953,"initexec":"2024-10-07 09:08:06.620800","startexec":"2024-10-07 09:08:06.620800","endexec":"2024-10-07 09:08:11.637495"} 70 | {"type":"core","plan_executors":12,"plan_executors_detail":[4,3],"real_executors":12,"group":"3x threads","total_calls":885,"total_call_per_sec_raw":187.16060463969745,"total_call_per_sec":37432.12092793949,"avrg_time":0.06411605702546846,"std_deviation":0.021698769440790522,"endexec":"2024-10-07 09:08:12.161666"} 71 | {"type":"detail","processid":23532,"calls":40,"avrg":0.12050284249926335,"min":0.05561619999934919,"max":0.5726243999961298,"st-dev":0.10757816980476564,"total":4.820113699970534,"initexec":"2024-10-07 09:08:17.200352","startexec":"2024-10-07 09:08:17.200352","endexec":"2024-10-07 09:08:22.241444"} 72 | {"type":"detail","processid":23532,"calls":36,"avrg":0.1353331444443029,"min":0.05173540000396315,"max":0.5820407999999588,"st-dev":0.10684499386830237,"total":4.871993199994904,"initexec":"2024-10-07 09:08:17.075996","startexec":"2024-10-07 09:08:17.075996","endexec":"2024-10-07 09:08:22.146874"} 73 | {"type":"detail","processid":23532,"calls":49,"avrg":0.09834034081574586,"min":0.03175850000116043,"max":0.6201700999954483,"st-dev":0.09353595636375253,"total":4.818676699971547,"initexec":"2024-10-07 09:08:16.335677","startexec":"2024-10-07 09:08:16.335930","endexec":"2024-10-07 09:08:21.350406"} 74 | {"type":"detail","processid":9520,"calls":44,"avrg":0.11048691591019054,"min":0.04717220000748057,"max":0.4474869999976363,"st-dev":0.075861097177875,"total":4.861424300048384,"initexec":"2024-10-07 09:08:16.663027","startexec":"2024-10-07 09:08:16.663027","endexec":"2024-10-07 09:08:21.749726"} 75 | {"type":"detail","processid":9520,"calls":48,"avrg":0.09999123333212386,"min":0.028374899993650615,"max":0.5614865999959875,"st-dev":0.0882942077536924,"total":4.799579199941945,"initexec":"2024-10-07 09:08:18.301381","startexec":"2024-10-07 09:08:18.301381","endexec":"2024-10-07 09:08:23.333011"} 76 | {"type":"detail","processid":9520,"calls":38,"avrg":0.12617668684221203,"min":0.040658099998836406,"max":0.6697647999972105,"st-dev":0.1228269765976995,"total":4.794714100004057,"initexec":"2024-10-07 09:08:17.334491","startexec":"2024-10-07 09:08:17.334491","endexec":"2024-10-07 09:08:22.361054"} 77 | {"type":"detail","processid":11824,"calls":50,"avrg":0.0954956359998323,"min":0.039937899986398406,"max":0.6003579999960493,"st-dev":0.08408676161123695,"total":4.774781799991615,"initexec":"2024-10-07 09:08:16.149590","startexec":"2024-10-07 09:08:16.149590","endexec":"2024-10-07 09:08:21.153534"} 78 | {"type":"detail","processid":11824,"calls":50,"avrg":0.09653493799996796,"min":0.039603400000487454,"max":0.5635368999937782,"st-dev":0.08056168619337416,"total":4.826746899998398,"initexec":"2024-10-07 09:08:16.248960","startexec":"2024-10-07 09:08:16.248960","endexec":"2024-10-07 09:08:21.307936"} 79 | {"type":"detail","processid":11824,"calls":38,"avrg":0.1305366710531464,"min":0.04634399998758454,"max":0.6501952000107849,"st-dev":0.13822006620837507,"total":4.960393500019563,"initexec":"2024-10-07 09:08:16.172249","startexec":"2024-10-07 09:08:16.172249","endexec":"2024-10-07 09:08:21.321895"} 80 | {"type":"detail","processid":18920,"calls":46,"avrg":0.10518270434682642,"min":0.03673889998754021,"max":0.47277790000953246,"st-dev":0.08477577825155072,"total":4.838404399954015,"initexec":"2024-10-07 09:08:16.138452","startexec":"2024-10-07 09:08:16.138452","endexec":"2024-10-07 09:08:21.201268"} 81 | {"type":"detail","processid":18920,"calls":44,"avrg":0.10963370909071686,"min":0.05124870000872761,"max":0.2589522000052966,"st-dev":0.058435318791050635,"total":4.823883199991542,"initexec":"2024-10-07 09:08:17.127403","startexec":"2024-10-07 09:08:17.127403","endexec":"2024-10-07 09:08:22.177620"} 82 | {"type":"detail","processid":18920,"calls":44,"avrg":0.10963087272764162,"min":0.033191800001077354,"max":0.34424720000242814,"st-dev":0.06701991533419857,"total":4.8237584000162315,"initexec":"2024-10-07 09:08:17.902081","startexec":"2024-10-07 09:08:17.902081","endexec":"2024-10-07 09:08:22.962430"} 83 | {"type":"detail","processid":2664,"calls":42,"avrg":0.11492695476218137,"min":0.04016780000529252,"max":0.23940429999493062,"st-dev":0.05273565427826607,"total":4.826932100011618,"initexec":"2024-10-07 09:08:16.862381","startexec":"2024-10-07 09:08:16.862381","endexec":"2024-10-07 09:08:21.894355"} 84 | {"type":"detail","processid":2664,"calls":48,"avrg":0.0987461479171543,"min":0.03818129999854136,"max":0.41780319999088533,"st-dev":0.06707157937541944,"total":4.739815100023407,"initexec":"2024-10-07 09:08:17.417644","startexec":"2024-10-07 09:08:17.417644","endexec":"2024-10-07 09:08:22.424403"} 85 | {"type":"detail","processid":2664,"calls":35,"avrg":0.1374959571407609,"min":0.04335490000084974,"max":0.45742790000804234,"st-dev":0.09113978149638156,"total":4.812358499926631,"initexec":"2024-10-07 09:08:17.471409","startexec":"2024-10-07 09:08:17.471409","endexec":"2024-10-07 09:08:22.515009"} 86 | {"type":"detail","processid":11360,"calls":36,"avrg":0.13546129444431346,"min":0.0492592000082368,"max":0.7162096999963978,"st-dev":0.11288740523760557,"total":4.876606599995284,"initexec":"2024-10-07 09:08:17.282017","startexec":"2024-10-07 09:08:17.282017","endexec":"2024-10-07 09:08:22.319564"} 87 | {"type":"detail","processid":11360,"calls":44,"avrg":0.11197882954398995,"min":0.03280990000348538,"max":0.6129312999983085,"st-dev":0.09162166987546214,"total":4.927068499935558,"initexec":"2024-10-07 09:08:16.439233","startexec":"2024-10-07 09:08:16.439233","endexec":"2024-10-07 09:08:21.550998"} 88 | {"type":"detail","processid":11360,"calls":54,"avrg":0.08877437407338423,"min":0.04253440001048148,"max":0.4481214999977965,"st-dev":0.05736898989396761,"total":4.793816199962748,"initexec":"2024-10-07 09:08:17.233542","startexec":"2024-10-07 09:08:17.233542","endexec":"2024-10-07 09:08:22.272237"} 89 | {"type":"detail","processid":10280,"calls":60,"avrg":0.07933277333431761,"min":0.03143659999477677,"max":0.27316260000225157,"st-dev":0.040428754857437514,"total":4.7599664000590565,"initexec":"2024-10-07 09:08:16.263095","startexec":"2024-10-07 09:08:16.263095","endexec":"2024-10-07 09:08:21.275091"} 90 | {"type":"detail","processid":10280,"calls":38,"avrg":0.1288328526294974,"min":0.04017409999505617,"max":0.8882640999945579,"st-dev":0.1459797819148739,"total":4.895648399920901,"initexec":"2024-10-07 09:08:16.330261","startexec":"2024-10-07 09:08:16.330261","endexec":"2024-10-07 09:08:21.404121"} 91 | {"type":"detail","processid":10280,"calls":46,"avrg":0.106425023912933,"min":0.04590230000030715,"max":0.2423257000045851,"st-dev":0.04969682131303806,"total":4.895551099994918,"initexec":"2024-10-07 09:08:16.874474","startexec":"2024-10-07 09:08:16.874474","endexec":"2024-10-07 09:08:21.945766"} 92 | {"type":"detail","processid":20572,"calls":38,"avrg":0.12689707105317594,"min":0.04403869999805465,"max":0.48238970000238623,"st-dev":0.0889029478111332,"total":4.822088700020686,"initexec":"2024-10-07 09:08:16.932319","startexec":"2024-10-07 09:08:16.932319","endexec":"2024-10-07 09:08:21.963355"} 93 | {"type":"detail","processid":20572,"calls":50,"avrg":0.09497315800079377,"min":0.032356499999878,"max":0.3447816999978386,"st-dev":0.07173510402820236,"total":4.748657900039689,"initexec":"2024-10-07 09:08:18.543510","startexec":"2024-10-07 09:08:18.543510","endexec":"2024-10-07 09:08:23.560050"} 94 | {"type":"detail","processid":20572,"calls":76,"avrg":0.061525021053775594,"min":0.029007400007685646,"max":0.27634160000889096,"st-dev":0.04675954908072244,"total":4.675901600086945,"initexec":"2024-10-07 09:08:19.778556","startexec":"2024-10-07 09:08:19.778556","endexec":"2024-10-07 09:08:24.796697"} 95 | {"type":"core","plan_executors":24,"plan_executors_detail":[8,3],"real_executors":24,"group":"3x threads","total_calls":1094,"total_call_per_sec_raw":219.5778715890009,"total_call_per_sec":43915.57431780018,"avrg_time":0.1093006313720103,"std_deviation":0.08434870696326596,"endexec":"2024-10-07 09:08:24.914723"} 96 | ############### State: OK, Duration: 1 min 33 sec (93.3 seconds) ############### 97 | -------------------------------------------------------------------------------- /input/prf_cassandra-without-std.txt: -------------------------------------------------------------------------------- 1 | ############### 2024-10-07 09:06:51.706216 ############### 2 | {"type":"headr","label":"cassandra-110538-W1-low","bulk":[200,10],"duration":5,"cpu":12,"mem":"15.2 GB","mem_free":"5.2 GB","host":"HCI-L3204/172.31.128.1","now":"2024-10-07 09:06:51.706216","responsetime_unit": "mmm"} 3 | {"type":"detail","processid":15392,"calls":100,"avrg":0.04605551800006651,"min":0.028453799997805618,"max":0.11998010000388604,"total":4.605551800006651,"initexec":"2024-10-07 09:06:55.562050","startexec":"2024-10-07 09:06:55.562050","endexec":"2024-10-07 09:07:00.588229"} 4 | {"type":"detail","processid":22396,"calls":100,"avrg":0.04602383199991891,"min":0.03069359999790322,"max":0.1104017999896314,"total":4.602383199991891,"initexec":"2024-10-07 09:06:55.567618","startexec":"2024-10-07 09:06:55.567618","endexec":"2024-10-07 09:07:00.572755"} 5 | {"type":"core","plan_executors":2,"plan_executors_detail":[2,1],"real_executors":2,"group":"1x threads","total_calls":200,"total_call_per_sec_raw":43.44079318544964,"total_call_per_sec":8688.158637089928,"avrg_time":0.046039674999992716,"endexec":"2024-10-07 09:07:00.757860"} 6 | {"type":"detail","processid":18716,"calls":100,"avrg":0.04663490700011607,"min":0.03173600000445731,"max":0.0762247000093339,"total":4.663490700011607,"initexec":"2024-10-07 09:07:04.841761","startexec":"2024-10-07 09:07:04.842686","endexec":"2024-10-07 09:07:09.866037"} 7 | {"type":"detail","processid":23936,"calls":101,"avrg":0.04566342079243162,"min":0.0317265000048792,"max":0.09115889998793136,"total":4.612005500035593,"initexec":"2024-10-07 09:07:04.727149","startexec":"2024-10-07 09:07:04.727149","endexec":"2024-10-07 09:07:09.744927"} 8 | {"type":"detail","processid":26484,"calls":100,"avrg":0.04640899100020761,"min":0.02922150000813417,"max":0.07789100000809412,"total":4.640899100020761,"initexec":"2024-10-07 09:07:04.763005","startexec":"2024-10-07 09:07:04.763005","endexec":"2024-10-07 09:07:09.808944"} 9 | {"type":"detail","processid":14756,"calls":99,"avrg":0.04672212727342008,"min":0.028102800002670847,"max":0.09830240000155754,"total":4.625490600068588,"initexec":"2024-10-07 09:07:06.153211","startexec":"2024-10-07 09:07:06.153211","endexec":"2024-10-07 09:07:11.184577"} 10 | {"type":"core","plan_executors":8,"plan_executors_detail":[8,1],"real_executors":8,"group":"1x threads","total_calls_95":18173,"total_call_per_sec_raw_95":417.813479143004,"total_call_per_sec_95":83562.6958286008,"avrg_time_95":0.089147299930124706,"total_calls":19124,"total_call_per_sec_raw":369.3477278895531,"total_call_per_sec":73869.54557791061,"avrg_time":0.081659805640911533,"endexec":"2024-10-11 14:37:17.983998"} 11 | ############### State: OK, Duration: 1 min 33 sec (93.3 seconds) ############### 12 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from qgate_graph.graph_performance import GraphPerformance 2 | from qgate_graph.graph_executor import GraphExecutor 3 | import qgate_graph 4 | import click 5 | import logging 6 | 7 | @click.command() 8 | @click.option("--input", help="input directory (default is directory 'input')", default="input") 9 | @click.option("--output", help="output directory (default is directory 'output')", default="output") 10 | def graph(input,output): 11 | """Generate graphs based in input data.""" 12 | logging.basicConfig() 13 | logging.getLogger().setLevel(logging.INFO) 14 | 15 | graph=GraphPerformance() 16 | graph.generate_from_dir(input, output) 17 | graph=GraphExecutor() 18 | graph.generate_from_dir(input, output) 19 | # graph.generate_from_file("input/prf_nonprod_BDP_NoSQL.txt", output) 20 | 21 | 22 | if __name__ == '__main__': 23 | graph() -------------------------------------------------------------------------------- /publish.bat: -------------------------------------------------------------------------------- 1 | rem pip install --upgrade build 2 | rem pip install --upgrade twine 3 | 4 | rmdir /S /Q dist 5 | rmdir /S /Q build 6 | rmdir /S /Q qgate_graph.egg-info 7 | 8 | rem helper 'https://www.scivision.dev/python-minimal-package/' 9 | rem https://pypa-build.readthedocs.io/en/latest/ 10 | python -m build --wheel 11 | 12 | rem twine upload is supported 13 | twine upload dist/* --verbose -u__token__ 14 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | 3 | name = "qgate_graph" # Required 4 | 5 | dynamic = ["version", "readme", "dependencies", "optional-dependencies"] 6 | 7 | description = "Generate graphs based on outputs from Quality Gate" # Optional 8 | 9 | requires-python = ">=3.6" 10 | 11 | license = {text = "MIT"} 12 | #license = {file = "LICENSE"} 13 | 14 | keywords = ["Quality", "QualityGate", "Graph"] # Optional 15 | 16 | authors = [ 17 | {name = "Jiri Steuer", email = "steuer.jiri@gmail.com" } # Optional 18 | ] 19 | maintainers = [ 20 | {name = "Jiri Steuer", email = "steuer.jiri@gmail.com" } # Optional 21 | ] 22 | 23 | classifiers = [ # Optional 24 | "Development Status :: 5 - Production/Stable", 25 | "Intended Audience :: Developers", 26 | "License :: OSI Approved :: Apache Software License", 27 | "Operating System :: POSIX :: Linux", 28 | "Operating System :: Microsoft :: Windows", 29 | "Operating System :: MacOS", 30 | "Programming Language :: Python :: 3", 31 | "Programming Language :: Python :: 3.6", 32 | "Programming Language :: Python :: 3.7", 33 | "Programming Language :: Python :: 3.8", 34 | "Programming Language :: Python :: 3.9", 35 | "Programming Language :: Python :: 3.10", 36 | "Programming Language :: Python :: 3.11", 37 | "Programming Language :: Python :: 3 :: Only", 38 | "Programming Language :: Python", 39 | "Topic :: Software Development :: Libraries :: Python Modules", 40 | "Topic :: Software Development :: Libraries", 41 | ] 42 | 43 | [project.urls] # Optional 44 | homepage='https://github.com/george0st/qgate-graph/' 45 | repository='https://pypi.org/project/qgate_graph/' 46 | #"Homepage" = 'https://github.com/george0st/qgate-perf/' 47 | #download_url='https://pypi.org/project/qgate_perf/' 48 | #"Source" = "https://github.com/pypa/sampleproject/" 49 | 50 | [tool.setuptools] 51 | include-package-data = false 52 | 53 | # it has relation only to --wheel 54 | [tool.setuptools.packages.find] 55 | include = ["qgate_graph*"] 56 | exclude = ["input*", "output*", "tests*"] 57 | 58 | [build-system] 59 | requires = ["setuptools>=68", "wheel"] 60 | build-backend = "setuptools.build_meta" 61 | 62 | [tool.setuptools.dynamic] 63 | readme = {file = ["README.md"], content-type = "text/markdown"} 64 | version = {attr = "qgate_graph.__version__"} 65 | dependencies = { file = ["requirements.txt"] } 66 | optional-dependencies.dev = { file = ["dev-requirements.txt"] } 67 | 68 | -------------------------------------------------------------------------------- /qgate_graph/.gitignore: -------------------------------------------------------------------------------- 1 | /__pycache__/ 2 | -------------------------------------------------------------------------------- /qgate_graph/__init__.py: -------------------------------------------------------------------------------- 1 | # info 2 | from .version import __version__ -------------------------------------------------------------------------------- /qgate_graph/circle_queue.py: -------------------------------------------------------------------------------- 1 | 2 | class CircleQueue: 3 | 4 | def __init__(self, items: [], init = 0): 5 | self._items = items 6 | self._pointer = init 7 | 8 | def next(self): 9 | current = self._pointer 10 | self._pointer = self._pointer + 1 if (self._pointer + 1) < len(self._items) else 0 11 | return self._items[current] 12 | 13 | def reset(self, pointer = 0): 14 | self._pointer = pointer 15 | 16 | def item(self): 17 | return self._items[self._pointer] 18 | 19 | class MarkerQueue(CircleQueue): 20 | 21 | def __init__(self, items: [] = ['o','x', '*', '^','X', 'D', 'p', 'H'], init = 0): 22 | super().__init__(items, init) 23 | 24 | 25 | class ColorQueue(CircleQueue): 26 | 27 | def __init__(self, items: [] = ['c', 'm', 'r', 'b', 'g', 'y', 'k'], init = 0): 28 | super().__init__(items, init) -------------------------------------------------------------------------------- /qgate_graph/file_marker.py: -------------------------------------------------------------------------------- 1 | 2 | class FileMarker: 3 | 4 | PRF_TYPE="type" 5 | 6 | # header 7 | PRF_HDR_TYPE="headr" 8 | PRF_HDR_LABEL="label" 9 | PRF_HDR_BULK="bulk" 10 | PRF_HDR_DURATION = "duration" 11 | PRF_HDR_RESPONSE_UNIT = "responsetime_unit" 12 | PRF_HDR_PERCENTILE = "percentile" 13 | PRF_HDR_AVIALABLE_CPU = "cpu" 14 | PRF_HDR_HOST="host" 15 | PRF_HDR_MEMORY="mem" 16 | PRF_HDR_MEMORY_FREE="mem_free" 17 | PRF_HDR_NOW="now" 18 | 19 | # detail 20 | PRF_DETAIL_TYPE="detail" 21 | PRF_DETAIL_PROCESSID="processid" 22 | PRF_DETAIL_CALLS="calls" 23 | PRF_DETAIL_COUNT="count" 24 | PRF_DETAIL_TOTAL="total" 25 | PRF_DETAIL_AVRG="avrg" 26 | PRF_DETAIL_MIN="min" 27 | PRF_DETAIL_MAX="max" 28 | PRF_DETAIL_STDEV="st-dev" 29 | PRF_DETAIL_ERR="err" 30 | PRF_DETAIL_TIME_INIT="initexec" 31 | PRF_DETAIL_TIME_START="startexec" 32 | PRF_DETAIL_TIME_END="endexec" 33 | 34 | # core output 35 | PRF_CORE_TYPE="core" 36 | PRF_CORE_PLAN_EXECUTOR_ALL="plan_executors" 37 | PRF_CORE_PLAN_EXECUTOR="plan_executors_detail" 38 | PRF_CORE_REAL_EXECUTOR="real_executors" 39 | PRF_CORE_GROUP="group" 40 | PRF_CORE_TOTAL_CALL="total_calls" 41 | PRF_CORE_AVRG_TIME="avrg_time" 42 | PRF_CORE_STD_DEVIATION = "std_deviation" 43 | PRF_CORE_MIN = "min" 44 | PRF_CORE_MAX = "max" 45 | PRF_CORE_TOTAL_CALL_PER_SEC = "total_call_per_sec" # total raw performance and multiply by rows in bundle 46 | PRF_CORE_TOTAL_CALL_PER_SEC_RAW = "total_call_per_sec_raw" # total raw performance (calls per one second) 47 | PRF_CORE_TIME_END = "endexec" 48 | -------------------------------------------------------------------------------- /qgate_graph/graph_base.py: -------------------------------------------------------------------------------- 1 | from qgate_graph import __version__ as version 2 | from matplotlib import get_backend, use 3 | from qgate_graph.percentile_item import PercentileItem 4 | from prettytable import PrettyTable 5 | import json 6 | 7 | 8 | class GraphBase: 9 | """ 10 | Generate graph based on input data 11 | 12 | example:: 13 | 14 | import qgate_graph.graph as grp 15 | import logging 16 | 17 | logging.basicConfig() 18 | logging.getLogger().setLevel(logging.INFO) 19 | 20 | graph=grp.Graph() 21 | graph.generate_from_dir("input_adr", "output_adr") 22 | """ 23 | def __init__(self, dpi=100): 24 | self.dpi=dpi 25 | 26 | # use 'Agg' as non-interactive backend for matplotlib 27 | if get_backend().lower()!="agg": 28 | use('Agg', force = True) 29 | 30 | def _watermark(self, plt, ax): 31 | """ 32 | Add watermark to the graph 33 | :param plt: 34 | :param ax: 35 | """ 36 | watermark=f'qgate_graph (v{version})' 37 | plt.text(1.0, 0, watermark, 38 | horizontalalignment='right', 39 | verticalalignment='bottom', 40 | transform = ax.transAxes, 41 | alpha=0.4, fontsize=8) 42 | 43 | def _unique_file_name(self, prefix, label, report_date, bulk, raw_format = False, extension = None): 44 | """ 45 | Generate unique file name based on key information 46 | 47 | :param prefix: Optional name 48 | :param label: Label (typically from perf test) 49 | :param report_date: Report date 50 | :param bulk: Bulk (rows, columns) size 51 | :raw_format: True - for RAW 52 | :extension: File extension such as ".png", ".txt", etc. (None - without extension) 53 | :return: Return unique file name 54 | """ 55 | file_name=(f"{prefix}" 56 | f"-{label}" 57 | f"{'-RAW' if raw_format else ''}" 58 | f"-{report_date}" 59 | f"-bulk-{bulk[0]}x{bulk[1]}" 60 | f"{extension if extension else ''}") 61 | 62 | # unify names 63 | remove_item = " ,&?" 64 | for itm in remove_item: 65 | file_name = file_name.replace(itm,"_") 66 | return file_name.replace("__","_") 67 | 68 | def _readable_duration(self, duration_seconds): 69 | """Return duration in human-readable form""" 70 | 71 | if duration_seconds < 0: 72 | return "n/a" 73 | 74 | str_duration = [] 75 | days = duration_seconds // 86400 76 | if days > 0: 77 | str_duration.append(f"{days} day") 78 | hours = duration_seconds // 3600 % 24 79 | if hours > 0: 80 | str_duration.append(f"{hours} hour") 81 | minutes = duration_seconds // 60 % 60 82 | if minutes > 0: 83 | str_duration.append(f"{minutes} min") 84 | seconds = duration_seconds % 60 85 | if seconds > 0: 86 | str_duration.append(f"{seconds} sec") 87 | return ' '.join(str_duration) 88 | 89 | @staticmethod 90 | def load_json(line): 91 | try: 92 | return json.loads(line.strip()) 93 | except Exception as ex: 94 | pass 95 | 96 | def _create_table(self, percentiles: {PercentileItem}) -> PrettyTable: 97 | summary_table = PrettyTable() 98 | 99 | percentiles_sort = sorted(list(percentiles.keys())) 100 | for group in percentiles[1].executors.keys(): 101 | table = PrettyTable() 102 | table.add_column("Executors", percentiles[1].executors[group]) 103 | table.add_column("Group", [group]*len(percentiles[1].executors[group])) 104 | for percentile in percentiles_sort: 105 | suffix = f" {int(percentile * 100)}ph" if percentile < 1 else "" 106 | table.add_column(f"Performance{suffix}", percentiles[percentile].total_performance[group]) 107 | for percentile in percentiles_sort: 108 | suffix = f" {int(percentile * 100)}ph" if percentile < 1 else "" 109 | table.add_column(f"Avrg{suffix}", percentiles[percentile].avrg_time[group]) 110 | for percentile in percentiles_sort: 111 | suffix = f" {int(percentile * 100)}ph" if percentile < 1 else "" 112 | table.add_column(f"Std{suffix}", percentiles[percentile].std_deviation[group]) 113 | 114 | for percentile in percentiles_sort: 115 | if len(percentiles[percentile].min) > 0: 116 | suffix = f" {int(percentile * 100)}ph" if percentile < 1 else "" 117 | table.add_column(f"Min{suffix}", percentiles[percentile].min[group]) 118 | for percentile in percentiles_sort: 119 | if len(percentiles[percentile].max) > 0: 120 | suffix = f" {int(percentile * 100)}ph" if percentile < 1 else "" 121 | table.add_column(f"Max{suffix}", percentiles[percentile].max[group]) 122 | 123 | if len(summary_table.rows) == 0: 124 | summary_table = table 125 | else: 126 | summary_table.add_rows(table.rows) 127 | 128 | summary_table.border = True 129 | summary_table.header = True 130 | summary_table.padding_width = 1 131 | summary_table.align = "r" 132 | summary_table.align["Executors"] = "c" 133 | summary_table.align["Label"] = "l" 134 | 135 | return summary_table 136 | 137 | 138 | -------------------------------------------------------------------------------- /qgate_graph/graph_executor.py: -------------------------------------------------------------------------------- 1 | from matplotlib import pyplot as plt 2 | from qgate_graph.file_marker import FileMarker as const 3 | from qgate_graph.graph_base import GraphBase 4 | from qgate_graph.circle_queue import ColorQueue, MarkerQueue 5 | from qgate_graph.graph_setup import GraphSetup 6 | import os.path, os 7 | import datetime 8 | import logging 9 | from io import StringIO 10 | 11 | 12 | class GraphExecutor(GraphBase): 13 | """ 14 | Generate graphs about executors in time (it is useful view for performance test tuning) 15 | 16 | example:: 17 | 18 | import qgate_graph.graph_executor as grp 19 | import logging 20 | 21 | logging.basicConfig() 22 | logging.getLogger().setLevel(logging.INFO) 23 | 24 | graph=grp.GraphExecutor() 25 | graph.generate_from_dir("input_adr", "output_adr") 26 | """ 27 | def __init__(self, dpi = 100, only_new = False): 28 | """ 29 | Generate graphs about executors in time in graphical format (*.png files) 30 | 31 | :param dpi: quality of output file in DPI (default is 100 DPI) 32 | :param only_new: generate only new/not existing outputs (default is False, rewrite/regenerate all) 33 | """ 34 | 35 | super().__init__(dpi) 36 | self._only_new = only_new 37 | self._output_file_format = ("EXE", ".png") 38 | 39 | def generate_from_dir(self, input_dir: str = "input", output_dir: str = "output") -> list[str]: 40 | """ 41 | Generate graphs about executors in time based on input directory 42 | 43 | example:: 44 | 45 | import qgate_graph.graph as grp 46 | 47 | graph=grp.Graph() 48 | graph.generate_from_dir("input_adr", "output_adr") 49 | 50 | :param input_dir: Input directory (default "input") 51 | :param output_dir: Output directory (default "output") 52 | :return: List of generated files 53 | """ 54 | output_list=[] 55 | for input_file in os.listdir(input_dir): 56 | for file in self.generate_from_file(os.path.join(input_dir, input_file), output_dir): 57 | output_list.append(file) 58 | logging.info("Done") 59 | return output_list 60 | 61 | def _order(self, date_arr: list): 62 | date_arr.sort(key=lambda x: x[0]) 63 | 64 | def _add_counter2(self, itm, new_array, new_array_count): 65 | 66 | if itm: 67 | for j in range(len(itm)): 68 | new_item=datetime.datetime.fromisoformat(itm[j]).replace(microsecond=0) 69 | 70 | found = False 71 | for i in new_array: 72 | if i[0] == new_item: 73 | if j==1: 74 | i[1]=i[1]+1 75 | elif j==2: 76 | i[1] = i[1] - 1 77 | found = True 78 | break 79 | if found == False: 80 | if j==0: 81 | new_array.append([new_item, 0]) 82 | elif j==1: 83 | new_array.append([new_item, 1]) 84 | elif j==2: 85 | new_array.append([new_item, -1]) 86 | 87 | def generate_from_text(self, text: str, output_dir: str = "output", suppress_error = False) -> list[str]: 88 | 89 | logging.info(f"Processing 'text' ...") 90 | with StringIO(text) as f: 91 | output_list=self._generate_from_stream(f,output_dir, suppress_error) 92 | return output_list 93 | 94 | def generate_from_file(self, input_file: str, output_dir: str = "output", suppress_error = False) -> list[str]: 95 | """ 96 | Generate graphs about executors based on input file 97 | 98 | :param input_file: Input file 99 | :param output_dir: Output directory (default "output") 100 | :param suppress_error: Ability to suppress error (default is False) 101 | :return: List of generated files 102 | """ 103 | 104 | logging.info(f"Processing '{input_file}' ...") 105 | with open(input_file, "r") as f: 106 | output_list=self._generate_from_stream(f,output_dir, suppress_error) 107 | return output_list 108 | 109 | def _generate_from_stream(self, f, output_dir: str = "output", suppress_error = False) -> list[str]: 110 | 111 | file_name = None 112 | executors = {} 113 | executor = [] 114 | input_dict = {} 115 | end_date = None 116 | start_date = None 117 | output_list = [] 118 | 119 | #logging.info(f"Processing '{input_file}' ...") 120 | 121 | # copy dir because the path can be modificated 122 | output_dir_target = output_dir 123 | 124 | # create output dir if not exist 125 | if not os.path.exists(output_dir_target): 126 | os.makedirs(output_dir_target, mode=0o777) 127 | 128 | # with open(input_file, "r") as f: 129 | while True: 130 | line = f.readline() 131 | if not line: 132 | break 133 | if line[0] == '#': 134 | file_name = None 135 | executors.clear() 136 | executor.clear() 137 | continue 138 | input_dict = GraphBase.load_json(line) 139 | if not input_dict: 140 | continue 141 | if input_dict[const.PRF_TYPE] == const.PRF_HDR_TYPE: 142 | # header 143 | start_date=input_dict[const.PRF_HDR_NOW] 144 | report_date = datetime.datetime.fromisoformat(start_date).strftime( 145 | "%Y-%m-%d %H-%M-%S") 146 | label = input_dict[const.PRF_HDR_LABEL] 147 | bulk = input_dict[const.PRF_HDR_BULK] 148 | duration = int(input_dict.get(const.PRF_HDR_DURATION, -1)) 149 | if duration >= 0: 150 | # update output dir based on duration (e.g. 1 min, 5 sec, etc.) and date 151 | output_dir_target = os.path.join(output_dir, 152 | self._readable_duration(duration), 153 | datetime.datetime.fromisoformat(start_date).strftime("%Y-%m-%d")) 154 | # create subdirectory based on duration 155 | if not os.path.exists(output_dir_target): 156 | os.makedirs(output_dir_target, mode=0o777) 157 | 158 | # setup response unit 159 | GraphSetup().response_time_unit=input_dict.get(const.PRF_HDR_RESPONSE_UNIT, "sec") 160 | 161 | bulk_name=f"{bulk[0]}/{bulk[1]}" 162 | file_name = self._unique_file_name(self._output_file_format[0], 163 | label, 164 | report_date, 165 | bulk, 166 | False, 167 | None) 168 | title = f"'{label}', {report_date}, bulk {bulk[0]}/{bulk[1]}, duration '{self._readable_duration(duration)}'" 169 | 170 | elif input_dict[const.PRF_TYPE] == const.PRF_CORE_TYPE: 171 | # core 172 | if executor: 173 | plan=f"{input_dict[const.PRF_CORE_PLAN_EXECUTOR][0]:03d}x{input_dict[const.PRF_CORE_PLAN_EXECUTOR][1]:02d}" 174 | executors[plan]=executor 175 | 176 | if input_dict.get(const.PRF_CORE_TIME_END): 177 | end_date=input_dict[const.PRF_CORE_TIME_END] 178 | 179 | new_file_name = f"{file_name}-plan-{plan}{self._output_file_format[1]}" 180 | 181 | # it is necessity to generate file? 182 | if self._only_new: 183 | # in case of focusing on only_new and file exists, jump it 184 | if os.path.exists(os.path.join(output_dir_target, new_file_name)): 185 | new_file_name=None 186 | 187 | if new_file_name: 188 | if suppress_error: 189 | try: 190 | output_list.append( 191 | self._show_graph(start_date, executors, end_date, title, new_file_name, output_dir_target)) 192 | except Exception as ex: 193 | logging.info(f" ... Error in '{new_file_name}', '{type(ex)}'") 194 | else: 195 | output_list.append( 196 | self._show_graph(start_date, executors, end_date, title, new_file_name, output_dir_target)) 197 | 198 | executors.clear() 199 | executor.clear() 200 | elif input_dict[const.PRF_TYPE] == const.PRF_DETAIL_TYPE: 201 | # detail 202 | if not input_dict.get(const.PRF_DETAIL_ERR): 203 | executor.append([ 204 | input_dict[const.PRF_DETAIL_TIME_INIT], 205 | input_dict[const.PRF_DETAIL_TIME_START], 206 | input_dict[const.PRF_DETAIL_TIME_END]]) 207 | return output_list 208 | 209 | def _show_graph(self, start_date, executors, end_date, title, file_name, output_dir) -> str : 210 | plt.style.use("bmh") #"ggplot" "seaborn-v0_8-poster" 211 | ax=plt.figure(figsize = (15, 6)) 212 | plt.grid() 213 | color = ColorQueue(init = 6) 214 | marker = MarkerQueue() 215 | 216 | # view total performance 217 | ax=plt.subplot(1,1,1) 218 | self._watermark(plt,ax) 219 | 220 | plt.suptitle("Executors in time",weight='bold', fontsize=18, ha="center", va="top") 221 | plt.title(title, fontsize=14,ha="center", va="top") 222 | 223 | new_array=[] 224 | new_array_count=[] 225 | 226 | # group values 227 | for key in executors.keys(): 228 | for itm in executors[key]: 229 | self._add_counter2(itm, new_array, new_array_count) 230 | 231 | 232 | # add start 233 | # new_array.insert(0, [datetime.datetime.fromisoformat(start_date).replace(microsecond=0),0]) 234 | 235 | # add end 236 | # new_array.append([datetime.datetime.fromisoformat(end_date).replace(microsecond=0),0]) 237 | 238 | # order 239 | self._order(new_array) 240 | 241 | # recalc (+/- values) 242 | for i in range(len(new_array)): 243 | if i==0: 244 | count=new_array[i][1] 245 | else: 246 | count+=new_array[i][1] 247 | new_array[i][1]=count 248 | 249 | # transform 250 | new_array2=[] 251 | for i in new_array: 252 | new_array_count.append(i[1]) 253 | new_array2.append(i[0]) 254 | 255 | for key in executors.keys(): 256 | plt.step(new_array2,new_array_count,where='post', 257 | color = color.next(), #self._next_color(), 258 | linestyle="-", 259 | marker=marker.next(), #self._next_marker(), 260 | label=f"{key}") 261 | 262 | output_file = os.path.join(output_dir, file_name) 263 | plt.savefig(output_file, dpi=self.dpi) 264 | logging.info(f" ... {output_file}") 265 | plt.close() 266 | return output_file 267 | 268 | 269 | -------------------------------------------------------------------------------- /qgate_graph/graph_performance.py: -------------------------------------------------------------------------------- 1 | import string 2 | 3 | from matplotlib import axes 4 | from matplotlib import pyplot as plt 5 | from qgate_graph.file_marker import FileMarker as const 6 | from numpy import std, average 7 | from qgate_graph.graph_base import GraphBase 8 | from qgate_graph.percentile_item import PercentileItem 9 | from qgate_graph.circle_queue import CircleQueue, ColorQueue, MarkerQueue 10 | from qgate_graph.graph_setup import GraphSetup 11 | import os.path, os 12 | import datetime 13 | import logging 14 | from io import StringIO 15 | 16 | 17 | class GraphPerformance(GraphBase): 18 | MIN_PRECISION = 0 19 | MAX_PRECISION = 4 20 | MAX_PRECISION_FORMAT = "{num:.4f}" 21 | 22 | """ 23 | Generate performance graphs based on input data 24 | 25 | example:: 26 | 27 | import qgate_graph.graph_performance as grp 28 | import logging 29 | 30 | logging.basicConfig() 31 | logging.getLogger().setLevel(logging.INFO) 32 | 33 | graph=grp.GraphPerformance() 34 | graph.generate_from_dir("input_adr", "output_adr") 35 | """ 36 | def __init__(self, dpi = 100, min_precision = -1, max_precision = -1, raw_format = False, only_new = False): 37 | """ 38 | Generate performance outputs based on input data in graphical format (*.png files) 39 | 40 | :param dpi: quality of output file in DPI (default is 100 DPI) 41 | :param min_precision: minimal precision in graph (-1 is without setting) 42 | :param max_precision: maximal precision in graph (-1 is without setting) 43 | :param raw_format: use raw format (default is True) 44 | :param only_new: generate only new/not existing outputs (default is False, rewrite/regenerate all) 45 | """ 46 | super().__init__(dpi) 47 | self._min_precision = min_precision if min_precision >= 0 else GraphPerformance.MIN_PRECISION 48 | self._max_precision = max_precision if max_precision >= 0 else GraphPerformance.MAX_PRECISION 49 | self._max_precision_format = "{num:." + str(self._max_precision) + "f}" 50 | self._raw_format = raw_format 51 | self._only_new = only_new 52 | self._output_file_format = ("PRF", ".png") 53 | 54 | def _get_executor_list(self, collections=None, collection=None): 55 | """ 56 | Get list of executor for graph X-line 57 | :param collections: 58 | :param collection: 59 | :return: 60 | """ 61 | list=[] 62 | if collections: 63 | for key in collections.keys(): 64 | for executor in collections[key]: 65 | if executor not in list: 66 | list.append(executor) 67 | else: 68 | if collection: 69 | for executor in collection: 70 | if executor not in list: 71 | list.append(executor) 72 | return list 73 | 74 | def _expected_round(self, avrg_time): 75 | """Calculation amount of precisions for number presentation""" 76 | 77 | # calc max by number precision 78 | max_len = 0 79 | min_zero = self._max_precision 80 | max_zero = self._min_precision 81 | for a in avrg_time: 82 | split = self._max_precision_format.format(num=a).split('.') 83 | 84 | if len(split)>1: 85 | decimal_item = split[1].rstrip('0') 86 | size = len(decimal_item) 87 | if size > max_len: 88 | max_len = size 89 | 90 | zero_prefix = 0 91 | skip = True 92 | for c in decimal_item: 93 | zero_prefix += 1 94 | if c != '0': 95 | skip = False 96 | break 97 | 98 | if not skip: 99 | min_zero = min(zero_prefix, min_zero) 100 | max_zero = max(zero_prefix, max_zero) 101 | if max_len == 0: 102 | return self._min_precision 103 | 104 | # max by standard deviation 105 | deviation = std(avrg_time) 106 | if deviation > 1: 107 | return int(average([min_zero,max_zero])) 108 | else: 109 | max_stddev = 0 110 | limit = False 111 | split = self._max_precision_format.format(num=deviation).split('.') 112 | if len(split) > 1: 113 | # calculation amount of zeros 114 | for c in split[1]: 115 | max_stddev += 1 116 | if c != '0': 117 | limit = True 118 | break 119 | 120 | if max_stddev>max_len: 121 | max_stddev=max_len 122 | 123 | if limit: 124 | return max_stddev if max_stddev > max_zero else max_zero 125 | return max_len 126 | 127 | def _create_output(self, percentiles: {PercentileItem}, title, file_name, output_dir) -> str: 128 | return self._create_graph(percentiles, title, file_name, output_dir) 129 | 130 | def _create_graph(self, percentiles: {PercentileItem}, title, file_name, output_dir) -> str: 131 | alpha = CircleQueue([0.4, 0.8] if len(percentiles) > 1 else [0.8]) 132 | line_style = CircleQueue(['--','-'] if len(percentiles) > 1 else ['-']) 133 | color = ColorQueue() 134 | marker = MarkerQueue() 135 | plt.style.use("bmh") #"ggplot" "seaborn-v0_8-poster" 136 | fig, ax = plt.subplots(2, 1, sharex='none', squeeze=False, figsize=(15, 6)) 137 | ax_main: axes.Axes = ax[0][0] 138 | 139 | # view total performance 140 | self._watermark(plt, ax_main) 141 | 142 | plt.suptitle("Performance & Response time",weight='bold', fontsize=18, ha="center", va="top") 143 | ax_main.set_title(title, fontsize=14, ha="center", va="top") 144 | 145 | # plot main graph 'Performance [calls/second]' (plus amount of executors) 146 | for percentile in percentiles.values(): 147 | for key in percentile.executors.keys(): 148 | ax_main.plot(percentile.executors[key], percentile.total_performance[key], 149 | color = color.next(), 150 | linestyle = line_style.item(), 151 | marker = marker.next(), 152 | alpha = alpha.item(), 153 | label = f"{key} " 154 | f"{str(int(percentile.percentile*100))+'ph ' if percentile.percentile != 1 else ''}" 155 | f"[{round(max(percentile.total_performance[key]), 2):,}]") 156 | 157 | marker.reset() 158 | color.reset() 159 | alpha.next() 160 | line_style.next() 161 | 162 | if len(percentiles[1].executors) > 0: 163 | ax_main.legend(fontsize = 'small') 164 | 165 | ax_main.set_ylabel("Performance [calls/sec]") 166 | ax_main.set_xticks(self._get_executor_list(collections=percentiles[1].executors)) 167 | 168 | # remove duplicit axis (because matplotlib>=3.8) 169 | ax[1][0].remove() 170 | 171 | # draw detail graphs 'Response time [seconds]' 172 | key_count = len(percentiles[1].executors) 173 | key_view = key_count 174 | marker.reset() 175 | color.reset() 176 | alpha.reset() 177 | for key in percentiles[1].executors.keys(): 178 | # view response time 179 | key_view += 1 180 | ax=plt.subplot(2, key_count, key_view) 181 | 182 | for percentile in percentiles.values(): 183 | if len(percentile.std_deviation)==0: 184 | ax.errorbar(x = percentile.executors[key], y = percentile.avrg_time[key], 185 | alpha = alpha.next(), 186 | color = color.item(), 187 | linestyle = '-', #'-' if (len(percentiles) > 1 and percentile.percentile != 1) or (len(percentiles) == 1) else 'none', 188 | marker = '_' if (len(percentiles) > 1 and percentile.percentile != 1) or (len(percentiles) == 1) else 'none', 189 | linewidth = 2 if (len(percentiles) > 1 and percentile.percentile != 1) or (len(percentiles) == 1) else 1, 190 | capsize = 6 if (len(percentiles) > 1 and percentile.percentile != 1) or (len(percentiles) == 1) else 6) 191 | self._watermark(plt, ax) 192 | ax.legend(['avrg', f"avrg {str(int(percentile.percentile*100))+'ph ' if percentile.percentile != 1 else ''}"], 193 | fontsize = 'small') 194 | else: 195 | ax.errorbar(x = percentile.executors[key], y = percentile.avrg_time[key], yerr = percentile.std_deviation[key], 196 | alpha = alpha.next(), 197 | color = color.item(), 198 | linestyle = 'none', #'-' if (len(percentiles) > 1 and percentile.percentile != 1) or (len(percentiles) == 1) else 'none', 199 | marker = '_' if (len(percentiles) > 1 and percentile.percentile != 1) or (len(percentiles) == 1) else 'none', 200 | linewidth = 2 if (len(percentiles) > 1 and percentile.percentile != 1) or (len(percentiles) == 1) else 1, 201 | capsize = 6 if (len(percentiles) > 1 and percentile.percentile != 1) or (len(percentiles) == 1) else 6) 202 | self._watermark(plt, ax) 203 | ax.legend(['avrg ± std', f"avrg ± std {str(int(percentile.percentile*100))+'ph ' if percentile.percentile != 1 else ''}"], 204 | fontsize = 'small') 205 | 206 | # add table 207 | # val1 = ["{:X}".format(i) for i in range(10)] 208 | # val2 = ["{:02X}".format(10 * i) for i in range(10)] 209 | # val3 = [["" for c in range(10)] for r in range(10)] 210 | # table = ax.table( 211 | # cellText=val3, 212 | # rowLabels=val2, 213 | # colLabels=val1, 214 | # rowColours=["palegreen"] * 10, 215 | # colColours=["palegreen"] * 10, 216 | # cellLoc='center', 217 | # loc='upper left') 218 | 219 | # add Y-lines 220 | # if percentile.percentile != 1: 221 | # lim = ax.get_ylim() 222 | # ax.set_yticks(list(ax.get_yticks()) + percentile.avrg_time[key]) 223 | # ax.set_ylim(lim) 224 | 225 | # get size of Y-axes 226 | #print(ax.get_yticks()) 227 | 228 | # print response time value with relevant precision 229 | if (len(percentiles) > 1 and percentile.percentile != 1) or (len(percentiles) == 1): 230 | expected_round = self._expected_round(percentile.avrg_time[key]) 231 | for x, y in zip(percentile.executors[key], percentile.avrg_time[key]): 232 | ax.annotate(round(y,expected_round), 233 | (x,y), 234 | textcoords = "offset fontsize", 235 | xytext = (0,0), 236 | ha = 'center', #'center', 237 | va = 'center', #'center', 238 | size = 9, 239 | weight = 'normal') 240 | #annotation_clip = True) # previous code weight='bold' 241 | 242 | ax.set_xlabel('Executors') 243 | if key_count+1 == key_view: 244 | ax.set_ylabel(str.format(f"Response [{GraphSetup().response_time_unit}]")) 245 | ax.set_xticks(self._get_executor_list(collection=percentile.executors[key])) 246 | ax.grid(visible = True) 247 | color.next() 248 | marker.next() 249 | 250 | output_file = os.path.join(output_dir, file_name) 251 | plt.savefig(output_file, dpi=self.dpi) 252 | logging.info(f" ... {output_file}") 253 | plt.close() 254 | return output_file 255 | 256 | def generate_from_dir(self, input_dir: str="input", output_dir: str="output") -> list[str]: 257 | """ 258 | Generate graphs based on input directory 259 | 260 | example:: 261 | 262 | import qgate_graph.graph_performance as grp 263 | 264 | graph=grp.GraphPerformance() 265 | graph.generate_from_dir("input_adr", "output_adr") 266 | 267 | :param input_dir: Input directory (default "input") 268 | :param output_dir: Output directory (default "output") 269 | :return: List of generated files 270 | """ 271 | output_list=[] 272 | 273 | for input_file in os.listdir(input_dir): 274 | for file in self.generate_from_file(os.path.join(input_dir, input_file), output_dir): 275 | output_list.append(file) 276 | logging.info("Done") 277 | return output_list 278 | 279 | def generate_from_text(self, text: str, output_dir: str = "output", suppress_error = False) -> list[str]: 280 | 281 | logging.info(f"Processing 'text' ...") 282 | with StringIO(text) as f: 283 | output_list=self._generate_from_stream(f,output_dir, suppress_error) 284 | return output_list 285 | 286 | def generate_from_file(self, input_file: str, output_dir: str = "output", suppress_error = False) -> list[str]: 287 | """ 288 | Generate graphs about executors based on input file 289 | 290 | :param input_file: Input file 291 | :param output_dir: Output directory (default "output") 292 | :param suppress_error: Ability to suppress error (default is False) 293 | :return: List of generated files 294 | """ 295 | 296 | logging.info(f"Processing '{input_file}' ...") 297 | with open(input_file, "r") as f: 298 | output_list=self._generate_from_stream(f,output_dir, suppress_error) 299 | return output_list 300 | 301 | def _generate_from_stream(self, f, output_dir: str="output", suppress_error = False) -> list[str]: 302 | """ 303 | Generate graphs based on input file 304 | 305 | :param input_file: Input file 306 | :param output_dir: Output directory (default "output") 307 | :param suppress_error: Ability to suppress error (default is False) 308 | :return: List of generated files 309 | """ 310 | file_name = None 311 | output_list = [] 312 | percentiles = {} 313 | percentiles[1] = PercentileItem(1) 314 | 315 | #logging.info(f"Processing '{input_file}' ...") 316 | 317 | # copy dir because the path can be modificated 318 | output_dir_target = output_dir 319 | 320 | # create output dir, if not exist 321 | if not os.path.exists(output_dir_target): 322 | os.makedirs(output_dir_target, mode = 0o777) 323 | 324 | #with open(input_file, "r") as f: 325 | while True: 326 | line = f.readline() 327 | if not line: 328 | break 329 | if line[0] == '#': 330 | if file_name and len(percentiles[1].executors) > 0: 331 | if suppress_error: 332 | try: 333 | output_list.append(self._create_output(percentiles, title, file_name, output_dir_target)) 334 | except Exception as ex: 335 | logging.info(f" ... Error in '{file_name}', '{type(ex)}'") 336 | else: 337 | output_list.append(self._create_output(percentiles, title, file_name, output_dir_target)) 338 | file_name = None 339 | percentiles.clear() 340 | percentiles[1] = PercentileItem(1) 341 | continue 342 | input_dict = GraphBase.load_json(line) 343 | if not input_dict: 344 | continue 345 | if input_dict[const.PRF_TYPE] == const.PRF_HDR_TYPE: 346 | # header items 347 | start_date = input_dict[const.PRF_HDR_NOW] 348 | report_date = datetime.datetime.fromisoformat(start_date).strftime("%Y-%m-%d %H-%M-%S") 349 | label = input_dict[const.PRF_HDR_LABEL] 350 | bulk = input_dict[const.PRF_HDR_BULK] 351 | duration = int(input_dict.get(const.PRF_HDR_DURATION, -1)) 352 | if duration >= 0: 353 | # update output dir based on duration (e.g. 1 min, 5 sec, etc.) and date 354 | output_dir_target = os.path.join(output_dir, 355 | self._readable_duration(duration), 356 | datetime.datetime.fromisoformat(start_date).strftime("%Y-%m-%d")) 357 | # create subdirectory based on duration 358 | if not os.path.exists(output_dir_target): 359 | os.makedirs(output_dir_target, mode=0o777) 360 | 361 | # setup response unit 362 | GraphSetup().response_time_unit=input_dict.get(const.PRF_HDR_RESPONSE_UNIT, "sec") 363 | 364 | # add percentile 365 | if input_dict.get(const.PRF_HDR_PERCENTILE, 1) < 1: 366 | percentiles[input_dict[const.PRF_HDR_PERCENTILE]] = PercentileItem(input_dict[const.PRF_HDR_PERCENTILE]) 367 | 368 | # create file name and title for graph 369 | file_name = self._unique_file_name(self._output_file_format[0], 370 | label, 371 | report_date, 372 | bulk, 373 | self._raw_format, 374 | self._output_file_format[1]) 375 | 376 | # it is necessity to generate file? 377 | if self._only_new: 378 | # in case of focusing on only_new and file exists, jump it 379 | if os.path.exists(os.path.join(output_dir_target, file_name)): 380 | file_name = None 381 | continue 382 | 383 | title = f"'{label}', {report_date}, bulk {bulk[0]}/{bulk[1]}, duration '{self._readable_duration(duration)}'" 384 | elif (input_dict[const.PRF_TYPE] == const.PRF_CORE_TYPE) and file_name: 385 | 386 | for percentile_key in percentiles.keys(): 387 | suffix = f"_{int(percentile_key * 100)}" if percentile_key < 1 else "" 388 | group = input_dict[const.PRF_CORE_GROUP]# if percentile == 1 else f"{input_dict[const.PRF_CORE_GROUP]}, {int(percentile * 100)}ph" 389 | percentile = percentiles[percentile_key] 390 | 391 | # core items 392 | if group in percentile.executors: 393 | percentile.executors[group].append(input_dict[const.PRF_CORE_REAL_EXECUTOR]) 394 | if self._raw_format: 395 | total_calls_sec_raw = input_dict.get(const.PRF_CORE_TOTAL_CALL_PER_SEC_RAW + suffix, None) 396 | if total_calls_sec_raw is None: 397 | total_calls_sec_raw = input_dict[const.PRF_CORE_TOTAL_CALL_PER_SEC + suffix] / bulk[0] 398 | percentile.total_performance[group].append(total_calls_sec_raw) 399 | else: 400 | percentile.total_performance[group].append(input_dict[const.PRF_CORE_TOTAL_CALL_PER_SEC + suffix]) 401 | percentile.avrg_time[group].append(input_dict[const.PRF_CORE_AVRG_TIME + suffix]) 402 | # optional STD_DEVIATION 403 | if input_dict.get(const.PRF_CORE_STD_DEVIATION + suffix, None): 404 | percentile.std_deviation[group].append(input_dict[const.PRF_CORE_STD_DEVIATION + suffix]) 405 | if input_dict.get(const.PRF_CORE_MIN + suffix, None): 406 | percentile.min[group].append(input_dict[const.PRF_CORE_MIN + suffix]) 407 | if input_dict.get(const.PRF_CORE_MAX + suffix, None): 408 | percentile.max[group].append(input_dict[const.PRF_CORE_MAX + suffix]) 409 | else: 410 | percentile.executors[group] = [input_dict[const.PRF_CORE_REAL_EXECUTOR]] 411 | if self._raw_format: 412 | total_calls_sec_raw = input_dict.get(const.PRF_CORE_TOTAL_CALL_PER_SEC_RAW + suffix, None) 413 | if total_calls_sec_raw is None: 414 | total_calls_sec_raw = input_dict[const.PRF_CORE_TOTAL_CALL_PER_SEC + suffix] / bulk[0] 415 | percentile.total_performance[group] = [total_calls_sec_raw] 416 | else: 417 | percentile.total_performance[group] = [input_dict[const.PRF_CORE_TOTAL_CALL_PER_SEC + suffix]] 418 | percentile.avrg_time[group] = [input_dict[const.PRF_CORE_AVRG_TIME + suffix]] 419 | # optional STD_DEVIATION 420 | if input_dict.get(const.PRF_CORE_STD_DEVIATION + suffix, None): 421 | percentile.std_deviation[group] = [input_dict[const.PRF_CORE_STD_DEVIATION + suffix]] 422 | if input_dict.get(const.PRF_CORE_MIN + suffix, None): 423 | percentile.min[group] = [input_dict[const.PRF_CORE_MIN + suffix]] 424 | if input_dict.get(const.PRF_CORE_MAX + suffix, None): 425 | percentile.max[group] = [input_dict[const.PRF_CORE_MAX + suffix]] 426 | return output_list 427 | 428 | 429 | -------------------------------------------------------------------------------- /qgate_graph/graph_performance_csv.py: -------------------------------------------------------------------------------- 1 | from qgate_graph.graph_performance import GraphPerformance 2 | from qgate_graph.percentile_item import PercentileItem 3 | import os.path, os 4 | import logging 5 | 6 | 7 | class GraphPerformanceCsv(GraphPerformance): 8 | 9 | def __init__(self, min_precision = -1, max_precision = -1, raw_format = False, only_new = False): 10 | """ 11 | Generate performance outputs based on input data in CSV format for next processing 12 | 13 | :param min_precision: minimal precision in graph (-1 is without setting) 14 | :param max_precision: maximal precision in graph (-1 is without setting) 15 | :param raw_format: use raw format (default is True) 16 | :param only_new: generate only new/not existing outputs (default is False, rewrite/regenerate all) 17 | """ 18 | 19 | super().__init__(0, min_precision, max_precision, raw_format, only_new) 20 | self._output_file_format = ("CSV", ".csv") 21 | 22 | def _create_output(self, percentiles: {PercentileItem}, title, file_name, output_dir) -> str: 23 | output_file = os.path.join(output_dir, file_name) 24 | with open(output_file, 'w', newline='') as file: 25 | file.write(super()._create_table(percentiles).get_csv_string(delimiter=',')) 26 | logging.info(f" ... {output_file}") 27 | return output_file 28 | -------------------------------------------------------------------------------- /qgate_graph/graph_performance_txt.py: -------------------------------------------------------------------------------- 1 | from qgate_graph.graph_performance import GraphPerformance 2 | from qgate_graph.percentile_item import PercentileItem 3 | import os.path, os 4 | import logging 5 | 6 | 7 | class GraphPerformanceTxt(GraphPerformance): 8 | 9 | def __init__(self, min_precision = -1, max_precision = -1, raw_format = False, only_new = False): 10 | """ 11 | Generate performance outputs based on input data in TXT readable format 12 | 13 | :param min_precision: minimal precision in graph (-1 is without setting) 14 | :param max_precision: maximal precision in graph (-1 is without setting) 15 | :param raw_format: use raw format (default is True) 16 | :param only_new: generate only new/not existing outputs (default is False, rewrite/regenerate all) 17 | """ 18 | 19 | super().__init__(0, min_precision, max_precision, raw_format, only_new) 20 | self._output_file_format = ("TXT", ".txt") 21 | 22 | def _create_output(self, percentiles: {PercentileItem}, title, file_name, output_dir) -> str: 23 | output_file = os.path.join(output_dir, file_name) 24 | with open(output_file, 'w') as file: 25 | file.write(str(super()._create_table(percentiles))) 26 | logging.info(f" ... {output_file}") 27 | return output_file 28 | -------------------------------------------------------------------------------- /qgate_graph/graph_setup.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | class Singleton (type): 4 | _instances = {} 5 | def __call__(cls, *args, **kwargs): 6 | if cls not in cls._instances: 7 | cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) 8 | return cls._instances[cls] 9 | 10 | class GraphSetup(metaclass=Singleton): 11 | 12 | def __init__(self): 13 | self.response_time_unit = "sec" 14 | # self.response_time_line = False 15 | # self.use_std = True 16 | 17 | -------------------------------------------------------------------------------- /qgate_graph/percentile_item.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | class PercentileItem: 4 | 5 | def __init__(self, percentile): 6 | 7 | self.percentile = percentile 8 | self.executors = {} 9 | self.total_performance = {} 10 | self.avrg_time = {} 11 | self.std_deviation = {} 12 | self.min = {} 13 | self.max = {} 14 | 15 | -------------------------------------------------------------------------------- /qgate_graph/version.py: -------------------------------------------------------------------------------- 1 | # Store the version here so: 2 | 3 | __version__ = '1.4.30' -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | click~=8.1 2 | 3 | # issue witn matplotlib under python 3.13t 4 | matplotlib>=3.5.0,<=3.9.2 5 | 6 | # numpy higher version need python==3.9 need max numpy 2.0.1 7 | numpy>=1.24.3,<=2.1.3 8 | 9 | prettytable==3.11.0 10 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/george0st/qgate-graph/0df35659acbb873bb110f2dd8ea7cd2302007748/tests/__init__.py -------------------------------------------------------------------------------- /tests/test_basic.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | import logging 4 | import time 5 | from os import path 6 | import shutil 7 | import glob 8 | from qgate_graph.graph_performance import GraphPerformance 9 | from qgate_graph.graph_executor import GraphExecutor 10 | 11 | class TestCaseBasic(unittest.TestCase): 12 | 13 | OUTPUT_ADR = "output/test/" 14 | INPUT_FILE = "input/prf_cassandra_02.txt" 15 | INPUT_FILE2 = "input/prf_cassandra-write-min-2024-08-29.txt" 16 | INPUT_FILE3 = "input/prf_cassandra-W1-low-2024-10-07.txt" 17 | INPUT_FILE4 = "input/prf_cassandra-W1-low-percentile-three-lines.txt" 18 | INPUT_FILE5 = "input/prf_cassandra-W2-med-percentile-one-line.txt" 19 | INPUT_FILE6 = "input/perf_test.txt" 20 | INPUT_FILE7 = "input/prf_cassandra-without-std.txt" 21 | 22 | INPUT_ADR = "input" 23 | 24 | PREFIX = "." 25 | 26 | @classmethod 27 | def setUpClass(cls): 28 | logging.basicConfig() 29 | logging.getLogger().setLevel(logging.INFO) 30 | 31 | # setup relevant path 32 | prefix = "." 33 | if not os.path.isfile(path.join(prefix, TestCaseBasic.INPUT_FILE)): 34 | prefix=".." 35 | TestCaseBasic.OUTPUT_ADR = path.join(prefix,TestCaseBasic.OUTPUT_ADR) 36 | TestCaseBasic.INPUT_FILE = path.join(prefix, TestCaseBasic.INPUT_FILE) 37 | TestCaseBasic.INPUT_FILE2 = path.join(prefix, TestCaseBasic.INPUT_FILE2) 38 | TestCaseBasic.INPUT_FILE3 = path.join(prefix, TestCaseBasic.INPUT_FILE3) 39 | TestCaseBasic.INPUT_FILE4 = path.join(prefix, TestCaseBasic.INPUT_FILE4) 40 | TestCaseBasic.INPUT_FILE5 = path.join(prefix, TestCaseBasic.INPUT_FILE5) 41 | TestCaseBasic.INPUT_FILE6 = path.join(prefix, TestCaseBasic.INPUT_FILE6) 42 | TestCaseBasic.INPUT_FILE7 = path.join(prefix, TestCaseBasic.INPUT_FILE7) 43 | TestCaseBasic.INPUT_ADR = path.join(prefix, TestCaseBasic.INPUT_ADR) 44 | 45 | # clean directory 46 | shutil.rmtree(TestCaseBasic.OUTPUT_ADR, True) 47 | 48 | @classmethod 49 | def tearDownClass(cls): 50 | pass 51 | 52 | def test_perf_file(self): 53 | """Performance graphs""" 54 | graph = GraphPerformance() 55 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE, self.OUTPUT_ADR) 56 | 57 | self.assertTrue(len(output) == 2) 58 | 59 | def test_perf_file2(self): 60 | """Performance graphs with suppress error""" 61 | graph = GraphPerformance() 62 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE, self.OUTPUT_ADR, suppress_error = True) 63 | 64 | self.assertTrue(len(output) == 2) 65 | 66 | def test_exec_file(self): 67 | """Execution graphs""" 68 | graph = GraphExecutor() 69 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE, self.OUTPUT_ADR) 70 | 71 | self.assertTrue(len(output) == 11) 72 | 73 | def test_exec_file2(self): 74 | """Execution graphs with suppress error""" 75 | graph = GraphExecutor() 76 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE, self.OUTPUT_ADR, suppress_error = True) 77 | 78 | self.assertTrue(len(output) == 11) 79 | 80 | def test_perf_dir(self): 81 | """Performance graphs for dir""" 82 | graph = GraphPerformance() 83 | output = graph.generate_from_dir(TestCaseBasic.INPUT_ADR, self.OUTPUT_ADR) 84 | 85 | self.assertTrue(len(output) == 12) 86 | 87 | def test_exec_dir(self): 88 | """Execution graphs for dir""" 89 | graph = GraphExecutor() 90 | output=graph.generate_from_dir(TestCaseBasic.INPUT_ADR, self.OUTPUT_ADR) 91 | 92 | self.assertTrue(len(output)==67) 93 | 94 | def test_check_path(self): 95 | """Check, dir with duration and date""" 96 | graph = GraphPerformance() 97 | output_dir = os.path.join(self.OUTPUT_ADR, "path_stability") 98 | output = graph.generate_from_dir(TestCaseBasic.INPUT_ADR, output_dir) 99 | self.assertTrue(output_dir == os.path.join(self.OUTPUT_ADR, "path_stability")) 100 | 101 | graph = GraphExecutor() 102 | output_dir = os.path.join(self.OUTPUT_ADR, "path_stability") 103 | output = graph.generate_from_dir(TestCaseBasic.INPUT_ADR, output_dir) 104 | self.assertTrue(output_dir == os.path.join(self.OUTPUT_ADR, "path_stability")) 105 | 106 | def test_check_path_perf(self): 107 | """Check, dir with duration and date for perf""" 108 | graph = GraphPerformance() 109 | output_dir = os.path.join(self.OUTPUT_ADR, "path_stability") 110 | output = graph.generate_from_dir(TestCaseBasic.INPUT_ADR, output_dir) 111 | 112 | file = glob.glob(path.join(output_dir, "1 min", "2024-08-29", f"PRF-Cassandra-write-min-*-bulk-200x10.png")) 113 | self.assertTrue(len(file) == 1) 114 | 115 | def test_check_path_exec(self): 116 | """Check, dir with duration and date for exec""" 117 | graph = GraphExecutor() 118 | output_dir = os.path.join(self.OUTPUT_ADR, "path_stability") 119 | output = graph.generate_from_dir(TestCaseBasic.INPUT_ADR, output_dir) 120 | 121 | file = glob.glob(path.join(output_dir, "1 min", "2024-08-29", f"EXE-Cassandra-write-min-*-bulk-200x10-plan-008x01.png")) 122 | self.assertTrue(len(file) == 1) 123 | 124 | def test_performance_graph_with_without_raw(self): 125 | graph = GraphPerformance(raw_format = False) 126 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE, self.OUTPUT_ADR) 127 | for file in output: 128 | self.assertTrue(file.find("RAW") == -1) 129 | 130 | graph = GraphPerformance(raw_format = True) 131 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE, self.OUTPUT_ADR) 132 | for file in output: 133 | self.assertTrue(file.find("RAW") != -1) 134 | 135 | def test_performance_graph_with_without_raw2(self): 136 | graph = GraphPerformance(raw_format = False) 137 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE2, self.OUTPUT_ADR) 138 | for file in output: 139 | self.assertTrue(file.find("RAW") == -1) 140 | 141 | graph = GraphPerformance(raw_format = True) 142 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE2, self.OUTPUT_ADR) 143 | for file in output: 144 | self.assertTrue(file.find("RAW") != -1) 145 | 146 | def test_performance_graph_with_without_raw3(self): 147 | graph = GraphPerformance(raw_format = False) 148 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE3, self.OUTPUT_ADR) 149 | for file in output: 150 | self.assertTrue(file.find("RAW") == -1) 151 | 152 | graph = GraphPerformance(raw_format = True) 153 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE3, self.OUTPUT_ADR) 154 | for file in output: 155 | self.assertTrue(file.find("RAW") != -1) 156 | 157 | def test_performance_graph_with_percentile1(self): 158 | graph = GraphPerformance() 159 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE4, self.OUTPUT_ADR) 160 | for file in output: 161 | self.assertTrue(file.find("RAW") == -1) 162 | 163 | def test_performance_graph_with_percentile2(self): 164 | graph = GraphPerformance() 165 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE5, self.OUTPUT_ADR) 166 | for file in output: 167 | self.assertTrue(file.find("RAW") == -1) 168 | 169 | def test_perf_file3(self): 170 | graph = GraphPerformance() 171 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE6, self.OUTPUT_ADR) 172 | for file in output: 173 | self.assertTrue(file.find("RAW") == -1) 174 | 175 | def test_perf_onlynew1(self): 176 | """Test setting 'only_new'""" 177 | graph = GraphPerformance(only_new=True) 178 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE6, os.path.join(self.OUTPUT_ADR,"only_new")) 179 | self.assertTrue(len(output)==2) 180 | for file in output: 181 | self.assertTrue(file.find("RAW") == -1) 182 | 183 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE6, os.path.join(self.OUTPUT_ADR,"only_new")) 184 | self.assertTrue(len(output) == 0) 185 | 186 | def test_perf_without_stdev(self): 187 | graph = GraphPerformance() 188 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE7, self.OUTPUT_ADR) 189 | 190 | self.assertTrue(len(output)==1) 191 | for file in output: 192 | self.assertTrue(file.find("RAW") == -1) 193 | 194 | def read_file_all(self, file) -> str: 195 | with open(file) as f: 196 | content = "" 197 | for itm in f.readlines(): 198 | content += f"{itm.strip()}\n" 199 | return content[:-1] 200 | def test_perf_source_text(self): 201 | graph = GraphPerformance() 202 | text = self.read_file_all(TestCaseBasic.INPUT_FILE7) 203 | 204 | output = graph.generate_from_text(text,self.OUTPUT_ADR) 205 | 206 | self.assertTrue(len(output)==1) 207 | for file in output: 208 | self.assertTrue(file.find("RAW") == -1) 209 | -------------------------------------------------------------------------------- /tests/test_executor.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | import logging 4 | from os import path 5 | import shutil 6 | from qgate_graph.graph_executor import GraphExecutor 7 | 8 | 9 | class TestCaseExecutor(unittest.TestCase): 10 | 11 | OUTPUT_ADR = "output/test/" 12 | INPUT_FILE = "input/prf_cassandra_02.txt" 13 | INPUT_ADR = "input" 14 | PREFIX = "." 15 | 16 | @classmethod 17 | def setUpClass(cls): 18 | logging.basicConfig() 19 | logging.getLogger().setLevel(logging.INFO) 20 | 21 | # setup relevant path 22 | prefix = "." 23 | if not os.path.isfile(path.join(prefix, TestCaseExecutor.INPUT_FILE)): 24 | prefix=".." 25 | TestCaseExecutor.OUTPUT_ADR = path.join(prefix,TestCaseExecutor.OUTPUT_ADR) 26 | TestCaseExecutor.INPUT_FILE = path.join(prefix, TestCaseExecutor.INPUT_FILE) 27 | TestCaseExecutor.INPUT_ADR = path.join(prefix, TestCaseExecutor.INPUT_ADR) 28 | 29 | # clean directory 30 | shutil.rmtree(TestCaseExecutor.OUTPUT_ADR, True) 31 | 32 | @classmethod 33 | def tearDownClass(cls): 34 | pass 35 | 36 | def test_executor_onlynew1(self): 37 | """Test setting 'only_new'""" 38 | graph = GraphExecutor(only_new=True) 39 | output = graph.generate_from_file(TestCaseExecutor.INPUT_FILE, os.path.join(self.OUTPUT_ADR,"only_new")) 40 | self.assertTrue(len(output) == 11) 41 | for file in output: 42 | self.assertTrue(file.find("RAW") == -1) 43 | 44 | output = graph.generate_from_file(TestCaseExecutor.INPUT_FILE, os.path.join(self.OUTPUT_ADR,"only_new")) 45 | self.assertTrue(len(output) == 0) -------------------------------------------------------------------------------- /tests/test_minmax.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | import logging 4 | import time 5 | from os import path 6 | import shutil 7 | import glob 8 | from qgate_graph.graph_performance_csv import GraphPerformanceCsv 9 | from qgate_graph.graph_executor import GraphExecutor 10 | 11 | class TestCaseBasic(unittest.TestCase): 12 | 13 | OUTPUT_ADR = "output/test/" 14 | INPUT_FILE = "input/perf_gil_impact_percentile.txt" 15 | INPUT_FILE2 = "input/perf_test.txt" 16 | 17 | INPUT_ADR = "input" 18 | 19 | PREFIX = "." 20 | 21 | @classmethod 22 | def setUpClass(cls): 23 | logging.basicConfig() 24 | logging.getLogger().setLevel(logging.INFO) 25 | 26 | # setup relevant path 27 | prefix = "." 28 | if not os.path.isfile(path.join(prefix, TestCaseBasic.INPUT_FILE)): 29 | prefix=".." 30 | TestCaseBasic.OUTPUT_ADR = path.join(prefix,TestCaseBasic.OUTPUT_ADR) 31 | TestCaseBasic.INPUT_FILE = path.join(prefix, TestCaseBasic.INPUT_FILE) 32 | TestCaseBasic.INPUT_FILE2 = path.join(prefix, TestCaseBasic.INPUT_FILE2) 33 | TestCaseBasic.INPUT_ADR = path.join(prefix, TestCaseBasic.INPUT_ADR) 34 | 35 | # clean directory 36 | shutil.rmtree(TestCaseBasic.OUTPUT_ADR, True) 37 | 38 | @classmethod 39 | def tearDownClass(cls): 40 | pass 41 | 42 | def test_minmax_with(self): 43 | graph = GraphPerformanceCsv() 44 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE, self.OUTPUT_ADR) 45 | for file in output: 46 | with open(file,"r") as f: 47 | line=f.readline() 48 | self.assertTrue(line.find("Min") != -1 and line.find("Min 9") != -1 and 49 | line.find("Max") != -1 and line.find("Max 9") != 1) 50 | 51 | def test_minmax_without(self): 52 | graph = GraphPerformanceCsv() 53 | output = graph.generate_from_file(TestCaseBasic.INPUT_FILE2, self.OUTPUT_ADR) 54 | for file in output: 55 | with open(file,"r") as f: 56 | line=f.readline() 57 | self.assertTrue(line.find("Min") == -1 and line.find("Max") == -1) 58 | -------------------------------------------------------------------------------- /tests/test_performance_csv.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | import logging 4 | from os import path 5 | import shutil 6 | from qgate_graph.graph_performance_csv import GraphPerformanceCsv 7 | 8 | 9 | class TestCasePerformanceCsv(unittest.TestCase): 10 | 11 | OUTPUT_ADR = "output/test/" 12 | INPUT_FILE = "input/prf_cassandra_02.txt" 13 | INPUT_ADR = "input" 14 | PREFIX = "." 15 | 16 | @classmethod 17 | def setUpClass(cls): 18 | logging.basicConfig() 19 | logging.getLogger().setLevel(logging.INFO) 20 | 21 | # setup relevant path 22 | prefix = "." 23 | if not os.path.isfile(path.join(prefix, TestCasePerformanceCsv.INPUT_FILE)): 24 | prefix=".." 25 | TestCasePerformanceCsv.OUTPUT_ADR = path.join(prefix,TestCasePerformanceCsv.OUTPUT_ADR) 26 | TestCasePerformanceCsv.INPUT_FILE = path.join(prefix, TestCasePerformanceCsv.INPUT_FILE) 27 | TestCasePerformanceCsv.INPUT_ADR = path.join(prefix, TestCasePerformanceCsv.INPUT_ADR) 28 | 29 | # clean directory 30 | shutil.rmtree(TestCasePerformanceCsv.OUTPUT_ADR, True) 31 | 32 | @classmethod 33 | def tearDownClass(cls): 34 | pass 35 | 36 | def test_csv1(self): 37 | """Performance graphs csv""" 38 | graph = GraphPerformanceCsv() 39 | output = graph.generate_from_file(TestCasePerformanceCsv.INPUT_FILE, self.OUTPUT_ADR) 40 | 41 | self.assertTrue(len(output) == 2) 42 | for file in output: 43 | self.assertTrue(file.find("RAW") == -1) 44 | 45 | # check header 46 | with open(file,"r") as f: 47 | line=f.readline() 48 | self.assertTrue(line.find("Executors") != -1 and line.find("Group") != -1 and 49 | line.find("Performance") != -1 and line.find("Avrg") != 1 and 50 | line.find("Std") != -1) 51 | 52 | 53 | def test_csv_raw(self): 54 | """Performance graphs csv with RAW format""" 55 | graph = GraphPerformanceCsv(raw_format = True) 56 | output = graph.generate_from_file(TestCasePerformanceCsv.INPUT_FILE, self.OUTPUT_ADR) 57 | 58 | self.assertTrue(len(output) == 2) 59 | for file in output: 60 | self.assertTrue(file.find("RAW") != -1) 61 | self.assertTrue(file.find("CSV-PRF-") == -1) 62 | 63 | # check header 64 | with open(file,"r") as f: 65 | line=f.readline() 66 | self.assertTrue(line.find("Executors") != -1 and line.find("Group") != -1 and 67 | line.find("Performance") != -1 and line.find("Avrg") != 1 and 68 | line.find("Std") != -1) 69 | 70 | def test_csv_from_dir_with_raw(self): 71 | """Performance graphs csv with RAW format""" 72 | graph = GraphPerformanceCsv(raw_format=True) 73 | output = graph.generate_from_dir(TestCasePerformanceCsv.INPUT_ADR, self.OUTPUT_ADR) 74 | 75 | self.assertTrue(len(output) == 12) 76 | for file in output: 77 | self.assertTrue(file.find("RAW") != -1) 78 | self.assertTrue(file.find("CSV-PRF-") == -1) 79 | 80 | # check header 81 | with open(file,"r") as f: 82 | line=f.readline() 83 | self.assertTrue(line.find("Executors") != -1 and line.find("Group") != -1 and 84 | line.find("Performance") != -1 and line.find("Avrg") != 1 and 85 | line.find("Std") != -1) 86 | 87 | def test_csv_from_dir(self): 88 | """Performance graphs csv""" 89 | graph = GraphPerformanceCsv() 90 | output = graph.generate_from_dir(TestCasePerformanceCsv.INPUT_ADR, self.OUTPUT_ADR) 91 | 92 | self.assertTrue(len(output) == 12) 93 | for file in output: 94 | self.assertTrue(file.find("RAW") == -1) 95 | self.assertTrue(file.find("CSV-PRF-") == -1) 96 | 97 | # check header 98 | with open(file,"r") as f: 99 | line=f.readline() 100 | self.assertTrue(line.find("Executors") != -1 and line.find("Group") != -1 and 101 | line.find("Performance") != -1 and line.find("Avrg") != 1 and 102 | line.find("Std") != -1) 103 | 104 | def test_perf_csv_onlynew1(self): 105 | """Test setting 'only_new'""" 106 | graph = GraphPerformanceCsv(only_new=True) 107 | output = graph.generate_from_file(TestCasePerformanceCsv.INPUT_FILE, os.path.join(self.OUTPUT_ADR,"only_new")) 108 | self.assertTrue(len(output)==2) 109 | for file in output: 110 | self.assertTrue(file.find("RAW") == -1) 111 | 112 | output = graph.generate_from_file(TestCasePerformanceCsv.INPUT_FILE, os.path.join(self.OUTPUT_ADR,"only_new")) 113 | self.assertTrue(len(output) == 0) 114 | -------------------------------------------------------------------------------- /tests/test_performance_txt.py: -------------------------------------------------------------------------------- 1 | from qgate_graph.graph_performance_txt import GraphPerformanceTxt 2 | from os import path 3 | import unittest 4 | import logging 5 | import shutil 6 | import os 7 | 8 | 9 | class TestCasePerformanceTxt(unittest.TestCase): 10 | 11 | OUTPUT_ADR = "output/test/" 12 | INPUT_FILE = "input/prf_cassandra_02.txt" 13 | INPUT_ADR = "input" 14 | PREFIX = "." 15 | 16 | @classmethod 17 | def setUpClass(cls): 18 | logging.basicConfig() 19 | logging.getLogger().setLevel(logging.INFO) 20 | 21 | # setup relevant path 22 | prefix = "." 23 | if not os.path.isfile(path.join(prefix, TestCasePerformanceTxt.INPUT_FILE)): 24 | prefix=".." 25 | TestCasePerformanceTxt.OUTPUT_ADR = path.join(prefix,TestCasePerformanceTxt.OUTPUT_ADR) 26 | TestCasePerformanceTxt.INPUT_FILE = path.join(prefix, TestCasePerformanceTxt.INPUT_FILE) 27 | TestCasePerformanceTxt.INPUT_ADR = path.join(prefix, TestCasePerformanceTxt.INPUT_ADR) 28 | 29 | # clean directory 30 | shutil.rmtree(TestCasePerformanceTxt.OUTPUT_ADR, True) 31 | 32 | @classmethod 33 | def tearDownClass(cls): 34 | pass 35 | 36 | def test_txt1(self): 37 | """Performance graphs txt """ 38 | graph = GraphPerformanceTxt() 39 | output = graph.generate_from_file(TestCasePerformanceTxt.INPUT_FILE, self.OUTPUT_ADR) 40 | 41 | self.assertTrue(len(output) == 2) 42 | for file in output: 43 | self.assertTrue(file.find("RAW") == -1) 44 | 45 | def test_txt_raw(self): 46 | """Performance graphs txt with RAW format""" 47 | graph = GraphPerformanceTxt(raw_format = True) 48 | output = graph.generate_from_file(TestCasePerformanceTxt.INPUT_FILE, self.OUTPUT_ADR) 49 | 50 | self.assertTrue(len(output) == 2) 51 | for file in output: 52 | self.assertTrue(file.find("RAW") != -1) 53 | self.assertTrue(file.find("TXT-PRF-") == -1) 54 | 55 | def test_txt_from_dir_with_raw(self): 56 | """Performance graphs txt with RAW format""" 57 | graph = GraphPerformanceTxt(raw_format = True) 58 | output = graph.generate_from_dir(TestCasePerformanceTxt.INPUT_ADR, self.OUTPUT_ADR) 59 | 60 | self.assertTrue(len(output) == 12) 61 | for file in output: 62 | self.assertTrue(file.find("RAW") != -1) 63 | self.assertTrue(file.find("TXT-PRF-") == -1) 64 | 65 | def test_txt_from_dir(self): 66 | """Performance graphs txt""" 67 | graph = GraphPerformanceTxt() 68 | output = graph.generate_from_dir(TestCasePerformanceTxt.INPUT_ADR, self.OUTPUT_ADR) 69 | 70 | self.assertTrue(len(output) == 12) 71 | for file in output: 72 | self.assertTrue(file.find("RAW") == -1) 73 | self.assertTrue(file.find("TXT-PRF-") == -1) 74 | 75 | def test_perf_txt_onlynew1(self): 76 | """Test setting 'only_new'""" 77 | graph = GraphPerformanceTxt(only_new=True) 78 | output = graph.generate_from_file(TestCasePerformanceTxt.INPUT_FILE, os.path.join(self.OUTPUT_ADR,"only_new")) 79 | self.assertTrue(len(output)==2) 80 | for file in output: 81 | self.assertTrue(file.find("RAW") == -1) 82 | 83 | output = graph.generate_from_file(TestCasePerformanceTxt.INPUT_FILE, os.path.join(self.OUTPUT_ADR,"only_new")) 84 | self.assertTrue(len(output) == 0) -------------------------------------------------------------------------------- /tests/test_support.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import numpy as np 3 | from qgate_graph.graph_performance import GraphPerformance 4 | from qgate_graph.graph_setup import GraphSetup 5 | 6 | class TestCaseBasic(unittest.TestCase): 7 | 8 | @classmethod 9 | def setUpClass(cls): 10 | pass 11 | 12 | @classmethod 13 | def tearDownClass(cls): 14 | pass 15 | 16 | def test_point_in_graph(self): 17 | """Performance graphs""" 18 | graph = GraphPerformance(min_precision=0, max_precision=4) 19 | 20 | precision = graph._expected_round(np.array([1, 5, 10])) 21 | self.assertTrue(precision == 0) 22 | 23 | precision = graph._expected_round(np.array([169488.92444, 0.00169488924, 0.000169488924])) 24 | self.assertTrue(precision == 2) 25 | precision = graph._expected_round(np.array([1.6948892444e+5, 1.6948892444e-3, 1.6948892444e-4])) 26 | self.assertTrue(precision == 2) 27 | 28 | precision = graph._expected_round(np.array([0.001302153310812064, 0.00327365633422423, 0.0092585296234321431])) 29 | self.assertTrue(precision == 3) 30 | 31 | precision = graph._expected_round(np.array([1.552, 1.545, 1.547])) 32 | self.assertTrue(precision == 3) 33 | 34 | precision = graph._expected_round(np.array([0.001302153310812064, 0.00127365633422423, 0.0012585296234321431])) 35 | self.assertTrue(precision == 4) 36 | 37 | precision = graph._expected_round(np.array([1.552, 1.54599, 1.547])) 38 | self.assertTrue(precision >= 3) 39 | 40 | precision = graph._expected_round(np.array([1.1, 1.0, 1.3])) 41 | self.assertTrue(precision == 1) 42 | 43 | def test_graph_setup(self): 44 | GraphSetup().response_time_unit="JS" 45 | print(GraphSetup().response_time_unit) --------------------------------------------------------------------------------