ردیابی تأخیر API
ثبت زمانبندی درخواستهای HTTP در Next.js، Flutter، Android، iOS و Node.js با ابزارگذاری خودکار و معیارهای صدکی.
ردیابی تأخیر API زمانبندی همهی درخواستهای HTTP اپلیکیشن شما را ثبت میکند. SDK کلاینتهای HTTP را بهطور خودکار ابزارگذاری میکند، مدت هر درخواست را میسنجد و این داده را برای تحلیل با صدکهای p50، p95 و p99 به ابرووا تریس میفرستد.
GET، POST، PUT، DELETE، PATCH و غیره
URL کامل و host برای گروهبندی
200، 404، 500 و غیره
مدت درخواست بر حسب میلیثانیه
جزئیات خطا اگر درخواست ناموفق باشد
هر متادیتای اضافهای که خودتان ضمیمه کنید
Next.js / React#
ردیابی خودکار
رهگیری خودکار fetch را فعال کنید تا همهی درخواستهای HTTP دنبال شوند:
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)
});ردیابی دستی عملیات
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
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
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 خودکار دنبال میشوند:
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();ردیابی عملیات سفارشی
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
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
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
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
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)
پیکربندی
// 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
ردیابی دستی
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 بفرستید:
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:
const middleware = AbrovaTrace.expressMiddleware(); app.use(middleware.requestHandler()); // Your routes // Error handler (must be last) app.use(middleware.errorHandler());
ردیابی کوئریهای دیتابیس
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 تمرکز کنید
endpointهای health check و فراخوانیهای داخلی SDK را از ردیابی کنار بگذارید
بگذارید SDK spanها را دستهای بفرستد؛ اگر خودتان span زیادی میفرستید از reportPerformanceSpanBatch استفاده کنید