Skip to content

Commit ddd9aa6

Browse files
Merge pull request #27 from DataKitchen/release/2.5.0
Release/2.5.0
2 parents 75d6082 + 562fdfd commit ddd9aa6

File tree

31 files changed

+4162
-7287
lines changed

31 files changed

+4162
-7287
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
## Developer Setup
1111

12-
**This repository requires `Python 3.10` at minimum -- prefer the latest `3.10.X`.**
12+
**This repository requires `Python 3.12` at minimum -- prefer the latest `3.12.X`.**
1313

1414
A local Kubernetes cluster requires
1515

@@ -28,7 +28,7 @@ it for you.
2828

2929
Example install
3030
```bash
31-
python -m virtualenv -p /usr/bin/python3.10 venv
31+
python3.12 -m venv venv
3232
source venv/bin/activate
3333
# Install platform and developer extra packages
3434
pip install --editable '.[dev]'

common/api/flask_ext/authentication/jwt_plugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class JWTAuth(BaseAuthPlugin):
4444
logout_callbacks: dict[str, Callable] = {}
4545
"""Callback functions to be called when the user logs out."""
4646

47-
secret_key: str = NotImplemented
47+
secret_key: bytes | str = NotImplemented
4848
"""
4949
Secret key utilized to encode/decode the JTW tokens.
5050
It is automatically set after flask's namesake setting upon initialization.

common/tests/integration/entity_services/test_event_service.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from unittest.mock import patch
33

44
import pytest
5+
from werkzeug.datastructures import MultiDict
56

67
from common.entities import DB
78
from common.entity_services import EventService
@@ -22,14 +23,14 @@ def test_get_events_with_rules_filters(
2223
):
2324
filter_cases = (
2425
({}, (event_entity, event_entity_2)),
25-
({"component_id": [str(pipeline.id)]}, (event_entity,)),
26-
({"instance_id": [str(instance_instance_set.instance_id)]}, (event_entity,)),
27-
({"journey_id": [str(instance_instance_set.instance.journey_id)]}, (event_entity,)),
28-
({"event_type": ["BATCH_PIPELINE_STATUS"]}, (event_entity,)),
29-
({"event_type": ["DATASET_OPERATION"]}, (event_entity_2,)),
30-
({"event_id": [str(event_entity_2.id)]}, (event_entity_2,)),
31-
({"run_id": [str(run.id)]}, (event_entity,)),
32-
({"task_id": [str(task.id)]}, (event_entity,)),
26+
({"component_id": str(pipeline.id)}, (event_entity,)),
27+
({"instance_id": str(instance_instance_set.instance_id)}, (event_entity,)),
28+
({"journey_id": str(instance_instance_set.instance.journey_id)}, (event_entity,)),
29+
({"event_type": "BATCH_PIPELINE_STATUS"}, (event_entity,)),
30+
({"event_type": "DATASET_OPERATION"}, (event_entity_2,)),
31+
({"event_id": str(event_entity_2.id)}, (event_entity_2,)),
32+
({"run_id": str(run.id)}, (event_entity,)),
33+
({"task_id": str(task.id)}, (event_entity,)),
3334
({"date_range_start": "2024-01-20T09:56:00"}, (event_entity,)),
3435
({"date_range_end": "2024-01-20T09:59:10"}, (event_entity, event_entity_2)),
3536
(
@@ -42,7 +43,7 @@ def test_get_events_with_rules_filters(
4243

4344
rules = ListRules()
4445
for filter_params, expected_result in filter_cases:
45-
filters = ProjectEventFilters.from_params(params=filter_params, project_ids=[project.id])
46+
filters = ProjectEventFilters.from_params(params=MultiDict(filter_params.items()), project_ids=[project.id])
4647
page = EventService.get_events_with_rules(rules=rules, filters=filters)
4748
assert set(page.results) == set(expected_result), filter_params
4849

@@ -51,7 +52,7 @@ def test_get_events_with_rules_filters(
5152
@pytest.mark.parametrize("sort_order,reverse", ((SortOrder.ASC, False), (SortOrder.DESC, True)))
5253
def test_get_events_with_rules_sort(sort_order, reverse, event_entity, event_entity_2, project):
5354
rules = ListRules(sort=sort_order)
54-
filters = ProjectEventFilters.from_params(params={}, project_ids=[project.id])
55+
filters = ProjectEventFilters.from_params(params=MultiDict({}), project_ids=[project.id])
5556

5657
page = EventService.get_events_with_rules(rules=rules, filters=filters)
5758

@@ -62,7 +63,7 @@ def test_get_events_with_rules_sort(sort_order, reverse, event_entity, event_ent
6263
@pytest.mark.integration
6364
def test_get_events_with_rules_prefetch(event_entity, project, instance):
6465
rules = ListRules()
65-
filters = ProjectEventFilters.from_params(params={}, project_ids=[project.id])
66+
filters = ProjectEventFilters.from_params(params=MultiDict({}), project_ids=[project.id])
6667

6768
with assert_num_queries(3):
6869
(result_event,) = EventService.get_events_with_rules(rules=rules, filters=filters)

common/tests/unit/test_decorators.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,11 @@ def test_class_mangled_auto_name():
136136
@pytest.mark.unit
137137
def test_no_duplicate_names():
138138
"""The same decorator function cannot be applied to two names on the same class."""
139-
with pytest.raises(RuntimeError):
139+
with pytest.raises(TypeError):
140140

141141
class DuplicateCheck:
142142
@cached_property
143-
def x() -> int:
143+
def x(self) -> int:
144144
return 3
145145

146146
y = x

deploy/charts/observability-app/values.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ observability:
99
flask_debug: "false"
1010
services_secrets_name: external-service-keys
1111
keys_secrets_name: internal-keys
12-
pythonpath: /dk/lib/python3.10/site-packages
12+
pythonpath: /dk/lib/python3.12/site-packages
1313
image:
1414
repository: docker.io/datakitchen
1515
tag: "v2"
Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
# DEV NOTE: YOU MUST RUN `docker build` FROM THE TOP-LEVEL OF `observability-be` AND POINT TO THIS FILE.
22
ARG BASE_IMAGE_URL
3-
FROM ${BASE_IMAGE_URL}python:3.10-slim-bullseye AS build-image
3+
FROM ${BASE_IMAGE_URL}python:3.12.7-alpine3.20 AS build-image
44
LABEL maintainer="DataKitchen"
55

6+
RUN apk update && apk upgrade && apk add --no-cache \
7+
# Tools needed for building the python wheels
8+
gcc \
9+
g++ \
10+
make \
11+
cmake \
12+
musl-dev \
13+
librdkafka-dev=2.4.0-r0
14+
615
COPY pyproject.toml /tmp/dk/
716
# -O: Strips asserts from the code which removes some unnecessary codepaths resulting in a small
817
# performance improvement
@@ -12,7 +21,7 @@ RUN python3 -O -m pip install /tmp/dk --prefix=/dk
1221

1322
# Copy and build the actual application
1423
COPY . /tmp/dk/
15-
ENV PYTHONPATH ${PYTHONPATH}:/dk/lib/python3.10/site-packages
24+
ENV PYTHONPATH ${PYTHONPATH}:/dk/lib/python3.12/site-packages
1625
# --no-deps: The previous pip layer will have already installed the dependencies. This
1726
# will disable doing a second dependency resolution check.
1827
# -O: Strips asserts from the code which removes some unnecessary codepaths resulting in a small
@@ -21,7 +30,9 @@ ENV PYTHONPATH ${PYTHONPATH}:/dk/lib/python3.10/site-packages
2130
# --prefix=/dk: The destination installation environment folder
2231
RUN python3 -O -m pip install --no-deps /tmp/dk --prefix=/dk
2332

24-
FROM ${BASE_IMAGE_URL}python:3.10-slim-bullseye AS runtime-image
33+
FROM ${BASE_IMAGE_URL}python:3.12.7-alpine3.20 AS runtime-image
34+
35+
RUN apk update && apk upgrade && apk add --no-cache librdkafka=2.4.0-r0
2536

2637
# Grab the pre-built app from the build-image. This way we don't have
2738
# excess laying around in the final image.
@@ -30,5 +41,5 @@ COPY --from=build-image /dk /dk
3041
COPY --from=build-image /tmp/dk/deploy/conf/gunicorn.conf.py /tmp/dk/deploy/conf/yoyo.ini /dk/
3142
COPY --from=build-image /tmp/dk/deploy/migrations/ /dk/lib/migrations/
3243

33-
ENV PYTHONPATH ${PYTHONPATH}:/dk/lib/python3.10/site-packages
44+
ENV PYTHONPATH ${PYTHONPATH}:/dk/lib/python3.12/site-packages
3445
ENV PATH ${PATH}:/dk/bin

deploy/docker/observability-ui.dockerfile

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
11
ARG BASE_IMAGE_URL
22

3-
FROM --platform=${BUILDPLATFORM} ${BASE_IMAGE_URL}debian:bookworm-slim AS build-image
3+
FROM --platform=${BUILDPLATFORM} ${BASE_IMAGE_URL}node:23.10-alpine3.21 AS build-image
44

55
WORKDIR /observability_ui
66
COPY observability_ui/ /observability_ui
77

8-
SHELL ["/bin/bash", "--login", "-c"]
9-
10-
RUN apt-get update -y && \
11-
apt-get upgrade -y && \
12-
apt-get install curl -y && \
13-
apt-get install jq -y
14-
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
15-
RUN nvm install $(jq -r .engines.node package.json)
16-
RUN npm install --global yarn
178
RUN yarn
189
RUN yarn build:ci
1910

20-
21-
FROM ${BASE_IMAGE_URL}nginxinc/nginx-unprivileged:1.25
11+
FROM ${BASE_IMAGE_URL}nginxinc/nginx-unprivileged:alpine3.21
2212

2313
WORKDIR /observability_ui
2414

observability_ui/apps/shell/src/app/projects/events/event-list/event-list.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export class EventListComponent extends CoreComponent implements OnInit, HasSear
8383
const filters: EventSearchFields = {
8484
event_type: event_type?.split(',').filter(e => e) ?? [] as any,
8585
component_id: component_id?.split(',').filter(e => e) ?? [] as any,
86-
}
86+
};
8787

8888
if (date_range_start) {
8989
const startDate = beginningOfDay(new Date(date_range_start));

observability_ui/apps/shell/src/app/projects/instances/alerts-dialog/alerts-dialog.component.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
@use '@observability/ui/styles/mixins' as mixins;
33

44
.table-wrapper-container {
5-
height: 400px;
5+
height: 500px;
66
display: flex;
77

88
table-wrapper {

observability_ui/apps/shell/src/app/projects/instances/alerts-dialog/alerts-dialog.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export class AlertsDialogComponent {
7979
instance: Instance
8080
}, private store: InstancesStore, private router: Router) {
8181
let urlTree = this.router.parseUrl(this.router.url);
82-
urlTree.queryParams['_pageSize'] = '5';
82+
urlTree.queryParams['_pageSize'] = '25';
8383
urlTree.queryParams['_pageIndex'] = 0;
8484

8585
void this.router.navigateByUrl(urlTree);

0 commit comments

Comments
 (0)