Monitoring tushunchasi
Monitoring nima, Logging bilan farqi, Golden Signals (Latency, Traffic, Errors, Saturation), o'rtacha (average) ko'rsatkichning aldamchiligi va p95/p99 percentile, alerting va 'alert charchashi', health check, distributed tracing, va Node.js'ga xos Event Loop Lag/GC pauzalari kabi runtime metrikalar.
97-dars
Monitoring tushunchasi
Tasavvur qiling, mashinangiz bor. Panelda — spidometr, yoqilg'i ko'rsatkichi, dvigatel harorati. Siz ularga vaqti-vaqti bilan qarab turasiz — mashina hali yo'lda yiqilib qolmasdan, muammoni oldindan sezish uchun.
Monitoring — dasturda aynan shu: tizim ishlayotganda uning "sog'ligini" doimiy kuzatib borish — "server band emasmi", "xotira yetarlimi", "so'rovlar sekin javob bermayaptimi".
1. Logging bilan farqi — bu muhim, ko'p aralashtiriladi
| Logging | Monitoring | |
|---|---|---|
| Savol | "Nima sodir bo'ldi?" (o'tmish, aniq voqea) | "Hozir tizim qanday holatda?" (joriy, umumiy holat) |
| Misol | "User 123 login qildi soat 14:30:05'da" | "Hozir sekundiga 500 ta so'rov kelyapti, o'rtacha javob vaqti 120ms" |
| Format | Matn/JSON yozuvlar | Sonlar (metrikalar), vaqt bo'yicha grafik |
| Qachon qaraladi | Muammo bo'lgandan keyin, tergov qilish uchun | Doimiy, real vaqtda, muammo bo'lishidan oldin sezish uchun |
Ya'ni: logging — "nima bo'ldi" haqida hikoya, monitoring — "hozir qanday" haqida sonlar va grafiklar.
2. Nima o'lchanadi — asosiy metrikalar
// Oddiy misol — so'rov vaqtini o'lchash
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
metrics.recordHttpDuration(req.path, duration); // metrika tizimiga yuboriladi
});
next();
});
Odatda kuzatiladigan 4 asosiy metrika turi bor (bu "Golden Signals" deb ataladi):
| Metrika | Nima | Misol |
|---|---|---|
| Latency (kechikish) | So'rov qancha vaqtda javob beradi | "Ortacha 120ms, lekin 1% so'rov 3 soniyadan ko'p" |
| Traffic (yuk) | Qancha so'rov kelyapti | "Sekundiga 500 so'rov" |
| Errors (xatolar) | Nechta so'rov muvaffaqiyatsiz | "So'rovlarning 2% — 500 xatosi bilan qaytdi" |
| Saturation (to'yinganlik) | Resurslar qancha band | "CPU 85%, xotira 70% ishlatilyapti" |
3. Nega faqat "sonlarni ko'rish" yetarli emas — percentile muammosi
Bu — monitoring'dagi eng ko'p xato qilinadigan joy. Tasavvur qiling, 100 ta so'rov keldi, va siz o'rtacha (average) javob vaqtini hisoblaysiz: 120ms. Yaxshi ko'rinadi, shundaymi?
Lekin o'rtacha — aldamchi bo'lishi mumkin:
99 ta so'rov: 50ms (tez)
1 ta so'rov: 7000ms (juda sekin!)
O'rtacha = (99×50 + 7000) / 100 = 119.5ms
O'rtacha 120ms — hech qanday muammo yo'q deb ko'rsatadi, holbuki 1 ta foydalanuvchi 7 soniya kutgan! Agar bu 1% — sizning eng yirik, eng muhim mijozingiz bo'lsa-chi?
Yechim — percentile (p50, p95, p99) o'lchash:
p50 (median): 50ms → so'rovlarning yarmi shundan tez
p95: 200ms → 95% so'rov shundan tez, 5% sekinroq
p99: 7000ms → 99% so'rov shundan tez, LEKIN 1% — juda sekin!
p99 — aynan shu **"eng yomon holatlar"**ni ko'rsatadi, ular o'rtachada yo'qolib ketadi. Katta kompaniyalarda (Google, Amazon) "p99 latency" — eng ko'p kuzatiladigan metrikalardan biri, chunki millionlab foydalanuvchida, "kam uchraydigan" 1% — aslida minglab odam degani.
4. Alerting — monitoring "sukut" saqlamasligi kerak
Agar siz grafikni doimo tikilib o'tirmasangiz (albatta o'tirmaysiz), monitoring o'zi sizga xabar berishi kerak — bu Alert (ogohlantirish) deyiladi:
// Konseptual misol — alert qoidasi
if (metrics.errorRate('last_5min') > 0.05) { // 5% dan ko'p xato
sendAlert({
channel: 'slack',
message: 'Xato darajasi 5% dan oshdi! Tekshiring.',
severity: 'critical'
});
}
Muhim muvozanat — "alert charchashi" (alert fatigue):
Agar siz har kichik narsaga alert qo'ysangiz (masalan, "CPU 50%dan oshdi"), jamoa kuniga 50 ta bildirishnoma oladi, ko'pi — haqiqiy muammo emas. Natijada odamlar alertlarni e'tiborsiz qoldirishni o'rganib qoladi — va aynan haqiqiy muammo kelganda ham, uni sezmay qolishadi. Bu — real hayotda ko'p falokatlarning sababi bo'lgan.
Qoida: alert faqat harakat talab qiladigan narsaga qo'yilishi kerak ("hozir kimdir uyg'onib, biror narsa qilishi kerak" darajasidagi muammo), "qiziqarli, lekin harakat kerak emas" narsalar — faqat dashboard'da ko'rsatiladi, alert emas.
5. Health check — tizim "tirikmi" degan eng oddiy savol
app.get('/health', (req, res) => {
res.json({ status: 'ok', uptime: process.uptime() });
});
Bu — eng sodda monitoring shakli: har 10 soniyada tashqi tizim (masalan, load balancer yoki Kubernetes) shu endpoint'ga so'rov yuboradi. Agar javob kelmasa (yoki xato bo'lsa) — bu server "o'lik" deb hisoblanadi va undan foydalanuvchi so'rovlari avtomatik boshqa serverga yo'naltiriladi.
Chuqurroq health check — bog'liq xizmatlarni ham tekshiradi:
app.get('/health', async (req, res) => {
const dbOk = await checkDatabaseConnection();
const cacheOk = await checkRedisConnection();
if (dbOk && cacheOk) {
res.json({ status: 'ok' });
} else {
res.status(503).json({ status: 'degraded', db: dbOk, cache: cacheOk });
}
});
6. Distributed tracing — ko'p xizmatli tizimda "sekinlik qayerda"
Logging mavzusida requestId orqali loglarni bog'lashni ko'rgan edik. Monitoring'da bunga o'xshash, lekin vizual vosita — tracing deyiladi:
So'rov keldi
│
├─ Auth xizmati: 5ms
│
├─ Order xizmati: 15ms
│ │
│ └─ Database so'rovi: 200ms ← MANA SHU YERDA sekinlik!
│
└─ Payment xizmati: 10ms
Jami: 230ms
Bu — masalan, Jaeger, Zipkin kabi vositalar orqali vizual grafik sifatida ko'rsatiladi: har bir xizmat qancha vaqt olganini ko'rasiz, va aniq qaysi qismda sekinlik borligini darhol topasiz — barcha xizmatlarning kodini birma-bir qidirib yurish o'rniga.
7. V8/Node.js darajasida — nimalarni monitoring qilish kerak (runtime metrikalar)
Bu — JS-specifik, muhim joy. Oddiy CPU/xotira'dan tashqari, Node.js'ning o'ziga xos muammo manbalari bor:
| Metrika | Nima uchun muhim |
|---|---|
| Event Loop Lag | Agar event loop band bo'lsa (bir joyda uzoq sinxron kod ishlasa), barcha so'rovlar kutib qoladi. Bu — Node.js'da eng muhim runtime metrika |
| Heap ishlatilishi | V8'ning xotira chegarasi bor (odatda ~1.5-4GB). Agar heap to'lib borsa — bu memory leak belgisi |
| GC pauzalari | Garbage Collector ishlaganda, ba'zan "Stop-the-world" pauza bo'ladi — bu paytda hech qanday kod ishlamaydi. Agar bu pauzalar uzoq (masalan, 100ms+) bo'lsa — foydalanuvchi "to'xtash"ni his qiladi |
| Active handles/requests | Nechta ochiq socket, timer, fayl operatsiyasi bor — bu ko'payib borsa, resurs oqib ketayotganidan (leak) darak beradi |
// Event Loop Lag'ni o'lchash — konseptual misol
let lastCheck = Date.now();
setInterval(() => {
const now = Date.now();
const lag = now - lastCheck - 1000; // kutilgan 1000ms dan qancha ortiq kechikdi
metrics.recordEventLoopLag(lag);
lastCheck = now;
}, 1000);
Agar lag doimiy ravishda katta bo'lsa (masalan, 50ms+) — bu degani, biror joyda sinxron, uzoq davom etadigan kod (masalan, katta massivni sinxron qayta ishlash, yoki noto'g'ri ishlatilgan JSON.parse katta faylga) event loop'ni bloklab turibdi — bu to'g'ridan-to'g'ri barcha foydalanuvchilar uchun sekinlikka olib keladi, garchi CPU/xotira "normal" ko'rinsa ham.
Yakuniy xulosa
- Logging — "nima bo'ldi" (o'tmish), Monitoring — "hozir qanday" (joriy holat).
- 4 asosiy metrika: Latency, Traffic, Errors, Saturation (Golden Signals).
- O'rtacha (average) — aldamchi bo'lishi mumkin; p95/p99 — "eng yomon holatlar"ni ko'rsatadi, ular ko'pincha eng muhim.
- Alert — faqat harakat talab qiladigan narsaga, aks holda "alert charchashi" yuzaga keladi.
- Health check — tizim tirikligini tekshirishning eng oddiy usuli, load balancer shu orqali qaror qabul qiladi.
- Node.js'da maxsus e'tibor: Event Loop Lag va GC pauzalari — bular JS-specifik, boshqa tillarda yo'q muammolar.