diff --git a/api/chalicelib/core/custom_metrics.py b/api/chalicelib/core/custom_metrics.py index cc457a0e2..51f8655a4 100644 --- a/api/chalicelib/core/custom_metrics.py +++ b/api/chalicelib/core/custom_metrics.py @@ -194,7 +194,8 @@ def update(metric_id, user_id, project_id, data: schemas.UpdateCustomMetricsSche SET name = %(name)s, is_public= %(is_public)s, view_type= %(view_type)s, metric_type= %(metric_type)s, metric_of= %(metric_of)s, metric_value= %(metric_value)s, - metric_format= %(metric_format)s + metric_format= %(metric_format)s, + edited_at = timezone('utc'::text, now()) WHERE metric_id = %(metric_id)s AND project_id = %(project_id)s AND (user_id = %(user_id)s OR is_public) @@ -224,6 +225,11 @@ def get_all(project_id, user_id, include_series=False): AND project_id = %(project_id)s AND ((user_id = %(user_id)s OR is_public))) AS connected_dashboards ) AS connected_dashboards ON (TRUE) + LEFT JOIN LATERAL (SELECT email AS owner_email + FROM users + WHERE deleted_at ISNULL + AND users.user_id = metrics.user_id + ) AS owner ON (TRUE) WHERE metrics.project_id = %(project_id)s AND metrics.deleted_at ISNULL AND (user_id = %(user_id)s OR metrics.is_public) @@ -246,7 +252,7 @@ def delete(project_id, metric_id, user_id): cur.execute( cur.mogrify("""\ UPDATE public.metrics - SET deleted_at = timezone('utc'::text, now()) + SET deleted_at = timezone('utc'::text, now()), edited_at = timezone('utc'::text, now()) WHERE project_id = %(project_id)s AND metric_id = %(metric_id)s AND (user_id = %(user_id)s OR is_public);""", @@ -274,6 +280,11 @@ def get(metric_id, project_id, user_id, flatten=True): AND project_id = %(project_id)s AND ((user_id = %(user_id)s OR is_public))) AS connected_dashboards ) AS connected_dashboards ON (TRUE) + LEFT JOIN LATERAL (SELECT email AS owner_email + FROM users + WHERE deleted_at ISNULL + AND users.user_id = metrics.user_id + ) AS owner ON (TRUE) WHERE metrics.project_id = %(project_id)s AND metrics.deleted_at ISNULL AND (metrics.user_id = %(user_id)s OR metrics.is_public) diff --git a/api/schemas.py b/api/schemas.py index b707a53e1..a7fd003b7 100644 --- a/api/schemas.py +++ b/api/schemas.py @@ -776,6 +776,7 @@ class CustomMetricCreateSeriesSchema(BaseModel): class MetricTimeseriesViewType(str, Enum): line_chart = "lineChart" progress = "progress" + area_chart = "areaChart" class MetricTableViewType(str, Enum): diff --git a/scripts/helm/db/init_dbs/postgresql/1.5.5/1.5.5.sql b/scripts/helm/db/init_dbs/postgresql/1.5.5/1.5.5.sql index 3080f8dbb..d4d8575ae 100644 --- a/scripts/helm/db/init_dbs/postgresql/1.5.5/1.5.5.sql +++ b/scripts/helm/db/init_dbs/postgresql/1.5.5/1.5.5.sql @@ -18,50 +18,23 @@ CREATE TABLE IF NOT EXISTS dashboards deleted_at timestamp NULL DEFAULT NULL ); --- CREATE TABLE templates --- ( --- template_id integer generated BY DEFAULT AS IDENTITY PRIMARY KEY, --- template_key text, --- name text NOT NULL, --- category text NOT NULL, --- series jsonb NOT NULL, --- config jsonb NOT NULL, --- predefined boolean DEFAULT TRUE --- ); - --- CREATE TABLE dashboard_widgets --- ( --- widget_id integer generated BY DEFAULT AS IDENTITY PRIMARY KEY, --- dashboard_id integer NOT NULL REFERENCES dashboards (dashboard_id) ON DELETE CASCADE, --- metric_id integer NOT NULL REFERENCES metrics (metric_id) ON DELETE CASCADE, --- -- template_id integer NOT NULL REFERENCES templates (template_id) ON DELETE CASCADE, --- user_id integer NOT NULL REFERENCES users (user_id) ON DELETE SET NULL, --- created_at timestamp NOT NULL DEFAULT timezone('utc'::text, now()), --- configuration jsonb NOT NULL DEFAULT '{}'::jsonb, --- name text --- ); - --- INSERT INTO public.templates (name, category, series, config, predefined, template_key) --- VALUES ('captured sessions', 'overview', '[]', '{}', true, 'count_sessions'), --- ('request load time', 'overview', '[]', '{}', true, 'avg_request_load_time'), --- ('page load time', 'overview', '[]', '{}', true, 'avg_page_load_time'), --- ('image load time', 'overview', '[]', '{}', true, 'avg_image_load_time'); - -ALTER TYPE metric_view_type ADD VALUE IF NOT EXISTS 'areaChart'; ALTER TABLE IF EXISTS metrics - DROP CONSTRAINT IF EXISTS null_project_id_for_template_only; + DROP CONSTRAINT IF EXISTS null_project_id_for_template_only, + DROP CONSTRAINT IF EXISTS unique_key; ALTER TABLE IF EXISTS metrics - ADD COLUMN IF NOT EXISTS is_pinned boolean NOT NULL DEFAULT FALSE, - ADD COLUMN IF NOT EXISTS category text NULL DEFAULT 'custom', - ADD COLUMN IF NOT EXISTS is_predefined boolean NOT NULL DEFAULT FALSE, - ADD COLUMN IF NOT EXISTS is_template boolean NOT NULL DEFAULT FALSE, - ADD COLUMN IF NOT EXISTS key text NULL DEFAULT NULL, - ADD COLUMN IF NOT EXISTS config jsonb NOT NULL DEFAULT '{}'::jsonb, + ADD COLUMN IF NOT EXISTS edited_at timestamp NULL DEFAULT NULL, + ADD COLUMN IF NOT EXISTS is_pinned boolean NOT NULL DEFAULT FALSE, + ADD COLUMN IF NOT EXISTS category text NULL DEFAULT 'custom', + ADD COLUMN IF NOT EXISTS is_predefined boolean NOT NULL DEFAULT FALSE, + ADD COLUMN IF NOT EXISTS is_template boolean NOT NULL DEFAULT FALSE, + ADD COLUMN IF NOT EXISTS key text NULL DEFAULT NULL, + ADD COLUMN IF NOT EXISTS config jsonb NOT NULL DEFAULT '{}'::jsonb, ALTER COLUMN project_id DROP NOT NULL, ADD CONSTRAINT null_project_id_for_template_only - CHECK ( (metrics.category != 'custom') != (metrics.project_id IS NOT NULL) ); + CHECK ( (metrics.category != 'custom') != (metrics.project_id IS NOT NULL) ), + ADD CONSTRAINT unique_key UNIQUE (key); @@ -76,17 +49,33 @@ CREATE TABLE IF NOT EXISTS dashboard_widgets name text ); --- INSERT INTO public.templates (name, category, series, config, predefined, template_key) --- VALUES ('captured sessions', 'overview', '[]', '{}', true, 'count_sessions'), --- ('request load time', 'overview', '[]', '{}', true, 'avg_request_load_time'), --- ('page load time', 'overview', '[]', '{}', true, 'avg_page_load_time'), --- ('image load time', 'overview', '[]', '{}', true, 'avg_image_load_time'); INSERT INTO metrics (name, category, config, is_predefined, is_template, is_public, key) -VALUES ('captured sessions', 'overview', '{}', true, true, true, 'count_sessions'), - ('request load time', 'overview', '{}', true, true, true, 'avg_request_load_time'), - ('page load time', 'overview', '{}', true, true, true, 'avg_page_load_time'), - ('image load time', 'overview', '{}', true, true, true, 'avg_image_load_time'); +VALUES ('sessions count', 'overview', '{}', true, true, true, 'count_sessions'), + ('avg request load time', 'overview', '{}', true, true, true, 'avg_request_load_time'), + ('avg page load time', 'overview', '{}', true, true, true, 'avg_page_load_time'), + ('avg image load time', 'overview', '{}', true, true, true, 'avg_image_load_time'), + ('avg dom content load start', 'overview', '{}', true, true, true, 'avg_dom_content_load_start'), + ('avg first contentful pixel', 'overview', '{}', true, true, true, 'avg_first_contentful_pixel'), + ('avg visited pages count', 'overview', '{}', true, true, true, 'avg_visited_pages'), + ('avg session duration', 'overview', '{}', true, true, true, 'avg_session_duration'), + ('avg pages dom buildtime', 'overview', '{}', true, true, true, 'avg_pages_dom_buildtime'), + ('avg pages response time', 'overview', '{}', true, true, true, 'avg_pages_response_time'), + ('avg response time', 'overview', '{}', true, true, true, 'avg_response_time'), + ('avg first paint', 'overview', '{}', true, true, true, 'avg_first_paint'), + ('avg dom content loaded', 'overview', '{}', true, true, true, 'avg_dom_content_loaded'), + ('avg time till first bit', 'overview', '{}', true, true, true, 'avg_till_first_bit'), + ('avg time to interactive', 'overview', '{}', true, true, true, 'avg_time_to_interactive'), + ('requests count', 'overview', '{}', true, true, true, 'count_requests'), + ('avg time to render', 'overview', '{}', true, true, true, 'avg_time_to_render'), + ('avg used js heap size', 'overview', '{}', true, true, true, 'avg_used_js_heap_size'), + ('avg cpu', 'overview', '{}', true, true, true, 'avg_cpu') +ON CONFLICT (key) DO UPDATE SET name=excluded.name, + category=excluded.category, + config=excluded.config, + is_predefined=excluded.is_predefined, + is_template=excluded.is_template, + is_public=excluded.is_public; - -COMMIT \ No newline at end of file +COMMIT; +ALTER TYPE metric_view_type ADD VALUE IF NOT EXISTS 'areaChart'; \ No newline at end of file diff --git a/scripts/helm/db/init_dbs/postgresql/init_schema.sql b/scripts/helm/db/init_dbs/postgresql/init_schema.sql index 35926bc96..c6f628e32 100644 --- a/scripts/helm/db/init_dbs/postgresql/init_schema.sql +++ b/scripts/helm/db/init_dbs/postgresql/init_schema.sql @@ -947,6 +947,7 @@ $$ active boolean NOT NULL DEFAULT TRUE, created_at timestamp default timezone('utc'::text, now()) not null, deleted_at timestamp, + edited_at timestamp, metric_type metric_type NOT NULL DEFAULT 'timeseries', view_type metric_view_type NOT NULL DEFAULT 'lineChart', metric_of text NOT NULL DEFAULT 'sessionCount',