From 5b84ada80967c93bdb4e7e5ff4483d7b5d0a3210 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Fri, 25 Feb 2022 21:53:35 +0100 Subject: [PATCH] feat(api): custom metrics table for VISITED_URL --- api/chalicelib/core/sessions.py | 29 +++++++++++++++++++++++------ api/schemas.py | 3 +++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/api/chalicelib/core/sessions.py b/api/chalicelib/core/sessions.py index caedc4ff7..0beec7aae 100644 --- a/api/chalicelib/core/sessions.py +++ b/api/chalicelib/core/sessions.py @@ -268,9 +268,12 @@ def search2_series(data: schemas.SessionsSearchPayloadSchema, project_id: int, d view_type: schemas.MetricViewType, metric_type: schemas.MetricType, metric_of: schemas.MetricOfType): step_size = int(metrics_helper.__get_step_size(endTimestamp=data.endDate, startTimestamp=data.startDate, density=density, factor=1, decimal=True)) + extra_event = None + if metric_of == schemas.MetricOfType.visited_url: + extra_event = "events.pages" full_args, query_part, sort = search_query_parts(data=data, error_status=None, errors_only=False, favorite_only=False, issue=None, project_id=project_id, - user_id=None) + user_id=None, extra_event=extra_event) full_args["step_size"] = step_size sessions = [] with pg_client.PostgresClient() as cur: @@ -303,6 +306,7 @@ def search2_series(data: schemas.SessionsSearchPayloadSchema, project_id: int, d if isinstance(metric_of, schemas.MetricOfType): main_col = "user_id" extra_col = "" + pre_query = "" if metric_of == schemas.MetricOfType.user_country: main_col = "user_country" elif metric_of == schemas.MetricOfType.user_device: @@ -312,7 +316,14 @@ def search2_series(data: schemas.SessionsSearchPayloadSchema, project_id: int, d elif metric_of == schemas.MetricOfType.issues: main_col = "issue" extra_col = f", UNNEST(s.issue_types) AS {main_col}" - main_query = cur.mogrify(f"""SELECT COUNT(*) AS count, COALESCE(JSONB_AGG(users_sessions) FILTER ( WHERE rn <= 200 ), '[]'::JSONB) AS values + elif metric_of == schemas.MetricOfType.visited_url: + main_col = "base_path" + extra_col = ", base_path" + # elif metric_of == schemas.MetricOfType.initial_page_load_time: + # main_col = "issue" + # extra_col = f", UNNEST(s.issue_types) AS {main_col}" + main_query = cur.mogrify(f"""{pre_query} + SELECT COUNT(*) AS count, COALESCE(JSONB_AGG(users_sessions) FILTER ( WHERE rn <= 200 ), '[]'::JSONB) AS values FROM (SELECT {main_col} AS name, count(full_sessions) AS session_count, ROW_NUMBER() OVER (ORDER BY count(full_sessions) DESC) AS rn @@ -321,15 +332,17 @@ def search2_series(data: schemas.SessionsSearchPayloadSchema, project_id: int, d s.user_id, s.user_os, s.user_browser, s.user_device, s.user_device_type, s.user_country, s.issue_types{extra_col} + ----------------- {query_part} + ----------------- ORDER BY s.session_id desc) AS filtred_sessions ) AS full_sessions GROUP BY {main_col} ORDER BY session_count DESC) AS users_sessions;""", full_args) - # print("--------------------") - # print(main_query) - # print("--------------------") + print("--------------------") + print(main_query) + print("--------------------") cur.execute(main_query) sessions = cur.fetchone() for s in sessions["values"]: @@ -339,7 +352,7 @@ def search2_series(data: schemas.SessionsSearchPayloadSchema, project_id: int, d return sessions -def search_query_parts(data, error_status, errors_only, favorite_only, issue, project_id, user_id): +def search_query_parts(data, error_status, errors_only, favorite_only, issue, project_id, user_id, extra_event=None): ss_constraints = [] full_args = {"project_id": project_id, "startDate": data.startDate, "endDate": data.endDate, "projectId": project_id, "userId": user_id} @@ -894,6 +907,10 @@ def search_query_parts(data, error_status, errors_only, favorite_only, issue, pr """ full_args["issue_contextString"] = issue["contextString"] full_args["issue_type"] = issue["type"] + if extra_event: + extra_join += f"""INNER JOIN {extra_event} AS ev USING(session_id)""" + extra_constraints.append("ev.timestamp>=%(startDate)s") + extra_constraints.append("ev.timestamp<=%(endDate)s") query_part = f"""\ FROM {f"({events_query_part}) AS f" if len(events_query_part) > 0 else "public.sessions AS s"} {extra_join} diff --git a/api/schemas.py b/api/schemas.py index 780bd0191..b341a45fb 100644 --- a/api/schemas.py +++ b/api/schemas.py @@ -732,6 +732,8 @@ class MetricOfType(str, Enum): user_country = FilterType.user_country.value user_id = FilterType.user_id.value issues = FilterType.issue.value + initial_page_load_time = "INITIAL_PAGE_LOAD_TIME" + visited_url = "VISITED_URL" class CustomMetricChartPayloadSchema(CustomMetricRawPayloadSchema): @@ -741,6 +743,7 @@ class CustomMetricChartPayloadSchema(CustomMetricRawPayloadSchema): viewType: MetricViewType = Field(MetricViewType.line_chart) metricType: MetricType = Field(MetricType.timeseries) metricOf: MetricOfType = Field(MetricOfType.user_id) + metricFraction: float = Field(None, gt=0, lt=1) class CustomMetricChartPayloadSchema2(CustomMetricChartPayloadSchema):