From c9b7f47b42cb1ab0eab29da95773286dddf1b867 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Sun, 18 Aug 2024 18:47:01 +0200 Subject: [PATCH] feat: sort pages Signed-off-by: David Dal Busco --- src/orbiter/src/analytics.rs | 90 ++++++++++++++++++++++++------------ src/orbiter/src/lib.rs | 6 ++- src/orbiter/src/store.rs | 2 +- src/orbiter/src/types.rs | 4 +- 4 files changed, 69 insertions(+), 33 deletions(-) diff --git a/src/orbiter/src/analytics.rs b/src/orbiter/src/analytics.rs index 035203be2..e2bba0e71 100644 --- a/src/orbiter/src/analytics.rs +++ b/src/orbiter/src/analytics.rs @@ -1,4 +1,8 @@ -use crate::types::interface::{AnalyticsBrowsersPageViews, AnalyticsClientsPageViews, AnalyticsDevicesPageViews, AnalyticsMetricsPageViews, AnalyticsTop10PageViews, AnalyticsTrackEvents, AnalyticsWebVitalsPageMetrics, AnalyticsWebVitalsPerformanceMetrics}; +use crate::types::interface::{ + AnalyticsBrowsersPageViews, AnalyticsClientsPageViews, AnalyticsDevicesPageViews, + AnalyticsMetricsPageViews, AnalyticsTop10PageViews, AnalyticsTrackEvents, + AnalyticsWebVitalsPageMetrics, AnalyticsWebVitalsPerformanceMetrics, +}; use crate::types::state::{ AnalyticKey, PageView, PerformanceData, PerformanceMetric, PerformanceMetricName, TrackEvent, WebVitalsMetric, @@ -6,6 +10,7 @@ use crate::types::state::{ use junobuild_shared::day::calendar_date; use junobuild_shared::types::utils::CalendarDate; use regex::Regex; +use std::cmp::Ordering; use std::collections::{HashMap, HashSet}; use url::Url; @@ -248,29 +253,43 @@ pub fn analytics_performance_metrics_web_vitals( let mut overall_lcp_acc = PerformanceMetricAccumulator::default(); let mut overall_ttfb_acc = PerformanceMetricAccumulator::default(); - let mut page_metrics: HashMap = HashMap::new(); + let mut page_metrics: HashMap< + String, + ( + PerformanceMetricAccumulator, + PerformanceMetricAccumulator, + PerformanceMetricAccumulator, + PerformanceMetricAccumulator, + PerformanceMetricAccumulator, + ), + > = HashMap::new(); for ( _, PerformanceMetric { - data, metric_name, href, .. + data, + metric_name, + href, + .. }, ) in metrics { #[allow(irrefutable_let_patterns)] if let PerformanceData::WebVitalsMetric(WebVitalsMetric { value, .. }) = &data { - let page = match Url::parse(&href) { + let page = match Url::parse(href) { Ok(parsed_url) => parsed_url.path().to_string(), Err(_) => href.clone(), }; - let entry = page_metrics.entry(page).or_insert_with(|| ( - PerformanceMetricAccumulator::default(), - PerformanceMetricAccumulator::default(), - PerformanceMetricAccumulator::default(), - PerformanceMetricAccumulator::default(), - PerformanceMetricAccumulator::default(), - )); + let entry = page_metrics.entry(page).or_insert_with(|| { + ( + PerformanceMetricAccumulator::default(), + PerformanceMetricAccumulator::default(), + PerformanceMetricAccumulator::default(), + PerformanceMetricAccumulator::default(), + PerformanceMetricAccumulator::default(), + ) + }); let (cls_acc, fcp_acc, inp_acc, lcp_acc, ttfb_acc) = entry; @@ -278,23 +297,23 @@ pub fn analytics_performance_metrics_web_vitals( PerformanceMetricName::CLS => { cls_acc.add(value); overall_cls_acc.add(value); - }, + } PerformanceMetricName::FCP => { fcp_acc.add(value); overall_fcp_acc.add(value); - }, + } PerformanceMetricName::INP => { inp_acc.add(value); overall_inp_acc.add(value); - }, + } PerformanceMetricName::LCP => { lcp_acc.add(value); overall_lcp_acc.add(value); - }, + } PerformanceMetricName::TTFB => { ttfb_acc.add(value); overall_ttfb_acc.add(value); - }, + } } } } @@ -307,22 +326,35 @@ pub fn analytics_performance_metrics_web_vitals( ttfb: overall_ttfb_acc.average(), }; - let page_metrics = page_metrics.into_iter().map(|(page, (cls_acc, fcp_acc, inp_acc, lcp_acc, ttfb_acc))| { - ( - page, - AnalyticsWebVitalsPageMetrics { - cls: cls_acc.average(), - fcp: fcp_acc.average(), - inp: inp_acc.average(), - lcp: lcp_acc.average(), - ttfb: ttfb_acc.average(), - } - ) - }).collect(); + let mut page_metrics: Vec<(String, AnalyticsWebVitalsPageMetrics)> = page_metrics + .into_iter() + .map(|(page, (cls_acc, fcp_acc, inp_acc, lcp_acc, ttfb_acc))| { + ( + page, + AnalyticsWebVitalsPageMetrics { + cls: cls_acc.average(), + fcp: fcp_acc.average(), + inp: inp_acc.average(), + lcp: lcp_acc.average(), + ttfb: ttfb_acc.average(), + }, + ) + }) + .collect(); + + page_metrics.sort_by(|(page_a, _), (page_b, _)| { + if page_a == "/" { + Ordering::Less + } else if page_b == "/" { + Ordering::Greater + } else { + page_a.cmp(page_b) + } + }); AnalyticsWebVitalsPerformanceMetrics { overall: overall_metrics, - pages: page_metrics + pages: page_metrics, } } diff --git a/src/orbiter/src/lib.rs b/src/orbiter/src/lib.rs index 6c3ab4116..91850cfec 100644 --- a/src/orbiter/src/lib.rs +++ b/src/orbiter/src/lib.rs @@ -33,7 +33,11 @@ use crate::store::{ get_track_events as get_track_events_store, insert_page_view, insert_performance_metric, insert_track_event, }; -use crate::types::interface::{AnalyticsClientsPageViews, AnalyticsMetricsPageViews, AnalyticsTop10PageViews, AnalyticsTrackEvents, AnalyticsWebVitalsPageMetrics, AnalyticsWebVitalsPerformanceMetrics, DelSatelliteConfig, GetAnalytics, SetPageView, SetPerformanceMetric, SetSatelliteConfig, SetTrackEvent}; +use crate::types::interface::{ + AnalyticsClientsPageViews, AnalyticsMetricsPageViews, AnalyticsTop10PageViews, + AnalyticsTrackEvents, AnalyticsWebVitalsPerformanceMetrics, DelSatelliteConfig, GetAnalytics, + SetPageView, SetPerformanceMetric, SetSatelliteConfig, SetTrackEvent, +}; use crate::types::state::{ AnalyticKey, HeapState, PageView, PerformanceMetric, SatelliteConfigs, State, TrackEvent, }; diff --git a/src/orbiter/src/store.rs b/src/orbiter/src/store.rs index 142c057a7..e3622bb3f 100644 --- a/src/orbiter/src/store.rs +++ b/src/orbiter/src/store.rs @@ -286,7 +286,7 @@ fn insert_performance_metric_impl( let created_at: Timestamp = match ¤t_performance_metric { None => now, - Some(current_performance_metric) => current_performance_metric.created_at.clone(), + Some(current_performance_metric) => current_performance_metric.created_at, }; let version: Version = match ¤t_performance_metric { diff --git a/src/orbiter/src/types.rs b/src/orbiter/src/types.rs index b4cc87c7a..3a80d545e 100644 --- a/src/orbiter/src/types.rs +++ b/src/orbiter/src/types.rs @@ -108,6 +108,7 @@ pub mod state { pub version: Option, } + #[allow(clippy::upper_case_acronyms)] #[derive(CandidType, Serialize, Deserialize, Clone)] pub enum PerformanceMetricName { CLS, @@ -275,10 +276,9 @@ pub mod interface { #[derive(CandidType, Deserialize, Clone)] pub struct AnalyticsWebVitalsPerformanceMetrics { pub overall: AnalyticsWebVitalsPageMetrics, - pub pages: HashMap, + pub pages: Vec<(String, AnalyticsWebVitalsPageMetrics)>, } - #[derive(CandidType, Deserialize, Clone)] pub struct AnalyticsWebVitalsPageMetrics { pub cls: Option,