From 9f9acf0405ad5fb623def9b76439b8d5b55177e1 Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Sun, 26 May 2024 15:01:39 +0200 Subject: [PATCH] Implement end-to-end benchmark --- .github/workflows/osrm-backend.yml | 3 +- scripts/ci/download_gps_traces.py | 91 ++++++++++++++++++++++++++++++ scripts/ci/run_benchmarks.sh | 12 +++- 3 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 scripts/ci/download_gps_traces.py diff --git a/.github/workflows/osrm-backend.yml b/.github/workflows/osrm-backend.yml index 4943d6de3..83ea2587d 100644 --- a/.github/workflows/osrm-backend.yml +++ b/.github/workflows/osrm-backend.yml @@ -641,8 +641,9 @@ jobs: restore-keys: | v1-conan-benchmarks- - name: Prepare data - run: | + run: | wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf -O ~/data.osm.pbf + python3 scripts/ci/download_gps_traces.py 13.0884 52.3383 13.7611 52.6755 > ~/gps_traces.csv - name: Install dependencies run: python3 -m pip install "conan<2.0.0" "requests==2.31.0" "locust==2.28.0" - name: Checkout PR Branch diff --git a/scripts/ci/download_gps_traces.py b/scripts/ci/download_gps_traces.py new file mode 100644 index 000000000..961acd532 --- /dev/null +++ b/scripts/ci/download_gps_traces.py @@ -0,0 +1,91 @@ +import requests +import xml.etree.ElementTree as ET +import csv +import sys +import argparse + +def get_osm_gps_traces(min_lon, min_lat, max_lon, max_lat): + url = 'https://api.openstreetmap.org/api/0.6/trackpoints' + traces = [] + + lon_step = 0.25 + lat_step = 0.25 + + current_min_lon = min_lon + + while current_min_lon < max_lon: + current_max_lon = min(current_min_lon + lon_step, max_lon) + + current_min_lat = min_lat + while current_min_lat < max_lat: + current_max_lat = min(current_min_lat + lat_step, max_lat) + + bbox = f'{current_min_lon},{current_min_lat},{current_max_lon},{current_max_lat}' + print(f"Requesting bbox: {bbox}", file=sys.stderr) + + params = { + 'bbox': bbox, + 'page': 0 + } + headers = { + 'Accept': 'application/xml' + } + + response = requests.get(url, params=params, headers=headers) + if response.status_code == 200: + traces.append(response.content) + else: + print(f"Error fetching data for bbox {bbox}: {response.status_code} {response.text}", file=sys.stderr) + + current_min_lat += lat_step + current_min_lon += lon_step + + return traces + +def parse_gpx_data(gpx_data): + try: + root = ET.fromstring(gpx_data) + except ET.ParseError as e: + print(f"Error parsing GPX data: {e}", file=sys.stderr) + return [] + namespace = {'gpx': 'http://www.topografix.com/GPX/1/0'} + + tracks = [] + for trk in root.findall('.//gpx:trk', namespace): + track_data = [] + for trkseg in trk.findall('.//gpx:trkseg', namespace): + for trkpt in trkseg.findall('gpx:trkpt', namespace): + lat = trkpt.get('lat') + lon = trkpt.get('lon') + time = trkpt.find('time').text if trkpt.find('time') is not None else '' + track_data.append([lat, lon, time]) + tracks.append(track_data) + return tracks + +def save_to_csv(data, file): + writer = csv.writer(file) + writer.writerow(['TrackID', 'Latitude', 'Longitude', 'Time']) + writer.writerows(data) + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Fetch and output OSM GPS traces for a given bounding box.') + parser.add_argument('min_lon', type=float, help='Minimum longitude of the bounding box') + parser.add_argument('min_lat', type=float, help='Minimum latitude of the bounding box') + parser.add_argument('max_lon', type=float, help='Maximum longitude of the bounding box') + parser.add_argument('max_lat', type=float, help='Maximum latitude of the bounding box') + + args = parser.parse_args() + + gpx_data_traces = get_osm_gps_traces(args.min_lon, args.min_lat, args.max_lon, args.max_lat) + print(f"Collected {len(gpx_data_traces)} trace segments", file=sys.stderr) + + all_data = [] + track_id = 0 + for gpx_data in gpx_data_traces: + for track in parse_gpx_data(gpx_data): + for point in track: + all_data.append([track_id] + point) + track_id += 1 + + # Output all data to stdout + save_to_csv(all_data, sys.stdout) diff --git a/scripts/ci/run_benchmarks.sh b/scripts/ci/run_benchmarks.sh index 1cdd76a66..c551cb998 100755 --- a/scripts/ci/run_benchmarks.sh +++ b/scripts/ci/run_benchmarks.sh @@ -31,9 +31,17 @@ function run_benchmarks_for_folder { # TODO: save results curl --retry-delay 3 --retry 10 --retry-all-errors "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true" - locust -f locustfile.py --headless --users 10 --spawn-rate 1 --host http://localhost:5000 --run-time 1m --csv=results + locust -f $FOLDER/locustfile.py --headless --users 10 --spawn-rate 1 --host http://localhost:5000 --run-time 1m --csv=results + + echo "STATS: " + cat results_stats.csv + echo "FAILURES: " + cat results_failures.csv + echo "EXCEPTIONS: " + cat results_exceptions.csv + echo "STATS HISTORY: " + cat results_stats_history.csv - cat results_distribution.csv kill -0 $OSRM_ROUTED_PID }