Laravel Project Guide
Complete observability setup for Laravel web backends
Use this guide for Laravel services that need stable incident context across request lifecycle and queue jobs.
- HTTP kernel and middleware stack.
- Controllers/services/repositories.
- Queue workers and scheduled jobs.
Create a service provider to initialize the SDK:
app/Providers/ObtraceServiceProvider.php <?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Obtrace\Sdk\ObtraceClient;
use Obtrace\Sdk\ObtraceConfig;
class ObtraceServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->singleton(ObtraceClient::class, function () {
return new ObtraceClient(new ObtraceConfig(
apiKey: config("services.obtrace.api_key"),
serviceName: "order-api",
env: app()->environment(),
serviceVersion: config("app.version", "1.0.0"),
));
});
}
}
Create middleware for HTTP request instrumentation:
app/Http/Middleware/ObtraceMiddleware.php <?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Obtrace\Sdk\ObtraceClient;
class ObtraceMiddleware
{
public function __construct(private ObtraceClient $client) {}
public function handle(Request $request, Closure $next)
{
$start = microtime(true);
$response = $next($request);
$durationMs = (microtime(true) - $start) * 1000;
$route = $request->route()?->uri() ?? $request->getPathInfo();
$method = $request->getMethod();
$this->client->span("http.server {$method} /{$route}", attrs: [
"http.method" => $method,
"http.route" => "/{$route}",
"http.status_code" => $response->getStatusCode(),
]);
$this->client->metric("http.server.request.duration", $durationMs, "ms", [
"http.method" => $method,
"http.route" => "/{$route}",
"http.status_code" => $response->getStatusCode(),
]);
return $response;
}
}
Register in bootstrap/app.php:
->withMiddleware(function ($middleware) {
$middleware->append(\App\Http\Middleware\ObtraceMiddleware::class);
})
Add to config/services.php:
'obtrace' => [
'api_key' => env('OBTRACE_API_KEY'),
],
- Keep credentials in deployment secret stores, not
.env in version control.
- Use queue-safe buffering settings.
- Validate observability after framework upgrades.
- Web data present but queue data missing: initialize SDK in worker context too.
- Noisy logs: restrict low-value events.
- Correlation breaks: enforce shared request/job identifiers.