Zero-config metrics for FastAPI apps - perfect for solo devs and MVPs
Project description
FastAPI Metrics - Project Specification
Project Vision
Zero-config metrics and observability for FastAPI apps targeting indie devs, startups, and no-code platforms. No Prometheus/Grafana infrastructure required.
Core Value Proposition
- 5-minute setup: One import, one line of code
- No infrastructure: SQLite/memory storage, no containers
- Business metrics: Track revenue, users, features - not just HTTP metrics
- Query API: JSON endpoints for custom dashboards
- Cost tracking: Auto-detect OpenAI/Anthropic API costs
- No-code ready: Retool/Bubble can consume the API directly
Target Users
- Indie developers building MVPs
- Early-stage startups (pre-Series A)
- No-code platform backends (Bubble, Retool, Make.com)
- Developers prototyping without DevOps resources
Technical Architecture
Package Structure
fastapi-metrics/
├── fastapi_metrics/
│ ├── __init__.py
│ ├── core.py # Main Metrics class
│ ├── middleware.py # Request tracking middleware
│ ├── storage/
│ │ ├── base.py # Storage interface
│ │ ├── memory.py # In-memory storage
│ │ ├── sqlite.py # SQLite storage
│ │ └── redis.py # Redis storage (optional)
│ ├── collectors/
│ │ ├── http.py # HTTP request metrics
│ │ ├── system.py # CPU, memory, disk
│ │ ├── business.py # Custom business metrics
│ │ └── cost.py # LLM API cost tracking
│ ├── health/
│ │ ├── checks.py # Health check implementations
│ │ └── endpoints.py # Health endpoints
│ ├── query.py # Metrics query engine
│ └── exporters/
│ ├── json.py # JSON export
│ ├── prometheus.py # Prometheus format
│ └── csv.py # CSV export
├── tests/
├── examples/
├── docs/
└── pyproject.toml
Phase 1: Core Functionality ⏳
1.1 Basic Setup & Middleware
- ✅ Main
Metricsclass initialization - ✅ FastAPI app integration
- ✅ Request tracking middleware
- ✅ Response time calculation
- ✅ Status code tracking
1.2 Storage Backends
- ✅ Abstract storage interface
- ✅ In-memory storage (dict-based)
- ✅ SQLite storage with tables:
http_requests(timestamp, endpoint, method, status, latency_ms)custom_metrics(timestamp, metric_name, value, labels)system_metrics(timestamp, cpu, memory, disk)
1.3 HTTP Metrics Collection
- ✅ Requests per endpoint
- ✅ Requests per status code
- ✅ Requests per method
- ✅ Latency percentiles (p50, p95, p99)
- ✅ Error rate calculation
- ✅ Active requests counter
1.4 Query API Endpoints
- ✅
GET /metrics- Current snapshot (JSON) - ✅
GET /metrics/query- Time-series queries- Query params:
from,to,metric,group_by,endpoint
- Query params:
- ✅
GET /metrics/endpoints- Per-endpoint stats - ✅
GET /metrics/export?format=csv|prometheus
Phase 2: Health Checks & System Metrics ⏳
2.1 Health Check System
- ✅ Health check base class
- ✅ Built-in checks:
- ✅ Database connectivity
- ✅ Redis connectivity
- ✅ Disk space
- ✅ Memory usage
- ✅ Custom check support
- ✅ Health endpoints:
- ✅
GET /health- Simple status - ✅
GET /health/live- Liveness probe - ✅
GET /health/ready- Readiness probe with checks
- ✅
2.2 System Metrics
- ✅ CPU usage tracking
- ✅ Memory usage tracking
- ✅ Disk usage tracking
- ✅ Uptime tracking
- ✅ System metrics endpoint
2.3 Additional
- ✅Make Redis storage first-class (not optional)
- ✅ Add proper K8s health checks (Phase 2 should be Phase 1)
- ✅ Add deployment examples for multi-instance setups
- ✅ Position as "lightweight alternative to Prometheus that scales"
Phase 3: Business Metrics & Cost Tracking ⏳
3.1 Custom Business Metrics
- ✅
metrics.track(name, value, **labels)API - ✅ Counter metrics
- ✅ Gauge metrics
- ✅ Histogram metrics
- ✅ Label/tag support for segmentation
3.2 LLM Cost Tracking
- ✅ Auto-detect OpenAI API calls
- ✅ Auto-detect Anthropic API calls
- ✅ Token usage tracking
- ✅ Cost calculation (using current pricing)
- ✅ Cost by model/endpoint
- ✅
GET /metrics/costsendpoint
Phase 4: Advanced Features ⏳
4.1 Retention & Cleanup
- Configurable retention period
- Automatic data cleanup job
- Aggregation for old data (hourly → daily)
4.2 Alerting (Simple)
- Threshold-based alerts
- Webhook notifications
- Email notifications (optional)
4.3 Export Formats
- Prometheus format
- CSV export
- JSON export with timestamps
Phase 5: Documentation & Examples ⏳
5.1 Documentation
- README with quick start
- Full API documentation
- Configuration guide
- Storage backend comparison
- Kubernetes deployment guide
5.2 Examples
- Basic FastAPI app
- With database health checks
- Custom business metrics
- LLM cost tracking
- Retool integration example
- No-code tool integration guide
5.3 Testing
- Unit tests (80%+ coverage)
- Integration tests
- Performance benchmarks
API Design (MVP)
Basic Usage
from fastapi import FastAPI
from fastapi_metrics import Metrics
app = FastAPI()
# Minimal setup
metrics = Metrics(
app,
storage="sqlite://metrics.db", # or "memory://"
retention_hours=24,
)
# Track custom metrics anywhere
@app.post("/payment")
def payment(amount: float, user_id: int):
metrics.track("revenue", amount, user_id=user_id)
metrics.track("payment_count", 1)
return {"status": "ok"}
Query Examples
GET /metrics
GET /metrics/query?metric=revenue&from=24h&group_by=hour
GET /metrics/endpoints
GET /metrics/costs
GET /health/ready
Key Decisions
Storage Strategy
- Default: SQLite (single file, no setup)
- Optional: Redis (for distributed systems)
- Fallback: In-memory (testing/development)
Data Model
- Store raw events initially
- Aggregate on query (Phase 1)
- Pre-aggregate for performance (Phase 4)
Performance
- Async middleware (non-blocking)
- Background workers for aggregation
- Configurable batch writes
- Query result caching
Success Metrics
- < 5 lines of code to set up
- < 1ms overhead per request
- Works with SQLite (no external deps)
- Query API returns in < 100ms
- Retool/Bubble integration works out-of-box
Non-Goals (v1)
- ❌ Replace Prometheus/Grafana for large scale
- ❌ Distributed tracing
- ❌ Log aggregation
- ❌ APM-level profiling
- ❌ Built-in UI (JSON API only)
Dependencies (Keep Minimal)
[dependencies]
fastapi = ">=0.100.0"
pydantic = ">=2.0.0"
aiosqlite = ">=0.19.0" # Async SQLite
psutil = ">=5.9.0" # System metrics
httpx = ">=0.24.0" # For health checks (optional)
Progress Tracker
✅ Completed
- Phase 1: Core functionality
- Phase 2: Health checks
- Phase 3: Business metrics
- Phase 4: Advanced features
🚧 In Progress
- Phase 5: Documentation
⏳ Todo
- Phase 6: Additional Features
Quick Start Command (Future)
pip install fastapi-metrics
Development Setup (Future)
git clone https://github.com/yourusername/fastapi-metrics
cd fastapi-metrics
poetry install
poetry run pytest
Notes & Decisions Log
- 2025-12-10: Initial spec created
- Target: Indie devs who want metrics without infrastructure
- Focus: Simplicity over enterprise features
- SQLite as default storage for zero-config experience
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
fastapi_metrics-0.3.11.tar.gz
(40.4 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastapi_metrics-0.3.11.tar.gz.
File metadata
- Download URL: fastapi_metrics-0.3.11.tar.gz
- Upload date:
- Size: 40.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
286ccba248a3d61f285c29c866f2993629ea656d76eb3bc0b221e3a72e0baa0e
|
|
| MD5 |
feed881f10ded8d772c8049949a9a9de
|
|
| BLAKE2b-256 |
ba43766394d8535c929e695728614c875e9ea93bdb63916986e2157c6dfc43ba
|
File details
Details for the file fastapi_metrics-0.3.11-py3-none-any.whl.
File metadata
- Download URL: fastapi_metrics-0.3.11-py3-none-any.whl
- Upload date:
- Size: 39.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14fc160b96642d6500f772f5d25634895d9831fed63ad27d7e68f8e580086160
|
|
| MD5 |
13de03d0e14290550d6fda0333001e95
|
|
| BLAKE2b-256 |
dbf621625e46b7b80f33e2d5c88b9ffc9f6f6ead0eb1996c656b0254ffe8ef6f
|