ابرووا
شروع رایگان
☰ فهرست مستندات · ردیابی تأخیر API

ردیابی تأخیر API

ثبت زمان‌بندی درخواست‌های HTTP در Next.js، Flutter، Android، iOS و Node.js با ابزارگذاری خودکار و معیارهای صدکی.

به‌روزرسانی: ۵ آبان ۱۴۰۵

ردیابی تأخیر API زمان‌بندی همه‌ی درخواست‌های HTTP اپلیکیشن شما را ثبت می‌کند. SDK کلاینت‌های HTTP را به‌طور خودکار ابزارگذاری می‌کند، مدت هر درخواست را می‌سنجد و این داده را برای تحلیل با صدک‌های p50، p95 و p99 به ابرووا تریس می‌فرستد.

متد HTTP

GET، POST، PUT، DELETE، PATCH و غیره

URL و Host درخواست

URL کامل و host برای گروه‌بندی

کد وضعیت پاسخ

200، 404، 500 و غیره

مدت‌زمان

مدت درخواست بر حسب میلی‌ثانیه

پیام‌های خطا

جزئیات خطا اگر درخواست ناموفق باشد

تگ‌های سفارشی

هر متادیتای اضافه‌ای که خودتان ضمیمه کنید

Next.js / React#

ردیابی خودکار

رهگیری خودکار fetch را فعال کنید تا همه‌ی درخواست‌های HTTP دنبال شوند:

typescript
import { AbrovaTrace } from '@abrova-trace/nextjs-sdk';

AbrovaTrace.init({
  apiKey: 'ab_live_your_api_key',
  environment: 'production',
});

// Enable automatic HTTP tracking
// This intercepts window.fetch and reports timing
AbrovaTrace.getInstance()?.enablePerformanceTracking({
  batchSize: 5,        // Send spans in batches of 5 (default)
  flushInterval: 5000, // Flush at most 5 seconds after a span is buffered (default)
});

ردیابی دستی عملیات

typescript
const sdk = AbrovaTrace.getInstance();

// Track an async operation
const result = await sdk?.trackOperation(
  'fetchUserProfile',
  async () => {
    const response = await fetch('/api/users/123');
    return response.json();
  },
  {
    operationType: 'http',
    tags: { userId: '123' }
  }
);

Wrapper برای fetch

typescript
const sdk = AbrovaTrace.getInstance();

// Create a tracked fetch function
const performanceFetch = sdk?.createPerformanceFetch() ?? fetch;

// Use it like regular fetch — timing is automatically captured
const response = await performanceFetch('/api/users');
const data = await response.json();

این wrapper فقط وقتی span می‌فرستد که قبلاً enablePerformanceTracking()، trackOperation() یا reportPerformanceSpan() صدا زده شده باشد. در مرورگر، enablePerformanceTracking() خودش همه‌ی fetchها را دنبال می‌کند، پس wrapper را سمت سرور به کار ببرید.

ارسال دستی span

typescript
import { createHttpSpan, PerformanceSpanFactory } from '@abrova-trace/nextjs-sdk';

// Create and report an HTTP span
const span = createHttpSpan({
  method: 'GET',
  url: 'https://api.example.com/users',
  statusCode: 200,
  durationMs: 245,
  startTime: new Date(),
});
AbrovaTrace.getInstance()?.reportPerformanceSpan(span);

// Or use the factory for other span types
const dbSpan = PerformanceSpanFactory.forDbQuery({
  queryType: 'SELECT',
  tableName: 'users',
  durationMs: 15,
  startTime: new Date(),
});
AbrovaTrace.getInstance()?.reportPerformanceSpan(dbSpan);

Flutter#

کلاینت HTTP عملکرد

با PerformanceHttpClient همه‌ی درخواست‌های HTTP خودکار دنبال می‌شوند:

dart
import 'package:abrova_trace_flutter_sdk/abrova_trace_flutter_sdk.dart';

// Create a performance-tracking HTTP client
final client = PerformanceHttpClient(
  apiKey: 'ab_live_your_api_key',
  environment: 'production',
  releaseVersion: '1.0.0',
  addBreadcrumbs: true,      // Also add HTTP breadcrumbs
  excludedHosts: {'analytics.example.com'},  // Hosts to skip (Abrova's own API is always skipped)
  minDurationMs: 0,          // Track all requests (set higher to filter fast ones)
);

// All requests are automatically tracked
final response = await client.get(
  Uri.parse('https://api.example.com/users'),
);

// Don't forget to flush and close
await client.flush();
client.close();

ردیابی عملیات سفارشی

dart
import 'package:abrova_trace_flutter_sdk/abrova_trace_flutter_sdk.dart';

// Automatic tracking with closure
final result = await PerformanceTracker.track(
  operation: 'processOrder',
  apiKey: 'ab_live_your_api_key',
  block: () async => await orderService.process(orderId),
);

// Manual tracking
final tracker = PerformanceTracker(
  operation: 'processPayment',
  apiKey: 'ab_live_your_api_key',
  operationType: 'custom',
  environment: 'production',
);
// ... perform operation
await tracker.finish(status: SpanStatus.ok);

Android (Kotlin)#

Interceptor عملکرد برای OkHttp

kotlin
import ir.abrova.trace.sdk.network.AbrovaTracePerformanceInterceptor
import okhttp3.OkHttpClient
import okhttp3.Request

val client = OkHttpClient.Builder()
    .addInterceptor(AbrovaTracePerformanceInterceptor())  // APM tracking
    .build()

// All API calls are automatically tracked
val request = Request.Builder()
    .url("https://api.example.com/users")
    .build()

client.newCall(request).execute().use { response ->
    // Duration, status code, and errors are automatically reported
    val users = response.body?.string()
}

همراه با Retrofit

kotlin
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

val okHttpClient = OkHttpClient.Builder()
    .addInterceptor(AbrovaTracePerformanceInterceptor())
    .build()

val retrofit = Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build()

// All API calls through this Retrofit instance are automatically tracked

ارسال دستی span

kotlin
import ir.abrova.trace.sdk.AbrovaTrace
import ir.abrova.trace.sdk.models.PerformanceSpan

// Track a custom operation
val result = AbrovaTrace.trackOperation("load_user_profile") {
    val user = fetchUserFromApi()
    cacheUserLocally(user)
    user
}

// Manual span
AbrovaTrace.reportPerformanceSpan(
    PerformanceSpan.fromHttpRequest(
        method = "GET",
        url = "https://api.example.com/products",
        statusCode = 200,
        durationMs = 245L,
        startTime = System.currentTimeMillis() - 245
    )
)

// Database query span
AbrovaTrace.reportPerformanceSpan(
    PerformanceSpan.forDbQuery(
        queryType = "SELECT",
        tableName = "products",
        durationMs = 15L,
        startTime = System.currentTimeMillis() - 15,
        rowsAffected = 50
    )
)

iOS (Swift)#

ردیابی خودکار URLSession

swift
import AbrovaTrace

// Enable automatic tracking for all URLSession requests
AbrovaTrace.shared.enablePerformanceTracking()

// Or create a custom session with tracking
let config = AbrovaTrace.shared.performanceSessionConfiguration()
let session = URLSession(configuration: config)

// All requests through this session are automatically tracked
let (data, response) = try await session.data(from: url)

پیکربندی

swift
// Exclude specific hosts from tracking
// (Abrova Trace's own API is always excluded)
AbrovaTrace.shared.setPerformanceExcludedHosts(["analytics.example.com"])

// Set minimum duration to track (filter very fast requests)
AbrovaTrace.shared.setPerformanceMinDuration(10) // Skip requests shorter than 10ms

ردیابی دستی

swift
import AbrovaTrace

// Track with closure
let profile = try await PerformanceTracker.trackAsync("fetchProfile") {
    await api.fetchProfile()
}

// Manual tracker
let tracker = PerformanceTracker(operation: "processOrder")
tracker.setTag("orderId", value: "12345")
// ... perform operation
tracker.finish(status: .ok)

Node.js#

ردیابی عملیات

در SDK مربوط به Node.js ثبت خودکار span برای HTTP وجود ندارد. کاری را که می‌خواهید زمان‌سنجی شود داخل trackOperation بگذارید، یا spanها را خودتان با reportPerformanceSpan بفرستید:

javascript
const AbrovaTrace = require('@abrova-trace/nodejs-sdk');

app.get('/api/users/:id', async (req, res) => {
  const user = await AbrovaTrace.trackOperation(
    'GET /api/users/:id',
    () => db.users.findById(req.params.id),
    { operationType: 'db', tags: { route: '/api/users/:id' } }
  );
  res.json(user);
});

Middleware برای Express.js

این middleware هر درخواست (متد، URL، وضعیت و مدت) را به‌صورت یک breadcrumb از نوع HTTP ثبت می‌کند که به خطاها ضمیمه می‌شود، نه به‌صورت Performance span:

javascript
const middleware = AbrovaTrace.expressMiddleware();
app.use(middleware.requestHandler());

// Your routes

// Error handler (must be last)
app.use(middleware.errorHandler());

ردیابی کوئری‌های دیتابیس

javascript
const { Breadcrumb } = require('@abrova-trace/nodejs-sdk');

async function executeQuery(sql, params) {
  const startTime = Date.now();

  try {
    AbrovaTrace.addBreadcrumb(Breadcrumb.database(sql.substring(0, 100), 0));

    const results = await db.query(sql, params);

    AbrovaTrace.addBreadcrumb(Breadcrumb.database(
      'Query completed',
      Date.now() - startTime
    ));

    return results;
  } catch (error) {
    AbrovaTrace.captureException(error, {
      extra: { sql, duration_ms: Date.now() - startTime }
    });
    throw error;
  }
}

نمای داشبورد#

داشبورد عملکرد داده‌های تأخیر را در این نماها نشان می‌دهد:

آمار کلی

  • • تعداد درخواست‌ها
  • • نرخ خطا
  • • تأخیر p50
  • • تأخیر p95 / p99

تأخیر

  • • p50، p95 و p99 در طول زمان
  • • تعداد درخواست‌ها در طول زمان، با خطاهای روی هم

عملیات

  • • نام و نوع عملیات
  • • تعداد درخواست و صدک‌های تأخیر
  • • تعداد خطا
  • • کارت‌های کدهای وضعیت، Web Vitals و درخواست‌های ناموفق

فیلتر

  • • بازه‌ی زمانی (۱ ساعت، ۲۴ ساعت، ۷ روز، ۳۰ روز یا دلخواه)
  • • پلتفرم
  • • محیط
  • • Release

بهترین روش‌ها#

نام‌های معنادار برای عملیات

به‌جای نام‌های کلی از نام‌های گویا مثل «GET /api/users» استفاده کنید تا راحت‌تر شناخته شوند

تگ سفارشی اضافه کنید

تگ‌هایی مثل شناسه‌ی کاربر، شناسه‌ی tenant یا feature flag اضافه کنید تا داده‌ها را در داشبورد فیلتر و تفکیک کنید

محیط را درست تنظیم کنید

همیشه محیط (production، staging، development) را تنظیم کنید تا داده‌ی deployهای مختلف از هم جدا بماند

به p95/p99 نگاه کنید، نه فقط میانگین

میانگین تأخیر موارد پرت را پنهان می‌کند؛ برای بدترین تجربه‌ی کاربر روی p95 و p99 تمرکز کنید

نویز را حذف کنید

endpointهای health check و فراخوانی‌های داخلی SDK را از ردیابی کنار بگذارید

از ارسال دسته‌ای استفاده کنید

بگذارید SDK spanها را دسته‌ای بفرستد؛ اگر خودتان span زیادی می‌فرستید از reportPerformanceSpanBatch استفاده کنید

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