SDK برای Laravel
ردیابی خطای سمت سرور برای Laravel با auto-discovery، middleware، ردیابی کوئریها، کانال Monolog و پایش عملکرد.
پایش کامل خطاها در برنامههای Laravel
از طریق reportable() با exception handler در Laravel یکپارچه میشود
middleware داخلی HTTP برای ردیابی درخواست و پاسخ
رویدادهای پیش از خطا را برای درک بهتر شرایط ثبت میکند
breadcrumb خودکار و تشخیص کوئریهای کند از طریق QueryExecuted
خطاها را خودکار به کاربرِ واردشده در Laravel مرتبط میکند
برای لاگ ساختاریافته از Log::channel('abrovatrace') استفاده کنید
درخواستهای HTTP، کوئریهای پایگاه داده و عملیات دلخواه را ردیابی کنید
نصب#
بسته از Abrova Center نصب میشود. دو مرحله دارد:
۱. مخزن ابرووا را اضافه کنید به فایل composer.json:
"repositories": [
{ "type": "composer", "url": "https://center.abrova.ir/api/packages/abrova/composer" }
]۲. بسته را نصب کنید:
composer require abrova-trace/laravel-sdk
فایل پیکربندی را publish کنید:
php artisan vendor:publish --tag=abrovatrace-config
شروع سریع#
کلیدها را به .env اضافه کنید:
ABROVATRACE_API_KEY=ab_live_your_api_key_here ABROVATRACE_SERVER_SECRET=ab_srv_your_server_secret_here ABROVATRACE_ENVIRONMENT=production ABROVATRACE_RELEASE=1.0.0
این SDK از قابلیت auto-discovery بستهها در Laravel استفاده میکند. نیازی به ثبت دستی service provider یا facade نیست. facade آن AbrovaTrace\Laravel\AbrovaTraceFacade است (که خودکار با نام مستعار AbrovaTrace ثبت میشود). تا وقتی هر دو متغیر ABROVATRACE_API_KEY و ABROVATRACE_SERVER_SECRET تنظیم نشده باشند، SDK غیرفعال میماند.
ثبت خطاها#
ثبت خودکار
همهی exceptionهای مدیریتنشده خودکار از طریق exception handler در Laravel ثبت میشوند. نیازی به تغییر کد نیست.
exception همچنان در لاگ خود برنامه (laravel.log یا کانالهای لاگ تنظیمشده) نوشته میشود، پس لازم نیست تنظیمات لاگگیری را تغییر دهید. نسخههای پیش از 0.2.3، لاگ پیشفرض Laravel را برای exceptionهای ثبتشده متوقف میکردند.
ثبت دستی
use AbrovaTrace\Laravel\AbrovaTraceFacade as AbrovaTrace;
// Capture an exception
try {
riskyOperation();
} catch (\Throwable $e) {
AbrovaTrace::captureException($e, [
'extra' => ['userId' => 123, 'feature' => 'checkout'],
]);
}
// Capture a message
AbrovaTrace::captureMessage('User completed checkout', [
'extra' => ['orderId' => 'ORD-456'],
]);
// With a level and tags ('debug', 'info' (default), 'warning', 'error')
AbrovaTrace::captureMessage('Payment retried', [
'level' => 'warning',
'tags' => ['feature' => 'checkout'],
]);هر exception فقط یک بار گزارش میشود. اگر آن را با captureException() ثبت کنید و دوباره throw کنید، ثبت خودکار آن را بار دوم نمیفرستد (از نسخهی 0.2.3).
پیامها در کنسول، در بخش ابرووا تریس › پیامها همراه با سطح، پلتفرم، دادههای اضافه و breadcrumbها نمایش داده میشوند. پیام هیچوقت مشکل (issue) نمیسازد. سطح 'warn' بهصورت warning؛ سطحهای 'fatal'، 'critical'، 'alert' و 'emergency' بهصورت error؛ سطح 'trace' بهصورت debug و هر مقدار دیگری بهصورت info فرستاده میشود. پیام را برای چیزهایی به کار ببرید که برنامه عمداً گزارش میدهد («checkout شروع شد»، «همگامسازی تمام شد»)؛ برای عیبیابی پرحجم از Logs استفاده کنید.
Breadcrumbها#
Breadcrumbها رویدادهای پیش از خطا را ثبت میکنند. درخواستهای HTTP و کوئریهای پایگاه داده خودکار ثبت میشوند.
Breadcrumb دستی
use AbrovaTrace\Laravel\AbrovaTraceFacade as AbrovaTrace;
use AbrovaTrace\Laravel\Models\Breadcrumb;
// HTTP breadcrumb
AbrovaTrace::addBreadcrumb(Breadcrumb::http('POST', '/api/orders', 201, 150.5));
// Database breadcrumb
AbrovaTrace::addBreadcrumb(Breadcrumb::database('SELECT * FROM users WHERE id = ?', 12.5));
// User action breadcrumb
AbrovaTrace::addBreadcrumb(Breadcrumb::user('clicked_checkout', ['cartTotal' => 99.99]));
// Custom breadcrumb
AbrovaTrace::addBreadcrumb(Breadcrumb::custom('Cache cleared', 'cache', ['keys' => 15]));SDK بهطور خودکار breadcrumbهای درخواست و پاسخ HTTP را از طریق middleware و breadcrumbهای کوئری پایگاه داده را از طریق listener رویداد QueryExecuted ثبت میکند. نیازی به تنظیم دستی نیست.
اطلاعات کاربر#
اطلاعات کاربر خودکار از کاربرِ واردشده و از طریق middleware برداشته میشود. میتوانید آن را دستی هم تعیین کنید:
AbrovaTrace::setUser([
'id' => 123,
'email' => 'user@example.com',
'username' => 'john_doe',
]);Context محدود به یک بلوک#
با context محدود میتوانید اطلاعات کاربر و درخواست را برای هر عملیات جدا کنید. هر دو بعد از آن خودکار به حالت قبل برمیگردند (breadcrumbهایی که داخل closure اضافه شدهاند باقی میمانند). closure نمونهی SDK را دریافت میکند.
AbrovaTrace::withScope(function ($scope) {
$scope->setUser(['id' => 456]);
$scope->setRequestContext(['operation' => 'bulk_import']);
$scope->addBreadcrumb(Breadcrumb::custom('Starting import', 'import'));
// Errors captured here include this context
AbrovaTrace::captureException(new \RuntimeException('Import failed'));
});
// Context is restored after the closureMiddleware برای Laravel#
middleware خودکار روی گروههای web و api ثبت میشود و این کارها را انجام میدهد:
- ردیابی درخواست — درخواست ورودی را بهصورت breadcrumb (متد و path) ثبت میکند و context درخواست (متد، URL، path، route، IP، user agent) را تعیین میکند
- ردیابی پاسخ — breadcrumb پاسخ را با کد وضعیت و مدت زمان ثبت میکند
- برداشتن اطلاعات کاربر — اطلاعات کاربر (id، email، name) را خودکار از کاربرِ واردشده تعیین میکند (
middleware.track_user) - Spanهای عملکرد — برای هر درخواست یک span عملکرد HTTP میسازد (وقتی
performance.enabledبرابر true باشد)
برای تغییر pathهای نادیدهگرفتهشده، فایل config/abrovatrace.php را ویرایش کنید:
'middleware' => [
'enabled' => true,
'ignored_paths' => [
'health',
'api/health',
'_debugbar/*',
'telescope/*',
],
],ردیابی کوئریهای پایگاه داده#
کوئریهای پایگاه داده خودکار از طریق رویداد QueryExecuted در Laravel ردیابی میشوند (performance.track_db_queries). هر کوئری یک breadcrumb میشود؛ کوئریهایی که مدتشان برابر یا بیشتر از آستانه باشد (پیشفرض ۵۰۰ میلیثانیه) span عملکرد هم میسازند.
// config/abrovatrace.php
'performance' => [
'enabled' => true,
'track_db_queries' => true,
'slow_query_threshold_ms' => 100, // Span for queries taking 100ms or more
],کانال لاگ در Monolog#
لاگها را با سیستم لاگگیری داخلی Laravel به ابرووا تریس بفرستید:
// config/logging.php
'channels' => [
'abrovatrace' => [
'driver' => 'custom',
'via' => AbrovaTrace\Laravel\Logging\AbrovaTraceLogChannel::class,
],
],use Illuminate\Support\Facades\Log;
Log::channel('abrovatrace')->info('User signed up', ['userId' => 123]);
Log::channel('abrovatrace')->error('Payment failed', ['orderId' => 'ORD-456']);
Log::channel('abrovatrace')->warning('Rate limit approaching', ['remaining' => 5]);میتوانید abrovatrace را به یک کانال stack اضافه کنید تا لاگها همزمان به چند مقصد فرستاده شوند.
برای رفتار ارسال دستهای، سطحهای لاگ و flush دستی، صفحهی لاگگیری در SDK برای Laravel را ببینید.
ردیابی عملکرد#
use AbrovaTrace\Laravel\AbrovaTraceFacade as AbrovaTrace;
use AbrovaTrace\Laravel\Performance\PerformanceSpan;
// Track a custom operation with automatic timing
$result = AbrovaTrace::trackOperation('cache.rebuild', function () {
return rebuildCache();
}, ['tags' => ['cache' => 'products']]);
// Manual performance span
AbrovaTrace::reportPerformanceSpan(PerformanceSpan::custom([
'operation' => 'email.send',
'durationMs' => 250.5,
'startTime' => now()->subMilliseconds(250),
'tags' => ['mailer' => 'smtp'],
]));گزینههای پیکربندی#
// config/abrovatrace.php
return [
'api_key' => env('ABROVATRACE_API_KEY', ''),
'server_secret' => env('ABROVATRACE_SERVER_SECRET', ''),
'enabled' => env('ABROVATRACE_ENABLED', true),
'environment' => env('ABROVATRACE_ENVIRONMENT', env('APP_ENV', 'production')),
'release' => env('ABROVATRACE_RELEASE', '0.1.0'),
'sample_rate' => env('ABROVATRACE_SAMPLE_RATE', 1.0),
'before_send' => null, // set a closure from a service provider
'debug' => env('ABROVATRACE_DEBUG', false),
'timeout' => env('ABROVATRACE_TIMEOUT', 5),
'max_breadcrumbs' => 50,
];| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| api_key | string | بله | کلید API پروژه (ab_live_xxx) |
| server_secret | string | بله | کلید سرور (ab_srv_xxx) |
| enabled | boolean | خیر | روشن/خاموش کردن ردیابی (پیشفرض: true) |
| environment | string | خیر | نام محیط (پیشفرض: APP_ENV، وگرنه "production") |
| release | string | خیر | شناسهی نسخهی برنامه (پیشفرض: "0.1.0") |
| sample_rate | float | خیر | نرخ نمونهبرداری برای خطاها و پیامها، 0.0 تا 1.0 (پیشفرض: 1.0) |
| before_send | callable | خیر | هر خطا (AbrovaTraceError) یا پیام (AbrovaTraceMessage) را دریافت میکند؛ برای ارسال، همان را (یا نسخهی اصلاحشده را) برگردانید و برای حذف null. آن را از یک service provider تعیین کنید، چون closure نمیتواند در config کششده قرار بگیرد |
| debug | boolean | خیر | فعال کردن لاگ عیبیابی (پیشفرض: false) |
| timeout | integer | خیر | مهلت HTTP بر حسب ثانیه (پیشفرض: 5، حداکثر: 30) |
| max_breadcrumbs | integer | خیر | حداکثر تعداد breadcrumbهای نگهداشتهشده، 0 تا 100 (پیشفرض: 50) |
exceptionهای نادیدهگرفتهشده#
SDK برای exceptionهایی که برنامههای Laravel معمولاً نمیخواهند بهعنوان خطا ببینند، پیشفرضهای معقولی دارد. بهطور پیشفرض اینها گزارش نمیشوند:
AuthenticationException— درخواستهای بدون احراز هویتValidationException— خطاهای اعتبارسنجی فرمNotFoundHttpException— خطاهای 404- همهی exceptionهای HTTP با کد 4xx
از طریق config/abrovatrace.php تغییرشان دهید:
'exception_handler' => [
'ignored_exceptions' => [
\App\Exceptions\BusinessException::class,
],
'report_4xx' => true,
],فهرست ignored_exceptions که تعیین میکنید جای فهرست پیشفرض را میگیرد؛ پس مواردی از پیشفرض را که هنوز میخواهید نادیده گرفته شوند، در فهرست نگه دارید.
پاسخهای 4xx خطای سمت کلاینت هستند و ثبت دوبارهشان بهعنوان exception، فهرست خطاها را شلوغ میکند. اگر واقعاً میخواهید ثبت شوند (مثلاً برای تحلیل)، report_4xx را true کنید.
مرجع API#
Facade ابرووا تریس
captureException($e, $options?)— ثبت یک exceptioncaptureMessage($msg, $options?)— ارسال پیام به ابرووا تریس › پیامها ($options:level،extra،tags)addBreadcrumb($breadcrumb)— افزودن یک breadcrumbsetUser($user)— تعیین اطلاعات کاربرsetRequestContext($context)— تعیین context درخواستwithScope($callback)— اجرای کد با context جداگانهی کاربر و درخواستlog($message, $level?, $metadata?)— ارسال یک لاگ (شناسهی کاربر ازsetUser()گرفته میشود)trace()،logDebug()،info()،warn()،logError()،fatal()— لاگ در یک سطح مشخص ($message, $metadata?)trackOperation($name, $callback, $options?)— ردیابی عملیات با زمانسنجی خودکار ($options:operationType،tags)reportPerformanceSpan($span)— گزارش یک span عملکردflush()— ارسال لاگها و spanهای عملکرد در بافر (هنگام خاموش شدن هم خودکار اجرا میشود)isEnabled()— بررسی فعال بودن SDKgetStats()— گرفتن آمار SDK
توابع کمکی Breadcrumb
Breadcrumb::http($method, $url, $status?, $duration?)— breadcrumb برای درخواست HTTPBreadcrumb::database($query, $duration, $error?)— breadcrumb برای کوئری پایگاه دادهBreadcrumb::user($action, $data?)— breadcrumb برای کار کاربرBreadcrumb::navigation($from, $to, $method?)— breadcrumb برای جابهجایی بین صفحههاBreadcrumb::custom($message, $category, $data?)— breadcrumb دلخواه
پیشنیازها#
- PHP — >= 8.1
- Laravel — 10.x / 11.x / 12.x
- Guzzle — >= 7.0 (همراه Laravel نصب است)
نمونهی کامل#
// routes/api.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Log;
use AbrovaTrace\Laravel\AbrovaTraceFacade as AbrovaTrace;
use AbrovaTrace\Laravel\Models\Breadcrumb;
Route::get('/users/{id}', function ($id) {
// Add a breadcrumb (DB queries are tracked automatically)
AbrovaTrace::addBreadcrumb(Breadcrumb::user('view_user', [
'userId' => $id,
]));
try {
$user = User::findOrFail($id);
return response()->json($user);
} catch (\Throwable $e) {
AbrovaTrace::captureException($e, [
'extra' => ['userId' => $id],
]);
return response()->json(['error' => 'User not found'], 404);
}
});
// Log via Monolog channel
Route::post('/orders', function (Request $request) {
$order = Order::create($request->validate([
'total' => 'required|numeric',
]));
Log::channel('abrovatrace')->info('Order created', [
'orderId' => $order->id,
'amount' => $order->total,
]);
// Track performance of external API call
$result = AbrovaTrace::trackOperation('payment.process', function () use ($order) {
return PaymentGateway::charge($order);
});
return response()->json($result);
});توصیهها#
کلید API و کلید سرور را در .env نگه دارید و هرگز آنها را commit نکنید
service provider خودکار ثبت میشود و نیازی به ثبت دستی نیست
برای لاگ متمرکز، لاگهای ساختاریافته را با Log::channel('abrovatrace') بفرستید
اطلاعات کاربر خودکار از Auth برداشته میشود، اما در احراز هویت با توکن API آن را دستی تعیین کنید
breadcrumbهای HTTP و پایگاه داده خودکارند؛ برای منطق کسبوکار breadcrumb دلخواه اضافه کنید
health checkها و routeهای debug را از ردیابی middleware کنار بگذارید
مقدار slow_query_threshold_ms را تعیین کنید تا افت عملکرد را زود ببینید
درخواستهای API خارجی و عملیات سنگین را برای پایش عملکرد داخل آن قرار دهید