Bahasa Indonesia

Manfaatkan kekuatan instrumentasi Next.js untuk mendapatkan wawasan mendalam tentang performa aplikasi Anda, mengidentifikasi hambatan, dan mengoptimalkan pengalaman pengguna. Pelajari cara mengimplementasikan hook pemantauan aplikasi secara efektif.

Instrumentasi Next.js: Hook Pemantauan Aplikasi untuk Wawasan Produksi

Instrumentasi Next.js menyediakan mekanisme yang kuat untuk mengamati dan mengukur performa aplikasi Anda di lingkungan produksi. Dengan memanfaatkan hook pemantauan aplikasi, Anda dapat memperoleh wawasan mendalam tentang penanganan permintaan, rendering sisi server, pengambilan data, dan aspek-aspek penting lainnya dari perilaku aplikasi Anda. Hal ini memungkinkan Anda untuk mengidentifikasi hambatan, mendiagnosis masalah performa, dan mengoptimalkan aplikasi Anda untuk pengalaman pengguna yang lebih baik. Ini sangat penting saat men-deploy aplikasi Next.js secara global, di mana latensi jaringan dan pengguna yang tersebar secara geografis dapat menimbulkan tantangan unik.

Memahami Instrumentasi Next.js

Fitur instrumentasi di Next.js memungkinkan Anda untuk mendaftarkan hook yang dieksekusi pada berbagai tahap siklus hidup aplikasi. Hook ini dapat digunakan untuk mengumpulkan metrik, jejak (traces), dan log, yang kemudian dapat dikirim ke sistem Application Performance Monitoring (APM) atau alat observabilitas lainnya. Ini memberikan pandangan komprehensif tentang performa aplikasi Anda secara real-time.

Berbeda dengan pemantauan sisi klien tradisional yang hanya menangkap pengalaman peramban, instrumentasi Next.js menyediakan observabilitas sisi klien dan sisi server, memungkinkan pandangan tumpukan penuh (full-stack) dari performa aplikasi Anda. Ini sangat penting untuk memahami dampak rendering sisi server, rute API, dan pengambilan data terhadap pengalaman pengguna secara keseluruhan.

Manfaat Utama Instrumentasi

Menyiapkan Instrumentasi di Next.js

Untuk mengaktifkan instrumentasi di aplikasi Next.js Anda, Anda perlu membuat file instrumentation.js (atau instrumentation.ts) di direktori root proyek Anda. File ini akan berisi hook yang ingin Anda daftarkan.

Berikut adalah contoh dasar file instrumentation.ts:

// instrumentation.ts

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

    trace('registering-tracing');
  }
}

Dalam contoh ini, kita mengimpor fungsi trace dari file ./utils/tracing dan memanggilnya di dalam fungsi register. Fungsi register secara otomatis dipanggil oleh Next.js saat aplikasi dimulai.

Eksekusi Kondisional Berdasarkan Runtime

Variabel process.env.NEXT_RUNTIME sangat penting untuk menentukan konteks eksekusi. Ini memungkinkan Anda untuk menjalankan kode secara kondisional berdasarkan apakah aplikasi berjalan di lingkungan Node.js (untuk rendering sisi server, rute API, dll.) atau di lingkungan Edge Runtime (untuk fungsi edge). Ini penting karena beberapa pustaka atau alat pemantauan mungkin hanya kompatibel dengan salah satu runtime atau yang lainnya.

Misalnya, Anda mungkin ingin menggunakan agen APM tertentu untuk lingkungan Node.js dan alat yang berbeda untuk lingkungan Edge Runtime. Menggunakan process.env.NEXT_RUNTIME memungkinkan Anda untuk memuat modul yang sesuai hanya saat diperlukan.

Mengimplementasikan Hook Pemantauan Aplikasi

Sekarang, mari kita lihat beberapa contoh cara mengimplementasikan hook pemantauan aplikasi di Next.js.

1. Mengukur Waktu Penanganan Permintaan

Salah satu kasus penggunaan umum untuk instrumentasi adalah mengukur waktu yang dibutuhkan untuk menangani permintaan masuk. Ini dapat membantu Anda mengidentifikasi endpoint yang lambat dan mengoptimalkan performanya.

Berikut adalah contoh cara mengukur waktu penanganan permintaan menggunakan 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`);
    // Dalam aplikasi nyata, Anda akan mengirim data ini ke sistem APM.
  };
}

Di dalam 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');

    // Mensimulasikan penanganan permintaan
    await new Promise((resolve) => setTimeout(resolve, 100));

    endTrace();
  }
}

Contoh ini mengukur waktu yang dibutuhkan untuk menangani permintaan dan mencatat durasinya ke konsol. Dalam aplikasi nyata, Anda akan mengirim data ini ke sistem APM untuk analisis lebih lanjut.

2. Memantau Waktu Rendering Sisi Server

Rendering sisi server (SSR) adalah fitur utama dari Next.js, tetapi juga bisa menjadi hambatan performa. Memantau waktu yang dibutuhkan untuk me-render halaman di server sangat penting untuk memastikan pengalaman pengguna yang cepat.

Anda dapat menggunakan instrumentasi untuk mengukur waktu yang dibutuhkan untuk mengeksekusi fungsi getServerSideProps atau getStaticProps. Fungsi-fungsi ini bertanggung jawab untuk mengambil data dan menyiapkannya untuk di-render di server.

// 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() {
  // Mensimulasikan pengambilan data dari API eksternal
  await new Promise((resolve) => setTimeout(resolve, 50));
  return 'Data from API';
}

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

{data}

; }

Dalam contoh ini, kita menggunakan fungsi trace untuk mengukur waktu yang dibutuhkan untuk mengeksekusi fungsi getServerSideProps. Ini memungkinkan kita untuk mengidentifikasi masalah performa dalam proses pengambilan data.

3. Melacak Performa Rute API

Rute API Next.js memungkinkan Anda membangun fungsi serverless yang menangani permintaan API. Memantau performa rute API ini penting untuk memastikan backend yang responsif.

Anda dapat menggunakan instrumentasi untuk mengukur waktu yang dibutuhkan untuk menangani permintaan API di rute API Anda.

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

Contoh ini mengukur waktu yang dibutuhkan untuk menangani permintaan API dan mengembalikan respons JSON. Ini membantu Anda memahami performa backend Anda dan mengidentifikasi endpoint API yang lambat.

4. Memantau Performa Edge Runtime

Next.js Edge Runtime memungkinkan Anda men-deploy aplikasi Anda ke edge, lebih dekat dengan pengguna Anda. Ini dapat secara signifikan meningkatkan performa, terutama untuk aplikasi yang didistribusikan secara global. Namun, penting untuk memantau performa aplikasi Anda di Edge Runtime untuk memastikan bahwa aplikasi berjalan secara efisien.

Instrumentasi dapat digunakan untuk memantau performa aplikasi Anda di Edge Runtime. Ini memungkinkan Anda untuk mengidentifikasi masalah performa yang spesifik untuk lingkungan Edge Runtime.

Catatan Penting: Tidak semua alat pemantauan mendukung Edge Runtime. Anda mungkin perlu menggunakan alat atau pustaka khusus yang dirancang untuk lingkungan Edge Runtime.

Misalnya, Vercel menyediakan analitik bawaan yang dapat digunakan untuk memantau performa aplikasi Anda di Edge Runtime. Anda juga dapat menggunakan alat pemantauan pihak ketiga yang mendukung Edge Runtime, seperti Datadog atau New Relic.

Integrasi dengan Sistem APM

Data yang dikumpulkan oleh hook instrumentasi Anda akan paling berharga saat dikirim ke sistem APM (Application Performance Monitoring). Sistem APM menyediakan alat untuk memvisualisasikan, menganalisis, dan memberikan peringatan tentang data performa. Sistem APM populer meliputi:

Langkah-langkah spesifik untuk berintegrasi dengan sistem APM akan bervariasi tergantung pada sistem yang Anda pilih. Namun, proses umumnya melibatkan langkah-langkah berikut:

  1. Instal agen atau SDK APM di aplikasi Next.js Anda.
  2. Konfigurasikan agen APM dengan kunci API atau kredensial sistem APM Anda.
  3. Gunakan API agen APM untuk mengirim metrik, jejak, dan log dari hook instrumentasi Anda.

Contoh menggunakan OpenTelemetry dengan Datadog:

OpenTelemetry adalah kerangka kerja observabilitas sumber terbuka yang menyediakan cara standar untuk mengumpulkan dan mengekspor data telemetri. Ini dapat digunakan untuk berintegrasi dengan berbagai sistem APM, termasuk 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;
}

Penggunaan di dalam `getServerSideProps`:

// pages/index.tsx

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

interface Props {
  data: string;
}

async function fetchData() {
  // Mensimulasikan pengambilan data dari API eksternal
  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}

; }

Contoh OpenTelemetry yang disederhanakan ini menunjukkan cara membungkus sebuah fungsi dengan span pelacakan. Penyiapan dan konfigurasi SDK OpenTelemetry dan agen Datadog yang sebenarnya lebih rumit dan memerlukan langkah-langkah tambahan, termasuk mengatur variabel lingkungan, mengonfigurasi pengekspor, dan menginisialisasi SDK di file `instrumentation.ts` Anda. Lihat dokumentasi OpenTelemetry dan Datadog untuk instruksi lengkap.

Praktik Terbaik untuk Instrumentasi Next.js

Kesalahan Umum dan Solusinya

Kesimpulan

Instrumentasi Next.js menyediakan mekanisme yang kuat untuk mengamati dan mengukur performa aplikasi Anda di lingkungan produksi. Dengan mengimplementasikan hook pemantauan aplikasi, Anda dapat memperoleh wawasan mendalam tentang penanganan permintaan, rendering sisi server, pengambilan data, dan aspek-aspek penting lainnya dari perilaku aplikasi Anda. Hal ini memungkinkan Anda untuk mengidentifikasi hambatan, mendiagnosis masalah performa, dan mengoptimalkan aplikasi Anda untuk pengalaman pengguna yang lebih baik.

Dengan mengikuti praktik terbaik yang diuraikan dalam panduan ini, Anda dapat secara efektif memanfaatkan instrumentasi Next.js untuk meningkatkan performa dan keandalan aplikasi Anda, di mana pun lokasi pengguna Anda. Ingatlah untuk memilih sistem APM yang tepat untuk kebutuhan Anda dan untuk terus memantau performa aplikasi Anda untuk mengidentifikasi dan mengatasi masalah secara proaktif.