Overview
The analytics storage system retrieves and aggregates data from the_analytics and _analytics_sessions collections using SQL queries. All aggregation happens in SQLite - no records are loaded into Go memory.
Type Definition
core/analytics/types.go:15
Data Retrieval
GetData
*Data- Aggregated analytics dataerror- Error if queries fail
core/analytics/storage.go:12
Query Strategy:
- All aggregation happens in SQLite
- No records loaded into Go memory
- Uses
COALESCEfor null safety - Groups and sums efficiently
- Returns defaults if collections don’t exist
DefaultData
core/analytics/types.go:57
Supporting Types
PageStat
core/analytics/types.go:42
RecentVisit
core/analytics/types.go:48
Aggregation Queries
Total Views and Sessions
core/analytics/storage.go:31
Today and Yesterday Views
core/analytics/storage.go:43
New vs Returning Visitors
core/analytics/storage.go:59
Device Breakdown
core/analytics/storage.go:77
Browser Breakdown (Top 5)
core/analytics/storage.go:110
Top Pages (Top 10)
core/analytics/storage.go:142
Recent Visits (Last 3)
core/analytics/storage.go:167
Hourly Activity
core/analytics/storage.go:190
Calculated Metrics
Views Per Visitor
core/analytics/storage.go:68
Device Percentages
core/analytics/storage.go:91
Browser Percentages
core/analytics/storage.go:126
Hourly Activity Percentage
core/analytics/storage.go:199
Complete Examples
Dashboard Handler
Custom Report
Conditional Dashboard Tile
Export to CSV
Comparison Query
Performance Considerations
Query Optimization
- Database Indexes: Analytics collections have indexes on commonly queried fields
- Aggregation in SQLite: All
SUM(),COUNT(),GROUP BYhappens in the database - No Memory Loading: Individual records never loaded into Go memory
- Ring Buffer:
_analytics_sessionslimited to 50 rows (constant size)
Caching Strategy
Data Retention
The__pbExtAnalyticsClean__ system job automatically deletes analytics older than 90 days:
core/jobs/manager.go:354
Constants
core/analytics/types.go:6
Best Practices
- Cache Results: Cache
GetData()results for 5-10 minutes in production - Error Handling: Return
DefaultData()on errors for graceful degradation - Query Timeouts: Use context timeouts for long-running analytics queries
- Date Formatting: Always use
"2006-01-02"format for date comparisons - Null Safety: Always use
COALESCEin SQL queries - Custom Reports: Query
_analyticsdirectly for custom time ranges - Performance: Monitor query performance as data grows
Related
- Analytics Collector - Data collection system
- Analytics Dashboard - Viewing analytics in the UI
- Database Schema - Collection structure