From a1f0e32e30a73800601fec3f0c92b5056584c2db Mon Sep 17 00:00:00 2001 From: Katalina Okano Date: Thu, 29 Jun 2023 15:30:29 -0400 Subject: [PATCH] make experience more specific --- services/api/src/analytics.rs | 11 +++++++- services/api/src/html/ingest.html | 47 +++++++++++++++++++++++++++++-- services/websocket/src/main.rs | 18 +++++++++--- 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/services/api/src/analytics.rs b/services/api/src/analytics.rs index 1967569..3e30c50 100644 --- a/services/api/src/analytics.rs +++ b/services/api/src/analytics.rs @@ -24,7 +24,16 @@ impl Analytics { ) -> Vec { let pool = ctx.data::>().unwrap(); - let sql = format!("SELECT time_bucket_gapfill('{} seconds', time, start => now() - '{}'::interval, finish => now()) AS bucket, CASE WHEN count(*) IS NULL THEN 0 ELSE count(*) END AS count, event_name, world_id FROM analytics WHERE event_name IN ('Death', 'VehicleDestroy', 'GainExperience') AND time > now() - '{}'::interval {} GROUP BY bucket, world_id, event_name ORDER BY bucket ASC", + let sql = format!(" + SELECT + time_bucket_gapfill('{} seconds', time, start => now() - '{}'::interval, finish => now()) AS bucket, + CASE WHEN count(*) IS NULL THEN 0 ELSE count(*) END AS count, + event_name, + world_id + FROM analytics + WHERE time > now() - '{}'::interval {} + GROUP BY bucket, world_id, event_name + ORDER BY bucket ASC", if hi_precision { 5 } else { diff --git a/services/api/src/html/ingest.html b/services/api/src/html/ingest.html index dc5c1f7..30178c5 100644 --- a/services/api/src/html/ingest.html +++ b/services/api/src/html/ingest.html @@ -147,6 +147,15 @@ +
+
+

Experience Events By ID

+

(0, 0, 0, 0)

+
+
+ +
+

[home] [1 day w/ 5m buckets] [ { - acc[ev.eventName][ev.time] = (acc[ev.time] || 0) + ev.count; + const eventName = ev.eventName.replace(/_[0-9]+/g, ""); + acc[eventName][ev.time] = acc[eventName][ev.time] ?? 0; + acc[eventName][ev.time] += ev.count; return acc; }, { Death: {}, VehicleDestroy: {}, GainExperience: {} } @@ -215,7 +226,7 @@ options: { scales: { y: { beginAtZero: true, suggestedMin: 0 }, - x: { stacked: true, type: "timeseries" }, + x: { stacked: false, type: "timeseries" }, }, }, data: { @@ -237,6 +248,37 @@ }); }; + const experienceEventsByID = (eventsUnfiltered) => { + const events = eventsUnfiltered.filter((ev) => + ev.eventName.startsWith("GainExperience_") + ); + + doSums("exp-by-id", events); + let allEvents = events.reduce((acc, ev) => { + const eventID = ev.eventName.replace(/GainExperience_([0-9]+)/g, "$1"); + acc[eventID] = acc[eventID] ?? {}; + acc[eventID][ev.time] = acc[eventID][ev.time] ?? 0; + acc[eventID][ev.time] += ev.count; + return acc; + }, {}); + + new Chart(document.getElementById("exp-by-id"), { + type: "bar", + options: { + scales: { + y: { beginAtZero: true, suggestedMin: 0 }, + x: { stacked: true, type: "timeseries" }, + }, + }, + data: { + datasets: Object.keys(allEvents).map((id) => ({ + label: id, + data: allEvents[id], + })), + }, + }); + }; + const eventsByWorld = (events) => { let allEvents = events.reduce((acc, ev) => { acc[ev.worldId] = acc[ev.worldId] || {}; @@ -341,5 +383,6 @@ let worldEvents = events.filter((ev) => ev.worldId === id); allEventsByType(world, worldEvents); }); + experienceEventsByID(events); })(); diff --git a/services/websocket/src/main.rs b/services/websocket/src/main.rs index 094d298..af8c413 100644 --- a/services/websocket/src/main.rs +++ b/services/websocket/src/main.rs @@ -66,6 +66,7 @@ struct PopEvent { vehicle_id: String, } +#[derive(Debug)] struct AnalyticsEvent { world_id: i32, event_name: String, @@ -150,7 +151,7 @@ async fn track_pop(pop_event: PopEvent) { } async fn track_analytics(analytics_event: AnalyticsEvent) { - // println!("[ws/track_analytics]"); + // println!("[ws/track_analytics] {:?}", analytics_event); let pool = PG.get().await; let AnalyticsEvent { @@ -158,12 +159,17 @@ async fn track_analytics(analytics_event: AnalyticsEvent) { event_name, } = analytics_event; - query("INSERT INTO analytics (time, world_id, event_name) VALUES (now(), $1, $2);") + match query("INSERT INTO analytics (time, world_id, event_name) VALUES (now(), $1, $2);") .bind(world_id) .bind(event_name) .execute(pool) .await - .unwrap(); + { + Ok(_) => {} + Err(e) => { + println!("[ws/track_analytics] ERR => {:?}", e); + } + } } async fn process_death_event(event: &Event) { @@ -209,7 +215,11 @@ async fn process_exp_event(event: &Event) { set.spawn(track_analytics(AnalyticsEvent { world_id: event.world_id.clone(), - event_name: event.event_name.clone(), + event_name: format!( + "{}_{}", + event.event_name.clone(), + event.experience_id.clone() + ), })); // Vehicle EXP events