diff --git a/api/chalicelib/core/custom_metrics.py b/api/chalicelib/core/custom_metrics.py index 317c3694b..3b0b01692 100644 --- a/api/chalicelib/core/custom_metrics.py +++ b/api/chalicelib/core/custom_metrics.py @@ -2,7 +2,7 @@ import json from typing import Union import schemas -from chalicelib.core import sessions, funnels, errors, issues +from chalicelib.core import sessions, funnels, errors, issues, metrics from chalicelib.utils import helper, pg_client from chalicelib.utils.TimeUTC import TimeUTC @@ -95,20 +95,19 @@ def __get_sessions_list(project_id, user_id, data): def __is_predefined(data): - return data.metric_type in (schemas.MetricType.errors, schemas.MetricType.performance, - schemas.MetricType.resources, schemas.MetricType.web_vital) + return data.is_template def merged_live(project_id, data: schemas.CreateCardSchema, user_id=None): - if __is_funnel_chart(data): + if data.is_template: + return get_predefined_metric(key=data.metric_of, project_id=project_id, data=data.dict()) + elif __is_funnel_chart(data): return __get_funnel_chart(project_id=project_id, data=data) elif __is_errors_list(data): return __get_errors_list(project_id=project_id, user_id=user_id, data=data) elif __is_sessions_list(data): return __get_sessions_list(project_id=project_id, user_id=user_id, data=data) - elif __is_predefined(data): - pass - print(">>>>>>>nin") + series_charts = __try_live(project_id=project_id, data=data) if data.view_type == schemas.MetricTimeseriesViewType.progress or data.metric_type == schemas.MetricType.table: return series_charts @@ -553,3 +552,67 @@ def get_funnel_sessions_by_issue(user_id, project_id, metric_id, issue_id, issue=issue, data=s.filter) if issue is not None else {"total": 0, "sessions": []}, "issue": issue} + + +def make_chart_from_card(project_id, user_id, metric_id, data: schemas.CardChartSchema): + raw_metric = get_with_template(metric_id=metric_id, project_id=project_id, user_id=user_id, + include_dashboard=False) + if raw_metric is None: + return None + metric: schemas.CreateCardSchema = schemas.CreateCardSchema(**raw_metric) + if metric.is_template: + return get_predefined_metric(key=metric.metric_of, project_id=project_id, data=data.dict()) + else: + return make_chart(project_id=project_id, user_id=user_id, metric_id=metric_id, data=data, metric=raw_metric) + + +PREDEFINED = {schemas.MetricOfWebVitals.count_sessions: metrics.get_processed_sessions, + schemas.MetricOfWebVitals.avg_image_load_time: metrics.get_application_activity_avg_image_load_time, + schemas.MetricOfWebVitals.avg_page_load_time: metrics.get_application_activity_avg_page_load_time, + schemas.MetricOfWebVitals.avg_request_load_time: metrics.get_application_activity_avg_request_load_time, + schemas.MetricOfWebVitals.avg_dom_content_load_start: metrics.get_page_metrics_avg_dom_content_load_start, + schemas.MetricOfWebVitals.avg_first_contentful_pixel: metrics.get_page_metrics_avg_first_contentful_pixel, + schemas.MetricOfWebVitals.avg_visited_pages: metrics.get_user_activity_avg_visited_pages, + schemas.MetricOfWebVitals.avg_session_duration: metrics.get_user_activity_avg_session_duration, + schemas.MetricOfWebVitals.avg_pages_dom_buildtime: metrics.get_pages_dom_build_time, + schemas.MetricOfWebVitals.avg_pages_response_time: metrics.get_pages_response_time, + schemas.MetricOfWebVitals.avg_response_time: metrics.get_top_metrics_avg_response_time, + schemas.MetricOfWebVitals.avg_first_paint: metrics.get_top_metrics_avg_first_paint, + schemas.MetricOfWebVitals.avg_dom_content_loaded: metrics.get_top_metrics_avg_dom_content_loaded, + schemas.MetricOfWebVitals.avg_till_first_byte: metrics.get_top_metrics_avg_till_first_bit, + schemas.MetricOfWebVitals.avg_time_to_interactive: metrics.get_top_metrics_avg_time_to_interactive, + schemas.MetricOfWebVitals.count_requests: metrics.get_top_metrics_count_requests, + schemas.MetricOfWebVitals.avg_time_to_render: metrics.get_time_to_render, + schemas.MetricOfWebVitals.avg_used_js_heap_size: metrics.get_memory_consumption, + schemas.MetricOfWebVitals.avg_cpu: metrics.get_avg_cpu, + schemas.MetricOfWebVitals.avg_fps: metrics.get_avg_fps, + schemas.MetricOfErrors.impacted_sessions_by_js_errors: metrics.get_impacted_sessions_by_js_errors, + schemas.MetricOfErrors.domains_errors_4xx: metrics.get_domains_errors_4xx, + schemas.MetricOfErrors.domains_errors_5xx: metrics.get_domains_errors_5xx, + schemas.MetricOfErrors.errors_per_domains: metrics.get_errors_per_domains, + schemas.MetricOfErrors.calls_errors: metrics.get_calls_errors, + schemas.MetricOfErrors.errors_per_type: metrics.get_errors_per_type, + schemas.MetricOfErrors.resources_by_party: metrics.get_resources_by_party, + schemas.MetricOfPerformance.speed_location: metrics.get_speed_index_location, + schemas.MetricOfPerformance.slowest_domains: metrics.get_slowest_domains, + schemas.MetricOfPerformance.sessions_per_browser: metrics.get_sessions_per_browser, + schemas.MetricOfPerformance.time_to_render: metrics.get_time_to_render, + schemas.MetricOfPerformance.impacted_sessions_by_slow_pages: metrics.get_impacted_sessions_by_slow_pages, + schemas.MetricOfPerformance.memory_consumption: metrics.get_memory_consumption, + schemas.MetricOfPerformance.cpu: metrics.get_avg_cpu, + schemas.MetricOfPerformance.fps: metrics.get_avg_fps, + schemas.MetricOfPerformance.crashes: metrics.get_crashes, + schemas.MetricOfPerformance.resources_vs_visually_complete: metrics.get_resources_vs_visually_complete, + schemas.MetricOfPerformance.pages_dom_buildtime: metrics.get_pages_dom_build_time, + schemas.MetricOfPerformance.pages_response_time: metrics.get_pages_response_time, + schemas.MetricOfPerformance.pages_response_time_distribution: metrics.get_pages_response_time_distribution, + schemas.MetricOfResources.missing_resources: metrics.get_missing_resources_trend, + schemas.MetricOfResources.slowest_resources: metrics.get_slowest_resources, + schemas.MetricOfResources.resources_loading_time: metrics.get_resources_loading_time, + schemas.MetricOfResources.resource_type_vs_response_end: metrics.resource_type_vs_response_end, + schemas.MetricOfResources.resources_count_by_type: metrics.get_resources_count_by_type, } + + +def get_predefined_metric(key: Union[schemas.MetricOfWebVitals, schemas.MetricOfErrors, \ + schemas.MetricOfPerformance, schemas.MetricOfResources], project_id: int, data: dict): + return PREDEFINED.get(key, lambda *args: None)(project_id=project_id, **data) diff --git a/api/chalicelib/core/dashboards.py b/api/chalicelib/core/dashboards.py index b3832f78d..aa5787bc5 100644 --- a/api/chalicelib/core/dashboards.py +++ b/api/chalicelib/core/dashboards.py @@ -211,74 +211,6 @@ def create_metric_add_widget(project_id, user_id, dashboard_id, data: schemas.Cr return add_widget(project_id=project_id, user_id=user_id, dashboard_id=dashboard_id, data=schemas.AddWidgetToDashboardPayloadSchema(metricId=metric_id)) - -PREDEFINED = {schemas.TemplatePredefinedKeys.count_sessions: metrics.get_processed_sessions, - schemas.TemplatePredefinedKeys.avg_image_load_time: metrics.get_application_activity_avg_image_load_time, - schemas.TemplatePredefinedKeys.avg_page_load_time: metrics.get_application_activity_avg_page_load_time, - schemas.TemplatePredefinedKeys.avg_request_load_time: metrics.get_application_activity_avg_request_load_time, - schemas.TemplatePredefinedKeys.avg_dom_content_load_start: metrics.get_page_metrics_avg_dom_content_load_start, - schemas.TemplatePredefinedKeys.avg_first_contentful_pixel: metrics.get_page_metrics_avg_first_contentful_pixel, - schemas.TemplatePredefinedKeys.avg_visited_pages: metrics.get_user_activity_avg_visited_pages, - schemas.TemplatePredefinedKeys.avg_session_duration: metrics.get_user_activity_avg_session_duration, - schemas.TemplatePredefinedKeys.avg_pages_dom_buildtime: metrics.get_pages_dom_build_time, - schemas.TemplatePredefinedKeys.avg_pages_response_time: metrics.get_pages_response_time, - schemas.TemplatePredefinedKeys.avg_response_time: metrics.get_top_metrics_avg_response_time, - schemas.TemplatePredefinedKeys.avg_first_paint: metrics.get_top_metrics_avg_first_paint, - schemas.TemplatePredefinedKeys.avg_dom_content_loaded: metrics.get_top_metrics_avg_dom_content_loaded, - schemas.TemplatePredefinedKeys.avg_till_first_bit: metrics.get_top_metrics_avg_till_first_bit, - schemas.TemplatePredefinedKeys.avg_time_to_interactive: metrics.get_top_metrics_avg_time_to_interactive, - schemas.TemplatePredefinedKeys.count_requests: metrics.get_top_metrics_count_requests, - schemas.TemplatePredefinedKeys.avg_time_to_render: metrics.get_time_to_render, - schemas.TemplatePredefinedKeys.avg_used_js_heap_size: metrics.get_memory_consumption, - schemas.TemplatePredefinedKeys.avg_cpu: metrics.get_avg_cpu, - schemas.TemplatePredefinedKeys.avg_fps: metrics.get_avg_fps, - schemas.TemplatePredefinedKeys.impacted_sessions_by_js_errors: metrics.get_impacted_sessions_by_js_errors, - schemas.TemplatePredefinedKeys.domains_errors_4xx: metrics.get_domains_errors_4xx, - schemas.TemplatePredefinedKeys.domains_errors_5xx: metrics.get_domains_errors_5xx, - schemas.TemplatePredefinedKeys.errors_per_domains: metrics.get_errors_per_domains, - schemas.TemplatePredefinedKeys.calls_errors: metrics.get_calls_errors, - schemas.TemplatePredefinedKeys.errors_by_type: metrics.get_errors_per_type, - schemas.TemplatePredefinedKeys.errors_by_origin: metrics.get_resources_by_party, - schemas.TemplatePredefinedKeys.speed_index_by_location: metrics.get_speed_index_location, - schemas.TemplatePredefinedKeys.slowest_domains: metrics.get_slowest_domains, - schemas.TemplatePredefinedKeys.sessions_per_browser: metrics.get_sessions_per_browser, - schemas.TemplatePredefinedKeys.time_to_render: metrics.get_time_to_render, - schemas.TemplatePredefinedKeys.impacted_sessions_by_slow_pages: metrics.get_impacted_sessions_by_slow_pages, - schemas.TemplatePredefinedKeys.memory_consumption: metrics.get_memory_consumption, - schemas.TemplatePredefinedKeys.cpu_load: metrics.get_avg_cpu, - schemas.TemplatePredefinedKeys.frame_rate: metrics.get_avg_fps, - schemas.TemplatePredefinedKeys.crashes: metrics.get_crashes, - schemas.TemplatePredefinedKeys.resources_vs_visually_complete: metrics.get_resources_vs_visually_complete, - schemas.TemplatePredefinedKeys.pages_dom_buildtime: metrics.get_pages_dom_build_time, - schemas.TemplatePredefinedKeys.pages_response_time: metrics.get_pages_response_time, - schemas.TemplatePredefinedKeys.pages_response_time_distribution: metrics.get_pages_response_time_distribution, - schemas.TemplatePredefinedKeys.missing_resources: metrics.get_missing_resources_trend, - schemas.TemplatePredefinedKeys.slowest_resources: metrics.get_slowest_resources, - schemas.TemplatePredefinedKeys.resources_fetch_time: metrics.get_resources_loading_time, - schemas.TemplatePredefinedKeys.resource_type_vs_response_end: metrics.resource_type_vs_response_end, - schemas.TemplatePredefinedKeys.resources_count_by_type: metrics.get_resources_count_by_type, - } - - -def get_predefined_metric(key: schemas.TemplatePredefinedKeys, project_id: int, data: dict): - return PREDEFINED.get(key, lambda *args: None)(project_id=project_id, **data) - - -def make_chart_metrics(project_id, user_id, metric_id, data: schemas.CardChartSchema): - raw_metric = custom_metrics.get_with_template(metric_id=metric_id, project_id=project_id, user_id=user_id, - include_dashboard=False) - if raw_metric is None: - return None - metric: schemas.CustomMetricAndTemplate = schemas.CustomMetricAndTemplate(**raw_metric) - if metric.is_template and metric.predefined_key is None: - return None - if metric.is_template: - return get_predefined_metric(key=metric.predefined_key, project_id=project_id, data=data.dict()) - else: - return custom_metrics.make_chart(project_id=project_id, user_id=user_id, metric_id=metric_id, data=data, - metric=raw_metric) - - # def make_chart_widget(dashboard_id, project_id, user_id, widget_id, data: schemas.CardChartSchema): # raw_metric = get_widget(widget_id=widget_id, project_id=project_id, user_id=user_id, dashboard_id=dashboard_id) # if raw_metric is None: diff --git a/api/routers/subs/dashboard.py b/api/routers/subs/dashboard.py index b167c4231..d732191c2 100644 --- a/api/routers/subs/dashboard.py +++ b/api/routers/subs/dashboard.py @@ -342,7 +342,7 @@ def get_dashboard_group(projectId: int, data: schemas.MetricPayloadSchema = Body {"key": "avg_time_to_render", "data": metrics.get_time_to_render(project_id=projectId, **data.dict())}, {"key": "avg_used_js_heap_size", "data": metrics.get_memory_consumption(project_id=projectId, **data.dict())}, {"key": "avg_cpu", "data": metrics.get_avg_cpu(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_fps, + {"key": schemas.MetricOfWebVitals.avg_fps, "data": metrics.get_avg_fps(project_id=projectId, **data.dict())} ] results = sorted(results, key=lambda r: r["key"]) @@ -353,45 +353,45 @@ def get_dashboard_group(projectId: int, data: schemas.MetricPayloadSchema = Body @app.get('/{projectId}/dashboard/overview2', tags=["dashboard", "metrics"]) def get_dashboard_group(projectId: int, data: schemas.MetricPayloadSchema = Body(...)): results = [ - {"key": schemas.TemplatePredefinedKeys.count_sessions, + {"key": schemas.MetricOfWebVitals.count_sessions, "data": metrics.get_processed_sessions(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_image_load_time, + {"key": schemas.MetricOfWebVitals.avg_image_load_time, "data": metrics.get_application_activity_avg_image_load_time(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_page_load_time, + {"key": schemas.MetricOfWebVitals.avg_page_load_time, "data": metrics.get_application_activity_avg_page_load_time(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_request_load_time, + {"key": schemas.MetricOfWebVitals.avg_request_load_time, "data": metrics.get_application_activity_avg_request_load_time(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_dom_content_load_start, + {"key": schemas.MetricOfWebVitals.avg_dom_content_load_start, "data": metrics.get_page_metrics_avg_dom_content_load_start(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_first_contentful_pixel, + {"key": schemas.MetricOfWebVitals.avg_first_contentful_pixel, "data": metrics.get_page_metrics_avg_first_contentful_pixel(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_visited_pages, + {"key": schemas.MetricOfWebVitals.avg_visited_pages, "data": metrics.get_user_activity_avg_visited_pages(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_session_duration, + {"key": schemas.MetricOfWebVitals.avg_session_duration, "data": metrics.get_user_activity_avg_session_duration(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_pages_dom_buildtime, + {"key": schemas.MetricOfWebVitals.avg_pages_dom_buildtime, "data": metrics.get_pages_dom_build_time(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_pages_response_time, + {"key": schemas.MetricOfWebVitals.avg_pages_response_time, "data": metrics.get_pages_response_time(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_response_time, + {"key": schemas.MetricOfWebVitals.avg_response_time, "data": metrics.get_top_metrics_avg_response_time(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_first_paint, + {"key": schemas.MetricOfWebVitals.avg_first_paint, "data": metrics.get_top_metrics_avg_first_paint(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_dom_content_loaded, + {"key": schemas.MetricOfWebVitals.avg_dom_content_loaded, "data": metrics.get_top_metrics_avg_dom_content_loaded(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_till_first_bit, + {"key": schemas.MetricOfWebVitals.avg_till_first_byte, "data": metrics.get_top_metrics_avg_till_first_bit(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_time_to_interactive, + {"key": schemas.MetricOfWebVitals.avg_time_to_interactive, "data": metrics.get_top_metrics_avg_time_to_interactive(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.count_requests, + {"key": schemas.MetricOfWebVitals.count_requests, "data": metrics.get_top_metrics_count_requests(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_time_to_render, + {"key": schemas.MetricOfWebVitals.avg_time_to_render, "data": metrics.get_time_to_render(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_used_js_heap_size, + {"key": schemas.MetricOfWebVitals.avg_used_js_heap_size, "data": metrics.get_memory_consumption(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_cpu, + {"key": schemas.MetricOfWebVitals.avg_cpu, "data": metrics.get_avg_cpu(project_id=projectId, **data.dict())}, - {"key": schemas.TemplatePredefinedKeys.avg_fps, + {"key": schemas.MetricOfWebVitals.avg_fps, "data": metrics.get_avg_fps(project_id=projectId, **data.dict())} ] results = sorted(results, key=lambda r: r["key"]) diff --git a/api/routers/subs/metrics.py b/api/routers/subs/metrics.py index 37f86fcad..48ef393ef 100644 --- a/api/routers/subs/metrics.py +++ b/api/routers/subs/metrics.py @@ -215,8 +215,8 @@ def get_custom_metric_errors_list(projectId: int, metric_id: int, @app.post('/{projectId}/custom_metrics/{metric_id}/chart', tags=["customMetrics"]) def get_card_chart(projectId: int, metric_id: int, data: schemas.CardChartSchema = Body(...), context: schemas.CurrentContext = Depends(OR_context)): - data = dashboards.make_chart_metrics(project_id=projectId, user_id=context.user_id, metric_id=metric_id, - data=data) + data = custom_metrics.make_chart_from_card(project_id=projectId, user_id=context.user_id, metric_id=metric_id, + data=data) if data is None: return {"errors": ["custom metric not found"]} return {"data": data} diff --git a/api/schemas.py b/api/schemas.py index 264c21808..718628760 100644 --- a/api/schemas.py +++ b/api/schemas.py @@ -803,7 +803,7 @@ class MetricType(str, Enum): errors = "errors" performance = "performance" resources = "resources" - web_vital = "webVital" + web_vital = "webVitals" pathAnalysis = "pathAnalysis" retention = "retention" stickiness = "stickiness" @@ -886,7 +886,7 @@ class MetricOfTimeseries(str, Enum): class CardSessionsSchema(FlatSessionsSearch, _PaginatedSchema): startTimestamp: int = Field(TimeUTC.now(-7)) endTimestamp: int = Field(TimeUTC.now()) - series: Optional[List[CustomMetricCreateSeriesSchema]] = Field(default=None) + series: List[CustomMetricCreateSeriesSchema] = Field(default=[]) class Config: alias_generator = attribute_to_camel_case @@ -907,20 +907,22 @@ class CardConfigSchema(BaseModel): class CreateCardSchema(CardChartSchema): name: Optional[str] = Field(...) - series: List[CustomMetricCreateSeriesSchema] = Field(default=[]) is_public: bool = Field(default=True) - view_type: Union[MetricTimeseriesViewType, MetricTableViewType, MetricOtherViewType] \ - = Field(MetricTimeseriesViewType.line_chart) - metric_type: Union[MetricType] = Field(default=MetricType.timeseries) + view_type: Union[MetricTimeseriesViewType, \ + MetricTableViewType, MetricOtherViewType] = Field(MetricTimeseriesViewType.line_chart) + metric_type: MetricType = Field(default=MetricType.timeseries) metric_of: Union[MetricOfTimeseries, MetricOfTable, MetricOfErrors, \ MetricOfPerformance, MetricOfResources, MetricOfWebVitals] = Field(MetricOfTable.user_id) metric_value: List[IssueType] = Field([]) metric_format: Optional[MetricFormatType] = Field(None) default_config: CardConfigSchema = Field(..., alias="config") + is_template: bool = Field(default=False) # This is used to handle wrong values sent by the UI @root_validator(pre=True) def transform(cls, values): + values["isTemplate"] = values["metricType"] in [MetricType.errors, MetricType.performance, + MetricType.resources, MetricType.web_vital] if values.get("metricType") == MetricType.timeseries \ or values.get("metricType") == MetricType.table \ and values.get("metricOf") != MetricOfTable.issues: @@ -1027,55 +1029,6 @@ class AddWidgetToDashboardPayloadSchema(UpdateWidgetPayloadSchema): alias_generator = attribute_to_camel_case -# these values should match the keys in metrics table -class TemplatePredefinedKeys(str, Enum): - count_sessions = "count_sessions" - avg_request_load_time = "avg_request_load_time" - avg_page_load_time = "avg_page_load_time" - avg_image_load_time = "avg_image_load_time" - avg_dom_content_load_start = "avg_dom_content_load_start" - avg_first_contentful_pixel = "avg_first_contentful_pixel" - avg_visited_pages = "avg_visited_pages" - avg_session_duration = "avg_session_duration" - avg_pages_dom_buildtime = "avg_pages_dom_buildtime" - avg_pages_response_time = "avg_pages_response_time" - avg_response_time = "avg_response_time" - avg_first_paint = "avg_first_paint" - avg_dom_content_loaded = "avg_dom_content_loaded" - avg_till_first_bit = "avg_till_first_byte" - avg_time_to_interactive = "avg_time_to_interactive" - count_requests = "count_requests" - avg_time_to_render = "avg_time_to_render" - avg_used_js_heap_size = "avg_used_js_heap_size" - avg_cpu = "avg_cpu" - avg_fps = "avg_fps" - impacted_sessions_by_js_errors = "impacted_sessions_by_js_errors" - domains_errors_4xx = "domains_errors_4xx" - domains_errors_5xx = "domains_errors_5xx" - errors_per_domains = "errors_per_domains" - calls_errors = "calls_errors" - errors_by_type = "errors_per_type" - errors_by_origin = "resources_by_party" - speed_index_by_location = "speed_location" - slowest_domains = "slowest_domains" - sessions_per_browser = "sessions_per_browser" - time_to_render = "time_to_render" - impacted_sessions_by_slow_pages = "impacted_sessions_by_slow_pages" - memory_consumption = "memory_consumption" - cpu_load = "cpu" - frame_rate = "fps" - crashes = "crashes" - resources_vs_visually_complete = "resources_vs_visually_complete" - pages_dom_buildtime = "pages_dom_buildtime" - pages_response_time = "pages_response_time" - pages_response_time_distribution = "pages_response_time_distribution" - missing_resources = "missing_resources" - slowest_resources = "slowest_resources" - resources_fetch_time = "resources_loading_time" - resource_type_vs_response_end = "resource_type_vs_response_end" - resources_count_by_type = "resources_count_by_type" - - class TemplatePredefinedUnits(str, Enum): millisecond = "ms" second = "s" @@ -1086,21 +1039,6 @@ class TemplatePredefinedUnits(str, Enum): count = "count" -class CustomMetricAndTemplate(BaseModel): - is_template: bool = Field(...) - project_id: Optional[int] = Field(...) - predefined_key: Optional[TemplatePredefinedKeys] = Field(...) - - @root_validator(pre=True) - def transform(cls, values): - values["isTemplate"] = values["metricType"] in [MetricType.errors, MetricType.performance, - MetricType.resources, MetricType.web_vital] - return values - - class Config: - alias_generator = attribute_to_camel_case - - class LiveFilterType(str, Enum): user_os = FilterType.user_os.value user_browser = FilterType.user_browser.value