Node.js Monitoring & Observability

Node.js

মনিটরিং এর ভূমিকা

Node.js .

নজরদারির মূল স্তম্ভ

পরিমাপ

সিস্টেমের কর্মক্ষমতা এবং স্বাস্থ্যের সংখ্যাসূচক পরিমাপ

রেকর্ড

কম্পিউটারে ঘটে যাওয়া ঘটনা এবং কার্যকলাপের বিস্তারিত রেকর্ড

ট্রেস

একাধিক পরিষেবার মাধ্যমে অনুরোধের পথ ট্র্যাক করা

মেট্রিক্স, লগ এবং ট্রেস (প্রায়শই "পর্যবেক্ষণের তিনটি স্তম্ভ" বলা হয়) আপনার সিস্টেমের স্বাস্থ্য এবং কর্মক্ষমতা সম্পর্কে ভিন্ন কিন্তু পরিপূরক মতামত প্রদান করে।

ব্যবহারের পরিমাপ সংগ্রহ

প্রমিথিউস ক্লায়েন্ট ব্যবহার করে

মৌলিক পরিমাপের সংগ্রহ

const express = require('express');
const client = require('prom-client');

// Create a Registry to register the metrics
const register = new client.Registry();

// Add a default label which is added to all metrics
register.setDefaultLabels({
  app: 'nodejs-monitoring-demo'
});

// Enable collection of default metrics
client.collectDefaultMetrics({ register });

// Create a custom metric
const httpRequestDurationMicroseconds = new client.Histogram({
  name: 'http_request_duration_seconds',
  help: 'Duration of HTTP requests in seconds',
  labelNames: ['method', 'route', 'code'],
  buckets: [0.1, 0.3, 0.5, 0.7, 1, 3, 5, 7, 10] // buckets for response time
});

const app = express();

// Custom middleware to track request duration
app.use((req, res, next) => {
  const end = httpRequestDurationMicroseconds.startTimer();
  res.on('finish', () => {
    end({ method: req.method, route: req.path, code: res.statusCode });
  });
  next();
});

// Expose metrics endpoint
app.get('/metrics', async (req, res) => {
  res.set('Content-Type', register.contentType);
  res.end(await register.metrics());
});

// Example route
app.get('/', (req, res) => {
  res.send('Hello, Observability!');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

নিরীক্ষণের জন্য মূল মেট্রিক্স

কম্পিউটার পরিমাপ

CPU ব্যবহার
মেমরি ব্যবহার (হিপ এবং আরএসএস)
ইভেন্ট লুপ ব্যাকলগ
আবর্জনা সংগ্রহ
সক্রিয় হ্যান্ডলগুলি/অনুরোধ

ব্যবহারের পরিমাপ

দাবির হার এবং সময়কাল
ত্রুটির হার
ডাটাবেস ক্যোয়ারী কর্মক্ষমতা
ক্যাশে হিট/মিস রেট
ক্রম দৈর্ঘ্য

বিতরণ ট্রেস

ডিস্ট্রিবিউটেড ট্রেসিং একটি মাইক্রোসার্ভিসেস আর্কিটেকচারে একাধিক পরিষেবার মাধ্যমে প্রবাহিত অনুরোধগুলিকে ট্রেস করতে সাহায্য করে৷

ওপেনটেলিমেট্রি সিস্টেম

// Install required packages
// npm install @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-http
// npm install @opentelemetry/exporter-trace-otlp-http

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const { Resource } = require('@opentelemetry/resources');
const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions');

const sdk = new NodeSDK({
  resource: new Resource({
    [SemanticResourceAttributes.SERVICE_NAME]: 'my-service',
    [SemanticResourceAttributes.SERVICE_VERSION]: '1.0.0',
  }),
  traceExporter: new OTLPTraceExporter({
    url: 'http://collector:4318/v1/traces',
  }),
  instrumentations: [getNodeAutoInstrumentations()],
});

sdk.start()
  .then(() => console.log('Tracing initialized'))
  .catch((error) => console.log('Error initializing tracing', error));

নিবন্ধন সেরা অনুশীলন

Pino এর সাথে অন্তর্নির্মিত নিবন্ধন

const pino = require('pino');
const express = require('express');
const pinoHttp = require('pino-http');

const logger = pino({
  level: process.env.LOG_LEVEL || 'info',
  formatters: {
    level: (label) => ({ level: label.toUpperCase() }),
  },
});

const app = express();

// HTTP request logging middleware
app.use(pinoHttp({
  logger,
  customLogLevel: function (res, err) {
    if (res.statusCode >= 400 && res.statusCode < 500) {
      return 'warn';
    } else if (res.statusCode >= 500 || err) {
      return 'error';
    }
    return 'info';
  },
}));

app.get('/', (req, res) => {
  req.log.info('Processing request');
  res.json({ status: 'ok' });
});

app.listen(3000, () => {
  logger.info('Server started on port 3000');
});

রেকর্ড সমৃদ্ধকরণ

// Add context to logs
app.use((req, res, next) => {
  const childLogger = logger.child({
    requestId: req.id,
    userId: req.user?.id || 'anonymous',
    path: req.path,
    method: req.method
  });
  req.log = childLogger;
  next();
});

সতর্কতা এবং ভিজ্যুয়ালাইজেশন

Grafana ড্যাশবোর্ড উদাহরণ

Grafana ড্যাশবোর্ডের সাথে আপনার মেট্রিক্স কল্পনা করুন। সাধারণ পরিমাপের জন্য উদাহরণ প্রশ্ন:

# Node.js Memory Usage (RSS in MB)
process_resident_memory_bytes{job="nodejs"} / 1024 / 1024

# Request Duration (p99 in ms)
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) * 1000

# Error Rate
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))

সতর্কতার নিয়ম (প্রমিথিউস)

groups:
- name: nodejs
  rules:
  - alert: HighErrorRate
    expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
    for: 10m
    labels:
      severity: critical
    annotations:
      summary: "High error rate on {{ $labels.instance }}"

উত্পাদন পর্যবেক্ষণ সরঞ্জাম

খোলা মাধ্যমে

Prometheus + Grafana
Elasticsearch + Fluentd + Kibana (EFK)
Jaeger
Loki

ব্যবসা

Datadog
New Relic
Dynatrace
AppDynamics

ক্লাউড নেটিভ

AWS CloudWatch
Google Cloud Operations
Azure Monitor
OpenTelemetry Collector

সর্বোত্তম অনুশীলন

করণীয়:

  • সামঞ্জস্যপূর্ণ নিদর্শন সহ একটি কাঠামোগত লগ ব্যবহার করুন
  • সিস্টেম এবং ব্যবহার মেট্রিক্স উভয় নিরীক্ষণ
  • এসএলও (পরিষেবা স্তরের উদ্দেশ্য) উপর ভিত্তি করে সতর্কতা সেট করুন।
  • মাইক্রোসার্ভিসের জন্য একটি বিতরণ করা নেটওয়ার্ক ব্যবহার করুন

করবেন না:

  • সংবেদনশীল তথ্য রেকর্ড করবেন না
  • মেট্রিক্সে উচ্চ-কার্ডিনালিটি লেবেল এড়িয়ে চলুন
  • ডিবাগিংয়ের জন্য শুধুমাত্র লগের উপর নির্ভর করবেন না
  • সতর্কতা অবসাদ এড়িয়ে চলুন - কর্মযোগ্য সতর্কতাগুলিতে ফোকাস করুন

অনুশীলন করুন

সঠিক প্যাকেজ নাম নির্বাচন করুন.

The ______ package is commonly used for logging in Node.js applications.

express
✗ ভুল! "এক্সপ্রেস" হল একটি ওয়েব ফ্রেমওয়ার্ক যা ওয়েব অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়, রেজিস্ট্রি লাইব্রেরি নয়
mongoose
✗ ভুল! "mongoose" হল MongoDB-এর জন্য একটি ODM লাইব্রেরি, লগিং লাইব্রেরি নয়৷
pino
✓ ঠিক আছে! "পিনো" হল একটি লগিং লাইব্রেরি যা সাধারণত Node.js অ্যাপ্লিকেশনে এর উচ্চ কার্যক্ষমতা এবং বিল্ট-ইন লগিং ক্ষমতার জন্য ব্যবহৃত হয়
axios
✗ ভুল! "axios" হল একটি লাইব্রেরি যা HTTP অনুরোধ করতে ব্যবহৃত হয়, লগিং লাইব্রেরি নয়