systemprompt_analytics/repository/
mod.rs1mod agents;
12mod cli_sessions;
13mod content_analytics;
14mod conversations;
15mod costs;
16mod engagement;
17mod events;
18mod fingerprint;
19mod overview;
20mod ownership;
21mod requests;
22mod session_signals;
23mod tools;
24mod traffic;
25
26pub use agents::AgentAnalyticsRepository;
27pub use cli_sessions::CliSessionAnalyticsRepository;
28pub use content_analytics::ContentAnalyticsRepository;
29pub use conversations::ConversationAnalyticsRepository;
30pub use costs::CostAnalyticsRepository;
31pub use engagement::EngagementRepository;
32pub use events::AnalyticsEventsRepository;
33pub use fingerprint::{
34 ABUSE_THRESHOLD_FOR_BAN, FingerprintRepository, HIGH_REQUEST_THRESHOLD, HIGH_VELOCITY_RPM,
35 MAX_SESSIONS_PER_FINGERPRINT, SUSTAINED_VELOCITY_MINUTES,
36};
37pub use overview::OverviewAnalyticsRepository;
38pub use ownership::AnalyticsOwnerReassignment;
39pub use requests::RequestAnalyticsRepository;
40pub use session_signals::SessionSignalsRepository;
41pub use tools::ToolAnalyticsRepository;
42pub use tools::list_queries::ToolListParams;
43pub use traffic::{NavigationQuery, PageQuery, TrafficAnalyticsRepository};
44
45use systemprompt_database::DbPool;
46use systemprompt_traits::DynSessionStore;
47
48#[derive(Clone)]
49pub struct AnalyticsRepositories {
50 pub session_store: DynSessionStore,
51 pub session_signals: SessionSignalsRepository,
52 pub costs: CostAnalyticsRepository,
53 pub engagement: EngagementRepository,
54 pub events: AnalyticsEventsRepository,
55}
56
57impl std::fmt::Debug for AnalyticsRepositories {
58 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59 f.debug_struct("AnalyticsRepositories")
60 .field("session_signals", &self.session_signals)
61 .field("costs", &self.costs)
62 .field("engagement", &self.engagement)
63 .field("events", &self.events)
64 .finish_non_exhaustive()
65 }
66}
67
68impl AnalyticsRepositories {
69 pub fn new(
70 db: &DbPool,
71 sessions: DynSessionStore,
72 event_sink: systemprompt_traits::DynAnalyticsEventStore,
73 content: systemprompt_traits::DynContentCatalogStats,
74 ) -> Self {
75 Self {
76 session_signals: SessionSignalsRepository::new(
77 db,
78 std::sync::Arc::clone(&sessions),
79 std::sync::Arc::clone(&event_sink),
80 content,
81 ),
82 session_store: sessions,
83 costs: CostAnalyticsRepository::new(db),
84 engagement: EngagementRepository::new(db),
85 events: AnalyticsEventsRepository::new(event_sink),
86 }
87 }
88}