ابرووا
شروع رایگان
☰ فهرست مستندات · SDK لاراول

SDK برای Laravel

ردیابی خطای سمت سرور برای Laravel با auto-discovery، middleware، ردیابی کوئری‌ها، کانال Monolog و پایش عملکرد.

Laravel 0.2.4PHP 8.1+Laravel 10–12به‌روزرسانی: ۵ آبان ۱۴۰۵
ردیابی خطای سمت سرور

پایش کامل خطاها در برنامه‌های Laravel

ثبت خودکار exceptionها

از طریق reportable() با exception handler در Laravel یکپارچه می‌شود

Middleware برای Laravel

middleware داخلی HTTP برای ردیابی درخواست و پاسخ

Breadcrumb

رویدادهای پیش از خطا را برای درک بهتر شرایط ثبت می‌کند

ردیابی کوئری‌های پایگاه داده

breadcrumb خودکار و تشخیص کوئری‌های کند از طریق QueryExecuted

اطلاعات کاربر

خطاها را خودکار به کاربرِ واردشده در Laravel مرتبط می‌کند

یکپارچگی با Monolog

برای لاگ ساختاریافته از Log::channel('abrovatrace') استفاده کنید

پایش عملکرد

درخواست‌های HTTP، کوئری‌های پایگاه داده و عملیات دلخواه را ردیابی کنید

نصب#

بسته از Abrova Center نصب می‌شود. دو مرحله دارد:

۱. مخزن ابرووا را اضافه کنید به فایل composer.json:

json
"repositories": [
    { "type": "composer", "url": "https://center.abrova.ir/api/packages/abrova/composer" }
]

۲. بسته را نصب کنید:

bash
composer require abrova-trace/laravel-sdk

فایل پیکربندی را publish کنید:

bash
php artisan vendor:publish --tag=abrovatrace-config

شروع سریع#

کلیدها را به .env اضافه کنید:

bash
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
Auto-Discovery.

این 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های ثبت‌شده متوقف می‌کردند.

ثبت دستی

php
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ها رویدادهای پیش از خطا را ثبت می‌کنند. درخواست‌های HTTP و کوئری‌های پایگاه داده خودکار ثبت می‌شوند.

Breadcrumb دستی

php
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]));
Breadcrumbهای خودکار.

SDK به‌طور خودکار breadcrumbهای درخواست و پاسخ HTTP را از طریق middleware و breadcrumbهای کوئری پایگاه داده را از طریق listener رویداد QueryExecuted ثبت می‌کند. نیازی به تنظیم دستی نیست.

اطلاعات کاربر#

اطلاعات کاربر خودکار از کاربرِ واردشده و از طریق middleware برداشته می‌شود. می‌توانید آن را دستی هم تعیین کنید:

php
AbrovaTrace::setUser([
    'id' => 123,
    'email' => 'user@example.com',
    'username' => 'john_doe',
]);

Context محدود به یک بلوک#

با context محدود می‌توانید اطلاعات کاربر و درخواست را برای هر عملیات جدا کنید. هر دو بعد از آن خودکار به حالت قبل برمی‌گردند (breadcrumbهایی که داخل closure اضافه شده‌اند باقی می‌مانند). closure نمونه‌ی SDK را دریافت می‌کند.

php
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 closure

Middleware برای 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 را ویرایش کنید:

php
'middleware' => [
    'enabled' => true,
    'ignored_paths' => [
        'health',
        'api/health',
        '_debugbar/*',
        'telescope/*',
    ],
],

ردیابی کوئری‌های پایگاه داده#

کوئری‌های پایگاه داده خودکار از طریق رویداد QueryExecuted در Laravel ردیابی می‌شوند (performance.track_db_queries). هر کوئری یک breadcrumb می‌شود؛ کوئری‌هایی که مدتشان برابر یا بیشتر از آستانه باشد (پیش‌فرض ۵۰۰ میلی‌ثانیه) span عملکرد هم می‌سازند.

php
// config/abrovatrace.php
'performance' => [
    'enabled' => true,
    'track_db_queries' => true,
    'slow_query_threshold_ms' => 100,  // Span for queries taking 100ms or more
],

کانال لاگ در Monolog#

لاگ‌ها را با سیستم لاگ‌گیری داخلی Laravel به ابرووا تریس بفرستید:

php
// config/logging.php
'channels' => [
    'abrovatrace' => [
        'driver' => 'custom',
        'via' => AbrovaTrace\Laravel\Logging\AbrovaTraceLogChannel::class,
    ],
],
php
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]);
کانال stack.

می‌توانید abrovatrace را به یک کانال stack اضافه کنید تا لاگ‌ها هم‌زمان به چند مقصد فرستاده شوند.

برای رفتار ارسال دسته‌ای، سطح‌های لاگ و flush دستی، صفحه‌ی لاگ‌گیری در SDK برای Laravel را ببینید.

ردیابی عملکرد#

php
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'],
]));

گزینه‌های پیکربندی#

php
// 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_keystringبلهکلید API پروژه (ab_live_xxx)
server_secretstringبلهکلید سرور (ab_srv_xxx)
enabledbooleanخیرروشن/خاموش کردن ردیابی (پیش‌فرض: true)
environmentstringخیرنام محیط (پیش‌فرض: APP_ENV، وگرنه "production")
releasestringخیرشناسه‌ی نسخه‌ی برنامه (پیش‌فرض: "0.1.0")
sample_ratefloatخیرنرخ نمونه‌برداری برای خطاها و پیام‌ها، 0.0 تا 1.0 (پیش‌فرض: 1.0)
before_sendcallableخیرهر خطا (AbrovaTraceError) یا پیام (AbrovaTraceMessage) را دریافت می‌کند؛ برای ارسال، همان را (یا نسخه‌ی اصلاح‌شده را) برگردانید و برای حذف null. آن را از یک service provider تعیین کنید، چون closure نمی‌تواند در config کش‌شده قرار بگیرد
debugbooleanخیرفعال کردن لاگ عیب‌یابی (پیش‌فرض: false)
timeoutintegerخیرمهلت HTTP بر حسب ثانیه (پیش‌فرض: 5، حداکثر: 30)
max_breadcrumbsintegerخیرحداکثر تعداد breadcrumbهای نگه‌داشته‌شده، 0 تا 100 (پیش‌فرض: 50)

exceptionهای نادیده‌گرفته‌شده#

SDK برای exceptionهایی که برنامه‌های Laravel معمولاً نمی‌خواهند به‌عنوان خطا ببینند، پیش‌فرض‌های معقولی دارد. به‌طور پیش‌فرض این‌ها گزارش نمی‌شوند:

  • AuthenticationException — درخواست‌های بدون احراز هویت
  • ValidationException — خطاهای اعتبارسنجی فرم
  • NotFoundHttpException — خطاهای 404
  • همه‌ی exceptionهای HTTP با کد 4xx

از طریق config/abrovatrace.php تغییرشان دهید:

php
'exception_handler' => [
    'ignored_exceptions' => [
        \App\Exceptions\BusinessException::class,
    ],
    'report_4xx' => true,
],

فهرست ignored_exceptions که تعیین می‌کنید جای فهرست پیش‌فرض را می‌گیرد؛ پس مواردی از پیش‌فرض را که هنوز می‌خواهید نادیده گرفته شوند، در فهرست نگه دارید.

چرا 4xx به‌طور پیش‌فرض کنار گذاشته می‌شود.

پاسخ‌های 4xx خطای سمت کلاینت هستند و ثبت دوباره‌شان به‌عنوان exception، فهرست خطاها را شلوغ می‌کند. اگر واقعاً می‌خواهید ثبت شوند (مثلاً برای تحلیل)، report_4xx را true کنید.

مرجع API#

Facade ابرووا تریس

  • captureException($e, $options?) — ثبت یک exception
  • captureMessage($msg, $options?) — ارسال پیام به ابرووا تریس › پیام‌ها ($options: level، extra، tags)
  • addBreadcrumb($breadcrumb) — افزودن یک breadcrumb
  • setUser($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() — بررسی فعال بودن SDK
  • getStats() — گرفتن آمار SDK

توابع کمکی Breadcrumb

  • Breadcrumb::http($method, $url, $status?, $duration?) — breadcrumb برای درخواست HTTP
  • Breadcrumb::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 نصب است)

نمونه‌ی کامل#

php
// 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 نکنید

از auto-discovery بهره ببرید

service provider خودکار ثبت می‌شود و نیازی به ثبت دستی نیست

از کانال Monolog استفاده کنید

برای لاگ متمرکز، لاگ‌های ساختاریافته را با Log::channel('abrovatrace') بفرستید

اطلاعات کاربر را تعیین کنید

اطلاعات کاربر خودکار از Auth برداشته می‌شود، اما در احراز هویت با توکن API آن را دستی تعیین کنید

Breadcrumb اضافه کنید

breadcrumbهای HTTP و پایگاه داده خودکارند؛ برای منطق کسب‌وکار breadcrumb دلخواه اضافه کنید

pathهای نادیده‌گرفته‌شده را تنظیم کنید

health checkها و routeهای debug را از ردیابی middleware کنار بگذارید

کوئری‌های کند را ردیابی کنید

مقدار slow_query_threshold_ms را تعیین کنید تا افت عملکرد را زود ببینید

از trackOperation() استفاده کنید

درخواست‌های API خارجی و عملیات سنگین را برای پایش عملکرد داخل آن قرار دهید

این صفحه مفید بود؟
گزارش مشکل