~3 دقیقه مطالعه • بروزرسانی ۶ آبان ۱۴۰۴
چرا رصد اهمیت دارد؟
با پیچیدهتر شدن اپلیکیشنها، تشخیص مشکلات و بهینهسازی عملکرد دشوارتر میشود. ابزارهای رصد مانند لاگگیری و متریکها به توسعهدهندگان کمک میکنند تا رفتار اپلیکیشن را تحلیل کرده و مشکلات را پیش از تبدیل شدن به بحران شناسایی کنند.
استفاده از OpenTelemetry
OpenTelemetry یک استاندارد مستقل از پلتفرم برای رصد است که امکان تغییر ارائهدهنده بدون تغییر کد را فراهم میکند. Next.js بهصورت داخلی از OpenTelemetry پشتیبانی میکند.
راهاندازی سریع با @vercel/otel
نصب پکیجها:
npm install @vercel/otel @opentelemetry/sdk-logs @opentelemetry/api-logs @opentelemetry/instrumentationساخت فایل instrumentation.ts در ریشه پروژه:
import { registerOTel } from '@vercel/otel'
export function register() {
registerOTel({ serviceName: 'next-app' })
}پیکربندی دستی OpenTelemetry
نصب پکیجهای اصلی:
npm install @opentelemetry/sdk-node @opentelemetry/resources @opentelemetry/semantic-conventions @opentelemetry/sdk-trace-node @opentelemetry/exporter-trace-otlp-httpساخت فایل instrumentation.node.ts:
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
import { resourceFromAttributes } from '@opentelemetry/resources'
import { NodeSDK } from '@opentelemetry/sdk-node'
import { SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node'
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'
const sdk = new NodeSDK({
resource: resourceFromAttributes({
[ATTR_SERVICE_NAME]: 'next-app',
}),
spanProcessor: new SimpleSpanProcessor(new OTLPTraceExporter()),
})
sdk.start()تست رصد و مشاهده Spanها
برای مشاهده Spanها، از OpenTelemetry Collector یا محیط توسعه مخصوص استفاده کنید. برای نمایش Spanهای بیشتر، متغیر NEXT_OTEL_VERBOSE=1 را تنظیم کنید.
اتصال به Collector
در حالت self-hosted، باید OpenTelemetry Collector را راهاندازی کرده و دادهها را از Next.js دریافت کنید. راهنمای رسمی OpenTelemetry Collector را دنبال کنید.
ساخت Span سفارشی
نصب پکیج API:
npm install @opentelemetry/apiمثال ساخت Span برای واکشی داده از GitHub:
import { trace } from '@opentelemetry/api'
export async function fetchGithubStars() {
return await trace
.getTracer('nextjs-example')
.startActiveSpan('fetchGithubStars', async (span) => {
try {
return await getValue()
} finally {
span.end()
}
})
}Spanهای پیشفرض در Next.js
Next.js بهصورت خودکار Spanهایی برای موارد زیر ایجاد میکند:
- BaseServer.handleRequest: ریشه درخواست HTTP
- AppRender.getBodyResult: رندر مسیر در App Router
- AppRender.fetch: واکشی دادهها
- AppRouteRouteHandlers.runHandler: اجرای API Route
- Render.getServerSideProps: اجرای getServerSideProps
- Render.getStaticProps: اجرای getStaticProps
- Render.renderDocument: رندر صفحات در Pages Router
- ResolveMetadata.generateMetadata: تولید متادیتا برای صفحات
- NextNodeServer.findPageComponents: یافتن کامپوننتهای صفحه
- NextNodeServer.getLayoutOrPageModule: بارگذاری ماژولهای layout یا page
- NextNodeServer.startResponse: ارسال اولین بایت پاسخ
جمعبندی
با استفاده از OpenTelemetry در Next.js، میتوانید عملکرد اپلیکیشن را بهصورت دقیق رصد کرده، مشکلات را سریعتر شناسایی کنید، و تجربه کاربری بهتری ارائه دهید. چه از @vercel/otel استفاده کنید و چه پیکربندی دستی انجام دهید، ابزارهای رصد به شما دیدی عمیقتر از رفتار اپلیکیشن میدهند.
نوشته و پژوهش شده توسط دکتر شاهین صیامی