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.
| Hansı suala cavab verir | Nədir | Qiyməti | |
|---|---|---|---|
| Loglar | dəqiq nə baş verdi? | təfərrüatlı hadisələr | çox yer; baha axtarış |
| Metriklər | nə qədər və nə sürətlə? | zamanla ədədlər | ucuz, amma təfərrüatsız |
| Trace-lər | vaxt harada itdi? | bir sorğunun yolu | tə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.
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):