עברית

נצלו את העוצמה של אינסטרומנטציה ב-Next.js כדי לקבל תובנות עומק על ביצועי האפליקציה שלכם, לזהות צווארי בקבוק ולשפר את חווית המשתמש. למדו כיצד ליישם ביעילות הוקים לניטור אפליקציות.

אינסטרומנטציה ב-Next.js: הוקים לניטור אפליקציות לקבלת תובנות מפרודקשן

האינסטרומנטציה של Next.js מספקת מנגנון רב עוצמה לצפייה ומדידת ביצועי האפליקציה שלכם בפרודקשן. על ידי מינוף הוקים (hooks) לניטור אפליקציות, תוכלו לקבל תובנות עומק על טיפול בבקשות, רינדור בצד השרת, שליפת נתונים והיבטים קריטיים אחרים של התנהגות האפליקציה שלכם. זה מאפשר לכם לזהות צווארי בקבוק, לאבחן בעיות ביצועים ולמטב את האפליקציה שלכם לחוויית משתמש טובה יותר. זה חשוב במיוחד כאשר פורסים אפליקציות Next.js גלובלית, שם השהיית רשת ומשתמשים מבוזרים גיאוגרפית יכולים להציב אתגרים ייחודיים.

הבנת האינסטרומנטציה ב-Next.js

תכונת האינסטרומנטציה ב-Next.js מאפשרת לכם לרשום הוקים שרצים בשלבים שונים של מחזור החיים של האפליקציה. ניתן להשתמש בהוקים אלה כדי לאסוף מדדים, עקבות (traces) ולוגים, אשר לאחר מכן ניתן לשלוח למערכת ניטור ביצועי אפליקציות (APM) או לכלי observability אחרים. זה מספק תמונה מקיפה של ביצועי האפליקציה שלכם בזמן אמת.

בניגוד לניטור מסורתי בצד הלקוח הלוכד רק את חוויית הדפדפן, האינסטרומנטציה של Next.js מספקת observability הן בצד הלקוח והן בצד השרת, ומאפשרת מבט full-stack על ביצועי האפליקציה שלכם. זה קריטי להבנת ההשפעה של רינדור בצד השרת, נתיבי API ושליפת נתונים על חוויית המשתמש הכוללת.

יתרונות מרכזיים של אינסטרומנטציה

הגדרת אינסטרומנטציה ב-Next.js

כדי להפעיל אינסטרומנטציה באפליקציית Next.js שלכם, עליכם ליצור קובץ instrumentation.js (או instrumentation.ts) בספריית השורש של הפרויקט. קובץ זה יכיל את ההוקים שברצונכם לרשום.

הנה דוגמה בסיסית לקובץ instrumentation.ts:

// instrumentation.ts

export async function register() {
  if (process.env.NEXT_RUNTIME === 'nodejs') {
    const { trace } = await import('./utils/tracing');

    trace('registering-tracing');
  }
}

בדוגמה זו, אנו מייבאים פונקציית trace מקובץ ./utils/tracing וקוראים לה בתוך הפונקציה register. הפונקציה register נקראת באופן אוטומטי על ידי Next.js כאשר האפליקציה עולה.

הרצה מותנית על בסיס סביבת ההרצה (Runtime)

המשתנה process.env.NEXT_RUNTIME הוא חיוני לקביעת ההקשר שבו הקוד רץ. הוא מאפשר לכם להריץ קוד באופן מותנה בהתבסס על האם האפליקציה פועלת בסביבת Node.js (עבור רינדור בצד השרת, נתיבי API וכו') או בסביבת Edge Runtime (עבור פונקציות edge). זה חשוב מכיוון שספריות ניטור או כלים מסוימים עשויים להיות תואמים רק לסביבת הרצה אחת או לאחרת.

לדוגמה, ייתכן שתרצו להשתמש בסוכן APM ספציפי עבור סביבות Node.js וכלי אחר עבור סביבות Edge Runtime. שימוש ב-process.env.NEXT_RUNTIME מאפשר לכם לטעון את המודולים המתאימים רק בעת הצורך.

יישום הוקים לניטור אפליקציות

כעת, בואו נבחן כמה דוגמאות לאופן יישום הוקים לניטור אפליקציות ב-Next.js.

1. מדידת זמן טיפול בבקשות

אחד השימושים הנפוצים לאינסטרומנטציה הוא מדידת הזמן שלוקח לטפל בבקשות נכנסות. זה יכול לעזור לכם לזהות נקודות קצה (endpoints) איטיות ולמטב את ביצועיהן.

הנה דוגמה לאופן מדידת זמן הטיפול בבקשה באמצעות ה-API של performance:

// utils/tracing.ts

import { performance } from 'perf_hooks';

export function trace(eventName: string) {
  const start = performance.now();

  return () => {
    const end = performance.now();
    const duration = end - start;

    console.log(`[${eventName}] took ${duration}ms`);
    // באפליקציה אמיתית, הייתם שולחים נתונים אלו למערכת APM.
  };
}

בקובץ instrumentation.ts:

// instrumentation.ts

export async function register() {
  if (process.env.NEXT_RUNTIME === 'nodejs') {
    const { trace } = await import('./utils/tracing');

    const endTrace = trace('request-handling');

    // מדמה טיפול בבקשה
    await new Promise((resolve) => setTimeout(resolve, 100));

    endTrace();
  }
}

דוגמה זו מודדת את הזמן שלוקח לטפל בבקשה ורושמת את משך הזמן לקונסול. באפליקציה אמיתית, הייתם שולחים נתונים אלה למערכת APM לניתוח נוסף.

2. ניטור זמן רינדור בצד השרת

רינדור בצד השרת (SSR) הוא תכונה מרכזית של Next.js, אך הוא יכול גם להוות צוואר בקבוק בביצועים. ניטור הזמן שלוקח לרנדר דפים בשרת הוא חיוני להבטחת חווית משתמש מהירה.

ניתן להשתמש באינסטרומנטציה כדי למדוד את הזמן שלוקח להריץ פונקציות כמו getServerSideProps או getStaticProps. פונקציות אלה אחראיות על שליפת נתונים והכנתם לרינדור בשרת.

// pages/index.tsx

import { GetServerSideProps } from 'next';
import { trace } from '../utils/tracing';

interface Props {
  data: string;
}

export const getServerSideProps: GetServerSideProps = async () => {
  const endTrace = trace('getServerSideProps');
  const data = await fetchData();
  endTrace();

  return {
    props: { data },
  };
};

async function fetchData() {
  // מדמה שליפת נתונים מ-API חיצוני
  await new Promise((resolve) => setTimeout(resolve, 50));
  return 'Data from API';
}

export default function Home({ data }: Props) {
  return 

{data}

; }

בדוגמה זו, אנו משתמשים בפונקציה trace כדי למדוד את הזמן שלוקח להריץ את הפונקציה getServerSideProps. זה מאפשר לנו לזהות בעיות ביצועים בתהליך שליפת הנתונים.

3. מעקב אחר ביצועי נתיבי API

נתיבי ה-API של Next.js מאפשרים לכם לבנות פונקציות serverless המטפלות בבקשות API. ניטור הביצועים של נתיבי API אלה חיוני להבטחת backend רספונסיבי.

ניתן להשתמש באינסטרומנטציה כדי למדוד את הזמן שלוקח לטפל בבקשות API בנתיבי ה-API שלכם.

// pages/api/hello.ts

import type { NextApiRequest, NextApiResponse } from 'next'
import { trace } from '../../utils/tracing';

type Data = {
  name: string
}

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  const endTrace = trace('api-hello');
  // מדמה ביצוע עבודה כלשהי
  await new Promise((resolve) => setTimeout(resolve, 25));
  endTrace();
  res.status(200).json({ name: 'John Doe' })
}

דוגמה זו מודדת את הזמן שלוקח לטפל בבקשת ה-API ומחזירה תגובת JSON. זה עוזר לכם להבין את ביצועי ה-backend שלכם ולזהות נקודות קצה איטיות ב-API.

4. ניטור ביצועים ב-Edge Runtime

ה-Edge Runtime של Next.js מאפשר לכם לפרוס את האפליקציה שלכם ל-edge, קרוב יותר למשתמשים שלכם. זה יכול לשפר משמעותית את הביצועים, במיוחד עבור אפליקציות מבוזרות גלובלית. עם זאת, חשוב לנטר את ביצועי האפליקציה שלכם ב-Edge Runtime כדי להבטיח שהיא פועלת ביעילות.

ניתן להשתמש באינסטרומנטציה כדי לנטר את ביצועי האפליקציה שלכם ב-Edge Runtime. זה מאפשר לכם לזהות בעיות ביצועים הספציפיות לסביבת ה-Edge Runtime.

הערה חשובה: לא כל כלי הניטור תומכים ב-Edge Runtime. ייתכן שתצטרכו להשתמש בכלים או ספריות מיוחדים המיועדים לסביבת ה-Edge Runtime.

לדוגמה, Vercel מספקת אנליטיקות מובנות שניתן להשתמש בהן כדי לנטר את ביצועי האפליקציה שלכם ב-Edge Runtime. ניתן גם להשתמש בכלי ניטור של צד שלישי התומכים ב-Edge Runtime, כגון Datadog או New Relic.

אינטגרציה עם מערכות APM

הנתונים שנאספים על ידי הוקי האינסטרומנטציה שלכם הם בעלי הערך הרב ביותר כאשר הם נשלחים למערכת APM (Application Performance Monitoring). מערכות APM מספקות כלים להדמיה, ניתוח והתראה על נתוני ביצועים. מערכות APM פופולריות כוללות:

השלבים הספציפיים לאינטגרציה עם מערכת APM ישתנו בהתאם למערכת שתבחרו. עם זאת, התהליך הכללי כולל את השלבים הבאים:

  1. התקינו את סוכן ה-APM או ה-SDK באפליקציית Next.js שלכם.
  2. הגדירו את סוכן ה-APM עם מפתח ה-API או האישורים של מערכת ה-APM שלכם.
  3. השתמשו ב-API של סוכן ה-APM כדי לשלוח מדדים, עקבות (traces) ולוגים מהוקי האינסטרומנטציה שלכם.

דוגמה לשימוש ב-OpenTelemetry עם Datadog:

OpenTelemetry היא מסגרת observability בקוד פתוח המספקת דרך סטנדרטית לאסוף ולייצא נתוני טלמטריה. ניתן להשתמש בה כדי להשתלב עם מגוון מערכות APM, כולל Datadog.

// utils/tracing.ts

import { trace, context } from '@opentelemetry/api';

const tracer = trace.getTracer('my-app-tracer');

export function traceFunction any>(
  operationName: string,
  fn: T
): T {
  return function tracedFunction(...args: Parameters): ReturnType {
    const span = tracer.startSpan(operationName);
    const ctx = trace.setSpan(context.active(), span);

    try {
      return context.with(ctx, () => fn(...args));
    } finally {
      span.end();
    }
  } as T;
}

שימוש בתוך getServerSideProps:

// pages/index.tsx

import { GetServerSideProps } from 'next';
import { traceFunction } from '../utils/tracing';

interface Props {
  data: string;
}

async function fetchData() {
  // Simulate fetching data from an external API
  await new Promise((resolve) => setTimeout(resolve, 50));
  return 'Data from API';
}

export const getServerSideProps: GetServerSideProps = async () => {
  const tracedFetchData = traceFunction('fetchData', fetchData);
  const data = await tracedFetchData();

  return {
    props: { data },
  };
};

export default function Home({ data }: Props) {
  return 

{data}

; }

דוגמת OpenTelemetry פשוטה זו מציגה כיצד לעטוף פונקציה עם tracing span. ההתקנה וההגדרה המלאות של ה-SDK של OpenTelemetry וסוכן Datadog הן מורכבות יותר ודורשות שלבים נוספים, כולל הגדרת משתני סביבה, הגדרת ה-exporter, ואתחול ה-SDK בקובץ instrumentation.ts שלכם. עיינו בתיעוד של OpenTelemetry ו-Datadog לקבלת הוראות מלאות.

שיטות עבודה מומלצות לאינסטרומנטציה ב-Next.js

בעיות נפוצות ופתרונות

סיכום

האינסטרומנטציה של Next.js מספקת מנגנון רב עוצמה לצפייה ומדידת ביצועי האפליקציה שלכם בפרודקשן. על ידי יישום הוקים לניטור אפליקציות, תוכלו לקבל תובנות עומק על טיפול בבקשות, רינדור בצד השרת, שליפת נתונים והיבטים קריטיים אחרים של התנהגות האפליקציה שלכם. זה מאפשר לכם לזהות צווארי בקבוק, לאבחן בעיות ביצועים ולמטב את האפליקציה שלכם לחוויית משתמש טובה יותר.

על ידי מעקב אחר שיטות העבודה המומלצות המתוארות במדריך זה, תוכלו למנף ביעילות את האינסטרומנטציה של Next.js כדי לשפר את הביצועים והאמינות של האפליקציות שלכם, לא משנה היכן המשתמשים שלכם נמצאים. זכרו לבחור את מערכת ה-APM המתאימה לצרכים שלכם ולנטר באופן רציף את ביצועי האפליקציה שלכם כדי לזהות ולטפל בבעיות באופן יזום.

אינסטרומנטציה ב-Next.js: הוקים לניטור אפליקציות לקבלת תובנות מפרודקשן | MLOG