π Analytics Pipeline Architecture
End-to-end data flow from agent to dashboard
Executive Summary
The analytics pipeline processes AI usage data from desktop agents through to dashboard visualizations. Understanding this flow is critical for optimizing performance and ensuring data consistency.
β
Real-time Ingestion
Agent events captured via Sessions API
Agent events captured via Sessions API
β οΈ Batch Aggregation
Daily summaries computed hourly
Daily summaries computed hourly
β οΈ No Streaming
SignalR planned for live dashboards
SignalR planned for live dashboards
π― Caching Gap
Redis recommended for KPI caching
Redis recommended for KPI caching
π Complete Data Pipeline
AIUsagePlatform Analytics Pipeline
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. DATA SOURCES β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββ βββββββββββββββββ βββββββββββββββββ β
β β Agent Tray β β Web Browser β β Mobile App β β
β β (C#) β β (Future) β β (Future) β β
β βββββββββ¬ββββββββ βββββββββ¬ββββββββ βββββββββ¬ββββββββ β
β β β β β
β β Session Events β Page Views β API Calls β
β β - Start/End β - Navigation β - Direct usage β
β β - AI Detection β - Time on page β - Sync events β
β β - Window titles β β β
β βββββββββββββββββββββ΄ββββββββββββββββββββ β
β β β
ββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 2. INGESTION LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β SessionsController β β
β β POST /api/sessions β β
β β β’ Validate JWT token (UserId, OrgId from claims) β β
β β β’ Multi-tenant isolation check β β
β β β’ DTO validation (FluentValidation) β β
β β β’ Call ISessionService.CreateAsync() β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ISessionService β β
β β β’ Business logic validation β β
β β β’ Enrichment (geo, device info) β β
β β β’ Call ISessionRepository.AddAsync() β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 3. STORAGE LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Sessions Table β β
β β βββββββββββββββββββββββββββββββββ β β
β β Id (PK, Guid) β UserId (FK, Guid) β β
β β DeviceId (FK, Guid) β StartTime (DateTime) β β
β β EndTime (DateTime) β AIUsageTime (TimeSpan) β β
β β TotalTime (TimeSpan) β IsActive (bool) β β
β β CreatedAt (DateTime) β UpdatedAt (DateTime) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Indexes: β
β β’ IX_Sessions_UserId (UserId) β
β β’ IX_Sessions_OrganizationId (OrganizationId) β
β β’ IX_Sessions_StartTime (StartTime) - For date range queries β
β β Missing: IX_Sessions_OrgId_StartTime (composite for analytics) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 4. AGGREGATION LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β BackgroundService (IHostedService) β
β β β
β βββ Hourly: SessionDailySummaryAggregationJob β
β β βββ Rolls up Sessions β SessionDailySummary β
β β (OrganizationId, Date, TotalSessions, TotalAIUsageTime) β
β β β
β βββ Daily: WeeklyAggregationJob β
β β βββ Rolls up SessionDailySummary β Weekly aggregates β
β β β
β βββ Daily: MonthlyAggregationJob β
β βββ Rolls up SessionDailySummary β Monthly aggregates β
β β
β β Current Issues: β
β β’ Aggregation jobs not consistently running β
β β’ SessionDailySummary underutilized by API layer β
β β’ No Redis cache warming β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 5. QUERY LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β AnalyticsController β β
β β β β
β β GET /api/analytics β IAIUsageAnalyticsService β β
β β GET /api/analytics/trends β IAIUsageAnalyticsService β β
β β GET /api/adminanalytics/* β IAdminAnalyticsService β β
β β β β
β β Authorization: [Authorize] + [RequiresPlanFeature("Analytics")] β β
β β Rate Limit: 60 req/min β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Query Pattern: β
β 1. Extract OrgId from JWT claims β
β 2. Validate subscription (plan feature check) β
β 3. Build query (date range, filters) β
β 4. Execute via Repository (EF Core) β
β 5. Return DTO (mapped via AutoMapper) β
β β
β β Performance Issues: β
β β’ Queries hit raw Sessions table (not SessionDailySummary) β
β β’ No query result caching β
β β’ N+1 queries in some aggregations β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 6. FRONTEND LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Angular Application (aiusage-app) β
β β β
β βββ DashboardModule β
β β βββ DashboardService β GET /api/admindashboard β
β β βββ home.component.ts (KPI cards) β
β β β
β βββ AnalyticsModule β
β βββ AnalyticsService β GET /api/analytics/* β
β βββ overview.component.ts (charts, trends) β
β β
β Caching Strategy: β
β β’ Component-level: 5-minute cache for KPIs (manual implementation) β
β β’ No HTTP-level caching (Cache-Control headers not set) β
β β’ Opportunity: Angular service worker caching β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π― Data Flow Diagrams
Real-time Dashboard Path (5-15 min delay)
Agent Detection β API Ingestion β Database β Aggregation Job β Dashboard API
β β β β β
β 30s-2min β 50-200ms β 0ms β 5-15 min β 50-200ms
βΌ βΌ βΌ βΌ βΌ
ββββββββββββββ ββββββββββββββ ββββββββββββββ ββββββββββββββ ββββββββββββββ
β Tray Agent ββ β Sessions ββ β Sessions ββ β SessionDailyββ β Dashboard β
β Detects AI β β Controller β β Table β β Summary β β Controller β
β Usage β β (validation)β β (raw data) β β (aggregated)β β (queries) β
ββββββββββββββ ββββββββββββββ ββββββββββββββ ββββββββββββββ ββββββββββββββ
β
βΌ
ββββββββββββββ
β Angular β
β Dashboard β
ββββββββββββββ
On-Demand Analytics Path (Real-time query)
User Request β AnalyticsController β AnalyticsService β Repository β Database
β β β β β
β 50-200ms β 10-50ms β 50-500ms β 50-500ms β
βΌ βΌ βΌ βΌ βΌ
βββββββββββ ββββββββββββββββ ββββββββββββββββ βββββββββββββββ βββββββββββββ
β User ββ β Validate JWT ββ β Build Query ββ β EF Core ββ β Sessions β
β Click β β Check Plan β β Apply Filtersβ β Execute SQL β β Table β
β Chart β β Feature Gate β β (Date range) β β (no cache) β β (raw) β
βββββββββββ ββββββββββββββββ ββββββββββββββββ βββββββββββββββ βββββββββββββ
β
βΌ
βββββββββββββββββ
β Return DTO β
β (mapped) β
βββββββββββββββββ
β Warning: This path hits raw Sessions table on every request.
Recommendation: Use SessionDailySummary + Redis caching
π Performance Metrics
| Stage | Avg Latency | Bottleneck | Optimization |
|---|---|---|---|
| Agent β API | 100-500ms | Network latency | Batch events client-side |
| API Validation | 10-30ms | JWT validation | Cache validation results |
| DB Write | 20-50ms | Disk I/O | Async processing |
| Aggregation Job | 5-15 min | Full table scan | Incremental aggregation |
| Dashboard Query | 100-500ms | Missing indexes | Add composite indexes |
| Frontend Render | 50-100ms | Chart rendering | Virtual scrolling |
β οΈ Known Issues & Recommendations
No Redis Caching
Dashboard KPIs re-queried on every request. Implement 5-minute Redis cache for hot data.
Missing Composite Indexes
Date range queries scan full Sessions table. Add IX_Sessions_OrgId_StartTime.
Underutilized Summary Table
SessionDailySummary exists but not used by AnalyticsController. Migrate queries.
No Real-time Streaming
SignalR recommended for live dashboard updates. Currently 5-15 min delay.