rylxes / laravel-observability
Production-grade observability and APM plugin for Laravel applications with OpenTelemetry, Prometheus, and AI-powered anomaly detection
Requires
- php: ^8.1
- guzzlehttp/guzzle: ^7.0
- illuminate/database: ^10.0|^11.0|^12.0
- illuminate/http: ^10.0|^11.0|^12.0
- illuminate/support: ^10.0|^11.0|^12.0
- open-telemetry/opentelemetry: ^1.0
- php-http/httplug: ^2.4
- promphp/prometheus_client_php: ^2.7
Requires (Dev)
- filament/filament: ^3.0
- mockery/mockery: ^1.5
- orchestra/testbench: ^8.0|^9.0|^10.0
- phpunit/phpunit: ^10.0|^11.0
Suggests
- ext-redis: Native PHP Redis extension for better performance
- filament/filament: Optional for Filament resources/widgets integration (^3.0)
- predis/predis: Required for Redis cache driver (^2.0)
README
๐ Production-Grade Observability & APM for Laravel Applications
A lightweight, database-agnostic alternative to full APM tools, optimized specifically for Laravel apps. Features request tracing, performance profiling, slow query detection, OpenTelemetry/Prometheus integration, AI-based anomaly detection, and smart alerting.
โจ Features
Core Capabilities
- ๐ Request Tracing - Capture HTTP requests with route, controller, duration, memory usage, headers
- ๐๏ธ Database Query Monitoring - Track all queries, detect N+1 problems, identify slow queries
- โก Performance Profiling - Per-route metrics, P50/P95/P99 latency, bottleneck identification
- ๐ Slow Query Detector - Automatic detection with stack traces and optimization recommendations
- ๐ค AI Anomaly Detection - Statistical analysis (Z-score) to detect unusual patterns
- ๐ OpenTelemetry Export - OTLP protocol support for distributed tracing
- ๐ Prometheus Metrics -
/metricsendpoint for Prometheus scraping - ๐ Smart Alerting - Slack/Telegram notifications with throttling and deduplication
- ๐จ Built-In Dashboard UI + API - Authenticated web dashboard at
/admin/observabilityplus API endpoints for custom implementations - ๐๏ธ Database Agnostic - Works with MySQL, PostgreSQL, SQLite, SQL Server
๐ฆ Installation
1. Install via Composer
composer require rylxes/laravel-observability
2. Run Installation Command
php artisan observability:install
This will:
- Publish configuration file to
config/observability.php - Run migrations (creates observability tables)
- Display middleware setup instructions
3. Register Middleware
Add to app/Http/Kernel.php (Laravel 10) or bootstrap/app.php (Laravel 11):
Laravel 10:
protected $middleware = [ // ... other middleware \Rylxes\Observability\Middleware\RequestTracingMiddleware::class, ];
Laravel 11:
->withMiddleware(function (Middleware $middleware) { $middleware->append(\Rylxes\Observability\Middleware\RequestTracingMiddleware::class); })
4. Configure Environment
Add to .env:
OBSERVABILITY_ENABLED=true OBSERVABILITY_TRACING_ENABLED=true OBSERVABILITY_SLOW_QUERY_THRESHOLD=1000 # Optional: Slack Notifications OBSERVABILITY_SLACK_ENABLED=true OBSERVABILITY_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL # Optional: Telegram Notifications OBSERVABILITY_TELEGRAM_ENABLED=true OBSERVABILITY_TELEGRAM_BOT_TOKEN=your_bot_token OBSERVABILITY_TELEGRAM_CHAT_ID=your_chat_id # Optional: Prometheus OBSERVABILITY_PROMETHEUS_ENABLED=true
๐ Usage
Using the Facade
use Rylxes\Observability\Facades\Observability; // Get performance analysis $analysis = Observability::analyze(days: 7); // Detect slow queries $slowQueries = Observability::slowQueries()->analyze(); // Detect anomalies $anomalies = Observability::anomalies()->detectAnomalies('response_time'); // Export Prometheus metrics $metrics = Observability::exportMetrics();
Artisan Commands
Analyze Performance:
php artisan observability:analyze --days=7 --notify
Prune Old Data:
php artisan observability:prune --force
Web Dashboard (Authenticated)
By default, the package includes a web dashboard at:
/admin/observability
It uses your app's configured auth guards (observability.dashboard.guards), so it works with your existing login/session setup while still exposing the API for internal tools.
API Endpoints
All endpoints are prefixed with /api/observability:
| Endpoint | Description |
|---|---|
GET /metrics |
Prometheus metrics (text format) |
GET /dashboard |
Performance dashboard data (JSON, supports ?days=1..30) |
GET /traces |
Recent request traces |
GET /traces/{traceId} |
Single trace detail |
GET /alerts |
Recent alerts |
POST /alerts/{id}/resolve |
Resolve an alert |
GET /health |
Health check |
Example:
curl http://yourapp.test/api/observability/metrics
curl http://yourapp.test/api/observability/dashboard | jq
โ๏ธ Configuration
Database Connection
By default, uses your app's default database connection. To use a separate database:
OBSERVABILITY_DB_CONNECTION=observability_db
Then configure the connection in config/database.php.
Request Tracing
'tracing' => [ 'enabled' => true, 'capture_headers' => true, 'capture_payload' => false, // Be careful with sensitive data 'excluded_routes' => ['telescope.*', 'horizon.*'], 'sample_rate' => 1.0, // 0.0 to 1.0 (1.0 = trace all) ],
Slow Query Detection
'queries' => [ 'enabled' => true, 'log_all' => false, // Only log slow queries 'slow_threshold_ms' => 1000, 'detect_duplicates' => true, // N+1 detection ],
Anomaly Detection (AI)
'anomaly_detection' => [ 'enabled' => true, 'z_score_threshold' => 3.0, // Standard deviations 'min_data_points' => 100, 'baseline_window_days' => 7, ],
Notifications
'notifications' => [ 'slack' => ['enabled' => true, 'webhook_url' => env('...')], 'telegram' => ['enabled' => true, 'bot_token' => env('...')], 'throttle' => [ 'enabled' => true, 'window_minutes' => 15, 'max_alerts_per_window' => 1, ], ],
Data Retention
'retention' => [ 'traces_days' => 7, 'queries_days' => 7, 'metrics_days' => 30, 'alerts_days' => 30, ],
Dashboard UI
'dashboard' => [ 'enabled' => true, 'route_prefix' => 'admin/observability', 'middleware' => ['web'], 'guards' => ['web', 'sanctum'], 'refresh_interval_seconds' => 30, ],
๐ Integrations
Prometheus
Enable in .env:
OBSERVABILITY_PROMETHEUS_ENABLED=true OBSERVABILITY_PROMETHEUS_STORAGE=redis # or 'memory', 'apc'
Configure Prometheus to scrape:
scrape_configs: - job_name: 'laravel-app' static_configs: - targets: ['yourapp.test'] metrics_path: '/api/observability/metrics'
OpenTelemetry
OBSERVABILITY_OTEL_ENABLED=true OBSERVABILITY_OTEL_ENDPOINT=http://localhost:4318
Grafana Dashboard
Import the included Grafana dashboard template:
# Coming soon - dashboard JSON in /docs folder
๐ค AI Anomaly Detection
The plugin uses statistical analysis (Z-score method) to detect anomalies:
- Baseline Calculation: Analyzes last 7 days (configurable)
- Statistical Analysis: Calculates mean and standard deviation
- Anomaly Detection: Flags values > 3ฯ from baseline
- Auto-Alerting: Creates alerts for critical anomalies
Monitored Metrics:
- Response time
- Memory usage
- Error rate
- Query execution time
Example:
$result = Observability::anomalies()->detectAnomalies('response_time'); if ($result['status'] === 'success') { foreach ($result['anomalies'] as $anomaly) { echo "Anomaly: {$anomaly['metric_name']} - "; echo "Value: {$anomaly['value']} (Baseline: {$anomaly['baseline']})"; echo "Deviation: {$anomaly['deviation_percent']}%"; } }
๐ Performance Insights
Dashboard Data Structure
{
"overall_metrics": {
"total_requests": 12500,
"avg_response_time_ms": 145.3,
"p95_response_time_ms": 450,
"p99_response_time_ms": 890,
"avg_memory_mb": 28.5,
"error_rate": 1.2
},
"route_performance": [
{
"route": "api.users.index",
"requests": 3400,
"avg_duration_ms": 89,
"error_rate": 0.5
}
],
"bottlenecks": [
{
"type": "slow_routes",
"severity": "warning",
"data": ["api.reports.generate"]
}
]
}
๐ Security Considerations
- Sensitive Data: Disable
capture_payloadandcapture_headersin production - Authentication: All API endpoints require authentication by default
- Data Sanitization: Passwords, tokens automatically redacted
- Rate Limiting: Consider adding rate limits to metrics endpoints
๐งช Testing
Run tests:
composer test
Local Development Loop (Deploy Once)
cd .. composer create-project laravel/laravel observability-sandbox cd observability-sandbox composer config repositories.observability '{"type":"path","url":"../Observability Plugin","options":{"symlink":true}}' composer require rylxes/laravel-observability:@dev php artisan observability:install php artisan migrate
This lets you test package changes locally through /admin/observability, then ship one release after validation.
With coverage:
composer test-coverage
๐ Database Schema
The plugin creates 4 tables (with configurable prefix):
| Table | Purpose |
|---|---|
observability_traces |
HTTP request traces |
observability_queries |
Database query logs |
observability_metrics |
Aggregated performance metrics |
observability_alerts |
Generated alerts |
All tables use your app's database connection (MySQL, PostgreSQL, SQLite, SQL Server).
๐ค Contributing
Contributions welcome! Please see CONTRIBUTING.md for details.
๐ License
MIT License. See LICENSE file.
๐ Credits
Built with โค๏ธ for the Laravel community by Sherriff Agboola.
- OpenTelemetry PHP: https://github.com/open-telemetry/opentelemetry-php
- Prometheus PHP: https://github.com/PromPHP/prometheus_client_php
๐ Support
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: rylxes@gmail.com
โญ If you find this useful, please star the repository!