Changeset View
Changeset View
Standalone View
Standalone View
contrib/teamcity/nanobench_json_to_teamcity_messages.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2021 The Bitcoin developers | # Copyright (c) 2021 The Bitcoin developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
import json | import json | ||||
import sys | import sys | ||||
from datetime import timedelta | from datetime import timedelta | ||||
from teamcity.messages import TeamcityServiceMessages | from teamcity.messages import TeamcityServiceMessages | ||||
if len(sys.argv) != 3: | if len(sys.argv) != 3: | ||||
print( | print(f""" | ||||
f""" | |||||
Usage: | Usage: | ||||
{sys.argv[0]} <benchmark suite name> <path to nanobench json file> | {sys.argv[0]} <benchmark suite name> <path to nanobench json file> | ||||
Print the teamcity service messages for associating op/s benchmark result | Print the teamcity service messages for associating op/s benchmark result | ||||
to the tests. | to the tests. | ||||
Requires the teamcity-messages python library: | Requires the teamcity-messages python library: | ||||
pip3 install teamcity-messages | pip3 install teamcity-messages | ||||
""") | """) | ||||
sys.exit(1) | sys.exit(1) | ||||
suite_name = sys.argv[1] | suite_name = sys.argv[1] | ||||
with open(sys.argv[2], encoding='utf-8') as f: | with open(sys.argv[2], encoding="utf-8") as f: | ||||
json_results = json.load(f) | json_results = json.load(f) | ||||
teamcity_messages = TeamcityServiceMessages() | teamcity_messages = TeamcityServiceMessages() | ||||
teamcity_messages.testSuiteStarted( | teamcity_messages.testSuiteStarted(suite_name) | ||||
suite_name | |||||
) | |||||
def testMetadata_number_message(test_name, param_name, param_value): | def testMetadata_number_message(test_name, param_name, param_value): | ||||
teamcity_messages.message( | teamcity_messages.message( | ||||
'testMetadata', | "testMetadata", | ||||
type='number', | type="number", | ||||
testName=test_name, | testName=test_name, | ||||
name=param_name, | name=param_name, | ||||
value=f'{param_value:.2f}', | value=f"{param_value:.2f}", | ||||
) | ) | ||||
for result in json_results.get('results', []): | for result in json_results.get("results", []): | ||||
test_name = result['name'] | test_name = result["name"] | ||||
teamcity_messages.testStarted( | teamcity_messages.testStarted(test_name) | ||||
test_name | |||||
) | |||||
testMetadata_number_message( | testMetadata_number_message( | ||||
test_name, | test_name, | ||||
f"ns/{result['unit']}", | f"ns/{result['unit']}", | ||||
1e9 * result['median(elapsed)'] / result['batch'], | 1e9 * result["median(elapsed)"] / result["batch"], | ||||
) | ) | ||||
testMetadata_number_message( | testMetadata_number_message( | ||||
test_name, | test_name, | ||||
f"{result['unit']}/s", | f"{result['unit']}/s", | ||||
result['batch'] / result['median(elapsed)'], | result["batch"] / result["median(elapsed)"], | ||||
) | ) | ||||
testMetadata_number_message( | testMetadata_number_message( | ||||
test_name, | test_name, | ||||
'err%', | "err%", | ||||
100 * result['medianAbsolutePercentError(elapsed)'], | 100 * result["medianAbsolutePercentError(elapsed)"], | ||||
) | ) | ||||
testMetadata_number_message( | testMetadata_number_message( | ||||
test_name, | test_name, | ||||
f"ins/{result['unit']}", | f"ins/{result['unit']}", | ||||
result['median(instructions)'] / result['batch'], | result["median(instructions)"] / result["batch"], | ||||
) | ) | ||||
teamcity_messages.testFinished( | teamcity_messages.testFinished( | ||||
test_name, | test_name, | ||||
testDuration=timedelta(seconds=result['totalTime']), | testDuration=timedelta(seconds=result["totalTime"]), | ||||
) | ) | ||||
teamcity_messages.testSuiteFinished( | teamcity_messages.testSuiteFinished(suite_name) | ||||
suite_name | |||||
) |