rylxes/laravel-observability

Production-grade observability and APM plugin for Laravel applications with OpenTelemetry, Prometheus, and AI-powered anomaly detection

Maintainers

Package info

github.com/rylxes/laravel-observability

pkg:composer/rylxes/laravel-observability

Statistics

Installs: 5

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.2.1 2026-02-16 22:42 UTC

This package is auto-updated.

Last update: 2026-02-16 22:43:20 UTC


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.

Latest Version PHP Version Laravel Version

โœจ 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 - /metrics endpoint for Prometheus scraping
  • ๐Ÿ”” Smart Alerting - Slack/Telegram notifications with throttling and deduplication
  • ๐ŸŽจ Built-In Dashboard UI + API - Authenticated web dashboard at /admin/observability plus 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:

  1. Baseline Calculation: Analyzes last 7 days (configurable)
  2. Statistical Analysis: Calculates mean and standard deviation
  3. Anomaly Detection: Flags values > 3ฯƒ from baseline
  4. 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_payload and capture_headers in 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.

๐Ÿ“ž Support

โญ If you find this useful, please star the repository!