Skip to content

Commit

Permalink
feat: sort pages
Browse files Browse the repository at this point in the history
Signed-off-by: David Dal Busco <david.dalbusco@outlook.com>
  • Loading branch information
peterpeterparker committed Aug 18, 2024
1 parent ca12e35 commit c9b7f47
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 33 deletions.
90 changes: 61 additions & 29 deletions src/orbiter/src/analytics.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
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,
};
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;

Expand Down Expand Up @@ -248,53 +253,67 @@ 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<String, (PerformanceMetricAccumulator, PerformanceMetricAccumulator, PerformanceMetricAccumulator, PerformanceMetricAccumulator, PerformanceMetricAccumulator)> = 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;

match metric_name {
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);
},
}
}
}
}
Expand All @@ -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,
}
}

Expand Down
6 changes: 5 additions & 1 deletion src/orbiter/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand Down
2 changes: 1 addition & 1 deletion src/orbiter/src/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ fn insert_performance_metric_impl(

let created_at: Timestamp = match &current_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 &current_performance_metric {
Expand Down
4 changes: 2 additions & 2 deletions src/orbiter/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ pub mod state {
pub version: Option<Version>,
}

#[allow(clippy::upper_case_acronyms)]
#[derive(CandidType, Serialize, Deserialize, Clone)]
pub enum PerformanceMetricName {
CLS,
Expand Down Expand Up @@ -275,10 +276,9 @@ pub mod interface {
#[derive(CandidType, Deserialize, Clone)]
pub struct AnalyticsWebVitalsPerformanceMetrics {
pub overall: AnalyticsWebVitalsPageMetrics,
pub pages: HashMap<String, AnalyticsWebVitalsPageMetrics>,
pub pages: Vec<(String, AnalyticsWebVitalsPageMetrics)>,
}


#[derive(CandidType, Deserialize, Clone)]
pub struct AnalyticsWebVitalsPageMetrics {
pub cls: Option<f64>,
Expand Down

0 comments on commit c9b7f47

Please sign in to comment.