Files
TimeTracker/docs/telemetry/ANALYTICS_IMPLEMENTATION_SUMMARY.md
Dries Peeters e4789cc26e feat: Add telemetry and analytics infrastructure with observability stack
Implement comprehensive analytics and monitoring system with PostHog integration,
complete observability stack (Prometheus, Grafana, Loki, Promtail), and CI/CD
workflows for automated builds.

Features:
- Add PostHog telemetry integration with privacy-focused event tracking
- Implement installation flow for opt-in telemetry configuration
- Add telemetry management UI in admin panel with detailed transparency
- Track key user events across all major features (projects, tasks, timer, etc.)

Infrastructure:
- Set up Prometheus for metrics collection
- Configure Grafana for visualization dashboards
- Integrate Loki and Promtail for log aggregation
- Add separate analytics docker-compose configuration

CI/CD:
- Add GitHub Actions workflows for building and publishing Docker images
- Implement separate dev and production build pipelines
- Configure automated image publishing to registry

Documentation:
- Restructure documentation into organized docs/ directory
- Add comprehensive guides for telemetry, analytics, and local development
- Create transparency documentation for tracked events
- Add CI/CD and build configuration guides

Code improvements:
- Integrate telemetry hooks across all route handlers
- Add feature flags and configuration management
- Refactor test suite for analytics functionality
- Clean up root directory by moving docs and removing test artifacts

Breaking changes:
- Requires new environment variables for PostHog configuration
- Docker compose setup now supports analytics stack

Changes: 73 files changed, 955 insertions(+), 14126 deletions(-)
2025-10-20 14:38:57 +02:00

11 KiB

Analytics & Telemetry Implementation Summary

Overview

This document summarizes the comprehensive analytics and telemetry system implementation for TimeTracker. All features are opt-in, privacy-first, and transparently documented.

Completed Implementation

1. Dependencies Added

File: requirements.txt

Added the following packages:

  • python-json-logger==2.0.7 - Structured JSON logging
  • sentry-sdk==1.40.0 - Error monitoring
  • prometheus-client==0.19.0 - Metrics collection
  • posthog==3.1.0 - Product analytics

2. Documentation Created

Files Created:

  • docs/analytics.md - Complete analytics documentation
  • docs/events.md - Event schema and naming conventions
  • docs/privacy.md - Privacy policy and GDPR compliance

Content:

  • Detailed explanation of all analytics features
  • Configuration instructions
  • Privacy guidelines and data collection policies
  • GDPR compliance information
  • Event naming conventions and schema

3. Structured JSON Logging

Modified: app/__init__.py

Features Implemented:

  • JSON formatted logs written to logs/app.jsonl
  • Request ID tracking for distributed tracing
  • Context-aware logging with request metadata
  • Helper function log_event() for structured event logging

Usage Example:

from app import log_event

log_event("project.created", user_id=user.id, project_id=project.id)

4. Sentry Error Monitoring

Modified: app/__init__.py

Features Implemented:

  • Automatic initialization when SENTRY_DSN is set
  • Flask integration for request context
  • Configurable sampling rate via SENTRY_TRACES_RATE
  • Environment-aware error tracking

Configuration:

SENTRY_DSN=https://your-dsn@sentry.io/project-id
SENTRY_TRACES_RATE=0.1  # 10% sampling

5. Prometheus Metrics

Modified: app/__init__.py

Metrics Implemented:

  • tt_requests_total - Counter for total requests (by method, endpoint, status)
  • tt_request_latency_seconds - Histogram for request latency (by endpoint)

Endpoint: /metrics - Exposes Prometheus-formatted metrics

Configuration File: prometheus/prometheus.yml - Example Prometheus configuration

6. PostHog Product Analytics

Modified: app/__init__.py

Features Implemented:

  • Automatic initialization when POSTHOG_API_KEY is set
  • Helper function track_event() for event tracking
  • Privacy-focused: Uses internal user IDs, not PII

Usage Example:

from app import track_event

track_event(user.id, "timer.started", {"project_id": project.id})

Configuration:

POSTHOG_API_KEY=your-api-key
POSTHOG_HOST=https://app.posthog.com

7. Telemetry Utility

File Created: app/utils/telemetry.py

Features Implemented:

  • Anonymous fingerprint generation (SHA-256 hash)
  • Opt-in telemetry sending (disabled by default)
  • Marker file system to track sent telemetry
  • Multiple event types: install, update, health
  • Privacy-first: No PII, no IP storage
  • Integration with PostHog for unified analytics

Functions:

  • get_telemetry_fingerprint() - Generate anonymous fingerprint
  • is_telemetry_enabled() - Check if telemetry is enabled
  • send_telemetry_ping() - Send telemetry event via PostHog
  • send_install_ping() - Send installation event
  • send_update_ping() - Send update event
  • send_health_ping() - Send health check event
  • check_and_send_telemetry() - Convenience function

Configuration:

ENABLE_TELEMETRY=true  # Default: false
POSTHOG_API_KEY=your-api-key  # Required for telemetry
TELE_SALT=your-unique-salt
APP_VERSION=1.0.0

8. Docker Compose Analytics Configuration

File Modified: docker-compose.yml

Services Included:

  • TimeTracker with analytics environment variables
  • Prometheus (profile: monitoring)
  • Grafana (profile: monitoring)
  • Loki (profile: logging)
  • Promtail (profile: logging)

Configuration Files:

  • prometheus/prometheus.yml - Prometheus scrape configuration
  • grafana/provisioning/datasources/prometheus.yml - Grafana datasource
  • loki/loki-config.yml - Loki log aggregation config
  • promtail/promtail-config.yml - Log shipping configuration

Usage:

# Basic deployment (no external analytics)
docker-compose up -d

# With monitoring (Prometheus + Grafana)
docker-compose --profile monitoring up -d

# With logging (Loki + Promtail)
docker-compose --profile logging up -d

# With everything
docker-compose --profile monitoring --profile logging up -d

9. Environment Variables

Modified: env.example

Added Variables:

# Sentry Error Monitoring (optional)
SENTRY_DSN=
SENTRY_TRACES_RATE=0.0

# PostHog Product Analytics (optional)
POSTHOG_API_KEY=
POSTHOG_HOST=https://app.posthog.com

# Telemetry (optional, opt-in, anonymous, uses PostHog)
ENABLE_TELEMETRY=false
TELE_SALT=change-me-to-random-string
APP_VERSION=1.0.0

10. Route Instrumentation

Modified Files:

  • app/routes/auth.py - Login, logout, login failures
  • app/routes/timer.py - Timer start, timer stop
  • app/routes/projects.py - Project creation
  • app/routes/reports.py - Report viewing, CSV exports

Events Tracked:

  • auth.login - User login (with auth method)
  • auth.logout - User logout
  • auth.login_failed - Failed login attempts (with reason)
  • timer.started - Timer started (with project, task, description)
  • timer.stopped - Timer stopped (with duration)
  • project.created - New project created (with client info)
  • report.viewed - Report accessed (with report type)
  • export.csv - CSV export (with row count, date range)

11. Test Suite

Files Created:

  • tests/test_telemetry.py - Comprehensive telemetry tests
  • tests/test_analytics.py - Analytics integration tests

Test Coverage:

  • Telemetry fingerprint generation
  • Telemetry enable/disable logic
  • Telemetry ping sending (with mocks)
  • Marker file functionality
  • Log event functionality
  • PostHog event tracking
  • Prometheus metrics endpoint
  • Privacy compliance checks
  • Performance impact tests

Run Tests:

pytest tests/test_telemetry.py tests/test_analytics.py -v

12. README Update

Modified: README.md

Added Section: "📊 Analytics & Telemetry"

Content:

  • Clear explanation of all analytics features
  • Opt-in status for each feature
  • Configuration examples
  • Self-hosting instructions
  • Privacy guarantees
  • Links to detailed documentation

🔒 Privacy & Compliance

Data Minimization

  • Only collect what's necessary
  • No PII in events (use internal IDs)
  • Local-first approach (logs, metrics stay on your infrastructure)
  • Short retention periods

Opt-In By Default

  • Sentry: Opt-in (requires SENTRY_DSN)
  • PostHog: Opt-in (requires POSTHOG_API_KEY)
  • Telemetry: Opt-in (requires ENABLE_TELEMETRY=true)
  • JSON Logs: Local only, never leave server
  • Prometheus: Self-hosted, stays on your infrastructure

GDPR Compliance

  • Right to access: All data is accessible
  • Right to rectify: Data can be corrected
  • Right to erasure: Data can be deleted
  • Right to export: Data can be exported
  • Right to opt-out: All optional features can be disabled

What We DON'T Collect

  • Email addresses
  • Usernames (use IDs instead)
  • IP addresses
  • Project names or descriptions
  • Time entry notes
  • Client information
  • Any personally identifiable information (PII)

📊 Event Schema

All events follow the resource.action naming convention:

Format: resource.action

  • resource: The entity (auth, timer, project, task, etc.)
  • action: The operation (created, updated, started, stopped, etc.)

Examples:

  • auth.login
  • timer.started
  • project.created
  • export.csv
  • report.viewed

See docs/events.md for the complete event catalog.

🚀 Deployment

1. Install Dependencies

pip install -r requirements.txt

2. Configure Environment

Copy and configure analytics variables in .env:

# Optional: Enable Sentry
SENTRY_DSN=your-dsn

# Optional: Enable PostHog
POSTHOG_API_KEY=your-key

# Optional: Enable Telemetry
ENABLE_TELEMETRY=true
TELE_URL=your-url

3. Deploy with Docker

# Basic deployment (no external analytics)
docker-compose up -d

# With self-hosted monitoring
docker-compose -f docker-compose.yml -f docker-compose.analytics.yml --profile monitoring up -d

4. Access Dashboards

🔍 Monitoring

Prometheus Queries

Request Rate:

rate(tt_requests_total[5m])

Request Latency (P95):

histogram_quantile(0.95, rate(tt_request_latency_seconds_bucket[5m]))

Error Rate:

rate(tt_requests_total{http_status=~"5.."}[5m])

Grafana Dashboards

Create dashboards for:

  • Request rate and latency
  • Error rates by endpoint
  • Active timers gauge
  • Database query performance
  • User activity metrics

🧪 Testing

Run All Tests

pytest tests/ -v

Run Analytics Tests Only

pytest tests/test_telemetry.py tests/test_analytics.py -v

Run with Coverage

pytest tests/test_telemetry.py tests/test_analytics.py --cov=app.utils.telemetry --cov=app -v

📚 Documentation References

  • Analytics Overview: docs/analytics.md
  • Event Schema: docs/events.md
  • Privacy Policy: docs/privacy.md
  • Configuration: env.example
  • Docker Compose: docker-compose.analytics.yml
  • README Section: README.md (Analytics & Telemetry section)

🔄 Next Steps

For Development

  1. Test analytics in development environment
  2. Verify logs are written to logs/app.jsonl
  3. Check /metrics endpoint works
  4. Test event tracking with mock services

For Production

  1. Set up Sentry project and configure DSN
  2. Set up PostHog project and configure API key
  3. Configure Prometheus scraping
  4. Set up Grafana dashboards
  5. Configure log rotation (logrotate or Docker volumes)
  6. Review and enable telemetry if desired

For Self-Hosting Everything

  1. Deploy with monitoring profile
  2. Configure Prometheus targets
  3. Set up Grafana datasources and dashboards
  4. Configure Loki for log aggregation
  5. Set up Promtail for log shipping

Validation Checklist

  • Dependencies added to requirements.txt
  • Documentation created (analytics.md, events.md, privacy.md)
  • JSON logging implemented
  • Sentry integration implemented
  • Prometheus metrics implemented
  • PostHog integration implemented
  • Telemetry utility created
  • Docker Compose analytics configuration created
  • Environment variables documented
  • Key routes instrumented
  • Test suite created
  • README updated
  • Configuration files created (Prometheus, Grafana, Loki, Promtail)
  • Privacy policy documented
  • Event schema documented

🎉 Summary

The analytics and telemetry system has been fully implemented with a strong focus on:

  1. Privacy First - All features are opt-in, no PII is collected
  2. Transparency - All data collection is documented
  3. Self-Hostable - Run your own analytics infrastructure
  4. Production Ready - Tested, documented, and deployable
  5. Extensible - Easy to add new events and metrics

Key Achievement: A comprehensive, privacy-respecting analytics system that helps improve TimeTracker while giving users complete control over their data.


Implementation Date: 2025-10-20
Documentation Version: 1.0
Status: Complete