10.9-bob: Monitoring va logging — Prometheus, Grafana, Sentry
10-QISM — DevOps va Deploy · 9-mavzu
1. Kirish va motivatsiya
10-QISM'da kodimizni real dunyoga chiqardik: Linux serverga joyladik 10.1-bob, Nginx ortiga qo'ydik 10.2-bob, Docker'ga o'radik 10.3-bob, CI/CD bilan avtomatik deploy qildik 10.5-bob, Kubernetes'da bir necha nusxada ishlatdik 10.8-bob. Endi ilovamiz production'da ishlayapti — minglab foydalanuvchi unga kirayapti. Lekin bir savol qoladi, va u eng muhimi: u qanday ishlayapti? Tez javob berayaptimi, yoki sekinlashganmi? Xato bo'lyaptimi, qaysi endpoint'da? RAM tugayaptimi? Soat 3da uxlab yotganingda server yiqilsa — kim aytadi? Kodni yozish va deploy qilish — yarmi; uni ko'rish va boshqarish — ikkinchi yarmi. Bu — observability (kuzatuvchanlik): tizimning ichida nima bo'layotganini tashqaridan ko'ra olish qobiliyati.
Bu farq junior bilan senior o'rtasidagi eng aniq chiziq. Junior "deploy qildim, ishladi" deydi va yopadi. Senior "deploy qildim, dashboard'da latency, error rate, traffic ko'rsatkichlarini kuzatyapman, alert qo'ydim — agar p99 latency 500ms'dan oshsa, Telegram'ga xabar keladi, Sentry har xatoni stack-trace bilan tutadi" deydi. Production'ni ko'rmasdan boshqarish — qorong'i xonada mashina haydashga o'xshaydi: erta yoki kech devorga urilasiz. Bu bob sizning "ko'zlaringizni" yoqadi.
Bu bobda uchta industriya standartini o'rganamiz: Prometheus (metrikalarni yig'uvchi va saqlovchi — vaqt qatori bazasi, PromQL so'rov tili), Grafana (o'sha metrikalarni chiroyli dashboard'da ko'rsatuvchi vizualizatsiya), va Sentry (xatolarni real vaqtda tutuvchi error tracking). Yana: structured logging (5.12 Winston/Pino davomi), log agregatsiya (Loki/ELK), alerting (qachon xabar berish), golden signals va SLI/SLO/SLA tushunchalari, distributed tracing (OpenTelemetry). Bular birgalikda — observability stack'ning markaziy yadrosi.
O'xshatish: Monitoring tizimi — mashinaning pribor paneli va bemor monitori. Mashina haydaganingda old oynaga qaraysiz (ilova ishlayaptimi), lekin pribor paneli sizga ko'rinmaydigan haqiqatni aytadi: tezlik (latency), yoqilg'i (resurs), dvigatel harorati (CPU/RAM), va eng muhimi — ogohlantirish chiroqlari (alert: "moy bosimi past!"). Pribor panelsiz mashina — ko'r-ko'rona. Prometheus — datchiklar (har joydan o'lchov olib turadi). Grafana — pribor paneli ekrani (o'lchovlarni chiroyli ko'rsatadi). Sentry — "Check Engine" chirog'i (xato bo'lsa darrov yonadi, qayerda ekanini aytadi). Alert — ogohlantirish ovozi (siz qaramasangiz ham, o'zi chaqiradi). Kasalxonada bemor monitori ham xuddi shunday: yurak urishi, bosim, kislorod — doim chiziqlar, og'ish bo'lsa signal. Server ham — "bemoring", siz — "shifokori".
Nega muhim?
- Ko'rinmasa — boshqarib bo'lmaydi — muammoni o'lchamasangiz, hal qila olmaysiz (sezgi emas, raqam).
- Tezroq tuzatish — alert + log + trace = muammo daqiqalarda topiladi (soatlar emas).
- Ishonchlilik 9.6-bob — SLO/SLA, uptime, downtime kamaytirish — biznes talabi.
- Intervyu/senior — "production'ni qanday monitor qilasiz?" — DevOps/SRE ning markaziy savoli.
2. Nazariya — chuqur tushuntirish
2.1. Observability nima (3 ustun: metrics, logs, traces)
OBSERVABILITY (kuzatuvchanlik) — tizim ICHIDAGI holatni
TASHQI signallardan tushunish (qutini ochmasdan bilish):
3 USTUN (three pillars of observability):
1. METRICS (metrikalar) — RAQAMLI vaqt qatori (time-series):
"so'ngi 1 daqiqada 1200 so'rov, p99 latency 240ms, RAM 60%"
ARZON, ixcham, trend ko'rsatadi (NIMA bo'lyapti?)
2. LOGS (loglar) — diskret HODISALAR yozuvi (matn/JSON):
"2026-06-22 10:03 ERROR user 42 login failed: bad password"
BATAFSIL, kontekst (NEGA bo'ldi?)
3. TRACES (izlar) — bitta so'rovning XIZMATLAR bo'ylab yo'li:
"so'rov API Gateway (5ms) Auth (20ms) DB (180ms) sekin!"
BOG'LIQLIK, qaysi bo'lak sekin (QAYERDA bo'ldi?)
Monitoring = "men nimani kuzatishni BILAMAN" (oldindan)
Observability = "BILMAGAN savolga ham javob topa olaman"Observability (kuzatuvchanlik) — tizim ichidagi holatni uning tashqi chiqishlaridan tushunish (qutini ochmasdan, ichida nima bo'layotganini bilish). Uch ustun (three pillars): metrics (raqamli vaqt qatori — "1200 so'rov, latency 240ms" — arzon, trend, nima bo'lyapti), logs (diskret hodisalar yozuvi — "ERROR login failed" — batafsil, nega), traces (bitta so'rovning xizmatlar bo'ylab yo'li — "DB 180ms sekin" — qayerda). Nozik farq: monitoring — oldindan bilgan narsangni kuzatish (dashboard, alert); observability — oldindan bilmagan savolga ham javob topa olish (debug). Metrics — masala borligini aytadi; logs/traces — sababini topadi. Uchalasi birga = to'liq ko'rinish.
2.2. Monitoring nima va nega kerak
MONITORING — tizim holatini DOIMIY o'lchash + og'ish bo'lsa OGOHLANTIRISH:
NEGA KERAK (production haqiqati):
Muammoni FOYDALANUVCHIDAN OLDIN bilish (alert, sezgi emas)
Trend ko'rish (RAM asta-sekin o'syaptimi? — memory leak)
Tezroq tuzatish (qachon, qayerda buzildi — log/trace)
Sig'im rejalashtirish (qachon server qo'shish kerak — capacity)
SLO/SLA bajarish (99.9% uptime — biznes va'dasi)
MTTR (Mean Time To Recovery — tiklash o'rtacha vaqti):
- Monitoringsiz: foydalanuvchi shikoyat qiladi 1 soat qidirasan
- Monitoring bilan: alert keladi log/trace 5 daqiqada tuzatasan
Maqsad — "ma'lumot yig'ish" emas, MTTR'ni kamaytirish + ishonchlilikMonitoring — tizim holatini doimiy o'lchash va belgilangan chegaradan og'ish bo'lsa ogohlantirish. Nega kerak: muammoni foydalanuvchidan oldin bilish (alert keladi — sezgiga tayanmaysiz), trend ko'rish (RAM asta o'syaptimi — memory leak belgisi), tezroq tuzatish, sig'im rejalashtirish (qachon server qo'shish), va SLO/SLA bajarish. Asosiy ko'rsatkich — MTTR (Mean Time To Recovery — buzilishdan tiklanishgacha o'rtacha vaqt): monitoringsiz foydalanuvchi shikoyat qilguncha bilmaysiz, keyin soatlab qidirasiz; monitoring bilan alert + log + trace = daqiqalarda. Maqsad shunchaki "ma'lumot yig'ish" emas — MTTR'ni kamaytirish va ishonchlilikni oshirish 9.6-bob.
2.3. Metric turlari (counter, gauge, histogram, summary)
METRIC — vaqt bo'yicha o'lchanadigan RAQAM (time-series: vaqt + qiymat):
1. COUNTER (hisoblagich) — faqat O'SADI (nol'ga reset bo'ladi restart'da):
http_requests_total, errors_total, jobs_completed_total
"jami nechta?" (so'rov, xato, tugagan vazifa)
qiymatning O'ZI emas, o'sish TEZLIGI muhim rate()
2. GAUGE (o'lchagich) — UP/DOWN (ixtiyoriy o'zgaradi):
memory_usage_bytes, active_connections, queue_size, temperature
"hozir nechta?" (joriy qiymat — RAM, ulanish soni)
3. HISTOGRAM (taqsimot) — qiymatlarni BUCKET'larga sanaydi:
http_request_duration: <0.1s, <0.5s, <1s, <5s ... + sum + count
"taqsimot qanday?" p50/p95/p99 (server tomonda hisoblanadi)
4. SUMMARY (xulosa) — quantile'ni MIJOZ tomonda hisoblaydi (sliding window):
histogram'ga o'xshash, lekin quantile client'da (agregatsiya qiyin)
ko'pincha HISTOGRAM afzal (Prometheus tomonda quantile)
p99 latency = "so'rovlarning 99% shu vaqtdan TEZ" (eng muhim ko'rsatkich)Metric — vaqt bo'yicha o'lchanadigan raqam (time-series — vaqt belgisi + qiymat juftliklari). To'rt tur (rasmiy Prometheus): counter (hisoblagich — faqat o'sadi, restart'da nol'ga —
http_requests_total,errors_total; qiymatning o'zi emas, o'sish tezligi muhimrate()); gauge (o'lchagich — up/down ixtiyoriy —memory_usage,active_connections; joriy qiymat); histogram (taqsimot — qiymatlarni bucket'larga sanaydi:<0.1s, <0.5s, <1s+ sum + count; undan p50/p95/p99 server tomonda hisoblanadi); summary (xulosa — histogram'ga o'xshash, lekin quantile'ni mijoz tomonda sliding window'da hisoblaydi — agregatsiya qiyin, shuning uchun ko'pincha histogram afzal). p99 latency = "so'rovlarning 99% shu vaqtdan tez" — o'rtacha (average)dan muhimroq, chunki sekin "dum"ni ko'rsatadi (1% sekin foydalanuvchini ham seza olasiz).
2.4. Prometheus arxitekturasi (pull model — scrape)
PROMETHEUS — ochiq kodli metrika tizimi (CNCF, 2012, sanoat standarti):
PULL MODEL (tortib olish — push EMAS):
Prometheus HAR X soniyada ilovaga GET /metrics yuboradi (scrape):
┌──────────────┐ GET /metrics ┌──────────────────────┐
│ Ilova │ ◄──── 15s ─────── │ PROMETHEUS SERVER │
│ /metrics │ ──── matn ──────► │ - scrape (yig'ish) │
│ (prom-client)│ javob qaytaradi │ - TSDB (saqlash) │
└──────────────┘ │ - PromQL (so'rov) │
│ - alert qoidalar │
┌──────────────┐ └──────┬───────────────┘
│ EXPORTER │ ◄──── scrape ─────────────┘
│ (DB/Node/OS) │ (ilova o'zi metrika bermasa — exporter)
└──────────────┘
KOMPONENTLAR:
- SCRAPE — Prometheus targetlardan metrika TORTIB oladi (interval)
- EXPORTER — metrika bermaydigan tizim uchun "tarjimon" (node_exporter, postgres_exporter)
- TSDB — Time-Series DataBase (metrikani vaqt bo'yicha saqlaydi)
- PromQL — Prometheus Query Language (metrikadan so'rov: rate, sum, avg)
PULL afzalligi: Prometheus target RO'YXATini biladi "target down" ni
o'zi sezadi (push'da yiqilgan ilova xabar bermaydi — bilmay qolasan)Prometheus — ochiq kodli metrika va alert tizimi (CNCF loyihasi, 2012, sanoat de-facto standarti). Asosiy g'oya — pull model (push emas): Prometheus har belgilangan oraliqda (masalan 15s) har bir target'ga
GET /metricsso'rov yuboradi va metrikani tortib oladi (scrape). Komponentlar: scrape (yig'ish jarayoni), exporter (o'zi metrika bermaydigan tizim — DB, OS — uchun "tarjimon":node_exporterserver resurslari,postgres_exporterDB metrikasi), TSDB (Time-Series DataBase — metrikani vaqt bo'yicha saqlaydi, ixcham), PromQL (Prometheus Query Language — metrikadan so'rov:rate,sum,histogram_quantile). Pull modelining afzalligi: Prometheus target ro'yxatini biladi, shuning uchun target down'ni o'zi sezadi (push modelda yiqilgan ilova hech narsa yubormaydi — yiqilganini bilmay qolasiz). Ilova metrikani prom-client kabi kutubxona bilan ochadi.
2.5. Grafana (vizualizatsiya — dashboard, panel, datasource, alerting)
GRAFANA — metrikani CHIROYLI ko'rsatuvchi vizualizatsiya platformasi:
(Prometheus raqam saqlaydi; Grafana uni grafik/dashboard qiladi)
ASOSIY TUSHUNCHALAR:
- DATASOURCE (manba) — qayerdan ma'lumot (Prometheus, Loki, PostgreSQL, ...)
170+ manba qo'llab-quvvatlaydi (2026)
- DASHBOARD — bir necha PANEL to'plami (bitta ekranda umumiy ko'rinish)
- PANEL — bitta vizualizatsiya (grafik, gauge, jadval, stat, heatmap)
- QUERY — panel ichidagi PromQL so'rov (qaysi metrikani ko'rsatish)
- ALERTING — shart buzilsa OGOHLANTIRISH (panelga bog'lanadi)
┌─────────────────── DASHBOARD: "API holati" ──────────────────┐
│ ┌─ Panel: RPS ──┐ ┌─ Panel: p99 latency ┐ ┌─ Panel: Errors ┐│
│ │ 1200/s ▲ │ │ 240ms ╱╲___╱╲ │ │ 0.2% ▁▁▃▁ ││
│ └───────────────┘ └─────────────────────┘ └────────────────┘│
│ ┌─ Panel: CPU/RAM ───────────────┐ ┌─ Panel: DB so'rovlar ─┐│
│ │ CPU 45% RAM 60% ╱╲╱╲╱ │ │ ... ││
│ └────────────────────────────────┘ └───────────────────────┘│
└──────────────────────────────────────────────────────────────┘
Grafana ma'lumot SAQLAMAYDI — faqat datasource'dan O'QIYDI va ko'rsatadiGrafana — metrikani chiroyli ko'rsatuvchi ochiq kodli vizualizatsiya platformasi (Prometheus raqamlarni saqlaydi, Grafana ularni grafik/dashboard'ga aylantiradi). Asosiy tushunchalar: datasource (ma'lumot manbasi — Prometheus, Loki, PostgreSQL, va h.k. — 2026'da 170+ turdagi manba); dashboard (bir necha panel to'plami — bitta ekranda umumiy ko'rinish); panel (bitta vizualizatsiya — grafik, gauge, jadval, stat, heatmap); query (panel ichidagi PromQL so'rov — qaysi metrika); alerting (shart buzilsa ogohlantirish, panelga bog'lanadi). Muhim: Grafana ma'lumotni saqlamaydi — faqat datasource'dan o'qiydi va ko'rsatadi (Prometheus/Loki — saqlash; Grafana — ko'rsatish). Dashboard JSON sifatida saqlanadi Git'ga qo'yib versiyalash mumkin (Infrastructure as Code — 10.10).
2.6. Sentry (error tracking — exception, stack trace, release, context)
SENTRY — XATOLARNI real vaqtda tutuvchi tizim (error/exception tracking):
(Prometheus metrika; Sentry — XATO tafsiloti: stack trace, kontekst)
NIMA TUTADI:
- Exception (tutilmagan xato), unhandled rejection, throw
- Har xato: STACK TRACE (qaysi qator), so'rov ma'lumoti, user, env
ASOSIY TUSHUNCHALAR:
- ISSUE — bir XIL xatolar guruhi (10000 marta bo'lsa — 1 issue, son bilan)
- STACK TRACE — xato qaysi fayl/qatorda yuz berdi (manba bilan)
- RELEASE — qaysi versiyada paydo bo'ldi (v1.2.3 — deploy bog'lash)
- CONTEXT — qo'shimcha: user (kim), tags, breadcrumbs (oldingi qadamlar)
- ENVIRONMENT — production / staging / development
┌────────────────────────────────────────────────────┐
│ TypeError: Cannot read 'id' of undefined │
│ UserService.findOne (user.service.ts:42) │
│ Seen 1,204 times · 89 users · release v1.2.3 │
│ First seen: 2h ago · Last: 10s ago │
└────────────────────────────────────────────────────┘
Log'da xato KO'MILIB ketadi (millionlab qator); Sentry — GURUHLAYDI,
ustuvorlashtiradi, alert beradi (qaysi xato ko'p, kimga ta'sir qildi)Sentry — xatolarni real vaqtda tutuvchi error tracking tizimi (Prometheus metrika beradi; Sentry — xatoning tafsilotini: stack trace, kontekst). Nima tutadi: exception (tutilmagan xato), unhandled rejection,
throw— har birini stack trace (qaysi fayl/qator), so'rov ma'lumoti, foydalanuvchi va environment bilan. Tushunchalar: issue (bir xil xatolar guruhi — 10000 marta bo'lsa bitta issue, son bilan); stack trace (xato qayerda yuz berdi); release (qaysi versiyada paydo bo'ldi —v1.2.3, deploy'ga bog'lash); context (qo'shimcha — user kim, tags, breadcrumbs — xatodan oldingi qadamlar); environment (production/staging). Oddiy log'da xato ko'milib ketadi (millionlab qator orasida) — Sentry uni guruhlaydi, ustuvorlashtiradi, alert beradi (qaysi xato eng ko'p, nechta foydalanuvchiga ta'sir qildi). Node/NestJS uchun rasmiy SDK bor (@sentry/nestjs).
2.7. Structured logging (JSON log — Winston/Pino)
STRUCTURED LOGGING — log'ni MATN emas, JSON sifatida yozish (5.12 davomi):
Oddiy matn (parse qilish qiyin, qidirish og'ir):
"User 42 logged in from 1.2.3.4 at 10:03"
Structured (JSON — mashina o'qiydi, filter/qidirish oson):
{"level":"info","time":"2026-06-22T10:03:00Z","msg":"login",
"userId":42,"ip":"1.2.3.4","requestId":"abc-123","traceId":"xyz"}
NEGA JSON:
Filter: level=error AND userId=42 (aniq qidirish)
Agregatsiya: Loki/ELK avtomatik tahlil qiladi (matn'da qiyin)
Bog'lash: requestId/traceId log'ni trace bilan ulash 2.10-bob
PINO vs WINSTON 5.12-bob:
- Pino — TEZ (minimal overhead, JSON default) production tavsiya
- Winston — moslashuvchan (ko'p transport, format)
LOG DARAJALARI: trace < debug < info < warn < error < fatal
production: info+ (debug o'chiq — shovqin/narx kamaytirish)Structured logging — log'ni oddiy matn emas, JSON sifatida yozish (5.12: Winston/Pino davomi). Oddiy matn (
"User 42 logged in") parse qilish va qidirishda qiyin; structured JSON ({"level":"info","msg":"login","userId":42,"requestId":"abc"}) — mashina o'qiydi, filter oson (level=error AND userId=42), agregatsiya tizimi (Loki/ELK) avtomatik tahlil qiladi. Eng muhim afzallik — bog'lash: har log'garequestId/traceIdqo'shsangiz, log'ni trace bilan ulay olasiz 2.10-bob va bitta so'rovning butun yo'lini ko'rasiz. Kutubxona 5.12-bob: Pino (tez, minimal overhead, JSON default — production tavsiya) yoki Winston (moslashuvchan, ko'p transport). Log darajalari: trace < debug < info < warn < error < fatal. Production'dainfova undan yuqori (debug o'chiq — shovqin va saqlash narxini kamaytiradi).
2.8. Log agregatsiya (Loki / ELK)
LOG AGREGATSIYA — ko'p server/podning loglarini BIR JOYGA yig'ish + qidirish:
(10 ta pod — 10 ta log fayli emas; markazlashgan, qidiriladigan)
GRAFANA LOKI (yengil, Prometheus uslubi):
- Log MAZMUNINI indekslamaydi faqat LABEL'larni (app, level, pod)
- Arzon (object storage'da saqlaydi), Grafana'da ko'riladi
- Promtail/agent loglarni yig'ib Loki'ga yuboradi
- "Prometheus loglar uchun" bir xil ekotizim (label, LogQL)
ELK / Elastic Stack (kuchli, og'irroq):
- Elasticsearch (saqlash + HAR token indekslanadi tez full-text qidiruv)
- Logstash/Beats (yig'ish) + Kibana (ko'rish)
- Kuchli qidiruv, lekin resurs ko'p (JVM, shard, disk)
┌─────────┐ ┌─────────┐
│ Loki │ arzon, │ ELK │ kuchli qidiruv,
│ label │ yengil │ full │ og'ir/qimmat
│ indeks │ │ indeks │
└─────────┘ └─────────┘
2026 amaliyot: Loki (ilova loglari — ko'p, arzon) + ELK (audit/security)Log agregatsiya — ko'p server/pod loglarini bir markaziy joyga yig'ish va qidirish (10 ta pod — 10 ta alohida fayl emas, balki bitta qidiriladigan oqim). Ikki yetakchi: Grafana Loki (yengil — log mazmunini indekslamaydi, faqat label'larni:
app,level,pod; arzon — object storage'da saqlaydi; Promtail/agent loglarni yig'ib yuboradi; "Prometheus loglar uchun" — bir xil ekotizim, LogQL so'rov tili) va ELK/Elastic Stack (Elasticsearch — har tokenni indekslaydi tez full-text qidiruv; Logstash/Beats yig'ish, Kibana ko'rish — kuchli, lekin resurs ko'p: JVM, shard, disk boshqaruvi). 2026 keng tarqalgan amaliyot — ikkalasini birga: Loki ilova loglari uchun (ko'p hajm, arzon, label'ga qulay) + ELK xavfsizlik/audit loglari uchun (kam hajm, full-text qidiruv kerak). Kichik loyiha uchun Loki + Grafana — soddaroq boshlanish.
2.9. Alerting (Alertmanager — qachon xabar)
ALERTING — shart buzilganda AVTOMATIK xabar (sen qaramasang ham):
PROMETHEUS ALERT QOIDASI (PromQL shart + davomiylik):
- expr: rate(errors_total[5m]) > 0.05 xato 5%'dan oshsa
- for: 5m 5 daqiqa DAVOM etsa (lop emas)
firing (yonadi) ALERTMANAGER'ga yuboriladi
ALERTMANAGER — alertlarni boshqaradi (Prometheus'ning alert qismi):
- GROUPING — o'xshash alertlarni guruhlaydi (10 pod yiqilsa — 1 xabar)
- ROUTING — kimga (Slack? Telegram? PagerDuty? email?)
- SILENCING — vaqtincha o'chirish (deploy/texnik ish paytida)
- INHIBITION — bog'liq alertni bostirish (server o'lsa — uning 100 alertini emas)
ALERT SEVIYALARI:
- WARNING — diqqat (p99 oshyapti — keyin qara)
- CRITICAL — darrov (server down — uyqudan tur, PagerDuty qo'ng'iroq)
ALERT NOISE (shovqin) eng katta dushman: ko'p/yolg'on alert "alert fatigue"
odam e'tibor bermay qo'yadi haqiqiy alertni o'tkazib yuboradiAlerting — belgilangan shart buzilganda avtomatik xabar (siz ekranni kuzatmasangiz ham, tizim o'zi chaqiradi). Prometheus alert qoidasi — PromQL shart + davomiylik:
expr: rate(errors_total[5m]) > 0.05(xato 5%'dan oshsa) +for: 5m(5 daqiqa davom etsa — lahzalik tebranish emas) firing (yonadi) Alertmanager'ga yuboriladi. Alertmanager (Prometheus'ning alert qismi): grouping (o'xshash alertlarni guruhlaydi — 10 pod yiqilsa bitta xabar), routing (kimga — Slack/Telegram/PagerDuty/email), silencing (vaqtincha o'chirish — deploy paytida), inhibition (bog'liq alertni bostirish — server o'lsa uning 100 ta hosila alertini yubormaydi). Seviyalar: warning (diqqat — keyin ko'rib chiqiladigan) va critical (darrov — uyqudan uyg'otadigan). Eng katta dushman — alert noise (shovqin): ko'p yoki yolg'on alert alert fatigue (charchash) odam e'tibor bermay qo'yadi haqiqiy alertni o'tkazib yuboradi. Kam, lekin mazmunli alert qo'yish tavsiya etiladi 2.13-bob.
2.10. Golden signals, RED, USE va distributed tracing
NIMANI O'LCHASH KERAK? — tasodifiy emas, METODLAR bor:
GOLDEN SIGNALS (Google SRE — 4 ta asosiy):
- LATENCY — so'rov qancha vaqt oldi (p50/p95/p99)
- TRAFFIC — qancha so'rov (RPS — request per second)
- ERRORS — necha % xato (error rate)
- SATURATION — resurs qanchalik to'la (CPU/RAM/disk — "to'yinganlik")
RED METODI (servis/so'rov uchun — Golden'ning soddasi):
- Rate (so'rov tezligi) · Errors (xato) · Duration (davomiylik)
USE METODI (resurs uchun — server/disk/CPU):
- Utilization (band %) · Saturation (navbat) · Errors (xato)
DISTRIBUTED TRACING — so'rovning XIZMATLAR bo'ylab yo'lini kuzatish:
- trace_id butun so'rovga; har bo'lak — SPAN (qaysi xizmat, qancha vaqt)
- OPENTELEMETRY (OTel) — vendor'siz standart (trace/metric/log yig'ish)
- JAEGER / Tempo — trace'larni saqlash va ko'rish
Boshla: GOLDEN SIGNALS (latency, traffic, errors, saturation) — yetadiNimani o'lchash kerak? — tasodifiy emas, tayyor metodlar bor. Golden signals (Google SRE — 4 asosiy): latency (so'rov vaqti — p50/p95/p99), traffic (qancha so'rov — RPS), errors (xato %), saturation (resurs to'lganligi — CPU/RAM/disk). RED metodi (servis uchun — golden'ning soddasi): Rate, Errors, Duration. USE metodi (resurs uchun): Utilization, Saturation, Errors. Distributed tracing — so'rovning bir necha xizmat bo'ylab yo'lini kuzatish: butun so'rovga trace_id, har bo'lak — span (qaysi xizmat, qancha vaqt); OpenTelemetry (OTel — vendor'siz standart, trace/metric/log yig'ish — 2026 sanoat yo'nalishi); Jaeger/Tempo (trace'larni saqlash/ko'rish). Boshlash uchun golden signals yetadi — latency, traffic, errors, saturation'ni o'lchasangiz, ilovaning sog'lig'ini 90% ko'rasiz. Tracing — mikroservis'da 9.5-bob ayniqsa qimmatli.
2.11. Health check, uptime va SLI/SLO/SLA
HEALTH CHECK — "tirikmi?" so'rovi (oddiy endpoint, alohida):
- GET /health 200 OK {"status":"ok"} (ilova javob beradimi)
- GET /ready bog'liqliklar tayyormi (DB, Redis ulanganmi)
Kubernetes 10.8-bob liveness/readiness probe shuni o'qiydi (yiqilsa qayta yoqadi)
Uptime monitor (UptimeRobot) tashqaridan har 1 daqiqa tekshiradi
SLI / SLO / SLA (ishonchlilik shartnomasi — 9.6 ishonchlilik):
SLI (Indicator) — O'LCHANADIGAN ko'rsatkich:
"checkout p99 latency" yoki "muvaffaqiyatli so'rov %"
SLO (Objective) — MAQSAD (ichki): "99.9% so'rov < 300ms, 30 kun ichida"
SLA (Agreement) — SHARTNOMA (mijoz bilan): "99.9% uptime, buzilsa — jarima"
ERROR BUDGET (xato byudjeti): 99.9% SLO oyiga ~43 daqiqa "ruxsat etilgan" downtime
byudjet bor: yangi feature deploy; byudjet tugadi: faqat barqarorlik
SLI o'lchanadi (metric) · SLO — ichki maqsad · SLA — tashqi va'da (jarima)Health check — "ilova tirikmi?" so'rovi (oddiy, alohida endpoint):
GET /health200 OK {"status":"ok"}(ilova javob beradimi),GET /ready(bog'liqliklar tayyormi — DB, Redis ulanganmi). Kubernetes (10.8) liveness/readiness probe shuni o'qiydi (yiqilgan podni qayta yoqadi), tashqi uptime monitor (UptimeRobot) har daqiqa tekshiradi. SLI/SLO/SLA (ishonchlilik "shartnomasi" — 9.6): SLI (Indicator — o'lchanadigan ko'rsatkich: "checkout p99 latency" yoki "muvaffaqiyatli so'rov %"); SLO (Objective — ichki maqsad: "99.9% so'rov < 300ms, 30 kun"); SLA (Agreement — mijoz bilan shartnoma: "99.9% uptime, buzilsa jarima"). Error budget (xato byudjeti): 99.9% SLO oyiga ~43 daqiqa "ruxsat etilgan" downtime — byudjet bor bo'lsa yangi feature deploy qilasiz, tugasa faqat barqarorlikka e'tibor. Farq: SLI o'lchanadi (metric), SLO — ichki maqsad, SLA — tashqi (jarima bilan).
2.12. To'liq stack — qanday birga ishlaydi
OBSERVABILITY STACK (hammasi birga):
┌──────────┐ metrika ┌────────────┐ so'rov ┌─────────┐
│ ILOVA │ ──/metrics──►│ PROMETHEUS │◄─PromQL──│ GRAFANA │
│ (NestJS) │ │ (TSDB) │ │(dashboard│
│ │ loglar ├────────────┤ │ + alert) │
│ prom- │ ──Promtail──►│ LOKI │◄─LogQL───│ │
│ client │ └────────────┘ └────┬────┘
│ + Sentry │ xatolar │ alert
│ + Pino │ ──────────► ┌────────────┐ ┌────▼────┐
└──────────┘ exception │ SENTRY │──alert──►│ Telegram│
│(error track)│ │/Slack │
└────────────┘ └─────────┘
HAR BIRI O'Z ISHIDA:
- Prometheus METRIKA (raqam, trend, alert)
- Grafana KO'RSATISH (dashboard) + ALERT (Alertmanager)
- Loki LOG (qidirish, kontekst)
- Sentry XATO (stack trace, guruh, release)
- Pino structured log ishlab chiqaradi (Loki o'qiydi)
Bittasi yetmaydi — birga to'liq ko'rinish (metric+log+trace+error)To'liq stack (hammasi birga ishlaydi): ilova (NestJS) prom-client orqali metrikani
/metrics'da ochadi Prometheus scrape qiladi va saqlaydi Grafana PromQL bilan o'qib dashboard'da ko'rsatadi va shart buzilsa alert beradi (Telegram/Slack). Bir vaqtda ilova Pino bilan structured log yozadi Promtail yig'ib Loki'ga yuboradi Grafana'da log ham ko'riladi. Xatolar esa Sentry'ga boradi (stack trace, guruh, release). Har biri o'z ishida: Prometheus — metrika, Grafana — ko'rsatish+alert, Loki — log, Sentry — xato. Bittasi yetmaydi — birgalikda metric + log + trace + error = to'liq ko'rinish. Boshlash uchun minimal: Prometheus + Grafana (metrika) + Sentry (xato) — keyin Loki/tracing qo'shasiz.
2.13. Best practices (monitoring/logging)
Golden signals'dan boshla (latency, traffic, errors, saturation — 2.10)
/metrics + prom-client (har xizmatda — 2.4); /health endpoint 2.11-bob
Structured JSON log (Pino) + requestId/traceId (bog'lash — 2.7)
Kam, MAZMUNLI alert (noise emas — actionable: chora bor — 2.9)
Alert davomiylik (for: 5m — lahzalik tebranishga emas — 2.9)
p99/p95 kuzat (o'rtacha emas — "dum"ni yashiradi — 2.3)
Sentry'da PII'ni TOZALA (parol/token yubormagin — 6-xato)
Metric cardinality nazorat (label cheklangan — userId LABEL emas — 6-xato)
Dashboard'ni Git'da saqla (JSON — IaC, qayta tiklanadi — 10.10)
SLO belgila + error budget (ishonchlilik o'lchovi — 2.11, 9.6)
Production'da debug log o'chiq (info+ — narx/shovqin — 2.7)3. Sintaksis — tez ma'lumotnoma
PROM-CLIENT 2.4-bob: new client.Counter({name,help,labelNames}) | .inc() | .observe()
client.register.metrics() /metrics endpoint matni
METRIC TURI 2.3-bob: Counter (.inc) | Gauge (.set/.inc/.dec) | Histogram (.observe)
PROMQL 2.4-bob: rate(http_requests_total[5m]) so'rov tezligi (RPS)
sum by (status) (rate(...[5m])) status bo'yicha guruh
histogram_quantile(0.99, rate(..._bucket[5m])) p99 latency
up == 0 target yiqilgan
rate(errors_total[5m])/rate(requests_total[5m]) error rate
PROMETHEUS CONFIG 2.4-bob: scrape_configs: job_name + targets + scrape_interval
ALERT QOIDA 2.9-bob: alert + expr (PromQL) + for (davomiylik) + labels
SENTRY 2.6-bob: Sentry.init({dsn, tracesSampleRate, environment, release})
Sentry.captureException(err) | Sentry.setUser({id})
PINO 2.7-bob: pino({level:'info'}) | logger.info({userId}, 'msg') | .error(err)
HEALTH 2.11-bob: GET /health 200 {status:'ok'} | /ready DB tayyormi4. Batafsil kod namunalari
Misol 1 — prom-client bilan Node metrika (counter + histogram — 2.3, 2.4)
// metrics.ts — prom-client bilan asosiy metrikalar (npm i prom-client)
import client from "prom-client";
// Default metrikalar (process CPU, RAM, event loop — avtomatik — 5.1)
const register = new client.Registry();
client.collectDefaultMetrics({ register }); // node_* metrikalar
// COUNTER — jami HTTP so'rovlar (faqat o'sadi — 2.3)
export const httpRequestsTotal = new client.Counter({
name: "http_requests_total", // metrika nomi (konvensiya: _total)
help: "Jami HTTP so'rovlar soni", // tavsif (majburiy)
labelNames: ["method", "route", "status"], // o'lchamlar (filtrlash uchun)
registers: [register],
});
// HISTOGRAM — so'rov davomiyligi (p50/p95/p99 hisoblash uchun — 2.3)
export const httpDuration = new client.Histogram({
name: "http_request_duration_seconds",
help: "HTTP so'rov davomiyligi (soniya)",
labelNames: ["method", "route", "status"],
buckets: [0.01, 0.05, 0.1, 0.3, 0.5, 1, 3, 5], // bucket chegaralari (soniya)
registers: [register],
});
export { register };
// buckets — taqsimot chegaralari; histogram_quantile shulardan p99 hisoblaydi (2.3)Misol 2 — Express middleware + /metrics endpoint (2.4)
// instrumentation.ts — har so'rovni o'lchaydigan middleware (5.6 middleware)
import { Request, Response, NextFunction } from "express";
import { httpRequestsTotal, httpDuration, register } from "./metrics";
export function metricsMiddleware(req: Request, res: Response, next: NextFunction) {
const end = httpDuration.startTimer(); // taymerni boshlash (histogram)
res.on("finish", () => { // javob tugagach o'lchaymiz
const route = req.route?.path ?? "unknown"; // route shabloni (/users/:id — 6-xato!)
const labels = { method: req.method, route, status: String(res.statusCode) };
httpRequestsTotal.inc(labels); // counter +1 (2.3)
end(labels); // histogram'ga davomiylik yoziladi
});
next();
}
// /metrics endpoint — Prometheus SHU YERNI scrape qiladi (2.4)
export async function metricsHandler(_req: Request, res: Response) {
res.set("Content-Type", register.contentType); // text/plain; prometheus format
res.end(await register.metrics()); // barcha metrikalar matni
}
// route'ni :id bilan (real ID emas) — aks holda cardinality portlaydi (6-xato)Misol 3 — Prometheus config (scrape job — 2.4)
# prometheus.yml — Prometheus serverning asosiy sozlamasi
global:
scrape_interval: 15s # har 15 soniyada scrape (default — 2.4)
evaluation_interval: 15s # alert qoidalarini har 15s tekshir
# Alert qoidalari va Alertmanager (2.9)
rule_files:
- "alert_rules.yml" # alert qoidalari (Misol 6)
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
scrape_configs:
# 1-job: Prometheus o'zini ham kuzatadi
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
# 2-job: bizning NestJS ilova (/metrics — Misol 2)
- job_name: "nestjs-api"
metrics_path: "/metrics" # qayerdan scrape (default /metrics)
static_configs:
- targets: ["api:3000"] # Docker network nomi (10.4)
# 3-job: server resurslari (node_exporter — CPU/RAM/disk — 2.4)
- job_name: "node"
static_configs:
- targets: ["node-exporter:9100"]
# Kubernetes'da 10.8-bob static emas, service discovery ishlatiladi (avtomatik)Misol 4 — PromQL so'rovlar (golden signals — 2.4, 2.10)
# === GOLDEN SIGNALS — PromQL so'rovlar 2.10-bob ===
# 1. TRAFFIC — so'rov tezligi (RPS — request per second):
rate(http_requests_total[5m])
# rate() — counter'ning 5 daqiqadagi o'rtacha o'sish tezligi (counter'ga DOIM rate)
# 2. ERRORS — xato foizi (5xx javoblar nisbati):
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
# status=~"5.." — regex (500-599); xato / jami = error rate 2.10-bob
# 3. LATENCY — p99 (so'rovlarning 99% shu vaqtdan tez — 2.3):
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
# histogram'ning _bucket'idan quantile hisoblaydi (le = "less than or equal")
# 4. SATURATION — RAM ishlatilishi (foiz):
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# 5. TARGET DOWN — qaysi ilova yiqilgan (pull model afzalligi — 2.4):
up == 0
# up — Prometheus avtomatik metrikasi (1 = scrape OK, 0 = target o'lik)Misol 5 — Grafana dashboard panel (JSON + tushuntirish — 2.5)
{
"title": "API Golden Signals",
"panels": [
{
"title": "So'rov tezligi (RPS)",
"type": "timeseries",
"datasource": { "type": "prometheus", "uid": "prometheus" },
"targets": [
{ "expr": "sum(rate(http_requests_total[5m]))", "legendFormat": "RPS" }
]
},
{
"title": "p99 latency",
"type": "timeseries",
"targets": [
{
"expr": "histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))",
"legendFormat": "p99"
}
],
"fieldConfig": { "defaults": { "unit": "s", "thresholds": {
"steps": [{ "color": "green", "value": 0 }, { "color": "red", "value": 0.5 }]
} } }
},
{
"title": "Error rate %",
"type": "stat",
"targets": [{ "expr": "sum(rate(http_requests_total{status=~\"5..\"}[5m])) / sum(rate(http_requests_total[5m])) * 100" }]
}
]
}Tushuntirish: Dashboard —
panelsmassivi; har paneltype(timeseries grafik,statraqam,gauge),datasource(Prometheus), vatargets(PromQLexpr).thresholds— qiymat 0.5s'dan oshsa qizil (vizual alert). Bu JSON'ni Grafana UI'da qurasiz, keyin eksport qilib Git'ga qo'yasiz (qayta tiklanadigan — 10.10). Tayyor dashboard'larni grafana.com'dan import ham qilish mumkin (Node.js, NestJS uchun).
Misol 6 — Alert qoidasi (Prometheus + Alertmanager — 2.9)
# alert_rules.yml — Prometheus alert qoidalari (prometheus.yml ulaydi — Misol 3)
groups:
- name: api_alerts
rules:
# 1. Xato foizi 5%'dan oshsa (critical)
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m])) > 0.05
for: 5m # 5 daqiqa DAVOM etsa (lahzalik emas — 2.9)
labels:
severity: critical # routing uchun (Alertmanager — 2.9)
annotations:
summary: "Xato foizi yuqori ({{ $value | humanizePercentage }})"
description: "API 5xx xatolari 5 daqiqada 5%'dan oshdi"
# 2. p99 latency sekin (warning)
- alert: SlowResponses
expr: histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 0.5
for: 10m
labels: { severity: warning }
annotations: { summary: "p99 latency 500ms'dan oshdi" }
# 3. Ilova yiqilgan (critical — pull model — 2.4)
- alert: TargetDown
expr: up == 0
for: 1m
labels: { severity: critical }
annotations: { summary: "{{ $labels.job }} target javob bermayapti" }
# for — eng muhim: b'siz har lahzalik tebranish alert beradi (noise — 2.9)Misol 7 — Sentry NestJS init + capture (2.6)
// instrument.ts — LOYIHA ILDIZIDA, eng birinchi import (rasmiy talab — 2.6)
import * as Sentry from "@sentry/nestjs";
Sentry.init({
dsn: process.env.SENTRY_DSN, // loyiha kaliti (.env — 10.11, secret)
environment: process.env.NODE_ENV, // production/staging (filtr — 2.6)
release: process.env.npm_package_version, // versiya — qaysi deploy'da xato (2.6)
tracesSampleRate: 0.1, // tranzaksiyalarning 10% (production — narx)
// PII himoyasi — parol/token'ni TOZALA (6-xato, GDPR — 14.x)
beforeSend(event) {
if (event.request?.data) delete (event.request.data as any).password;
return event;
},
});// main.ts — instrument BOSHQA importlardan OLDIN (2.6 — kritik!)
import "./instrument"; // eng birinchi qator
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();// app.module.ts — global filter (tutilmagan xatolarni Sentry'ga — 8.6 filter)
import { Module } from "@nestjs/common";
import { APP_FILTER } from "@nestjs/core";
import { SentryModule } from "@sentry/nestjs/setup";
import { SentryGlobalFilter } from "@sentry/nestjs/setup";
@Module({
imports: [SentryModule.forRoot()],
providers: [{ provide: APP_FILTER, useClass: SentryGlobalFilter }],
})
export class AppModule {}
// Qo'lda tutish: Sentry.captureException(err) + Sentry.setUser({ id: userId })Misol 8 — Structured logging (Pino — 2.7)
// logger.ts — Pino structured JSON logger (5.12 davomi, tez)
import pino from "pino";
export const logger = pino({
level: process.env.LOG_LEVEL ?? "info", // production: info (debug o'chiq — 2.7)
// Production: toza JSON (Loki o'qiydi — 2.8); dev: chiroyli rangli
transport: process.env.NODE_ENV !== "production"
? { target: "pino-pretty" } // dev: o'qiladigan format
: undefined, // prod: JSON (mashina o'qiydi)
formatters: { level: (label) => ({ level: label }) }, // "level":"info" (raqam emas)
redact: ["req.headers.authorization", "password", "*.token"], // PII tozalash (2.13)
});
// Ishlatish — har log'ga KONTEKST (requestId/traceId — bog'lash — 2.7)
logger.info({ userId: 42, requestId: "abc-123" }, "Foydalanuvchi kirdi");
logger.error({ err, orderId: 7 }, "Buyurtma yaratishda xato");
// Birinchi argument — obyekt (struktura); ikkinchi — xabar (msg)
// Natija: {"level":"info","time":...,"userId":42,"requestId":"abc-123","msg":"..."}Misol 9 — Health check endpoint (NestJS Terminus — 2.11)
// health.controller.ts — @nestjs/terminus bilan (DB/Redis tekshiradi)
import { Controller, Get } from "@nestjs/common";
import { HealthCheck, HealthCheckService, TypeOrmHealthIndicator } from "@nestjs/terminus";
@Controller("health")
export class HealthController {
constructor(
private health: HealthCheckService,
private db: TypeOrmHealthIndicator,
) {}
// GET /health — liveness: ilova tirikmi? (Kubernetes probe — 10.8)
@Get()
@HealthCheck()
check() {
return this.health.check([
() => this.db.pingCheck("database"), // DB ulanish ishlayaptimi (2.11)
]);
// 200 {"status":"ok","info":{"database":{"status":"up"}}}
// biror bog'liqlik o'lsa: 503 (Kubernetes podni qayta yoqadi — 10.8)
}
}
// /health (tirikmi) + /ready (bog'liqliklar tayyormi) — K8s ikkalasini o'qiydi (2.11)Misol 10 — Docker Compose: Prometheus + Grafana stack (2.12, 10.4)
# docker-compose.monitoring.yml — to'liq monitoring stack (10.4 davomi)
services:
prometheus:
image: prom/prometheus:latest
ports: ["9090:9090"]
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml # config (Misol 3)
- ./alert_rules.yml:/etc/prometheus/alert_rules.yml # alertlar (Misol 6)
- prom_data:/prometheus # TSDB saqlash (doimiy)
grafana:
image: grafana/grafana:latest
ports: ["3001:3000"] # 3000 ilovada band
environment:
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD} # admin parol (.env — 10.11)
volumes:
- grafana_data:/var/lib/grafana # dashboard saqlash
depends_on: [prometheus] # Prometheus avval (10.4)
node-exporter:
image: prom/node-exporter:latest # server resurs metrikasi (2.4)
ports: ["9100:9100"]
alertmanager:
image: prom/alertmanager:latest # alert boshqaruvi (2.9)
ports: ["9093:9093"]
volumes: ["./alertmanager.yml:/etc/alertmanager/alertmanager.yml"]
volumes: { prom_data: {}, grafana_data: {} } # doimiy saqlash (10.3)
# docker compose up Prometheus:9090, Grafana:3001 (Prometheus'ni datasource qo'sh)5. To'g'ri va noto'g'ri holatlar
1) Nimani o'lchash
Tasodifiy metrika ("har narsani o'lchayman" — shovqin, narx)
Golden signals (latency, traffic, errors, saturation — 2.10)2) Latency ko'rsatkichi
O'rtacha (average) latency (sekin "dum"ni yashiradi — 2.3)
p95/p99 (foydalanuvchilarning eng sekin tajribasini ko'rsatadi)3) Log formati
console.log("User " + id + " login") (matn — qidirish/filter qiyin)
Structured JSON (Pino) + requestId/traceId (filter/bog'lash — 2.7)4) Alert miqdori
Ko'p/yolg'on alert (alert fatigue e'tibor bermay qo'yiladi — 2.9)
Kam, mazmunli, actionable + for: 5m (chora bor — davomiy — 2.9)5) Metric label
labelNames: ["userId", "requestId"] (cheksiz qiymat — cardinality portlaydi)
Cheklangan label (method, route shabloni, status — 6-xato)6) Sentry'da maxfiy ma'lumot
Xato bilan parol/token/karta Sentry'ga ketadi (PII leak — 6-xato)
beforeSend / redact bilan tozalash (GDPR — 2.13)6. Keng tarqalgan xatolar va yechimlari
Xato 1 — Scrape target down (up == 0, "context deadline exceeded")
Sababi: Prometheus ilovaga yeta olmayapti — noto'g'ri target/port, network alohida, yoki /metrics ochiq emas. Yechimi: Prometheus UI Status Targets (qaysi down); Docker network bir xilmi 10.4-bob; curl http://api:3000/metrics ishlayaptimi tekshirish (Misol 2, 3).
Xato 2 — Metric cardinality portlashi (Prometheus RAM tugaydi, sekinlashadi)
Sababi: label'da cheksiz qiymat (userId, requestId, full URL /users/123). Har noyob qiymat — alohida time-series millionlab seriya. Yechimi: label'ni cheklangan qiymatga (route shabloni /users/:id, real ID emas); userId — label emas, log'da bo'lsin (Misol 2, 2.13).
Xato 3 — Alert spam / noise (telefon tinmaydi e'tibor yo'qoladi)
Sababi: for yo'q (lahzalik tebranish alert beradi), juda past chegara, yoki har metrikaga alert. Yechimi: for: 5m (davomiylik); faqat actionable (chora bor) alert; Alertmanager grouping/inhibition 2.9-bob.
Xato 4 — Sentry'da PII leak (parol, token, shaxsiy ma'lumot ketadi)
Sababi: xato obyekti so'rov body/header bilan to'liq yuboriladi. Yechimi: beforeSend da maxfiy maydonni o'chir; sendDefaultPii: false; Pino'da redact (Misol 7, 8, 14.x xavfsizlik).
Xato 5 — Log hajmi/narx portlashi (disk to'ladi, billing oshadi)
Sababi: production'da debug log ochiq, har so'rovga ko'p log, yoki retention cheksiz. Yechimi: production'da level: info (debug o'chiq); Loki retention sozla (eski log o'chsin); sampling (2.7, 2.8).
Xato 6 — Dashboard'ni noto'g'ri o'qish (panika yoki e'tiborsizlik)
Sababi: counter'ning xom qiymatini ko'rsatish (rate()siz — doim o'sadi, ma'nosiz); noto'g'ri time range; o'rtachaga ishonish. Yechimi: counter'ga doim rate(); mos vaqt oynasi; p99 kuzatiladi; threshold/rang qo'yiladi (Misol 4, 5).
Xato 7 — /metrics himoyasiz ochiq (tashqaridan ko'rinadi)
Sababi: /metrics public — ichki ma'lumot (route'lar, hajm) tashqariga chiqadi. Yechimi: firewall'da faqat Prometheus'ga ochiq (10.1 ufw), yoki ichki network'da; Nginx'da /metrics'ni bloklash 10.2-bob.
7. Integratsiya — bu mavzu stack'ning qayerida uchraydi
- Logger Winston/Pino 5.12-bob: structured log poydevori — bu bob uni agregatsiya (Loki) va trace bilan bog'laydi.
- Error handling (8.15, 5.10): global exception filter Sentry'ga ulanadi (tutilmagan xato avtomatik).
- Deploy 10.7-bob: deploy'dan keyin metrika/alert kuzatiladi (yangi versiya buzdimi — release Sentry'da).
- Kubernetes 10.8-bob: liveness/readiness probe
/healtho'qiydi; Prometheus K8s service discovery bilan podlarni topadi. - Ishonchlilik 9.6-bob: SLI/SLO/SLA, error budget — monitoring ularni o'lchaydi va tasdiqlaydi.
- Nginx 10.2-bob: access log log agregatsiya; reverse proxy metrikasi.
- IaC/secrets (10.10, 10.11): dashboard JSON Git'da; SENTRY_DSN, Grafana parol — secret.
- Xavfsizlik (14.x): PII leak oldini olish (Sentry/log),
/metricshimoyasi.
8. Eng yaxshi amaliyotlar (best practices)
- Golden signals'dan boshla (latency, traffic, errors, saturation — yetarli asos — 2.10).
- prom-client + /metrics har xizmatda; /health endpoint (K8s probe — 2.4, 2.11).
- Structured JSON log (Pino) + requestId/traceId (filter va bog'lash — 2.7).
- p99/p95 kuzat (o'rtacha "dum"ni yashiradi — 2.3).
- Kam, mazmunli alert (actionable +
fordavomiylik — noise emas — 2.9). - Metric cardinality nazorat (label cheklangan — userId LABEL emas — 6-xato).
- Sentry PII tozalash (beforeSend/redact — parol/token yubormagin — 2.13).
- Dashboard'ni Git'da (JSON eksport — qayta tiklanadi — 10.10).
- SLO + error budget (ishonchlilik o'lchovi va qarori — 2.11, 9.6).
- Production debug o'chiq (level info — narx/shovqin — 2.7); retention sozla 2.8-bob.
- OpenTelemetry (vendor'siz standart — kelajakka tayyor, mikroservis tracing — 2.10).
9. Amaliy loyiha: "To'liq Observability Stack"
NestJS ilovaga to'liq monitoring stack qo'yish — real SRE/DevOps ko'nikmasi.
Maqsad
Mavjud NestJS ilovaga (8-QISM) Prometheus + Grafana + Sentry + structured logging ulab, golden signals dashboard, alert va xato tracking ishlaydigan to'liq observability stack qurish (Docker Compose bilan).
Talablar (requirements)
- prom-client: counter (
http_requests_total) + histogram (http_request_duration_seconds) + default metrika (Misol 1). - /metrics endpoint: middleware bilan har so'rovni o'lcha; route shabloni ishlat (cardinality — Misol 2, 6-xato).
- Prometheus:
prometheus.yml— ilova + node-exporter scrape job (Misol 3). - Grafana dashboard: golden signals (RPS, p99 latency, error rate, CPU/RAM) — 4+ panel (Misol 4, 5).
- Alert: HighErrorRate + SlowResponses + TargetDown (
forbilan — Misol 6, 2.9). - Sentry: NestJS init + global filter + PII tozalash (beforeSend — Misol 7, 6-xato).
- Structured logging: Pino — JSON, requestId, redact (Misol 8, 2.7).
- Health check:
/health(Terminus — DB ping) +/ready(Misol 9, 2.11). - Docker Compose: Prometheus + Grafana + node-exporter + alertmanager (Misol 10).
- SLO: bitta SLI tanlab SLO yoz (masalan "99.9% so'rov < 300ms") + error budget hisobla 2.11-bob.
Maslahatlar (hint)
/metrics'da route'ni:idshabloni bilan yoz — real ID label cardinality'ni portlatadi (6-xato).- Counter'ga PromQL'da doim
rate()— xom qiymat ma'nosiz (6-xato, Misol 4). - Sentry
instrument.ts—main.tsda eng birinchi import (rasmiy talab — 2.6). - Alert'ga
for: 5mqo'y — aks holda lahzalik tebranish spam beradi 2.9-bob. - Grafana'da avval Prometheus'ni datasource qo'sh (Configuration Data sources).
- Sentry'da
beforeSendbilan parol/token tozala — production'da majburiy (6-xato).
"Tayyor" mezonlari (acceptance criteria)
-
/metricsPrometheus formatida metrika beradi (counter + histogram). - Prometheus UI Targets'da ilova UP (yashil).
- Grafana dashboard golden signals'ni jonli ko'rsatadi (RPS, p99, error).
- Alert qoidalari mavjud; sun'iy xato yaratganda alert firing bo'ladi.
- Sentry'da test xato ko'rinadi (stack trace + release + environment).
- Sentry'da parol/token ko'rinmaydi (PII tozalangan).
- Log JSON formatida, requestId bilan (filter ishlaydi).
-
/health200 (DB up) qaytaradi; DB to'xtasa 503. -
docker compose upbilan butun stack ko'tariladi. - SLO + error budget hujjatlashtirilgan (README).
Yechim kodi ataylab berilmagan — bu loyihani o'zingiz yozib ko'ring.
10. Xulosa va keyingi bobga ko'prik
Bu bobda monitoring va logging'ni — production'ni ko'rish san'atini — chuqur o'rgandik:
- Observability (3 ustun: metrics/logs/traces — 2.1); monitoring (nega, MTTR — 2.2); metric turlari (counter/gauge/histogram/summary — 2.3).
- Prometheus (pull model, scrape, exporter, TSDB, PromQL — 2.4); Grafana (dashboard, panel, datasource, alerting — 2.5); Sentry (error tracking, stack trace, release, context — 2.6).
- Structured logging (Pino JSON — 2.7); log agregatsiya (Loki/ELK — 2.8); alerting (Alertmanager, noise — 2.9); golden signals/RED/USE/tracing (OpenTelemetry — 2.10); health/SLI/SLO/SLA (error budget — 2.11).
Endi siz production'ni ko'r-ko'rona emas, raqamlar bilan boshqarasiz: dashboard'da latency/error/traffic, alert telefonda, Sentry'da har xato stack-trace bilan. Bu — "deploy qildim, ishladi shekilli" deydigan junior'dan, "p99 240ms, error rate 0.1%, SLO bajarilyapti" deydigan senior/SRE'ga o'tish.
Keyingi bob — 10.10-bob: Infrastructure as Code (Terraform asoslari). Shu paytgacha serverni, Docker'ni, monitoring stack'ni qo'lda yoki yarim avtomatik sozladik. Lekin "serverni qayta qur" desa — yana qo'lda bosasizmi? Yo'q. Terraform — butun infratuzilmani (server, network, DB, DNS — hatto Grafana/Prometheus konfiguratsiyasini) kod sifatida yozish imkonini beradi: terraform apply — va butun muhit noldan bir buyruq bilan ko'tariladi (yoki o'chiriladi). Bu — DevOps'ning eng kuchli g'oyasi: infratuzilma ham — kod, versiyalanadi, takrorlanadi, qayta tiklanadi.
Foydalanilgan rasmiy/ishonchli manbalar
- Prometheus Documentation — Metric types, Concepts, Querying (PromQL), Alerting (prometheus.io/docs, 2026)
- prom-client — Prometheus client for Node.js (github.com/siimon/prom-client, npm — 2026)
- Grafana Documentation — Dashboards, Data sources, Alerting (grafana.com/docs, Grafana 13 — 2026)
- Grafana Loki Documentation — log aggregation, Promtail, LogQL (grafana.com/docs/loki — 2026)
- Sentry Documentation — NestJS/Node.js SDK, Releases & Health, Capturing Errors (docs.sentry.io — 2026)
- OpenTelemetry — Observability primer, signals (opentelemetry.io/docs — 2026)
- Google SRE Book — Four Golden Signals, SLI/SLO/SLA, error budget
- Pino — fast Node.js logger (getpino.io — 2026); Better Stack, VictoriaMetrics — Prometheus metrics guides (2026)
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!