🩺 शाळेच्या पद्धतीने observability शिका

तुमची system काय करत आहे — आणि का — हे कसे ओळखायचे, शाळेच्या आरोग्य कक्षाप्रमाणे शिकवलेले: दैनंदिनी (logs), तपासणी तक्ता (metrics), एका विद्यार्थ्याचे मार्ग कार्ड (traces), खरोखर गरज असतानाच कुणाला उठवणारी धोक्याची घंटा, अग्निशमन सराव आणि त्यानंतरचा अहवाल. प्रत्येक धडा ही आकृती आणि lab असलेली एक शाळेची गोष्ट आहे — आणि आरोग्य कक्ष repo मध्येच आहे: शुद्ध Python मधील छोटे, प्रामाणिक models (obs/signals.py, obs/reliability.py, शून्य dependencies) जे एक निकालाचा दिवस मिनिटा-मिनिटाने पुन्हा चालवतात.

📓 structured logs📊 counters · gauges · histograms⏱️ buckets मधून p99🧵 traces + traceparent🔭 OpenTelemetry📈 PromQL🚨 burn-rate alerts🎯 SLOs + error budgets🧯 incidents🔍 पाच का📝 दोषारोपविरहित postmortems

🩺 भाग 1 — SIGNALS (1–4)

  • आरोग्य कक्ष कशासाठी 🩺
  • दैनंदिनी 📓
  • तपासणी तक्ता 📊
  • हळू म्हणजे किती हळू ⏱️

🧵 भाग 2 — SERVICES च्या पलीकडे (5–8)

  • प्रत्येक खोलीतून जाणारे मार्ग कार्ड 🧵
  • गोळा करण्याचा एकच मार्ग 🔭
  • scrape करा, विचारा, काढा 📈
  • महत्त्वाच्या धोक्याच्या घंटा 🚨

🎯 भाग 3 — विश्वासार्हतेचे चक्र (9–12)

  • पुरेसे चांगले, आकड्यांमध्ये 🎯
  • अग्निशमन सराव 🧯
  • खरे कारण 🔍
  • अहवाल आणि चक्र 📝
# the 60-second wow — one results day, replayed:
git clone https://github.com/BaluRaut/learn-observability-school.git && cd learn-observability-school
python3 obs/demo.py                # 12 lessons: every signal, alert and minute
python3 obs/test_obs.py            # 12 checks across the lessons

तुम्हाला काय दिसायला हवे (छाटलेले — यश असे दिसते):

═══ why ═══
── results day, 11:40: 'parents say the results page is broken' — can we answer WHY without adding code?
   monitoring: dashboards for failures you predicted (CPU, disk, 5xx)
   observability: ask NEW questions of the system from what it already emits — logs, metrics, traces
   this morning: CPU crossed 80% in 64 minutes — but CPU is not what parents feel
   the three signals: metrics say THAT something is wrong · traces say WHERE · logs say WHY

═══ logs ═══
── structured logs: one JSON object per line, not free text
   {"ts": "11:40:02", "level": "ERROR", "msg": "grade service timeout", "route": "/results/3A", "status": 504, "ms": 1000, "trace_id": "a3ce929d", "user": "parent-9"}
── query level=ERROR route=/results/3A → 2 lines · trace ids ['a3ce929d', 'b7ad6b71']
   levels: DEBUG < INFO < WARN < ERROR · never log passwords, tokens or full personal data
   a request id / trace id in EVERY line is what joins logs to traces

═══ metrics ═══
── three kinds of metric — counter (only up), gauge (up and down), histogram (buckets)
   # HELP http_requests_total Requests served
   # TYPE http_requests_total counter
   http_requests_total{route="/results",status="200"} 9450
   http_requests_total{route="/results",status="404"} 30
   http_requests_total{route="/results",status="500"} 20
   # HELP print_queue_length Certificates waiting
   # TYPE print_queue_length gauge
   print_queue_length 137
   # HELP http_request_duration_seconds Request time
   # TYPE http_request_duration_seconds histogram
   http_request_duration_seconds_bucket{le="0.1"} 10
   http_request_duration_seconds_bucket{le="0.25"} 18
   http_request_duration_seconds_bucket{le="0.5"} 19
   http_request_duration_seconds_bucket{le="1.0"} 19
   http_request_duration_seconds_bucket{le="2.5"} 20
   http_request_duration_seconds_bucket{le="+Inf"} 20
   http_request_duration_seconds_sum 3.657
   http_request_duration_seconds_count 20
── labels route, status → 6 time series
── labels route, status, user_id → 300,000 time series
   never put user ids, emails or full URLs in labels — cardinality explodes the bill and the database

═══ percentiles ═══
── 20 requests (ms): 80 85 90 92 95 98 100 105 110 120 130 150 180 240 400 95 88 102 97 1200
   p50  true   100 ms · from buckets   100.0 ms
   p95  true   400 ms · from buckets   500.0 ms
   p99  true  1200 ms · from buckets  2200.0 ms
── two servers' p99: 2000 and 100 ms · their average 1050 ms · the real p99 of both: 2000 ms
   you cannot average percentiles — merge the histograms and compute again · buckets set the precision

═══ tracing ═══
── one parent's request, as a trace (one tree of spans):
   GET /results/3A [gateway] 0–1040 ms (1040 ms) ✗
     check parent login [auth] 5–45 ms (40 ms)
     load class list [results-api] 50–90 ms (40 ms)
     fetch grades [results-api] 95–1035 ms (940 ms) ✗
       SELECT grades [postgres] 100–160 ms (60 ms)
       grade service call [grade-service] 165–1030 ms (865 ms) ✗
   critical path: GET /results/3A → fetch grades → grade service call — 865 of 1040 ms is the grade service
   passed between services in a header: traceparent: 00-a3ce929d0e0e47364bf92f3577b34da6-00f067aa0ba902b7-01

═══ otel ═══
── OpenTelemetry: one SDK in the app → the Collector → any backend (Tempo, Jaeger, X-Ray, Datadog…)
   app (SDK: traces, metrics, logs) → OTLP → collector (receive → batch → sample → export) → backends
── 1,000 traces, tail sampling (keep every error and every trace > 500 ms, 1 in 10 of the rest) → kept 113, dropped 887
   all 4 error traces and all 10 slow traces survive — the boring ones are sampled
   semantic conventions: http.request.method, http.response.status_code, service.name — the same names everywhere

═══ prometheus ═══
── a counter scraped every 60 s: [(0, 1000), (60, 1600), (120, 2200), (180, 150), (240, 750)] — the app restarted at 180 s
   rate over 4 min = 8.1 requests/s (the reset is handled, not a negative spike)
── PromQL you will type every week:
   sum by (status) (rate(http_requests_total[5m]))
   sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
   histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
   Prometheus PULLS /metrics every 15–60 s and stores series · Grafana draws them · recording rules pre-compute

═══ alerting ═══
── 8 hours of traffic, SLO 99.9%: a slow leak (0.9% errors, minutes 100–379) and a bad deploy (6%, minutes 400–431)
   CPU > 80% alerts: 64 minutes of noise that do not track what users feel
   burn-rate TICKET (≥6× over 6 h AND 30 min): minutes 266–390, 401–408, 435–458 — first the slow leak (nobody woken at night), then around the deploy while the page is not firing
   burn-rate PAGE (≥14.4× over 1 h AND 5 min): minutes 409–434 — the bad deploy, 9 minutes after it began
   page for fast burns that hurt users now; open a ticket for slow burns; never page on a cause like CPU

═══ slo ═══
── SLI: good requests / all requests · SLO: 99.9% over 30 days · SLA: the contract with a penalty
   SLO 99.00% →  432.0 minutes of full outage per 30 days
   SLO 99.90% →   43.2 minutes of full outage per 30 days
   SLO 99.99% →    4.3 minutes of full outage per 30 days
── a 30-day window of 43,200,000 requests may have 43,200 failures · today's 8 hours failed 4,608
   one bad day used 10.7% of the month's budget → 89.3% left
   budget left → ship faster · budget gone → freeze risky changes and fix reliability first

═══ incident ═══
── roles: incident commander (Dipika) · ops lead (Katrina) · communications (Aishwarya) · scribe
   SEV1: most parents cannot see results — page everyone, status page, updates every 30 min
   SEV2: a feature is broken for many — page on-call, updates every hour
   SEV3: degraded or a small group affected — fix in working hours
── the timeline (minutes): {'started': 400, 'detected': 409, 'acknowledged': 411, 'mitigated': 432, 'resolved': 470}
   time_to_detect       9 min
   time_to_acknowledge  2 min
   time_to_mitigate     32 min
   time_to_resolve      70 min
   users_hurt_minutes   32 min
   first mitigate (roll back, switch off, add capacity), THEN find the cause

═══ rootcause ═══
── the error ratio first crosses 5% at minute 400
   changes in the 30 minutes before: [(398, 'deploy results-api v42')]
   why 1? parents saw 504 on /results
   why 2? the grade service call took 1 s and timed out
   why 3? v42 removed the grade cache, so every view hit the grade service
   why 4? the load test used 3 classes, not 900
   why 5? there is no production-like load test in the release checklist
   the root cause is usually a missing guard in the PROCESS, not a person

═══ postmortem ═══
   # Postmortem: results page 504s on results day
   
   Blameless: we look at the system, not at a person.
   
   ## Impact
   6% of results views failed for 32 minutes (minutes 400–431); ~1,900 parents saw an error
   
   ## Timeline
   - 398 deploy v42
   - 409 burn-rate page fired
   - 411 Dipika acknowledged, took command
   - 432 rollback to v41 — errors back to normal
   - 470 resolved; grade cache restored
   
   ## Root cause
   v42 removed the grade cache; the release load test did not match results-day traffic
   
   ## Action items
   - [Katrina] restore the grade cache with a test that fails without it (by 2 days)
   - [Aishwarya] results-day load test in the release checklist (by 1 week)
   - [Dipika] canary 5% for 15 min with burn-rate auto-rollback (by 2 weeks)
── the loop: signals → alerts on the SLO → incident → root cause → postmortem → action items → better signals

✅ done — the health room is watching
🎒 धडा 01 आधी: तुम्हाला फक्त Python 3 हवे — दुसरे काही नाही. Lab म्हणजे एक निकालाचा दिवस पुन्हा चालवणाऱ्या शिकवणीसाठीच्या models चा संच आहे; खरी साधने म्हणजे Prometheus, Grafana, OpenTelemetry, CloudWatch, Datadog — कल्पना आणि गणित तेच आहे. चांगले शेजारी: Scaling (load खाली तुम्ही काय पाहता), System Design (धडा 15 त्याचे नियोजन करतो) आणि Kubernetes.

🗺️ संपूर्ण चित्र — एक आकृती, पूर्ण कोर्स

संपूर्ण कोर्स एका कॅनव्हासवर. 4K आवृत्तीसाठी क्लिक करा.

The big picture: the signals (why observability, logs, metrics, percentiles), across services (tracing, OpenTelemetry, Prometheus and Grafana, alerting) and the reliability loop (SLOs, incident response, root cause, postmortems)

🩺 भाग 1 — signals (धडे 1–4)

एक git branch = एक कल्पना; branch 04 मध्ये धडे 01–04 आहेत. प्रत्येक आकडा obs/ मधून येतो — cloud account लागत नाही.

1

🩺 Observability का

शाळेचा आरोग्य कक्ष — monitoring तुम्ही आधी अंदाज केलेले पाहते; observability तुम्हाला system आधीच जे सांगते त्याबद्दल नवे प्रश्न विचारू देते.lesson-01-why-observabilityधडा वाचा →आकृती पहा ↗
2

📓 Logs

दैनंदिनी — structured JSON lines, levels, प्रत्येक ओळीत एक trace id, आणि काय कधीच लिहू नये.lesson-02-logsधडा वाचा →आकृती पहा ↗
3

📊 Metrics

तपासणी तक्ता — counters, gauges, histograms, labels, आणि cardinality चा सापळा.lesson-03-metricsधडा वाचा →आकृती पहा ↗
4

⏱️ Percentiles आणि histograms

हळू म्हणजे किती हळू — buckets मधून p50, p95, p99, आणि percentiles ची सरासरी कधीच का काढता येत नाही.lesson-04-percentilesधडा वाचा →आकृती पहा ↗

🧵 भाग 2 — services च्या पलीकडे (धडे 5–8)

एका request चा अनेक services मधून पाठलाग करा, सगळे एकाच पद्धतीने गोळा करा, आणि users ना जे जाणवते त्यावर alert करा.

5

🧵 Distributed tracing

एका विद्यार्थ्याचे प्रत्येक खोलीतून जाणारे मार्ग कार्ड — spans, critical path आणि traceparent header.lesson-05-tracingधडा वाचा →आकृती पहा ↗
6

🔭 OpenTelemetry

सगळे गोळा करण्याचा एकच मार्ग — SDK, OTLP, Collector, tail sampling आणि सामायिक नावे.lesson-06-opentelemetryधडा वाचा →आकृती पहा ↗
7

📈 Prometheus आणि Grafana

Scrape करा, साठवा, विचारा, काढा — /metrics, rate(), PromQL, histogram_quantile आणि dashboards.lesson-07-prometheus-grafanaधडा वाचा →आकृती पहा ↗
8

🚨 Alerting

Users ना त्रास होत असेल तेव्हाच कुणाला उठवा — कारणे नव्हे तर लक्षणे, आणि multi-window burn-rate alerts.lesson-08-alertingधडा वाचा →आकृती पहा ↗

🎯 भाग 3 — विश्वासार्हतेचे चक्र (धडे 9–12)

Signals चे निर्णयात रूपांतर करा: budgets, incidents, मूळ कारणे आणि टिकणारे उपाय.

9

🎯 SLIs, SLOs आणि error budgets

पुरेसे चांगले म्हणजे काय ते ठरवा — SLI, SLO, SLA, आणि कधी गती कमी करायची ते सांगणारे budget.lesson-09-slosधडा वाचा →आकृती पहा ↗
10

🧯 Incident response

अग्निशमन सराव — severity, भूमिका, संवाद, आधी mitigate करा, आणि चार घड्याळे: detect, acknowledge, mitigate, resolve.lesson-10-incident-responseधडा वाचा →आकृती पहा ↗
11

🔍 Root-cause analysis

हे खरोखर का घडले — बदलांशी जुळवून पाहा, पाच का, आणि प्रक्रियेतील हरवलेले संरक्षण.lesson-11-root-causeधडा वाचा →आकृती पहा ↗
12

📝 Postmortems आणि चक्र

मालक आणि तारखांसह दोषारोपविरहित अहवाल — आणि signals पासून अधिक चांगल्या signals पर्यंतचे चक्र.lesson-12-postmortemsधडा वाचा →आकृती पहा ↗
🗣️ हे मोठ्याने समजावून सांगा — धडा 12 नंतर: (1) logs, metrics आणि traces पैकी प्रत्येक कशाचे उत्तर देतो? (2) user_id label धोकादायक का आहे? (3) दोन servers चे p99 100 ms आणि 2,000 ms आहेत — 1,050 ms चूक का आहे? (4) traceparent header काय घेऊन जातो? (5) CPU ऐवजी burn rate वर alert का करायचे? (6) 99.9% SLO महिन्याला किती मिनिटे देतो? (7) incident मध्ये तुम्ही कोणती चार घड्याळे मोजता? (8) postmortem दोषारोपविरहित का असतो?
🎓 याच शाळेतून: System Design · Scaling · Kubernetes · API — तेच उपमा-विश्व, तीच branch-दर-branch पद्धत.

📐 धड्यांच्या आकृत्या — क्रमांक अनुसरा

प्रत्येक धडा एका क्रमांकित बॉक्स-आणि-बाण आकृतीत — स्वतंत्र पानावरही.

1 🩺 Observability का

शाळेचा आरोग्य कक्ष — monitoring तुम्ही आधी अंदाज केलेले पाहते; observability तुम्हाला system आधीच जे सांगते त्याबद्दल नवे प्रश्न विचारू देते.

🧒 सोप्या शब्दांत

विद्यार्थी आजारी वाटला तर शाळेचा आरोग्य कक्ष अंदाज लावत नाही. तो तक्ता तपासतो, दैनंदिनी वाचतो आणि विद्यार्थी कुठे कुठे गेला ते विचारतो. निकालाच्या दिवशी page तुटले. CPU ची घंटा 64 मिनिटे वाजली, पण पालकांना CPU कधीच जाणवत नाही. चांगल्या signals मुळे Dipika नवे प्रश्न विचारू शकते आणि खरे कारण शोधू शकते.

📖 नवे शब्दmonitoring — आधी ओळखलेल्या failures साठी dashboards, जसे CPU, disk किंवा 5xxobservability — system आधीच जे सांगते त्यातून नवे प्रश्न विचारणेsignal — system कडून मिळणारी खूण: log ओळ, metric किंवा tracethree signals — metrics सांगतात काहीतरी झाले, traces सांगतात कुठे, logs सांगतात का
1🩺 शाळेचा आरोग्य कक्ष — एका monitor भोवती तीन उपकरणे🩺 आरोग्य कक्षresults-apierror ratio 6.0% ▲परिचारिका (on-call)11:40:01 INFO 20011:40:02 ERROR 504 grade service timeout trace_id a3ce929d11:40:02 INFO 20011:40:03 ERROR 504📓 दैनंदिनी = LOGSका ते सांगते — प्रत्येक घटनेसाठी एक ओळधोक्याची रेषादर मिनिटाला errors📊 तक्ता = METRICSकाय ते सांगते — वेळेनुसार आकडेमार्ग कार्डइथे 865 ms ▲🧵 मार्ग कार्ड = TRACESकुठे ते सांगते — एक request, प्रत्येक खोली2🔭 monitoring विरुद्ध observabilitymonitoringतुम्ही आधीच विचारलेले प्रश्नCPUdisk5xx✓ माहीत असलेल्या बिघाडांसाठी स्वस्त आणि स्पष्ट✗ नव्या प्रकारच्या बिघाडाबद्दल आंधळे —तुम्ही code जोडता आणि तो पुन्हा होण्याची वाट पाहताobservabilityते जे पाठवते त्याबद्दल नवे प्रश्न विचाराकोणते पालक? कोणता route?route=/results/3Astatus=504version=v42trace a3ce929dकोणत्याही field नुसार विभागा — नवा code नको,उत्तर आधीच signals मध्ये आहे3🌡️ CPU चा सापळा — व्यस्त म्हणजे बिघडलेले नव्हेCPU % — एक निकालाचा दिवस, 480 मिनिटे80%64 मिनिटांत CPU > 80% ▮ — दिवसभर तोच करवतीसारखा आकारपालकांना काय जाणवते — दर मिनिटाला errorsहळूहळू गळती 0.9%deploy 6%CPU यांपैकी एकही सांगत नाही4🕚 निकालाचा दिवस, 11:40 — "पालक म्हणतात निकालाचे पान बिघडले आहे": metrics → traces → logs"निकालाचे पानबिघडले आहे!"— अनेक पालक📊METRICS काय ते सांगतातerror ratio उडी मारूनमिनिट 400 ला 6% झाला🧵TRACES कुठे ते सांगतातgrade service call:1,040 पैकी 865 ms📓LOGS का ते सांगतात"grade service timeout"status 504, a3ce929dउत्तर system आधीच पाठवत असलेल्या signals मधून येते — त्यांना एका trace id ने जोडाmonitoring: तुम्ही अंदाज केलेल्या बिघाडांसाठी dashboards · observability: नवे प्रश्न, नवा code नको
⏪ आधी

Dashboards फक्त आधी ओळखलेल्या failures पाहत, त्यामुळे CPU ची घंटा 64 मिनिटे वाजली आणि पालकांना मात्र तुटलेले page दिसले.

💡 काय

Observability म्हणजे शाळेचा आरोग्य कक्ष: system आधीच देत असलेल्या signals मधून, कधी न ठरवलेले प्रश्नही विचारता येतात.

⚙️ कसे

तीन signals एकत्र काम करतात: metrics सांगतात काहीतरी चुकले आहे, traces सांगतात कुठे, आणि logs सांगतात का.

🎯 का

निकालाच्या दिवशी 11:40 ला नवा code न जोडता आणि पुन्हा बिघडण्याची वाट न पाहता, results page का तुटले ते शोधता येते.

🚀 पुढे

पुढचा धडा दैनंदिनी उघडतो: structured JSON logs, levels, आणि प्रत्येक ओळीत एक trace id.

🧪 इथे करून पाहा — CPU धोक्याची रेषा 480 मिनिटांच्या निकालाच्या दिवसावर हलवा — आणि ती पालकांबद्दल काही सांगते का ते पाहा
80

संपूर्ण धडा 01 वाचा →

2 📓 Logs

दैनंदिनी — structured JSON lines, levels, प्रत्येक ओळीत एक trace id, आणि काय कधीच लिहू नये.

🧒 सोप्या शब्दांत

आरोग्य कक्ष एक दैनंदिनी ठेवतो. प्रत्येक ओळीत वेळ, किती गंभीर, काय झाले आणि कोणता विद्यार्थी हे असते. Katrina ती प्रत्येक वेळी त्याच नीटनेटक्या पद्धतीने लिहिते, म्हणजे नंतर शोधता येते. ती वर्ग 3A च्या फक्त ERROR ओळी मागते आणि नेमक्या 2 मिळतात. प्रत्येक ओळीत पूर्ण मार्गाकडे नेणारा trace id असतो.

📖 नवे शब्दstructured log — प्रत्येक ओळीत एक JSON object, मोकळ्या मजकुराऐवजी नावे असलेली fieldslevel — ओळ किती गंभीर आहे: DEBUG < INFO < WARN < ERRORtrace id — प्रत्येक ओळीतला सामायिक id जो दैनंदिनीला मार्ग कार्डाशी जोडतोnever log — passwords, tokens किंवा पूर्ण वैयक्तिक माहिती दैनंदिनीत कधीच लिहू नये
1📓 दैनंदिनी — प्रत्येक ओळीत एक JSON object, प्रत्येक field शोधता येणारेमोकळा मजकूर (जुनी पद्धत) — फक्त grep त्याला वाचू शकतो:11:40:02 ERROR something went wrong for parent 9 on 3A after 1000ms (grade svc?)structured (JSON lines) — त्याच चार घटना, प्रत्येक field एक column ज्यावर तुम्ही filter आणि मोजणी करू शकता:{"ts": "11:40:01", "level": "INFO", "msg": "results viewed", "route": "/results/3A", "status": 200, "ms": 92, "trace_id": "4bf92f35", "user": "parent-7"}{"ts": "11:40:02", "level": "ERROR", "msg": "grade service timeout", "route": "/results/3A", "status": 504, "ms": 1000, "trace_id": "a3ce929d", "user": "parent-9"}{"ts": "11:40:02", "level": "INFO", "msg": "results viewed", "route": "/results/3B", "status": 200, "ms": 88, "trace_id": "00f067aa", "user": "parent-2"}{"ts": "11:40:03", "level": "ERROR", "msg": "grade service timeout", "route": "/results/3A", "status": 504, "ms": 1000, "trace_id": "b7ad6b71", "user": "parent-4"}प्रत्येक event फाइलमध्ये एकच ओळ असते — इथे बसावे म्हणून तोडून दाखवली आहेlevel— किती गंभीरroute— कोणते पानstatus— पालकांना काय मिळालेtrace_id— logs ना traces शी जोडतोts · level · msg · मग तुम्हाला हवी ती fields — प्रत्येक service मध्ये तीच नावे2🔎 दैनंदिनीला प्रश्न विचारा — field नुसार query कराlevel=ERROR route=/results/3Aशोध→ 2 ओळी (4 पैकी) · trace ids [a3ce929d, b7ad6b71]11:40:02 ERROR 504 1000 ms"grade service timeout" parent-9trace a3ce929d11:40:03 ERROR 504 1000 ms"grade service timeout" parent-4trace b7ad6b71trace id वर click करा → त्या request चे मार्ग कार्ड उघडा (lesson 05)3🪜 levels — ओळ किती मोठ्याने बोलते?DEBUGdevelopers साठी तपशीलसहसा production मध्ये बंदINFOसामान्य घटना"results viewed"WARNविचित्र, पण हाताळलेलेयशस्वी झालेला retryERRORएक request अयशस्वी झाली"grade service timeout"DEBUG < INFO < WARN < ERROR — प्रत्येक service साठी किमान पातळी ठरवा4🚫 दैनंदिनीत कधीही काय असू नये"password":✗कधीच नाही: password, hash केलेला असला तरी"token":✗कधीच नाही: session किंवा API token"name + phone":✗कधीच नाही: पालकांचा फोन नंबर✓ प्रत्येक ओळीत एक request / trace id✓ ids, माणसे नाहीत: "user": "parent-9"✓ एक event = एक ओळ, fields ची नावे तीच
⏪ आधी

प्रत्येक server एका मोठ्या file मध्ये मोकळ्या मजकुराच्या ओळी लिहायचा, आणि outage मध्ये लोक grep ने वाचून अंदाज लावत.

💡 काय

Logs म्हणजे आरोग्य कक्षाची दैनंदिनी: प्रत्येक ओळीत एक JSON object, त्यात वेळ, level, message, route, status आणि trace id.

⚙️ कसे

level=ERROR route=/results/3A ही query नेमक्या 2 ओळी देते, आणि त्यांचे trace ids थेट हळू requests पर्यंत नेतात.

🎯 का

Structured ओळी filter करता येतात आणि मोजता येतात, आणि प्रत्येक ओळीतला trace id दैनंदिनीला मार्ग कार्डाशी जोडतो.

🚀 पुढे

पुढचा धडा तपासणी तक्ता काढतो: counters, gauges, histograms, labels आणि cardinality चा सापळा.

🧪 इथे करून पाहा — field नुसार दैनंदिनीत query करा — मग त्यात तुमची स्वतःची ओळ लिहा

पूर्ण lesson 02 वाचा →

3 📊 Metrics (तपासणी तक्ता)

तपासणी तक्ता — counters, gauges, histograms, labels, आणि cardinality चा सापळा.

🧒 सोप्या शब्दांत

तपासणी तक्त्यात गोष्टी नसतात, आकडे असतात. एक मोजणी फक्त वाढते, जसे आज तपासलेले विद्यार्थी. एक वर-खाली होते, जसे आत्ता थांबलेले विद्यार्थी. एक भेटी किती वेळ लागला त्यानुसार वाटते. Labels तक्ता route आणि status नुसार विभागतात: 6 ओळी. प्रत्येक विद्यार्थ्याचे नाव जोडले तर 300,000 ओळी. खूपच जास्त!

📖 नवे शब्दcounter — फक्त वाढणारा आकडा, जसे हाताळलेल्या requestsgauge — वर-खाली होणारा आकडा, जसे 137 वरची print queuehistogram — buckets मध्ये वाटलेल्या किंमतींची मोजणी, जसे le=0.1, 0.25, 0.5cardinality — labels किती time series बनवतात: 6 ठीक, 300,000 म्हणजे मोठे bill
1📊 तपासणी तक्ता — metric चे तीन प्रकारCOUNTER — फक्त वरच जातोhttp_requests_totalstatus 20009450status 40400030status 50000020फक्त value स्वतः फारसे सांगत नाही:त्याचा RATE विचारा (lesson 07)GAUGE — वर आणि खाली, आत्ता या क्षणीprint_queue_length050100150200137वाट पाहणारी प्रमाणपत्रेवापरातील memory, queue ची लांबी,तापमान — जसे आहे तसे वाचाHISTOGRAM — bucketshttp_request_duration_seconds10le 0.118le 0.2519le 0.519le 1.020le 2.520le +Infcumulative: "≤ 0.25 s" मध्ये "≤ 0.1 s" समाविष्ट आहेsum 3.657 s · count 202📄 GET /metrics — Prometheus वाचतो तो मजकूरcurl results-api:8080/metrics# HELP http_requests_total Requests served# TYPE http_requests_total counterhttp_requests_total{route="/results",status="200"} 9450http_requests_total{route="/results",status="404"} 30http_requests_total{route="/results",status="500"} 20# HELP print_queue_length Certificates waiting# TYPE print_queue_length gaugeprint_queue_length 137# HELP http_request_duration_seconds Request time# TYPE http_request_duration_seconds histogram..._bucket{le="0.1"} 10..._bucket{le="0.25"} 18..._bucket{le="0.5"} 19..._bucket{le="1.0"} 19..._bucket{le="2.5"} 20..._bucket{le="+Inf"} 20http_request_duration_seconds_sum 3.657http_request_duration_seconds_count 203💥 labels गुणाकार करतात — cardinality चा सापळाroute × status = 2 × 3 =6 series/results200404500/notices200404500प्रत्येक label ला मोजकीच, ठरलेली values:साठवायला स्वस्त, query करायला जलद+ user_id (50,000 पालक) → 2 × 3 × 50,000 =300,000प्रत्येक चौकोन ≈ 230 series (1,296 चौकोन ≈ 300,000)series ×50,000labels मध्ये user ids, emails किंवा पूर्ण URLs कधीही टाकू नका —ते LOGS आणि TRACES मध्ये ठेवा; labels फक्त route, status, method पुरते ठेवाcardinality = प्रत्येक label च्या values च्या संख्येचा गुणाकार
⏪ आधी

Teams logs शोधून गोष्टी मोजत, जे हळू आणि महाग होते, किंवा user_id label जोडून 300,000 series मिळवत.

💡 काय

Metrics म्हणजे तपासणी तक्ता: counters फक्त वाढतात, gauges वर-खाली होतात, histograms किंमती buckets मध्ये वाटतात.

⚙️ कसे

route आणि status labels सह http_requests_total मधून 6 time series बनतात; user_id जोडला तर 300,000 बनतात.

🎯 का

आकडे साठवायला स्वस्त आणि query साठी जलद असतात, म्हणून alerts आणि trends साठी उत्तम, जर labels कमी ठेवले तर.

🚀 पुढे

पुढचा धडा विचारतो हळू म्हणजे किती हळू: buckets मधून p50, p95 आणि p99, आणि percentiles ची सरासरी का खोटी ठरते.

🧪 इथे करून पाहा — requests मोजा, gauge हलवा, requests ची वेळ buckets मध्ये टाका — /metrics मजकूर बदलतो; मग labels चा गुणाकार करा

पूर्ण lesson 03 वाचा →

4 ⏱️ Percentiles आणि histograms

हळू म्हणजे किती हळू — buckets मधून p50, p95, p99, आणि percentiles ची सरासरी कधीच का काढता येत नाही.

🧒 सोप्या शब्दांत

बहुतेक विद्यार्थी आरोग्य कक्षातून सुमारे 100 ms मध्ये निघतात, पण एक 1200 ms थांबतो. सरासरी त्याला लपवते, म्हणून Aishwarya हळू टोक पाहते: p99. तिचे buckets रुंद आहेत, म्हणून ते 2200 ms सांगतात. आणि p99 2000 आणि 100 असलेल्या दोन खोल्यांची सरासरी 1050 होत नाही. खरा p99 2000 आहे. आधी मोजण्या एकत्र करा, मग काढा.

📖 नवे शब्दp50 — मधली वेळ: अर्ध्या भेटी यापेक्षा जलद होत्या, इथे 100 msp99 — हळू टोक: 100 पैकी फक्त 1 भेट यापेक्षा हळू, इथे 1200 msbucket — histogram मधली एक श्रेणी; percentile ची precision buckets ठरवतातaveraging percentiles — नेहमी चूक: खऱ्या 2000 ms ऐवजी 1050 ms
1⏱️ 20 requests buckets मध्ये — buckets मधून वाचलेले p50, p95, p99 विरुद्ध खरी values10 requestsle 0.1 s · cum 108 requestsle 0.25 s · cum 181 requestle 0.5 s · cum 190 requestsle 1 s · cum 191 requestle 2.5 s · cum 200 ms100 ms250 ms500 ms1,000 ms2,500 msप्रत्येक bucket एकाच रुंदीचा काढला आहे; bucket च्या आत scale रेषीय आहेते 20requestsp50: खरा 100 = buckets 100.0p95 खरा 400p95 buckets 500.0p99 खरा 1,200p99 buckets 2,200.0अचूक: 10 वी requestbucket च्या कडेवर बसतेhistogram_quantile() p99 कसा वाचतो: target = 0.99 × 20 = 19.8 वी requestcumulative 10, 18, 19, 19, 20 → 19.8 वी (1.0, 2.5] bucket मध्ये आहे (19 → 20)त्याच्या आत सरळ रेषा: 1.0 + (2.5 − 1.0) × (19.8 − 19) / (20 − 19) = 2.2 s → 2,200 msखरा p99 1,200 ms आहे — bucket ला फक्त "1 ते 2.5 s च्या दरम्यान" एवढेच माहीत असते. Buckets अचूकता ठरवतात: कडा तुमच्या SLO जवळ ठेवा (उदा. 300 ms, 1 s).p95: target 19 → (0.25, 0.5] bucket (18 → 19) → 0.25 + 0.25 × 1/1 = 0.5 s = 500 ms, खरा 400 ms2🚫 percentiles ची सरासरी काढता येत नाही — histograms एकत्र करा आणि पुन्हा गणना कराserver A · 100 requests95 × 100 ms5 × 2,000 msp99 = 2,000 msserver B · 100 requests100 × 100 msएकही हळू नाहीp99 = 100 ms✗ दोन p99 ची सरासरी: (2,000 + 100) ÷ 2 =1,050 msकोणत्याही request ला 1,050 ms लागले नाहीत; 200 पैकी 5 ना 2,000 ms लागले — म्हणजे 2.5%,म्हणून संपूर्ण service च्या सर्वात हळू 1% ला 2,000 ms लागतात, 1,050 नाहीचूकमिळवणेएकत्रित: A + B = 200 requests195 × 100 ms5 × 2,000 msrank = ceil(0.99 × 200) = 198क्रमाने: 1…195 या 100 ms,196…200 या 2,000 msखरा p99 = 2,000 msPromQL मध्ये: आधी sum by (le), मग quantile
⏪ आधी

Teams दोन servers चे p99, 2000 आणि 100 ms, यांची सरासरी 1050 ms सांगत, पण दोघांचा खरा p99 2000 ms होता.

💡 काय

Percentiles सांगतात हळू म्हणजे किती हळू: p99 म्हणजे अशी वेळ ज्यापेक्षा 100 पैकी फक्त 1 भेट हळू असते, रांगेचे हळू टोक.

⚙️ कसे

20 requests मधून खरा p99 1200 ms आहे, पण buckets 2200 ms सांगतात, कारण precision buckets ठरवतात.

🎯 का

Percentiles ची सरासरी काढता येत नाही; histograms एकत्र करून पुन्हा मोजा, आणि महत्त्वाच्या वेळांजवळ buckets ठेवा.

🚀 पुढे

पुढचा धडा एका request मागे प्रत्येक खोलीत जातो: spans, critical path आणि traceparent header.

🧪 इथे करून पाहा — latencies आणि bucket च्या कडा बदला — खरे percentiles विरुद्ध bucket चा अंदाज; मग दोन servers एकत्र करा
520000

पूर्ण lesson 04 वाचा →

5 🧵 Distributed tracing (मार्ग कार्ड)

एका विद्यार्थ्याचे प्रत्येक खोलीतून जाणारे मार्ग कार्ड — spans, critical path आणि traceparent header.

🧒 सोप्या शब्दांत

विद्यार्थिनी एका खोलीतून दुसऱ्या खोलीत मार्ग कार्ड घेऊन जाते. प्रत्येक खोली ती कधी आली आणि कधी गेली ते लिहिते. एका पालकाच्या request च्या कार्डावर एकूण 1040 ms दिसतात, आणि त्यातले 865 ms grade service मध्ये गेले. आता कोणी अंदाज लावत नाही. कार्डाचा नंबर header मधून पुढे जातो, म्हणून प्रत्येक खोली त्याच कार्डावर लिहिते.

📖 नवे शब्दtrace — संपूर्ण मार्ग कार्ड: spans चे झाड म्हणून एक requestspan — कार्डावरची एका खोलीची नोंद: service, सुरुवात आणि कालावधीcritical path — एकूण वेळ ठरवणारी spans ची साखळी; इथे grade servicetraceparent — एका service कडून पुढच्या service कडे trace id नेणारा header
1🧵 एका पालकाची request trace म्हणून — एकाच कालरेषेवर spans चे झाडspan (service)0 ms1,040 ms020040060080010001040 ms ✗GET /results/3Agateway40 msपालकांचे login तपासाauth40 msवर्गाची यादी load कराresults-api940 ms ✗गुण आणाresults-api60 msSELECT gradespostgres865 ms ✗grade service ला callgrade-servicecritical path (नारिंगी बाह्यरेषा): root पासून, सर्वात शेवटी संपणाऱ्या child मागे जात राहाGET /results/3A → गुण आणा → grade service ला call — 1,040 पैकी 865 ms grade service चे आहेतlogin जलद केले: 0 ms वाचले2✉️ मार्ग कार्ड एका header मधून प्रवास करते — traceparent (W3C Trace Context)gatewayspan 00f067aa…results-apispan गुण आणाgrade-servicespan grade callpostgresspan SELECTtraceparentप्रत्येक hop तोच trace id ठेवतो आणि स्वतःचा span id parent म्हणून टाकतो — त्यामुळे backend झाड पुन्हा उभारू शकतोtraceparent:00आवृत्ती-a3ce929d0e0e47364bf92f3577b34da6trace-id · 16 bytes = 32 hex · संपूर्ण request-00f067aa0ba902b7parent-id · 8 bytes = 16 hex · caller चा span-01flags · 01 = sampledlesson 02 मधील log ओळ trace_id a3ce929d घेऊन जाते — या trace चाच id (…a3ce929d0e0e4736) — म्हणून दैनंदिनीतील शोधथेट मार्ग कार्डवर उडी मारते, आणि एक हळू span परत त्याच्या log ओळींवर उडी मारतो. हा जोडच तर सगळा मुद्दा आहे.header शिवाय प्रत्येक service एक नवा trace सुरू करते, आणि मार्ग कार्ड न जोडलेल्या तुकड्यांत तुटते.
⏪ आधी

प्रत्येक service चे स्वतःचे logs होते, त्यामुळे 5 टप्प्यांपैकी कोणत्या टप्प्याने एका पालकाला 1040 ms थांबवले ते कोणालाच दिसत नव्हते.

💡 काय

Trace म्हणजे प्रत्येक खोलीतून जाणारे विद्यार्थ्याचे मार्ग कार्ड: spans चे झाड, प्रत्येकात service, सुरुवात आणि कालावधी.

⚙️ कसे

Trace id traceparent header मधून पुढे जातो; critical path दाखवतो की 1040 पैकी 865 ms grade service call घेतो.

🎯 का

अंदाज न लावता तुम्ही तो एक हळू टप्पा दुरुस्त करता, आणि तोच trace id मार्ग कार्डाला दैनंदिनीच्या ओळींशी जोडतो.

🚀 पुढे

पुढचा धडा सगळे एकाच पद्धतीने गोळा करतो: OpenTelemetry SDK, OTLP, Collector आणि tail sampling.

🧪 इथे करून पाहा — span कधी संपतो ते बदला — waterfall, tree आणि critical path त्यामागे येतात; मग एक traceparent बनवा
1651030

संपूर्ण धडा 05 वाचा →

6 🔭 OpenTelemetry

सगळे गोळा करण्याचा एकच मार्ग — SDK, OTLP, Collector, tail sampling आणि सामायिक नावे.

🧒 सोप्या शब्दांत

आधी प्रत्येक खोली स्वतःच्या प्रकारचा form भरायची. आता एकच form आणि एकच संकलन पेटी आहे. पेटी error असलेले प्रत्येक कार्ड आणि प्रत्येक हळू कार्ड ठेवते, आणि कंटाळवाण्यांपैकी फक्त 10 मधले 1. 1,000 कार्डांपैकी तिने 113 ठेवली आणि 887 टाकली, पण एकही error हरवला नाही.

📖 नवे शब्दOpenTelemetry — कोणत्याही भाषेत traces, metrics आणि logs साठी एक open standard SDKOTLP — SDK Collector ला signals पाठवण्यासाठी वापरतो तो protocolCollector — signals घेतो, batch करतो, sample करतो आणि कोणत्याही backend ला export करतोtail sampling — trace संपल्यावर ठरवणे: errors आणि हळू ठेवा, बाकीचे sample करा
1🔭 सगळे गोळा करण्याचा एकच मार्ग — SDK → OTLP → Collector → कोणताही backendresults-apiOTel SDK🧵traces📊metrics📓logsservice.name=results-apiएक SDK, तीन signalsOTLPgRPC :4317HTTP :4318OpenTelemetry Collector📥स्वीकाराOTLP, Prometheus,Jaeger formats आत📦batchspans चे गट करा —कमी, मोठे calls🎯sampletail: trace संपल्यानंतरनिर्णय घ्या📤exportपाठवाप्रत्येक backend कडेCollector config बदलून backend बदला —app चा code कधीच बदलत नाहीsidecar, node agent किंवा central gateway म्हणून चालतेTempo / JaegertracesPrometheusmetricsLoki / OpenSearchlogsX-Ray · Datadogकोणताही vendor2🎯 tail sampling — 1,000 traces आत, 113 ठेवले, 887 टाकले1,000 पूर्ण झालेले traces (प्रत्येकी एक ठिपका), जसे Collector ला दिसतातप्रत्येक error trace4 पैकी 4500 ms पेक्षा हळू प्रत्येक trace10 पैकी 10बाकीच्यांपैकी 10 मध्ये 1 (स्थानानुसार)100113 ठेवले100 + 4 errors + 9 हळू (एक हळू trace, #291, आधीच 10 मध्ये 1 म्हणून निवडला होता) = 113887 टाकले — कंटाळवाणे, जलद, यशस्वी traces3⚖️ head विरुद्ध tail, आणि सामायिक नावेhead sampling: सुरुवातीलाच निर्णय घ्यातो कसा संपेल हे कोणालाही कळण्याआधी दर 10 वा ठेवा;4 errors 249, 499, 749, 999 या स्थानांवर आहेत:head 100 traces ठेवते, 0 errors, 1 हळूtail 113 ठेवते: सगळे 4 errors, सगळे 10 हळूsemantic conventions — सगळीकडे तीच नावे:http.request.method = GEThttp.response.status_code = 504service.name = grade-serviceएका service साठी लिहिलेला dashboard किंवा queryप्रत्येक service साठी चालतो — आणिCollector ज्या प्रत्येक backend ला export करतो तिथेहीCollector trace संपेपर्यंत तोmemory मध्ये धरून ठेवतो — हीच tail sampling ची किंमत
⏪ आधी

प्रत्येक backend चा स्वतःचा agent आणि स्वतःची field names होती, आणि प्रत्येक trace ठेवल्याने bill traffic पेक्षा जलद वाढले.

💡 काय

OpenTelemetry म्हणजे गोळा करण्याची एकच पद्धत: app मधला एक SDK OTLP ने Collector ला पाठवतो, जो कोणत्याही backend ला export करतो.

⚙️ कसे

1,000 traces वर tail sampling प्रत्येक error, 500 ms वरचा प्रत्येक trace आणि बाकीचे 10 पैकी 1 ठेवते: 113 ठेवले, 887 टाकले.

🎯 का

सगळे 4 error traces आणि सगळे 10 हळू traces टिकतात, सामायिक names सगळीकडे जुळतात, आणि backend मोकळेपणाने बदलता येतो.

🚀 पुढे

पुढचा धडा scrape, store, query आणि चित्र: /metrics, rate(), PromQL, histogram_quantile आणि Grafana.

🧪 इथे करून पाहा — धड्यातील 1,000 traces चे tail-sample करा — नियम बदला, head sampling शी तुलना करा
50010

संपूर्ण धडा 06 वाचा →

7 📈 Prometheus & Grafana

Scrape करा, साठवा, विचारा, काढा — /metrics, rate(), PromQL, histogram_quantile आणि dashboards.

🧒 सोप्या शब्दांत

दर मिनिटाला एक मदतनीस प्रत्येक खोलीत जाऊन तिचे counters मोठ्या तक्त्यावर उतरवतो. त्याला scrape म्हणतात. एकदा एक खोली restart झाली आणि तिची मोजणी 150 वर आली, पण तक्त्याला reset आणि crash मधला फरक कळतो: rate सेकंदाला 8.1 च राहतो. मग Katrina एक छोटा प्रश्न टाइप करते आणि भिंतीवरचा screen उत्तर काढतो.

📖 नवे शब्दscrape — Prometheus दर 15 ते 60 s ला प्रत्येक target कडून /metrics ओढतोrate() — एका window मध्ये counter ची दर सेकंदाची वाढ; restarts सांभाळतोPromQL — query भाषा, जसे sum by (status) (rate(http_requests_total[5m]))Grafana — Prometheus series ना dashboards म्हणून काढणारा भिंतीवरचा screen
1📈 Prometheus दर 15–60 s ला /metrics PULL करते, series साठवते; Grafana ते काढतेresults-api-0:8080/metricsresults-api-1:8080/metricsresults-api-2:8080/metricsservice discovery ने सापडलेले targetsPrometheusTSDB:प्रत्येक label setसाठी एक seriesscrape (pull)उत्तर देणे थांबवणारा target → up == 0recording rulesजड queries आधीच मोजून ठेवाAlertmanagerroute · group · silenceGrafanaPrometheus ला PromQL मध्ये विचारते2🔄 पुन्हा सुरू होणारा counter — rate() ते सांभाळते01,0002,0000 s60 s120 s180 s240 s1,0001,6002,200150750app पुन्हा सुरू झाले+600+600+150+600घसरण = restart: पुन्हा शून्यापासून मोजा (+150, −2,050 नाही)(600 + 600 + 150 + 600) ÷ 240 s= 1,950 ÷ 240 = 8.1 requests/s3🧮 दर आठवड्याला तुम्ही टाइप कराल ते PromQLप्रति सेकंद requests, status नुसारsum by (status) (rate(http_requests_total[5m]))error ratio (धडा 09 चा SLI)sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))6%buckets मधून p99 latencyhistogram_quantile(0.99, sum by (le) (rate( http_request_duration_seconds_bucket[5m])))Prometheus: scrape, साठवा, alert · Grafana: काढा · recording rules: आधीच मोजा · Alertmanager: page पोहोचवाwindow वरचे rate() "आतापर्यंतची एकूण" ला "प्रति सेकंद" मध्ये बदलते — कच्चा counter कधीच graph करू नका
⏪ आधी

प्रत्येक server स्वतःचे graphs काढायचा, कोणालाच तुलना करता येत नव्हती, आणि restart नंतर counter reset crash सारखा दिसायचा.

💡 काय

Prometheus दर 15 ते 60 s ला /metrics ओढतो आणि series साठवतो; Grafana ते आरोग्य कक्षाच्या भिंतीवर काढतो.

⚙️ कसे

दर 60 s ला scrape केलेला counter 4 मिनिटांत 8.1 requests/s चा rate() देतो, जरी app 180 s ला restart झाले तरी.

🎯 का

rate() resets सांभाळतो, PromQL एका ओळीत नवे प्रश्न सोडवते, आणि histogram_quantile सगळ्या servers चा p99 देतो.

🚀 पुढे

पुढचा धडा वापरकर्त्यांना त्रास होतो तेव्हाच धोक्याची घंटा वाजवतो: causes नव्हे symptoms, आणि multi-window burn-rate alerts.

🧪 इथे करून पाहा — दर 60 s ला scrape होणारा counter — samples बदला (घसरण म्हणजे restart) आणि rate() काय म्हणते ते पाहा

संपूर्ण धडा 07 वाचा →

8 🚨 Alerting (धोक्याची घंटा)

Users ना त्रास होत असेल तेव्हाच कुणाला उठवा — कारणे नव्हे तर लक्षणे, आणि multi-window burn-rate alerts.

🧒 सोप्या शब्दांत

जुनी घंटा CPU व्यस्त झाला की वाजायची: 64 मिनिटांचा गोंगाट, आणि एकाही पालकाला जाणवले नाही. नवी घंटा त्याऐवजी पालकांचे ऐकते. हळू गळतीसाठी सकाळी पाहायचे ticket उघडते. अनेक पालकांना त्रास देणारा वाईट deploy सुरू झाल्यावर 9 मिनिटांनी मोठी धोक्याची घंटा वाजवतो. कोणालाही विनाकारण उठवले जात नाही.

📖 नवे शब्दsymptom alert — वापरकर्त्यांना जाणवणाऱ्या गोष्टीवर वाजते, जसे errors, CPU सारख्या causes वर नाहीburn rate — परवानगी असलेल्या वेगाच्या तुलनेत error budget किती जलद खर्च होतोpage — आत्ता कोणाला तरी उठवा: 1 h आणि 5 min मध्ये 14.4× burnticket — कामाच्या वेळेत दुरुस्त करा: 6 h आणि 30 min मध्ये 6× burn
1🚨 एक निकालाचा दिवस, 480 मिनिटे — burn-rate alerts वापरकर्त्यांना त्रास होत असेल तेव्हाच कोणाला तरी उठवतातburn rate (budget दराच्या ×; 1× = 0.1% errors = 99.9% SLO वर अगदी बरोबर) — log scale1×6× ticket14.4× page60×हे मिनिट1 h window6 h window(5 min / 30 min: तीच कल्पना)हळू गळती: 0.9% = 9× (मिनिटे 100–379)वाईट deploy: 6% = 60×TICKET266–390PAGE401–408435–458409: 1 h 14.8× AND 5 min 60× → PAGE266: 6 h reaches 6.0× (30 min 9×) → TICKETCPU %(एक कारण)80%060120180240300360420480दिवसाचे मिनिट →CPU > 80%: 64 alert मिनिटे निव्वळ गोंगाट — पालक ठीक असोत वा नसोत, तोच करवतीसारखा आलेखगळती 266 ला TICKET उघडते (कोणालाही उठवले नाही); deploy 409 ला PAGE करतो — सुरू झाल्यानंतर 9 मिनिटांनी; page 434 ला बंद होतो, rollback नंतर 2 मिनिटांनी2🪟 multi-window burn-rate नियम (Google SRE Workbook)alertburn rateलांब windowAND लहानम्हणजेPAGE≥ 14.4×1 h5 min30 दिवसांच्या budget पैकी 2% 1 h मध्येTICKET≥ 6×6 h30 min6 h मध्ये budget चे 5%burn rate = error ratio ÷ (1 − SLO) · 6% ÷ 0.1% = 60×लांब window: हे खरे आहे का? लहान window: हे अजूनही घडत आहे का? — लवकर वाजते, लवकर बंद होतेवापरकर्त्यांना जाणवणाऱ्या लक्षणांवर page; हळू जळण्यावर ticket; कारणांसाठी dashboards (pages नाही)3⏰ माणसाला काय उठवू शकते?पानerror ratio SLO वेगाने जाळत आहेबहुतेक वापरकर्त्यांसाठी p99 SLO च्या वरकधीच page करू नकाCPU > 80% · एक pod पुन्हा सुरू होत आहेdisk 70% (त्याचे ticket करा)log ओळीतील एक retry
⏪ आधी

CPU > 80% alerts नी 8 तासांत 64 मिनिटांचा गोंगाट केला, आणि त्यातला एकही पालकांना जाणवलेल्या त्रासाबद्दल नव्हता.

💡 काय

धोक्याची घंटा वापरकर्त्यांना त्रास होत असतानाच वाजली पाहिजे: CPU सारख्या causes वर नव्हे, errors सारख्या symptoms वर alert.

⚙️ कसे

Slow leak साठी ticket minute 266 पासून येते; वाईट deploy नंतर 9 मिनिटांनी, minute 409 ला page येतो.

🎯 का

दोन windows मुळे alerts लवकर वाजतात आणि लवकर थांबतात, म्हणून fast burn कोणाला तरी उठवतो आणि slow burn सकाळपर्यंत थांबतो.

🚀 पुढे

पुढचा धडा आकड्यांत ठरवतो पुरेसे चांगले म्हणजे काय: SLI, SLO, SLA आणि error budget (चुकांची मुभा).

🧪 इथे करून पाहा — 480 मिनिटांचा निकालाचा दिवस — SLO, burn-rate मर्यादा, windows आणि दोन घटना बदलून पाहा
14.4605636030960

संपूर्ण धडा 08 वाचा →

9 🎯 SLIs, SLOs आणि error budgets (चुकांची मुभा)

पुरेसे चांगले म्हणजे काय ते ठरवा — SLI, SLO, SLA, आणि कधी गती कमी करायची ते सांगणारे budget.

🧒 सोप्या शब्दांत

कोणताही आरोग्य कक्ष परिपूर्ण नसतो, म्हणून शाळा पुरेसे चांगले ठरवते: 30 दिवसांत 99.9% भेटी नीट व्हायला हव्यात. म्हणजे महिन्याला पूर्ण बंदीची 43.2 मिनिटे खर्च करायला उरतात. निकालाच्या दिवसाने त्यातला 10.7% खर्च केला. Budget उरला असेल तर शाळा नवे प्रयोग करू शकते. संपला की आधी थांबून दुरुस्ती करते.

📖 नवे शब्दSLI — मोजमाप: चांगल्या requests भागिले सगळ्या requestsSLO — ध्येय, जसे 30 दिवसांत 99.9%SLA — वचन मोडले तर दंड असलेला करारerror budget — चुकांची मुभा: 99.9% ला महिन्याला 43.2 मिनिटे
1🎯 SLI → SLO → SLA — "पुरेसे चांगले" म्हणजे काय ते आकड्यांत ठरवाSLIमोजमापचांगल्या requests ÷ सगळ्या requestsआज: 475,392 ÷ 480,000 = 99.04%SLOलक्ष्य (अंतर्गत)30 दिवसांत 99.9% चांगलेteam स्वतःला दिलेले वचनSLAकरार (बाह्य)थोडे सैल वचन + दंडमोडले तर पैसे परतSLI वापरकर्ते जिथे आहेत तिथून मोजा (load balancer किंवा page), CPU वरून नाही2⏳ nines — 30 दिवसांत किती पूर्ण outage चालतोSLO 99%432.0 min ≈ 7.2 hSLO 99.9%43.2 minSLO 99.99%4.3 min(1 − SLO)× 30 × 24 × 60प्रत्येक अतिरिक्त nine म्हणजे 10× कमी जागा — आणि सहसा 10× खर्च3🔋 error budget — एका वाईट दिवसाने महिन्याचा 10.7% वापरला89.3% उरलेआज वापरले: 4,608 = 10.7%30 दिवस × 1,000/min= 43,200,000 requests× 0.1% परवानगी= 43,200 अपयशbudgetहळू गळती 2,520 (5.8%)वाईट deploy 1,920 (4.4%)सामान्य 0.1% · 168 (0.4%)280 min × 9 + 32 min × 60 + 168 min × 1 = 8 तासांत 4,608 अयशस्वी requests4🚦 budget ठरवते — वादविवाद नाही🚀budget उरले → जलद ship कराप्रयोग, मोठे releases, नियोजित जोखीम🧊budget संपले → जोखमीचे बदल थांबवाआधी reliability दुरुस्त करा; फक्त सुरक्षित fixes ship होतात
⏪ आधी

Teams 'पुरेसे विश्वसनीय' यावर भावनेने वाद घालत, आणि 100% चे ध्येय ठेवत, त्यामुळे प्रत्येक release भांडण ठरायचे.

💡 काय

SLO म्हणजे आकड्यांत पुरेसे चांगले: SLI म्हणजे चांगल्या भागिले सगळ्या requests, आणि error budget म्हणजे खर्च करता येणाऱ्या चुका.

⚙️ कसे

30 दिवसांसाठी 99.9% SLO पूर्ण बंदीची 43.2 मिनिटे देतो; एका वाईट दिवसाने budget चा 10.7% वापरला, 89.3% उरला.

🎯 का

Budget वादाचे नियमात रूपांतर करतो: budget उरला तर जलद ship करा, budget संपला तर धोकादायक बदल थांबवा.

🚀 पुढे

पुढचा धडा अग्निशमन सराव घेतो: severity, भूमिका, updates, आधी mitigate, आणि incident ची चार घड्याळे.

🧪 इथे करून पाहा — एक SLO निवडा — outage मिनिटे, requests मधील budget, आणि आज किती वापरले ते पाहा
301000

संपूर्ण धडा 09 वाचा →

10 🧯 Incident response (घटनेला प्रतिसाद)

अग्निशमन सराव — severity, भूमिका, संवाद, आधी mitigate करा, आणि चार घड्याळे: detect, acknowledge, mitigate, resolve.

🧒 सोप्या शब्दांत

आगीची घंटा वाजली की कोणी इकडे-तिकडे धावत नाही. Dipika नेतृत्व घेते, Katrina दुरुस्तीचे काम करते आणि Aishwarya पालकांना काय चालले आहे ते सांगते. आधी rollback करून त्रास थांबवतात, आणि मगच कारण शोधतात. घड्याळे सांगतात: 9 मिनिटांत सापडले, 2 मध्ये स्वीकारले, 32 मध्ये थांबवले, 70 मध्ये पूर्ण.

📖 नवे शब्दincident commander — नेतृत्व करणारी आणि निर्णय घेणारी एक व्यक्ती; इथे Dipikaseverity — SEV1 बहुतेक पालकांना त्रास, SEV2 एक feature बंद, SEV3 छोटा गटmitigate — आधी त्रास थांबवा: rollback, बंद करा किंवा capacity वाढवाfour clocks — detect 9, acknowledge 2, mitigate 32, resolve 70 मिनिटे
1🧯 अग्निशमन सराव — मिनिट 400 ते 470, आणि चार घड्याळेप्रति मिनिट errors (1,000 पैकी)60 errors / min (6%)395400405410415420425430435440445450455460465470475🚀 398 deploy v42🔥 400 सुरू झाले🚨 409 DETECTED · page वाजते✋ 411 ACKNOWLEDGED · दीपिका↩️ 432 MITIGATED · v41 वर rollback✅ 470 RESOLVED · cache पुन्हा आलाशोधायला लागलेला वेळ: 9 minदखल घ्यायला लागलेला वेळ: 2 minनुकसान थांबवायला लागलेला वेळ: 32 minपूर्ण सोडवायला लागलेला वेळ: 70 minMTTD / MTTA / MTTM / MTTR म्हणजे अनेक incidents मधील या घड्याळांची सरासरी · वापरकर्त्यांना 32 मिनिटे त्रास झाला (≈ 1,920 अयशस्वी views)2👩‍🚒 भूमिका — प्रत्येक कामासाठी एक व्यक्ती, मोठ्याने नाव घेऊनDipikaincident commanderनिर्णय घेतो, काम वाटतो,घड्याळावर लक्ष ठेवतोKatrinaops leadकीबोर्डवर हात:v42 rollback करतोAishwaryaसंवादstatus page, पालक,मुख्याध्यापक+ एक लेखनिक घडत असताना timeline लिहितो (तीच पुढे postmortem बनते)commander debug करत नाही — कोणीतरी संपूर्ण आग पाहत राहिले पाहिजे3🎚️ severity ठरवते किती गोंगाट करायचाSEV1बहुतेक पालकांना निकाल दिसत नाहीतसगळ्यांना page · status page · दर 30 min ला अपडेटSEV2अनेकांसाठी एक feature बिघडलेon-call ला page · दर तासाला अपडेटSEV3कामगिरी घसरली, एक छोटा गटकामाच्या वेळेत दुरुस्त कराआधी MITIGATE करा, मग कारण शोधाrollback · बंद करा · क्षमता वाढवा
⏪ आधी

Page तुटल्यावर सगळे एकाच chat मध्ये उड्या मारत, कोणीच नेतृत्व करत नसे, आणि वापरकर्ते थांबलेले असताना लोक cause शोधत.

💡 काय

Incident response म्हणजे अग्निशमन सराव: severity, स्पष्ट भूमिका, नियमित updates, आणि आधी mitigate, मग cause शोधा.

⚙️ कसे

Dipika commander, Katrina ops lead, Aishwarya पालकांशी संवाद; detect 9, ack 2, mitigate 32, resolve 70 मिनिटे.

🎯 का

आधी rollback केल्याने वापरकर्त्यांचा त्रास 32 मिनिटांत थांबतो, आणि स्पष्ट भूमिकांमुळे पाच जण एकच काम करत नाहीत.

🚀 पुढे

पुढचा धडा विचारतो हे खरोखर का घडले: बदलांशी जुळवणी, पाच का, आणि नसलेले संरक्षण.

🧪 इथे करून पाहा — अग्निशमन सरावाची चार घड्याळे हलवा — metrics आणि नुकसान त्याप्रमाणे बदलतात
400409411432470

पूर्ण पाठ 10 वाचा →

11 🔍 मूळ कारणाचे विश्लेषण

हे खरोखर का घडले — बदलांशी जुळवून पाहा, पाच का, आणि प्रक्रियेतील हरवलेले संरक्षण.

🧒 सोप्या शब्दांत

Minute 400 ला errors उसळले. Katrina त्याच्या अगदी आधी काय बदलले ते पाहते: minute 398 ला एक deploy. मग ती पाच वेळा का विचारते. Errors का? एक हळू call. हळू का? Cache काढला. पकडले का नाही? Test ने 900 नव्हे 3 वर्ग वापरले. का? Checklist मध्ये खरी load test नाही. दुरुस्ती process मध्ये आहे.

📖 नवे शब्दcorrelate — errors कधी सुरू झाले ते अगदी आधीच्या बदलांशी जुळवणेsuspect deploy — errors च्या अगदी आधीचा बदल: minute 398 ला results-api v42five whys — दुरुस्त करता येईल अशा गोष्टीपर्यंत पोहोचेपर्यंत पुन्हा पुन्हा का विचारणेroot cause — बहुधा process मधले नसलेले संरक्षण, व्यक्ती नाही
1🔍 बदल आणि errors एका रेषेत मांडा — संशयित पहिल्या वाईट मिनिटाच्या अगदी आधीचा असतो30-min मागे पाहणे →5% — "वाईट"0.1%0.9%6%060120180240300360420480मिनिट →90 · config: cache TTL 60 s → 5 s250 · results-api v41 deploy398 · results-api v42 deploy432 · v41 वर rollbackसंशयित: v42first_bad_minute: error ratio पहिल्यांदा 5% ओलांडते ते मिनिट 400 ला · त्याआधीच्या 30 मिनिटांतील बदल: (398, "deploy results-api v42")correlation संशयित निवडते; errors थांबवणारा rollback (432) हा पुरावा आहे. 100 वरील leak हा 90 वरील config बदलाशी जुळतो — दुसरा धागा.2🪜 पाच का — हरवलेल्या संरक्षणापर्यंत खाली उतरा1का 1?पालकांना /results वर 504 दिसला2का 2?grade service call ला 1 s लागला आणि timeout झाला3का 3?v42 ने grade cache काढून टाकला, म्हणून प्रत्येक view grade service वर गेला4का 4?load test मध्ये 900 नव्हे, 3 वर्ग वापरले होते5का 5?release checklist मध्ये production सारखी load test नाहीमूळ कारण = PROCESS मधील हरवलेले संरक्षण3🙅 व्यक्ती नव्हेv42 ship करणाराengineer✗ "मानवी चूक"का-का खूप लवकर थांबवतेकुंपणातील फट✓ विचारा: SYSTEM ने तेपुढे का जाऊ दिले? — मग संरक्षण जोडाload test · canary · auto-rollback
⏪ आधी

Outages 'human error' या cause ने संपत, कोणाला तरी दोष दिला जायचा, आणि पुढच्या सत्रात तेच अपयश परत यायचे.

💡 काय

Root-cause analysis विचारते हे खरोखर का घडले: errors ना अलीकडच्या बदलांशी जुळवा, मग पाच वेळा का विचारा.

⚙️ कसे

Minute 400 ला errors 5% ओलांडतात; त्याआधीचा एकच बदल म्हणजे minute 398 चा संशयित deploy, results-api v42.

🎯 का

पाच का नसलेल्या संरक्षणापर्यंत पोहोचतात: release checklist मध्ये production सारखी load test नाही, दोष process चा, व्यक्तीचा नाही.

🚀 पुढे

पुढचा धडा अहवाल लिहितो: owners आणि dates सह blameless postmortem, आणि signals कडे परत जाणारे चक्र.

🧪 इथे करून पाहा — पहिले वाईट मिनिट आणि संशयित बदल शोधा — मग पाच का चढा
530

पूर्ण पाठ 11 वाचा →

12 📝 Postmortems आणि चक्र

मालक आणि तारखांसह दोषारोपविरहित अहवाल — आणि signals पासून अधिक चांगल्या signals पर्यंतचे चक्र.

🧒 सोप्या शब्दांत

सरावानंतर आरोग्य कक्ष अहवाल लिहितो. तो कोणालाही दोष देत नाही. काय बिघडले, किती वेळ आणि का ते सांगतो. मग तीन कामे लिहितो, प्रत्येकाला नाव आणि तारीख: Katrina cache परत आणते, Aishwarya खरी load test जोडते, Dipika छोटा आणि सावध rollout जोडते. पुढच्या निकालाच्या दिवशी signals अधिक चांगले असतात.

📖 नवे शब्दpostmortem — incident नंतरचा लेखी अहवाल: impact, timeline, cause, actionsblameless — बटण दाबणाऱ्या व्यक्तीकडे नव्हे, system कडे पाहणेaction item — एक owner आणि date असलेली दुरुस्ती, product work सारखी track केलेलीthe loop — signals → alerts → incident → root cause → अहवाल → अधिक चांगले signals
1📝 अहवाल — दोषारोपविरहित, जबाबदार व्यक्ती आणि तारखांसह# Postmortem: निकालाच्या दिवशी results page वर 504दोषारोपविरहित: आम्ही system कडे पाहतो, व्यक्तीकडे नाही.## परिणाम32 मिनिटे 6% results views अयशस्वी झाले(मिनिटे 400–431); ~1,900 पालकांना error दिसला## Timeline- 398 v42 deploy- 409 burn-rate page वाजले- 411 दीपिकाने दखल घेतली, नेतृत्व घेतले- 432 v41 वर rollback — errors पुन्हा सामान्य- 470 सोडवले; grade cache पुन्हा आला## मूळ कारणv42 ने grade cache काढून टाकला; release loadtest निकालाच्या दिवसाच्या traffic शी जुळत नव्हती## कृती मुद्दे[कतरिना]grade cache परत आणा, अशा test सहजी त्याशिवाय fail होते2 दिवसांत[ऐश्वर्या]निकालाच्या दिवसाची load testrelease checklist मध्ये1 आठवड्यात[दीपिका]15 min साठी canary 5%,burn-rate auto-rollback सह2 आठवड्यांतदोषारोपविरहित शब्दरचना✗ "ज्याने v42 deploy केले त्याने निकालाचा दिवस बिघडवला"✓ "v42 निकालाच्या दिवसाच्या load test शिवाय ship झाले,आणि 32 min च्या 6% error rate ला काहीही थांबवले नाही"मग लोक खरे सांगतात — आणि दुरुस्ती system मध्ये जातेप्रत्येक कृती: एक जबाबदार व्यक्ती, एक तारीख — product कामासारखा पाठपुरावा2🔁 चक्र — प्रत्येक incident signals अधिक चांगले करतो📡signalsतिन्ही🚨alertsSLO वर🧯incidentआधी नुकसान थांबवा🔍मूळ कारण5 का📝postmortemदोषारोपविरहित✅कृती मुद्देजबाबदार + तारखा✨अधिक चांगलेsignalsआरोग्य कक्षअधिक चांगला होतोप्रत्येक अग्निशमन सरावानंतर3🛡️ या निकालाच्या दिवसाने काय जोडलेgrade cache शिवाय fail होणारी testप्रत्येक release आधी निकालाच्या दिवसाची load testcanary 5% + burn-rate auto-rollbackलेखनिकाची timeline हाच अहवाल बनली
⏪ आधी

Outage नंतर लोक पुढे जात, fixes ना owner किंवा date नसे, आणि निकालाच्या दिवशीचे तेच अपयश पुढच्या वर्षी परत यायचे.

💡 काय

Postmortem म्हणजे आरोग्य कक्षाचा अहवाल: blameless, तो system कडे पाहतो, आणि प्रत्येक action item ला owner आणि date असते.

⚙️ कसे

अहवालात impact, timeline आणि root cause असतात, मग Katrina, Aishwarya आणि Dipika यांच्या नावाचे तीन action items.

🎯 का

चक्र असे चालते: signals, alerts, incident, root cause, अहवाल, fixes आणि अधिक चांगले signals, म्हणून प्रत्येक outage तुम्हाला मजबूत करते.

🚀 पुढे

पुढे कुठे: System Design school प्रत्येक box मध्ये signals ठरवते, Scaling काय पाहायचे ते दाखवते, Kubernetes ते चालवते.

🧪 इथे करून पाहा — postmortem लिहा — builder तपासतो की तो दोषारोपविरहित आहे आणि प्रत्येक कृतीला जबाबदार व्यक्ती व तारीख आहे

पूर्ण पाठ 12 वाचा →

धडा 01 सुरू करा → 🗓️ अभ्यास योजना (4 आठवडे) 📐 सर्व 12 धड्यांच्या आकृत्या 🧪 प्रश्नमंजुषा (16 प्रश्न) ⏮️ आधी काय होते & फायदे-तोटे