Norsk

Utnytt kraften i Next.js-instrumentering for å få dyp innsikt i applikasjonens ytelse, identifisere flaskehalser og optimalisere brukeropplevelsen. Lær hvordan du implementerer applikasjonsovervåkings-hooks effektivt.

Next.js Instrumentering: Applikasjonsovervåkings-hooks for Produksjonsinnsikt

Next.js-instrumentering gir en kraftig mekanisme for å observere og måle ytelsen til applikasjonen din i produksjon. Ved å utnytte applikasjonsovervåkings-hooks kan du få dyp innsikt i forespørselshåndtering, server-side rendering, datahenting og andre kritiske aspekter ved applikasjonens oppførsel. Dette lar deg identifisere flaskehalser, diagnostisere ytelsesproblemer og optimalisere applikasjonen for en bedre brukeropplevelse. Dette er spesielt viktig når du distribuerer Next.js-applikasjoner globalt, der nettverkslatens og geografisk spredte brukere kan introdusere unike utfordringer.

Forstå Next.js Instrumentering

Instrumenteringsfunksjonen i Next.js lar deg registrere hooks som utføres på ulike stadier i applikasjonens livssyklus. Disse hooksene kan brukes til å samle inn metrikker, sporinger og logger, som deretter kan sendes til et Application Performance Monitoring (APM)-system eller andre observerbarhetsverktøy. Dette gir en omfattende oversikt over applikasjonens ytelse i sanntid.

I motsetning til tradisjonell klient-side-overvåking som kun fanger nettleseropplevelsen, gir Next.js-instrumentering både klient-side- og server-side-observerbarhet, noe som muliggjør en full-stack-visning av applikasjonens ytelse. Dette er kritisk for å forstå virkningen av server-side rendering, API-ruter og datahenting på den totale brukeropplevelsen.

Hovedfordeler med Instrumentering

Sette opp Instrumentering i Next.js

For å aktivere instrumentering i din Next.js-applikasjon, må du opprette en instrumentation.js (eller instrumentation.ts) fil i rotkatalogen til prosjektet ditt. Denne filen vil inneholde de hooksene du ønsker å registrere.

Her er et grunnleggende eksempel på en instrumentation.ts-fil:

// instrumentation.ts

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

    trace('registering-tracing');
  }
}

I dette eksempelet importerer vi en trace-funksjon fra en ./utils/tracing-fil og kaller den inne i register-funksjonen. register-funksjonen kalles automatisk av Next.js når applikasjonen starter opp.

Betinget Kjøring Basert på Kjøretid

process.env.NEXT_RUNTIME-variabelen er avgjørende for å bestemme kjøringskonteksten. Den lar deg betinget kjøre kode basert på om applikasjonen kjører i et Node.js-miljø (for server-side rendering, API-ruter, etc.) eller i et Edge Runtime-miljø (for edge-funksjoner). Dette er viktig fordi visse overvåkingsbiblioteker eller verktøy kanskje bare er kompatible med den ene eller den andre kjøretiden.

For eksempel kan du ønske å bruke en spesifikk APM-agent for Node.js-miljøer og et annet verktøy for Edge Runtime-miljøer. Ved å bruke process.env.NEXT_RUNTIME kan du laste inn de riktige modulene bare når det er nødvendig.

Implementere Applikasjonsovervåkings-hooks

La oss nå se på noen eksempler på hvordan man implementerer applikasjonsovervåkings-hooks i Next.js.

1. Måle Tid for Forespørselshåndtering

Et vanlig bruksområde for instrumentering er å måle tiden det tar å håndtere innkommende forespørsler. Dette kan hjelpe deg med å identifisere trege endepunkter og optimalisere ytelsen deres.

Her er et eksempel på hvordan du måler tid for forespørselshåndtering ved hjelp av performance API-et:

// 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`);
    // I en ekte applikasjon ville du sendt disse dataene til et APM-system.
  };
}

I 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');

    // Simulerer forespørselshåndtering
    await new Promise((resolve) => setTimeout(resolve, 100));

    endTrace();
  }
}

Dette eksempelet måler tiden det tar å håndtere forespørselen og logger varigheten til konsollen. I en ekte applikasjon ville du sendt disse dataene til et APM-system for videre analyse.

2. Overvåke Gjengivelsestid på Serversiden

Server-side rendering (SSR) er en nøkkelfunksjon i Next.js, men det kan også være en ytelsesflaskehals. Å overvåke tiden det tar å gjengi sider på serveren er avgjørende for å sikre en rask brukeropplevelse.

Du kan bruke instrumentering til å måle tiden det tar å utføre getServerSideProps- eller getStaticProps-funksjoner. Disse funksjonene er ansvarlige for å hente data og forberede dem for gjengivelse på serveren.

// 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() {
  // Simulerer henting av data fra et eksternt API
  await new Promise((resolve) => setTimeout(resolve, 50));
  return 'Data from API';
}

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

{data}

; }

I dette eksempelet bruker vi trace-funksjonen til å måle tiden det tar å utføre getServerSideProps-funksjonen. Dette lar oss identifisere ytelsesproblemer i datahentingsprosessen.

3. Spore Ytelsen til API-ruter

Next.js API-ruter lar deg bygge serverløse funksjoner som håndterer API-forespørsler. Å overvåke ytelsen til disse API-rutene er avgjørende for å sikre en responsiv backend.

Du kan bruke instrumentering til å måle tiden det tar å håndtere API-forespørsler i dine API-ruter.

// 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');
  // Simulerer litt arbeid
  await new Promise((resolve) => setTimeout(resolve, 25));
  endTrace();
  res.status(200).json({ name: 'John Doe' })
}

Dette eksempelet måler tiden det tar å håndtere API-forespørselen og returnerer et JSON-svar. Dette hjelper deg med å forstå ytelsen til din backend og identifisere trege API-endepunkter.

4. Overvåke Ytelsen til Edge Runtime

Next.js Edge Runtime lar deg distribuere applikasjonen din til 'the edge', nærmere brukerne dine. Dette kan forbedre ytelsen betydelig, spesielt for globalt distribuerte applikasjoner. Det er imidlertid viktig å overvåke ytelsen til applikasjonen din i Edge Runtime for å sikre at den kjører effektivt.

Instrumentering kan brukes til å overvåke ytelsen til applikasjonen din i Edge Runtime. Dette lar deg identifisere ytelsesproblemer som er spesifikke for Edge Runtime-miljøet.

Viktig merknad: Ikke alle overvåkingsverktøy støtter Edge Runtime. Du må kanskje bruke spesialiserte verktøy eller biblioteker som er designet for Edge Runtime-miljøet.

For eksempel tilbyr Vercel innebygd analyse som kan brukes til å overvåke ytelsen til applikasjonen din i Edge Runtime. Du kan også bruke tredjeparts overvåkingsverktøy som støtter Edge Runtime, som Datadog eller New Relic.

Integrere med APM-systemer

Dataene som samles inn av dine instrumenterings-hooks er mest verdifulle når de sendes til et APM (Application Performance Monitoring)-system. APM-systemer gir verktøy for å visualisere, analysere og varsle om ytelsesdata. Populære APM-systemer inkluderer:

De spesifikke trinnene for å integrere med et APM-system vil variere avhengig av systemet du velger. Imidlertid innebærer den generelle prosessen følgende trinn:

  1. Installer APM-agenten eller SDK-en i din Next.js-applikasjon.
  2. Konfigurer APM-agenten med API-nøkkelen eller legitimasjonen til APM-systemet ditt.
  3. Bruk APM-agentens API til å sende metrikker, sporinger og logger fra dine instrumenterings-hooks.

Eksempel med OpenTelemetry med Datadog:

OpenTelemetry er et open-source observerbarhetsrammeverk som gir en standard måte å samle inn og eksportere telemetridata. Det kan brukes til å integrere med en rekke APM-systemer, inkludert 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;
}

Bruk i `getServerSideProps`:

// pages/index.tsx

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

interface Props {
  data: string;
}

async function fetchData() {
  // Simulerer henting av data fra et eksternt 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}

; }

Dette forenklede OpenTelemetry-eksemplet viser hvordan man kan omslutte en funksjon med en sporings-span. Den faktiske oppsettet og konfigurasjonen av OpenTelemetry SDK og Datadog-agenten er mer involvert og krever flere trinn, inkludert å sette miljøvariabler, konfigurere eksportøren og initialisere SDK-en i din `instrumentation.ts`-fil. Se dokumentasjonen for OpenTelemetry og Datadog for komplette instruksjoner.

Beste Praksis for Next.js Instrumentering

Vanlige Fallgruver og Løsninger

Konklusjon

Next.js-instrumentering gir en kraftig mekanisme for å observere og måle ytelsen til applikasjonen din i produksjon. Ved å implementere applikasjonsovervåkings-hooks kan du få dyp innsikt i forespørselshåndtering, server-side rendering, datahenting og andre kritiske aspekter ved applikasjonens oppførsel. Dette lar deg identifisere flaskehalser, diagnostisere ytelsesproblemer og optimalisere applikasjonen for en bedre brukeropplevelse.

Ved å følge beste praksis som er skissert i denne guiden, kan du effektivt utnytte Next.js-instrumentering for å forbedre ytelsen og påliteligheten til applikasjonene dine, uansett hvor brukerne dine befinner seg. Husk å velge riktig APM-system for dine behov og å kontinuerlig overvåke applikasjonens ytelse for å identifisere og løse problemer proaktivt.

Next.js Instrumentering: Applikasjonsovervåkings-hooks for Produksjonsinnsikt | MLOG