Skip to main content

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

Location: core/analytics/types.go:15

Data Retrieval

GetData

Computes aggregated analytics from the two collections via SQL. Returns:
  • *Data - Aggregated analytics data
  • error - Error if queries fail
Location: core/analytics/storage.go:12 Query Strategy:
  1. All aggregation happens in SQLite
  2. No records loaded into Go memory
  3. Uses COALESCE for null safety
  4. Groups and sums efficiently
  5. Returns defaults if collections don’t exist
Example:

DefaultData

Returns a zero-value Data struct for when no records exist. Location: core/analytics/types.go:57

Supporting Types

PageStat

Holds view counts for a single path. Location: core/analytics/types.go:42

RecentVisit

A single entry for recent visitors display. Location: core/analytics/types.go:48

Aggregation Queries

Total Views and Sessions

Location: core/analytics/storage.go:31

Today and Yesterday Views

Location: core/analytics/storage.go:43

New vs Returning Visitors

Location: core/analytics/storage.go:59

Device Breakdown

Location: core/analytics/storage.go:77

Browser Breakdown (Top 5)

Location: core/analytics/storage.go:110

Top Pages (Top 10)

Location: core/analytics/storage.go:142

Recent Visits (Last 3)

Location: core/analytics/storage.go:167

Hourly Activity

Location: core/analytics/storage.go:190

Calculated Metrics

Views Per Visitor

Location: core/analytics/storage.go:68

Device Percentages

Location: core/analytics/storage.go:91

Browser Percentages

Location: core/analytics/storage.go:126

Hourly Activity Percentage

Location: core/analytics/storage.go:199

Complete Examples

Dashboard Handler

Custom Report

Conditional Dashboard Tile

Export to CSV

Comparison Query

Performance Considerations

Query Optimization

  1. Database Indexes: Analytics collections have indexes on commonly queried fields
  2. Aggregation in SQLite: All SUM(), COUNT(), GROUP BY happens in the database
  3. No Memory Loading: Individual records never loaded into Go memory
  4. Ring Buffer: _analytics_sessions limited to 50 rows (constant size)

Caching Strategy

Data Retention

The __pbExtAnalyticsClean__ system job automatically deletes analytics older than 90 days:
Schedule: Daily at 3 AM Location: core/jobs/manager.go:354

Constants

Location: core/analytics/types.go:6

Best Practices

  1. Cache Results: Cache GetData() results for 5-10 minutes in production
  2. Error Handling: Return DefaultData() on errors for graceful degradation
  3. Query Timeouts: Use context timeouts for long-running analytics queries
  4. Date Formatting: Always use "2006-01-02" format for date comparisons
  5. Null Safety: Always use COALESCE in SQL queries
  6. Custom Reports: Query _analytics directly for custom time ranges
  7. Performance: Monitor query performance as data grows