Monitoring va kuzatuv


ULASHISH

Kuzatish qobiliyatiga kirish

Node.js ilovalarida kuzatuvchanlik tizim xatti-harakatlarini tushunish uchun ko‘rsatkichlar va jurnallarni to‘plash va tahlil qilishni o‘z ichiga oladi.

Kuzatilishi mumkin bo‘lgan asosiy ustunlar: Ko‘rsatkichlar, jurnallar va izlar (ko‘pincha "kuzatishning uchta ustuni" deb ataladi) tizimingizning sog‘lig‘i va ishlashi haqida turli xil, ammo bir-birini to‘ldiradigan ko‘rinishlarni beradi.


Ilova ko‘rsatkichlari to‘plami

Prometey mijozidan foydalanish

Asosiy ko‘rsatkichlar to‘plami

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}`);
});

Monitoring uchun asosiy ko‘rsatkichlar

Tizim ko‘rsatkichlari

  • CPU foydalanish
  • Xotiradan foydalanish (uyma va RSS)
  • Voqea davrining kechikishi
  • Axlat yig‘ish
  • Faol tutqichlar/so‘rovlar

Ilova ko‘rsatkichlari

  • So‘rov darajasi va muddati
  • Xato stavkalari
  • Ma’lumotlar bazasi so‘rovining ishlashi
  • Kesh urish/Miss nisbatlari
  • Navbat uzunligi


Tarqalgan kuzatuv

Taqsimlangan kuzatuv so‘rovlarni mikroservislar arxitekturasida bir nechta xizmatlar orqali o‘tayotganda kuzatishga yordam beradi.

OpenTelemetry sozlash

// 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));

Eng yaxshi amaliyotlar jurnali

Pino bilan tizimlashtirilgan jurnallar

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

Jurnalni boyitish

// 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();
});

Ogohlantirish va vizualizatsiya

Grafana boshqaruv paneliga misol

Grafana boshqaruv paneli yordamida o‘lchovlaringizni tasavvur qiling. Umumiy ko‘rsatkichlar uchun misol so‘rovlari:

# 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]))

Ogohlantirish qoidalari (Prometheus)

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 }}"

Ishlab chiqarish monitoringi vositalari

Ochiq manba

  • Prometey + Grafana
  • Elasticsearch + Fluentd + Kibana (EFK)
  • Jaeger
  • Loki

Tijorat

  • Datadog
  • Yangi qoldiq
  • Dynatrace
  • AppDynamics

Bulutga moslashgan (Cloud Native) yondashuv

  • AWS CloudWatch
  • Google Cloud Operations
  • Azure Monitor
  • OpenTelemetry kollektori

Eng yaxshi amaliyotlar

Qilish

  • Izchil formatlar bilan tuzilgan jurnallardan foydalaning
  • Tizim va dastur ko‘rsatkichlarini kuzatib boring
  • SLO’lar (Service Level Objectives, xizmat darajasi maqsadlari) asosida ogohlantirishlarni sozlang
  • Mikroservislar uchun taqsimlangan kuzatuvdan foydalaning

Qilmasligi kerak

  • Maxfiy ma’lumotlarni jurnalga kiritmang
  • Ko‘rsatkichlarda yuqori kardinallik belgilaridan saqlaning
  • Nosozliklarni tuzatish uchun faqat jurnallarga tayanmang
  • Ogohlantiruvchi charchoqdan saqlaning - harakat qilish mumkin bo‘lgan ogohlantirishlarga e’tibor qarating



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!