Skip to content

Commit 81c8ea0

Browse files
GitHKAndrei Neagu
andauthored
✨Adding dynamic services monitoring dashboard (⚠️devops) (#6784)
Co-authored-by: Andrei Neagu <[email protected]>
1 parent b1fe598 commit 81c8ea0

File tree

33 files changed

+990
-46
lines changed

33 files changed

+990
-46
lines changed

.env-devel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ DYNAMIC_SCHEDULER_LOGLEVEL=DEBUG
128128
DYNAMIC_SCHEDULER_PROFILING=1
129129
DYNAMIC_SCHEDULER_STOP_SERVICE_TIMEOUT=01:00:00
130130
DYNAMIC_SCHEDULER_TRACING={}
131+
DYNAMIC_SCHEDULER_UI_STORAGE_SECRET=adminadmin
131132

132133
FUNCTION_SERVICES_AUTHORS='{"UN": {"name": "Unknown", "email": "[email protected]", "affiliation": "unknown"}}'
133134

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ printf "$$rows" "oSparc platform" "http://$(get_my_ip).nip.io:9081";\
322322
printf "$$rows" "oSparc public API doc" "http://$(get_my_ip).nip.io:8006/dev/doc";\
323323
printf "$$rows" "oSparc web API doc" "http://$(get_my_ip).nip.io:9081/dev/doc";\
324324
printf "$$rows" "Dask Dashboard" "http://$(get_my_ip).nip.io:8787";\
325+
printf "$$rows" "Dy-scheduler Dashboard" "http://$(get_my_ip).nip.io:8012";\
325326
printf "$$rows" "Docker Registry" "http://$${REGISTRY_URL}/v2/_catalog" $${REGISTRY_USER} $${REGISTRY_PW};\
326327
printf "$$rows" "Invitations" "http://$(get_my_ip).nip.io:8008/dev/doc" $${INVITATIONS_USERNAME} $${INVITATIONS_PASSWORD};\
327328
printf "$$rows" "Jaeger" "http://$(get_my_ip).nip.io:16686";\

packages/models-library/tests/test_service_settings_labels.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from pprint import pformat
99
from typing import Any, Final, NamedTuple
1010

11-
import pydantic_core
1211
import pytest
12+
from common_library.json_serialization import json_dumps
1313
from models_library.basic_types import PortInt
1414
from models_library.osparc_variable_identifier import (
1515
OsparcVariableIdentifier,
@@ -558,11 +558,6 @@ def test_can_parse_labels_with_osparc_identifiers(
558558
assert "$" not in service_meta_str
559559

560560

561-
def servicelib__json_serialization__json_dumps(obj: Any, **kwargs):
562-
# Analogous to 'models_library.utils.json_serialization.json_dumps'
563-
return json.dumps(obj, default=pydantic_core.to_jsonable_python, **kwargs)
564-
565-
566561
def test_resolving_some_service_labels_at_load_time(
567562
vendor_environments: dict[str, Any], service_labels: dict[str, str]
568563
):
@@ -579,9 +574,7 @@ def test_resolving_some_service_labels_at_load_time(
579574
("settings", SimcoreServiceSettingsLabel),
580575
):
581576
to_serialize = getattr(service_meta, attribute_name)
582-
template = TextTemplate(
583-
servicelib__json_serialization__json_dumps(to_serialize)
584-
)
577+
template = TextTemplate(json_dumps(to_serialize))
585578
assert template.is_valid()
586579
resolved_label: str = template.safe_substitute(vendor_environments)
587580
to_restore = TypeAdapter(pydantic_model).validate_json(resolved_label)

packages/models-library/tests/test_utils_fastapi_encoders.py

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,25 @@
44
# pylint: disable=too-many-arguments
55

66
import json
7-
from typing import Any
87
from uuid import uuid4
98

10-
import pytest
9+
from common_library.json_serialization import json_dumps
1110
from faker import Faker
1211
from models_library.utils.fastapi_encoders import servicelib_jsonable_encoder
13-
from pydantic.json import pydantic_encoder
14-
15-
16-
def servicelib__json_serialization__json_dumps(obj: Any, **kwargs):
17-
# Analogous to 'models_library.utils.json_serialization.json_dumps'
18-
return json.dumps(obj, default=pydantic_encoder, **kwargs)
1912

2013

2114
def test_using_uuids_as_keys(faker: Faker):
2215
uuid_key = uuid4()
2316

24-
with pytest.raises(TypeError):
25-
# IMPORTANT NOTE: we cannot serialize UUID objects as keys.
26-
# We have to convert them to strings but then the class information is lost upon deserialization i.e. it is not reversable!
27-
# NOTE: This could potentially be solved using 'orjson' !!
28-
#
29-
servicelib__json_serialization__json_dumps({uuid_key: "value"}, indent=1)
17+
# this was previously failing
18+
assert json_dumps({uuid_key: "value"}, indent=1)
3019

31-
# use encoder
20+
# uuid keys now serialize without raising to the expected format string
3221
data = servicelib_jsonable_encoder({uuid_key: "value"})
3322
assert data == {f"{uuid_key}": "value"}
3423

3524
# serialize w/o raising
36-
dumped_data = servicelib__json_serialization__json_dumps(data, indent=1)
25+
dumped_data = json_dumps(data, indent=1)
3726

3827
# deserialize w/o raising
3928
loaded_data = json.loads(dumped_data)

services/docker-compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,7 @@ services:
566566
DYNAMIC_SCHEDULER_STOP_SERVICE_TIMEOUT: ${DYNAMIC_SCHEDULER_STOP_SERVICE_TIMEOUT}
567567
DYNAMIC_SCHEDULER_PROFILING: ${DYNAMIC_SCHEDULER_PROFILING}
568568
DYNAMIC_SCHEDULER_TRACING: ${DYNAMIC_SCHEDULER_TRACING}
569+
DYNAMIC_SCHEDULER_UI_STORAGE_SECRET: ${DYNAMIC_SCHEDULER_UI_STORAGE_SECRET}
569570
TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT: ${TRACING_OPENTELEMETRY_COLLECTOR_ENDPOINT}
570571
TRACING_OPENTELEMETRY_COLLECTOR_PORT: ${TRACING_OPENTELEMETRY_COLLECTOR_PORT}
571572
static-webserver:

services/dynamic-scheduler/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ HEALTHCHECK --interval=30s \
146146
--timeout=20s \
147147
--start-period=30s \
148148
--retries=3 \
149-
CMD ["python3", "services/dynamic-scheduler/docker/healthcheck.py", "http://localhost:8000/"]
149+
CMD ["python3", "services/dynamic-scheduler/docker/healthcheck.py", "http://localhost:8000/health"]
150150

151151
ENTRYPOINT [ "/bin/sh", "services/dynamic-scheduler/docker/entrypoint.sh" ]
152152
CMD ["/bin/sh", "services/dynamic-scheduler/docker/boot.sh"]

services/dynamic-scheduler/requirements/_base.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
arrow
1919
fastapi
2020
httpx
21+
nicegui
2122
packaging
2223
python-socketio
2324
typer[all]

services/dynamic-scheduler/requirements/_base.txt

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ aiodebug==2.3.0
77
aiodocker==0.24.0
88
# via -r requirements/../../../packages/service-library/requirements/_base.in
99
aiofiles==24.1.0
10-
# via -r requirements/../../../packages/service-library/requirements/_base.in
10+
# via
11+
# -r requirements/../../../packages/service-library/requirements/_base.in
12+
# nicegui
1113
aiohappyeyeballs==2.4.3
1214
# via aiohttp
1315
aiohttp==3.11.7
@@ -27,6 +29,8 @@ aiohttp==3.11.7
2729
# -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt
2830
# -c requirements/../../../requirements/constraints.txt
2931
# aiodocker
32+
# nicegui
33+
# python-socketio
3034
aiormq==6.8.1
3135
# via aio-pika
3236
aiosignal==1.3.1
@@ -77,6 +81,7 @@ certifi==2024.8.30
7781
# -c requirements/../../../requirements/constraints.txt
7882
# httpcore
7983
# httpx
84+
# nicegui
8085
# requests
8186
charset-normalizer==3.4.0
8287
# via requests
@@ -92,6 +97,8 @@ deprecated==1.2.15
9297
# opentelemetry-semantic-conventions
9398
dnspython==2.7.0
9499
# via email-validator
100+
docutils==0.21.2
101+
# via nicegui
95102
email-validator==2.2.0
96103
# via pydantic
97104
exceptiongroup==1.2.2
@@ -102,6 +109,7 @@ fastapi==0.115.5
102109
# via
103110
# -r requirements/../../../packages/service-library/requirements/_fastapi.in
104111
# -r requirements/_base.in
112+
# nicegui
105113
faststream==0.5.30
106114
# via -r requirements/../../../packages/service-library/requirements/_base.in
107115
frozenlist==1.5.0
@@ -143,15 +151,37 @@ httpx==0.27.2
143151
# -c requirements/../../../requirements/constraints.txt
144152
# -r requirements/../../../packages/service-library/requirements/_fastapi.in
145153
# -r requirements/_base.in
154+
# nicegui
146155
idna==3.10
147156
# via
148157
# anyio
149158
# email-validator
150159
# httpx
151160
# requests
152161
# yarl
162+
ifaddr==0.2.0
163+
# via nicegui
153164
importlib-metadata==8.5.0
154165
# via opentelemetry-api
166+
itsdangerous==2.2.0
167+
# via nicegui
168+
jinja2==3.1.4
169+
# via
170+
# -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
171+
# -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
172+
# -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
173+
# -c requirements/../../../packages/postgres-database/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
174+
# -c requirements/../../../packages/postgres-database/requirements/../../../requirements/constraints.txt
175+
# -c requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
176+
# -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
177+
# -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
178+
# -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
179+
# -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt
180+
# -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt
181+
# -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
182+
# -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt
183+
# -c requirements/../../../requirements/constraints.txt
184+
# nicegui
155185
jsonschema==4.23.0
156186
# via
157187
# -r requirements/../../../packages/models-library/requirements/_base.in
@@ -177,14 +207,20 @@ mako==1.3.6
177207
# alembic
178208
markdown-it-py==3.0.0
179209
# via rich
210+
markdown2==2.5.1
211+
# via nicegui
180212
markupsafe==3.0.2
181-
# via mako
213+
# via
214+
# jinja2
215+
# mako
182216
mdurl==0.1.2
183217
# via markdown-it-py
184218
multidict==6.1.0
185219
# via
186220
# aiohttp
187221
# yarl
222+
nicegui==2.7.0
223+
# via -r requirements/_base.in
188224
opentelemetry-api==1.28.2
189225
# via
190226
# -r requirements/../../../packages/service-library/requirements/_base.in
@@ -280,6 +316,7 @@ orjson==3.10.12
280316
# -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in
281317
# -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in
282318
# -r requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in
319+
# nicegui
283320
packaging==24.2
284321
# via
285322
# -r requirements/_base.in
@@ -300,6 +337,8 @@ protobuf==5.28.3
300337
# via
301338
# googleapis-common-protos
302339
# opentelemetry-proto
340+
pscript==0.7.7
341+
# via vbuild
303342
psutil==6.1.0
304343
# via -r requirements/../../../packages/service-library/requirements/_base.in
305344
psycopg2-binary==2.9.10
@@ -357,7 +396,9 @@ pydantic-settings==2.6.1
357396
# -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in
358397
# -r requirements/../../../packages/settings-library/requirements/_base.in
359398
pygments==2.18.0
360-
# via rich
399+
# via
400+
# nicegui
401+
# rich
361402
pyinstrument==5.0.0
362403
# via -r requirements/../../../packages/service-library/requirements/_base.in
363404
python-dateutil==2.9.0.post0
@@ -368,8 +409,12 @@ python-dotenv==1.0.1
368409
# uvicorn
369410
python-engineio==4.10.1
370411
# via python-socketio
412+
python-multipart==0.0.17
413+
# via nicegui
371414
python-socketio==5.11.4
372-
# via -r requirements/_base.in
415+
# via
416+
# -r requirements/_base.in
417+
# nicegui
373418
pyyaml==6.0.2
374419
# via
375420
# -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
@@ -412,7 +457,9 @@ referencing==0.35.1
412457
repro-zipfile==0.3.1
413458
# via -r requirements/../../../packages/service-library/requirements/_base.in
414459
requests==2.32.3
415-
# via opentelemetry-exporter-otlp-proto-http
460+
# via
461+
# nicegui
462+
# opentelemetry-exporter-otlp-proto-http
416463
rich==13.9.4
417464
# via
418465
# -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in
@@ -487,6 +534,7 @@ typing-extensions==4.12.2
487534
# alembic
488535
# fastapi
489536
# faststream
537+
# nicegui
490538
# opentelemetry-sdk
491539
# pydantic
492540
# pydantic-core
@@ -510,15 +558,21 @@ urllib3==2.2.3
510558
# -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt
511559
# -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt
512560
# -c requirements/../../../requirements/constraints.txt
561+
# nicegui
513562
# requests
514563
uvicorn==0.32.1
515564
# via
516565
# -r requirements/../../../packages/service-library/requirements/_fastapi.in
517566
# -r requirements/_base.in
567+
# nicegui
518568
uvloop==0.21.0
519569
# via uvicorn
570+
vbuild==0.8.2
571+
# via nicegui
520572
watchfiles==1.0.0
521-
# via uvicorn
573+
# via
574+
# nicegui
575+
# uvicorn
522576
websockets==14.1
523577
# via uvicorn
524578
wrapt==1.17.0

services/dynamic-scheduler/requirements/_test.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ asgi_lifespan
1515
coverage
1616
docker
1717
faker
18+
hypercorn
19+
playwright
1820
pytest
1921
pytest-asyncio
2022
pytest-cov

services/dynamic-scheduler/requirements/_test.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,20 @@ docker==7.1.0
2323
# via -r requirements/_test.in
2424
faker==33.0.0
2525
# via -r requirements/_test.in
26+
greenlet==3.1.1
27+
# via
28+
# -c requirements/_base.txt
29+
# playwright
2630
h11==0.14.0
2731
# via
2832
# -c requirements/_base.txt
2933
# httpcore
34+
# hypercorn
35+
# wsproto
36+
h2==4.1.0
37+
# via hypercorn
38+
hpack==4.0.0
39+
# via h2
3040
httpcore==1.0.7
3141
# via
3242
# -c requirements/_base.txt
@@ -36,6 +46,10 @@ httpx==0.27.2
3646
# -c requirements/../../../requirements/constraints.txt
3747
# -c requirements/_base.txt
3848
# respx
49+
hypercorn==0.17.3
50+
# via -r requirements/_test.in
51+
hyperframe==6.0.1
52+
# via h2
3953
icdiff==2.0.7
4054
# via pytest-icdiff
4155
idna==3.10
@@ -51,10 +65,16 @@ packaging==24.2
5165
# -c requirements/_base.txt
5266
# pytest
5367
# pytest-sugar
68+
playwright==1.49.0
69+
# via -r requirements/_test.in
5470
pluggy==1.5.0
5571
# via pytest
5672
pprintpp==0.4.0
5773
# via pytest-icdiff
74+
priority==2.0.0
75+
# via hypercorn
76+
pyee==12.0.0
77+
# via playwright
5878
pytest==8.3.3
5979
# via
6080
# -r requirements/_test.in
@@ -107,9 +127,14 @@ typing-extensions==4.12.2
107127
# via
108128
# -c requirements/_base.txt
109129
# faker
130+
# pyee
110131
urllib3==2.2.3
111132
# via
112133
# -c requirements/../../../requirements/constraints.txt
113134
# -c requirements/_base.txt
114135
# docker
115136
# requests
137+
wsproto==1.2.0
138+
# via
139+
# -c requirements/_base.txt
140+
# hypercorn

0 commit comments

Comments
 (0)