directorytree/metrics
Record and query metrics in Laravel with a simple, elegant API. Track page views, API calls, signups, and other countable events. Supports values, categories, custom attributes, hourly/dated metrics, model-based tracking, and Redis storage.
Installation:
composer require directorytree/metrics
php artisan vendor:publish --tag="metrics-migrations"
php artisan migrate
First Metric:
use DirectoryTree\Metrics\Facades\Metrics;
Metrics::record('page_views'); // or metric('page_views')->record();
Querying:
$views = Metric::today()->where('name', 'page_views')->sum('value');
Metrics facade or metric() helper for recording.Metric model for querying (e.g., today(), thisMonth()).config/metrics.php for driver (e.g., redis) and queue settings.Track page views in a Laravel controller:
use DirectoryTree\Metrics\Facades\Metrics;
public function show(Page $page) {
Metrics::record('page_views');
return view('page', ['page' => $page]);
}
Recording Metrics:
metric('name')->record() (default value = 1).metric('api_calls')->record(10).metric('errors')->category('critical')->record().Model Association:
// User model
use DirectoryTree\Metrics\HasMetrics;
class User extends Model { use HasMetrics; }
// Record
metric('user_logins')->measurable($user)->record();
// Query
$user->metrics()->where('name', 'user_logins')->sum('value');
Time-Based Granularity:
metric('daily_views')->record().metric('hourly_views')->hourly()->record().Custom Attributes:
metric('views')
->with(['source' => 'google', 'country' => 'US'])
->record();
public function handle(Request $request, Closure $next) {
metric('api_requests')->record();
return $next($request);
}
registered):
Event::listen('registered', function () {
metric('user_signups')->record();
});
Metrics::capture();
// ... record metrics ...
Metrics::commit(); // or auto-commit on job completion
// config/metrics.php
'driver' => 'redis',
Schedule metrics:commit hourly in app/Console/Kernel.php.Metrics::capture();
// ... record 100+ metrics ...
Metrics::commit();
Hourly Metrics Overuse:
Auto-Commit Conflicts:
redis driver, disable auto_commit in config:
'auto_commit' => false,
metrics:commit manually.Custom Attributes Uniqueness:
name + attributes are merged (values summed).source are unique if segmentation is needed.Model Association Quirks:
measurable() requires the model to use HasMetrics trait.metric('user_actions')->measurable_id($user->id)->measurable_type('App\Models\User')->record();
auto_commit is enabled (metrics may not persist if using redis).php artisan metrics:commit manually.get() on large datasets; use sum() or count():
// Bad (loads all rows)
Metric::today()->get();
// Good
Metric::today()->sum('value');
Custom Metric Models:
DirectoryTree\Metrics\Metric for additional fields:
class CustomMetric extends Metric {
protected $casts = ['ip_address' => 'string'];
}
AppServiceProvider:
Metrics::extend('custom', function () {
return new CustomMetric();
});
Custom Repository:
DirectoryTree\Metrics\MetricRepository for custom logic (e.g., caching):
Metrics::setRepository(new CustomMetricRepository());
Testing:
Metrics::fake();
metric('test')->record();
Metrics::assertRecorded('test');
metrics.ttl in config).metrics.ttl = 2).'queue_connection' => 'redis',
date() to populate historical metrics:
metric('signups')->date(Carbon::parse('2023-01-01'))->record(100);
category + attributes for multi-dimensional tracking:
metric('purchases')
->category('product_x')
->with(['country' => 'US', 'device' => 'mobile'])
->record();
Metric::searchable(['name', 'category'])->toSearchableArray();
How can I help you explore Laravel packages today?