domnikl/statsd
PHP client library for StatsD, providing a simple API to send counters, timers, gauges and other metrics. Supports batching and multiple transports (UDP/TCP) to help instrument applications and report performance and usage data to StatsD-compatible servers.
Installation
composer require domnikl/statsd
Add to config/app.php under providers:
Domnikl\Statsd\StatsdServiceProvider::class,
Publish config (optional):
php artisan vendor:publish --provider="Domnikl\Statsd\StatsdServiceProvider"
Update .env with your StatsD server details (e.g., STATSD_HOST=localhost, STATSD_PORT=8125).
First Use Case
Inject the Statsd facade or service into a controller/service:
use Domnikl\Statsd\Facades\Statsd;
public function trackUserActivity()
{
Statsd::increment('user.activity'); // Track a counter
Statsd::timing('user.activity.latency', 150); // Record latency in ms
}
Key Config
Check config/statsd.php for:
host, port, prefix (default: app.)flush_interval (default: 1000 ms)flush_timeout (default: 500 ms)Metrics Collection
Statsd::increment('api.requests')).Statsd::timing('db.query', 42)).Statsd::gauge('memory.usage', 1024)).Statsd::set('active.users', ['user1', 'user2'])).Middleware Integration Use middleware to auto-track HTTP metrics:
namespace App\Http\Middleware;
use Closure;
use Domnikl\Statsd\Facades\Statsd;
class StatsdMiddleware
{
public function handle($request, Closure $next)
{
Statsd::timing('http.request', fn() => $next($request)->getContent());
}
}
Service Integration Wrap database queries or external API calls:
Statsd::timing('service.external_api', function() {
return Http::get('https://api.example.com/data');
});
Batch Processing
Use flush() explicitly for critical metrics:
Statsd::increment('batch.processed');
// ... process 1000 items ...
Statsd::flush(); // Force sync to StatsD server
Custom Prefixes Override the global prefix per context:
Statsd::setPrefix('feature.x.');
Statsd::increment('feature.x.usage');
Connection Issues
STATSD_HOST/PORT in .env and check firewall/network policies.config/statsd.php:
'log_errors' => true,
Prefix Collisions
app. + feature.) can clutter dashboards.app.feature.x.) or disable global prefix:
Statsd::setPrefix('');
Timer Granularity
microtime(true) for sub-millisecond precision:
$start = microtime(true);
// ... operation ...
Statsd::timing('operation.time', (microtime(true) - $start) * 1000);
Flush Behavior
flush_interval (default: 1s). For high-volume apps, reduce flush_interval or call flush() manually.Gauge Updates
// WRONG: Treats as delta
Statsd::gauge('memory.usage', +512);
// RIGHT: Set absolute value
Statsd::gauge('memory.usage', 1536);
Enable Debug Mode
Statsd::debug(true); // Logs all metric calls to stderr
Check UDP Packets
Use tcpdump to verify packets reach StatsD:
tcpdump -i any -n udp port 8125
Test Locally Run StatsD locally with Graphite:
docker run -p 8125:8125/udp -p 80:80 grafana/statsd
Access metrics at http://localhost.
Custom Backends
Extend Domnikl\Statsd\Statsd to support alternative transports (e.g., HTTP):
class HttpStatsd extends Statsd
{
protected function send($data)
{
Http::post('https://stats.example.com', ['data' => $data]);
}
}
Metric Sanitization
Override sanitizeMetricName() to enforce naming conventions:
Statsd::setSanitizer(function($name) {
return preg_replace('/[^a-zA-Z0-9._-]/', '_', $name);
});
Contextual Tagging
Use Statsd::tag() to add context (requires StatsD v0.7+):
Statsd::tag('environment', 'production');
Statsd::increment('user.signups');
How can I help you explore Laravel packages today?