Skip to content

Commit

Permalink
Merge pull request #220 from EURODEO/load-test
Browse files Browse the repository at this point in the history
Fix and move local locust loadtest, and add EWC loadtest code to repo
  • Loading branch information
lukas-phaf authored Dec 16, 2024
2 parents 31a83fc + 64e76a5 commit 2cbcf24
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 37 deletions.
87 changes: 87 additions & 0 deletions api/load-test/locust-ewc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
from datetime import datetime, timedelta, UTC
import random

from locust import HttpUser
from locust import task

headers = {"Accept-Encoding": "br"}

common_standard_names = [
"wind_speed",
"wind_from_direction",
"air_temperature",
]

polygon_size = [0.5, 1.0, 2.0, 4.0]
hours_choice = [1, 3, 6, 12, 24]


class ESohUser(HttpUser):
def on_start(self):
response = self.client.get("/collections/observations/locations", headers=headers)
stations = response.json()["features"]
self.stations = {s["id"]: s["properties"]["parameter-name"] for s in stations}
self.station_ids = list(self.stations.keys())
self.stations_by_location = {
(s["geometry"]["coordinates"][0], s["geometry"]["coordinates"][1]): s["properties"]["parameter-name"]
for s in stations
}
self.station_locations = list(self.stations_by_location.keys())

# @task
# def get_data_single_station_single_parameter(self):
# station_id = random.choice(self.station_ids)
# parameter = random.choice(self.stations[station_id])
# response = self.client.get(
# f"/collections/observations/locations/{station_id}?parameter-name={parameter}",
# name="location",
# headers=headers
# )

@task
def get_data_single_station_single_parameter_last_x_hours(self):
hours = random.choice(hours_choice)
date_time = datetime.now(UTC) - timedelta(hours=hours)
dt_string = date_time.strftime("%Y-%m-%dT%H:%M:%SZ")
station_id = random.choice(self.station_ids)
parameter = random.choice(self.stations[station_id])
self.client.get(
f"/collections/observations/locations/{station_id}?parameter-name={parameter}&datetime={dt_string}/..",
name=f"location {hours:02d} hours",
headers=headers,
)

@task
def get_data_single_position_single_parameter(self):
(lon, lat) = random.choice(self.station_locations)
parameter = random.choice(self.stations_by_location[(lon, lat)])
self.client.get(
f"/collections/observations/position?coords=POINT({lon} {lat})&parameter-name={parameter}",
name="position",
headers=headers,
)

@task
def get_data_area_single_parameter_last_hour(self):
date_time = datetime.now(UTC) - timedelta(hours=1)
dt_string = date_time.strftime("%Y-%m-%dT%H:%M:%SZ")
standard_name = random.choice(common_standard_names)
(cx, cy) = random.choice(self.station_locations)
sz = random.choice(polygon_size) / 2.0
left = cx - sz
bottom = cy - sz
right = cx + sz
top = cy + sz
polygon = f"POLYGON(({left} {bottom},{right} {bottom},{right} {top},{left} {top},{left} {bottom}))"
url = f"/collections/observations/area?coords={polygon}&standard_names={standard_name}&datetime={dt_string}/.."
self.client.get(url, name=f"area {sz*2.0}deg x {sz*2.0}deg x 1h", headers=headers)
# if sz == 2.0:
# j = response.json()
# # print(sz*2.0)
# if response.status_code != 200:
# print(0)
# elif j["type"] == "CoverageCollection":
# print(len(j["coverages"]))
# else:
# print(1)
# # print(j)
46 changes: 46 additions & 0 deletions api/load-test/locustfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import random

from locust import HttpUser
from locust import task

parameters = [
"wind_speed:10.0:mean:PT10M",
"wind_speed:10.0:mean:PT10M",
"relative_humidity:2.0:mean:PT1M",
"air_temperature:2.0:mean:PT1M",
]
# fmt: off
stations = [
"0-20000-0-06203", "0-20000-0-06204", "0-20000-0-06205", "0-20000-0-06207", "0-20000-0-06208", "0-20000-0-06211",
"0-20000-0-06214", "0-20000-0-06215", "0-20000-0-06235", "0-20000-0-06239", "0-20000-0-06242", "0-20000-0-06251",
"0-20000-0-06260", "0-20000-0-06269", "0-20000-0-06270", "0-20000-0-06275", "0-20000-0-06279", "0-20000-0-06280",
"0-20000-0-06290", "0-20000-0-06310", "0-20000-0-06317", "0-20000-0-06319", "0-20000-0-06323", "0-20000-0-06330",
"0-20000-0-06340", "0-20000-0-06344", "0-20000-0-06348", "0-20000-0-06350", "0-20000-0-06356", "0-20000-0-06370",
"0-20000-0-06375", "0-20000-0-06380",
]
# fmt: on
headers = {"Accept-Encoding": "br"}


class WebsiteUser(HttpUser):
@task
def get_data_single_station_single_parameter(self):
parameter = random.choice(parameters)
station_id = random.choice(stations)
response = self.client.get(
f"/collections/observations/locations/{station_id}?parameter-name={parameter}",
name=f"single station {parameter}",
headers=headers,
)
if response.status_code != 200:
print(station_id, parameter)

@task
def get_data_bbox_three_parameters(self):
self.client.get(
"/collections/observations/area?parameter-name="
"wind_speed:10.0:mean:PT10M,wind_speed:10.0:mean:PT10M,relative_humidity:2.0:mean:PT1M&"
"coords=POLYGON((5.0 52.0,6.0 52.0,6.0 52.1,5.0 52.1,5.0 52.0))",
name="bbox",
headers=headers,
)
36 changes: 0 additions & 36 deletions api/locustfile.py

This file was deleted.

4 changes: 3 additions & 1 deletion api/test/.coveragerc
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
[run]
omit = test/*
omit =
test/*
load-test/*

1 comment on commit 2cbcf24

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage

Unit Test Coverage Report
FileStmtsMissCoverMissing
__init__.py00100% 
datastore_pb2.py614821%34–81
datastore_pb2_grpc.py542750%15–16, 19, 65–80, 121–123, 128–130, 135–137, 142–144, 148–173, 219, 246, 273, 300
export_metrics.py100100% 
grpc_getter.py201145%15–19, 23–26, 30–32, 36–38
main.py45784%51, 56, 66, 76–77, 87–88
metadata_endpoints.py693254%50–59, 63, 115, 130–257, 261
response_classes.py50100% 
utilities.py1803978%21, 39, 46, 68–71, 79–90, 95–102, 122, 126, 128, 156, 162, 180, 238–244, 248–250, 280, 284, 306, 311
custom_geo_json
   edr_feature_collection.py60100% 
formatters
   __init__.py110100% 
   covjson.py60198%91
   geojson.py21290%27, 52
openapi
   custom_dimension_examples.py40100% 
   edr_query_parameter_descriptions.py110100% 
   openapi_examples.py130100% 
   openapi_metadata.py10100% 
routers
   __init__.py00100% 
   edr.py101496%348–349, 438–439
   feature.py471960%99–132, 148–153, 159–181
TOTAL71919074% 

Title Coverage Tests Skipped Failures Errors Time
API Unit Tests Coverage 40 0 💤 0 ❌ 0 🔥 1.909s ⏱️
Ingest Unit Tests Coverage 16 0 💤 0 ❌ 0 🔥 11.828s ⏱️

Please sign in to comment.