Gecə saat üçdür: istifadəçilər Prowid Photos lentinin yavaş olduğunu yazırlar. Dashboard prosessorun normal olduğunu və serverlərin sağ olduğunu göstərir. Səbəbi harada axtarmalı? Müşahidə imkanı (observability) — sistemin kənara verdiyi siqnallara görə içəridə nə baş verdiyini anlamaq bacarığıdır. Bu dərsdə üç siqnal növünü — logları, metrikləri və trace-ləri, RED və USE metodlarını, SLI, SLO hədəflərini və xəta büdcəsini öyrənəcək, həmçinin yerində oyadan alertlər qurmağı mənimsəyəcəyik.

Observability nə üçün lazımdır

Monitorinq əvvəlcədən fikirləşdiyiniz suallara cavab verir: «prosessor 80%-dən yüksəkdirmi?». Observability isə ağlınıza gəlməyən sualı verməyə imkan yaradır: «niyə lent yalnız Bakıdan olan istifadəçilər üçün və yalnız axşam saatlarında yavaşdır?». Bir neçə servisə keçəndən sonra (əvvəlki dərslər) bu həyati vacibdir: bir sorğu beş prosesdən keçir və «server loglarına baxmaq» artıq işləmir.

Bənzətmə — həkim. Metriklər temperatur və təzyiqdir: xəstədə nəsə düz olmadığı tez görünür. Trace-lər şəkildir: problemin hansı orqanda olduğunu göstərir. Loglar xəstəlik tarixçəsidir: dəqiq nə və nə vaxt baş verib.

Loglar, metriklər və trace-lər tətbiqdən Grafana-ya gedir və bir id ilə bağlanır
Loglar, metriklər və trace-lər tətbiqdən Grafana-ya gedir və bir id ilə bağlanır
Hansı suala cavab verirNədirQiyməti
Loglardəqiq nə baş verdi?təfərrüatlı hadisələrçox yer; baha axtarış
Metriklərnə qədər və nə sürətlə?zamanla ədədlərucuz, amma təfərrüatsız
Trace-lərvaxt harada itdi?bir sorğunun yolutəfərrüatlıdır, ona görə seçmə götürürlər

Tipik araşdırma: metrik lent p95-nin 300 ms-dən 900 ms-ə qalxdığını göstərdi (simptom); yavaş sorğunun trace-i bildirişlər çağırışına işarə etdi (yer); həmin çağırışın logu səbəbi izah etdi.

Loglar: strukturlu və id ilə

console.log('error ' + err) sətrini insan oxuyur, axtarış isə yox: bir istifadəçinin bir saatdakı bütün xətalarını tapmağa çalışın. Strukturlu log — süzgəcdən keçirə biləcəyiniz sahələri olan JSON-dur. Səviyyələr (debug, info, warn, error) production-da yalnız vacibi yazmağa imkan verir. pino kitabxanası (onunla Next.js-də loglama dərsində tanış olmusunuz) hər sətirdə bir JSON obyekti yazır.

Əsas tapıntı — correlation id (sorğu id-si): bu sorğunun hər log sətrinə düşən, digər servislərə x-request-id başlığında ötürülən və müştəriyə qaytarılan unikal identifikator. İndi bir id ilə sorğunun tarixçəsini bütün servislərdən yığa bilərsiniz.

js
import pino from 'pino';
import { randomUUID } from 'node:crypto';

export const logger = pino({
  level: process.env.LOG_LEVEL ?? 'info',
  base: { service: 'prowid-api' },
  redact: ['req.headers.authorization', 'password'], // never log secrets
});

export function requestId(req, res, next) {
  const id = req.get('x-request-id') ?? randomUUID(); // reuse the caller's id
  req.log = logger.child({ requestId: id }); // every line carries the id
  res.set('x-request-id', id); // the client can quote it in a bug report
  const started = Date.now();
  res.on('finish', () => {
    const ms = Date.now() - started;
    req.log.info({ status: res.statusCode, ms }, 'request done');
  });
  next();
}

Log sətri belə olacaq (pino susmaya görə səviyyəni ədədlə yazır: 30 — info-dur):