tutorial

118 Middleware Resolver untuk Logging dan Monitoring

118 Middleware Resolver untuk Logging dan Monitoring

Middleware telah menjadi tulang punggung dari ekosistem web modern, terutama pada aplikasi dengan arsitektur microservices atau monolith yang kompleks. Salah satu pendekatan powerful dalam dunia Node.js API development adalah penggunaan middleware resolver di dalam pengelolaan logging dan monitoring. Di artikel ini, saya akan membahas secara mendalam penerapan middleware resolver nomor 118, sebuah pola yang saya temukan sangat efektif dalam build logging dan monitoring pipeline. Kita juga akan membahas contoh implementasi, simulasi, dan analisis kinerja berdasarkan pengalaman di dunia nyata.


Apa Itu Middleware Resolver?

Middleware resolver adalah sebuah fungsi atau serangkaian fungsi yang menjalankan proses tertentu (seperti logging, authentication, monitoring, dsb.) sebelum atau sesudah request utama diproses oleh server. Konsep ini sangat sering digunakan di framework seperti Express.js, Koa, bahkan di GraphQL middleware.

Keunggulan middleware resolver adalah kemudahan dalam mengelola cross-cutting concerns seperti logging dan monitoring, tanpa perlu mengotori business logic utama. Kita cukup menempelkan resolver pada route atau endpoint tertentu dan segala logika terkait logging akan berjalan otomatis.


Logging dan Monitoring: Kenapa Penting?

Sebelum kita diving ke middleware-nya, mari kita ingatkan diri sendiri: kenapa kita peduli soal logging dan monitoring?

  • Logging: Bantu debug, audit, dan trace request/response flow.
  • Monitoring: Deteksi masalah lebih awal, insight performa, dan upaya scaling yang presisi.

Pada kasus nyata, logging yang baik mampu menurunkan waktu downtime dan lebih banyak “insiden kecil” bisa didiagnosis sebelum menjadi krisis besar.


Middleware Resolver #118: Pola yang Praktis

Ketika sampai di angka ratusan resolvers, saya menyadari pattern khusus pada resolver ke-118 yang saya gunakan di beberapa project angular backend dan Node.js. Pola ini:

  • Memisahkan logging request/response secara detail.
  • Menghitung waktu proses tiap request (performance monitoring).
  • Flexible: bisa plug ke berbagai stack (Express, Koa, Fastify, dsb).
  • Suport optional telemetry push ke services eksternal seperti Datadog atau Grafana.

Mari lihat diagram flow middleware logging ini.

flowchart LR
    A[Incoming Request] --> B[Middleware #118]
    B --> C{Logging Mode?}
    C --Yes--> D[Log Request]
    C --No--> E[Skip Logging]
    D --> F[Start Timer]
    E --> F
    F --> G[Process Handler]
    G --> H[Stop Timer & Log Response]
    H --> I[Push Metric to Monitoring]
    I --> J[Send Response]

Contoh Implementasi di Express.js

Berikut adalah contoh middleware resolver #118 untuk logging dan monitoring. Inti kodenya sederhana namun powerful.

const fs = require('fs');
const path = require('path');

function middleware118(options = {}) {
  return function (req, res, next) {
    const {
      logRequest = true,
      logResponse = true,
      monitorTime = true,
      telemetryPush = false
    } = options;
    const startTime = Date.now();

    if (logRequest) {
      console.log(`[REQ] ${req.method} ${req.url} @ ${new Date().toISOString()}`);
    }

    // Simulasi push ke monitoring eksternal
    function pushTelemetry(durationMs) {
      if (telemetryPush) {
        // Contoh push ke file sebagai dummy
        fs.appendFileSync(
          path.join(__dirname, "metrics.log"),
          `endpoint=${req.url},duration=${durationMs}ms\n`
        );
      }
    }

    // Listen response end
    res.on('finish', () => {
      const duration = Date.now() - startTime;
      if (logResponse) {
        console.log(
          `[RES] ${req.method} ${req.url} -> ${res.statusCode} in ${duration}ms`
        );
      }

      // Monitoring
      if (monitorTime) {
        pushTelemetry(duration);
      }
    });

    next();
  };
}

// Penggunaan pada Express
const express = require('express');
const app = express();

app.use(middleware118({ logRequest: true, telemetryPush: true }));

app.get('/hello', (req, res) => {
  setTimeout(() => {
    res.json({ message: "World!", time: Date.now() });
  }, Math.floor(Math.random() * 150));
});

app.listen(3000, () => {
  console.log('Server running at http://localhost:3000');
});

Simulasi dan Analisis

Mari kita lakukan simulasi 3 request ke endpoint /hello.

RequestResponse Time (ms)StatusLog RequestLog ResponseTelemetry Push
#152200YaYaYa
#2101200YaYaYa
#337200YaYaYa

Pada setiap request, berikut output yang akan muncul di console:

[REQ] GET /hello @ 2024-06-15T08:00:00.000Z
[RES] GET /hello -> 200 in 52ms
[REQ] GET /hello @ 2024-06-15T08:00:01.000Z
[RES] GET /hello -> 200 in 101ms
[REQ] GET /hello @ 2024-06-15T08:00:02.000Z
[RES] GET /hello -> 200 in 37ms

Dan file metrics.log akan berisi:

endpoint=/hello,duration=52ms
endpoint=/hello,duration=101ms
endpoint=/hello,duration=37ms

Tabel Fitur Middleware #118

FiturKeteranganKustomisasi
Log RequestMencatat metode, endpoint, dan waktu request masukYa
Log ResponseLog status dan response timeYa
Performance TimerHitung waktu proses tiap endpointYa
Telemetry PushSimpan metric ke file/log/monitoring serviceYa
Plug & PlayCocok untuk Express, Koa, Fastify, GraphQLYa

Kesimpulan

Middleware resolver #118 adalah salah satu pattern yang menurut saya wajib dimiliki di project Node.js modern, terutama ketika kebutuhan observability dan audit semakin meningkat. Dengan pattern ini, implementasi logging dan monitoring menjadi lebih rapi, fleksibel, dan scalable tanpa menambah kerumitan di core API.

Beberapa tips dari penggunaan di proyek nyata:

  • Pastikan middleware di-load sebelum route utama untuk comprehensive logging.
  • Jangan lupa untuk disabling telemetry push pada environment development.
  • Expand middleware dengan traceID untuk distributed tracing (jika butuh).

Jangan ragu melakukan fork dan modifikasi middleware ini untuk kebutuhan tim dan project kamu. Selamat bereksperimen, semoga observability aplikasi kamu naik satu level lagi!


comments powered by Disqus