- आधुनिक distributed systems में पारंपरिक logging तरीकों की ऐसी संरचनात्मक सीमाएँ हैं कि वे सच्चाई नहीं बता पाते
- logs अब भी 2005-स्टाइल single-server environment को मानकर डिज़ाइन किए गए हैं, इसलिए कई services, databases और cache से गुजरने वाले request का context खो जाता है
- साधारण string search structure, relation, correlation को नहीं समझती, जिससे समस्या की जड़ तक पहुँचना मुश्किल हो जाता है
- इसका समाधान है कि हर request के लिए सभी context वाला एक single ‘Wide Event(या Canonical Log Line)’ छोड़ा जाए
- इससे logs सिर्फ text नहीं रहते, बल्कि analyzable data asset में बदल जाते हैं
लॉगिंग की मूल समस्या
- मौजूदा logs monolithic server युग को ध्यान में रखकर बनाए गए थे, इसलिए वे आज की distributed service architecture को reflect नहीं करते
- एक request कई services, DB, cache और queue से होकर गुजरता है, लेकिन logs अब भी single server के हिसाब से लिखे जाते हैं
- उदाहरण logs में एक request पर 13 lines बनती हैं, इसलिए 10,000 concurrent users पर प्रति सेकंड 130,000 lines निकलती हैं, लेकिन इनमें से अधिकतर अर्थहीन जानकारी होती है
- समस्या आने पर सबसे ज़रूरी चीज़ context होती है, लेकिन मौजूदा logs में वही नहीं होता
string search की सीमाएँ
- जब कोई user रिपोर्ट करता है कि “payment नहीं हो रहा”, तब email या user_id से logs खोजने पर भी कोई consistent structure न होने के कारण उपयोगी नतीजे मिलना मुश्किल होता है
- एक ही user ID
user-123, user_id=user-123, {"userId":"user-123"} जैसी दर्जनों अलग forms में रिकॉर्ड हो सकती है
- services के बीच log format अलग-अलग होने से related events को trace करना असंभव हो जाता है
- मूल समस्या यह है कि logs को write के लिए डिज़ाइन किया गया है, query के लिए optimize नहीं किया गया
मुख्य अवधारणाओं की परिभाषा
- Structured Logging: strings की जगह key-value (JSON) format में रिकॉर्ड करने का तरीका
- Cardinality: किसी field के unique values की संख्या; उदाहरण के लिए
user_id बहुत high होता है
- Dimensionality: किसी log event में fields की संख्या; जितनी अधिक होगी, analysis की संभावना उतनी अधिक होगी
- Wide Event / Canonical Log Line: प्रति request एक context-rich single log event
- अधिकांश logging systems high-cardinality data को cost कारणों से सीमित करते हैं, जबकि वास्तव में debugging के लिए वही सबसे उपयोगी होता है
OpenTelemetry की सीमाएँ
- OpenTelemetry(OTel) एक protocol और SDKs का set है, जो सिर्फ data collection और transport का standard देता है
- लेकिन OTel यह काम नहीं करता
- क्या log करना है, यह तय नहीं करता
- business context (जैसे subscription tier, cart amount आदि) अपने आप नहीं जोड़ता
- developer की logging mindset नहीं बदलता
- एक ही library इस्तेमाल करने पर भी, जानबूझकर context जोड़कर की गई instrumentation और साधारण instrumentation के debugging experience में बहुत बड़ा फर्क होता है
- OTel सिर्फ plumbing है; उसमें क्या बहाना है, यह developer को तय करना होता है
Wide Event / Canonical Log Line तरीका
- पारंपरिक “code क्या कर रहा है” वाली logging से हटकर, “request के साथ क्या हुआ” यह रिकॉर्ड करना चाहिए
- हर request के लिए service स्तर पर एक व्यापक event बनाया जाए
- इसमें request, user, payment, error, environment आदि के 50 से अधिक fields शामिल हो सकते हैं
- उदाहरण JSON में
user_id, subscription_tier, service_version, error_code जैसे debugging के लिए ज़रूरी सभी context शामिल होते हैं
- इससे एक ही search में “premium users की payment failure का कारण” जैसी चीज़ों का तुरंत analysis संभव हो जाता है
Wide Event की query में उपयोगिता
- Wide Event को साधारण text search की तरह नहीं, बल्कि structured data query की तरह handle किया जाता है
- high-cardinality और high-dimensional data के आधार पर real-time analysis स्तर की debugging संभव होती है
- उदाहरण: “पिछले 1 घंटे में premium users की payment failure rate को error code के हिसाब से aggregate करो” जैसी query तुरंत चलाई जा सकती है
implementation pattern
- पूरे request lifecycle के दौरान event तैयार किया जाए, और अंत में सिर्फ एक बार output किया जाए
- middleware में
request_id, timestamp, method, path जैसे base fields initialize करें
- handler में user, cart, payment, error जानकारी को धीरे-धीरे जोड़ें
- आखिर में
logger.info(event) से एक single JSON event रिकॉर्ड करें
sampling से cost control
- प्रति request 50 से अधिक fields रिकॉर्ड करने पर cost तेज़ी से बढ़ सकती है, इसलिए sampling ज़रूरी है
- साधारण random sampling में errors छूट जाने का जोखिम रहता है
- Tail Sampling strategy का सुझाव
- errors (जैसे 500) हमेशा store करें
- slow requests (p99 से ऊपर) हमेशा store करें
- VIP users या specific flag sessions हमेशा store करें
- बाकी में सिर्फ 1~5% को random sample करें
- इससे cost reduction और critical events preservation दोनों साथ हासिल किए जा सकते हैं
आम गलतफहमियाँ
- Structured Logging ≠ Wide Event: सिर्फ JSON format काफी नहीं है, context ही असली चीज़ है
- OpenTelemetry का उपयोग ≠ complete observability: यह सिर्फ collection को standardize करता है, क्या रिकॉर्ड करना है यह developer पर निर्भर है
- यह Tracing जैसा नहीं है: tracing services के बीच flow दिखाता है, जबकि Wide Event service के अंदर का context देता है
- logs debugging के लिए, metrics dashboard के लिए जैसी विभाजन रेखा अनावश्यक है — Wide Event दोनों काम कर सकता है
- high-cardinality data महँगा होता है वाली सोच पुरानी हो चुकी है; ClickHouse, BigQuery जैसे modern DBs इसे efficiently handle कर सकते हैं
Wide Event अपनाने का असर
- debugging archaeology से analytics में बदल जाती है
- “user payment failure” खोजने के लिए 50 services के logs पर grep चलाने के बजाय,
“premium users की payment failure rate को error code के हिसाब से देखो” जैसे single-query based analysis पर शिफ्ट हो जाता है
- नतीजतन logs झूठ बोलने वाले tool से, सच बताने वाले data asset में बदल जाते हैं
अभी कोई टिप्पणी नहीं है.