ऑब्ज़र्वेबिलिटी और निगरानी: इंजीनियरिंग टीमों के लिए सम्पूर्ण मार्गदर्शिका

हर इंजीनियरिंग टीम प्रोडक्शन पर नज़र रखती है। बहुत कम टीमें «सिस्टम ऐसा व्यवहार क्यों कर रहा है?» का उत्तर लंबी छानबीन के बिना दे पाती हैं। निगरानी और ऑब्ज़र्वेबिलिटी का फ़र्क़ औज़ार का चुनाव नहीं — यह रचना का दर्शन है, जो तय करता है कि आपकी टीम अनदेखे प्रकार की विफलताओं को कितनी तेज़ी से समझेगी और सँभालेगी।

परंपरागत निगरानी यह मान लेती है कि आपको पता है किस चीज़ पर नज़र रखनी है। आप CPU की सीमाएँ तय करते हैं, स्थिति-कोड देखते हैं, और डिस्क 90% भरते ही किसी को जगा देते हैं। ज्ञात विफलताओं के लिए यह काम करता है। पर आधुनिक वितरित सिस्टम ऐसे टूटते हैं जिनकी किसी पटल ने कल्पना नहीं की थी: किसी एक सेवा में विलंब का सूक्ष्म बिगाड़ एक क़तार को जाम कर देता है, जो डेटाबेस के कनेक्शन-पूल के ख़ाली होने के रूप में दिखता है और केवल भीड़ के समय सतह पर आता है। भीतरी अवस्था के बारे में मनचाहे सवाल पूछने की क्षमता के बिना आप अंधेरे में उड़ रहे हैं।

ऑब्ज़र्वेबिलिटी बुनियादी निगरानी से आगे क्यों है

ऑब्ज़र्वेबिलिटी किसी सिस्टम का वह गुण है जिससे उसकी बाहरी अभिव्यक्तियों से भीतरी अवस्था का अनुमान लगाया जा सके। निगरानी बताती है कि कुछ ग़लत है; ऑब्ज़र्वेबिलिटी यह जानने देती है कि ग़लत क्या हुआ — तब भी जब आपने उस विशेष विफलता की कभी भविष्यवाणी नहीं की थी। यह भेद निर्णायक है: निगरानी चेतावनी-चालित और पटल-बँधी है, ऑब्ज़र्वेबिलिटी प्रश्न-चालित और आँकड़ा-समृद्ध।

जब आपका सिस्टम लॉग, मेट्रिक और ट्रेस में उच्च विविधता वाले संरचित आँकड़े देता है, तो आप घटनाओं को जोड़ सकते हैं, विशिष्ट उपयोगकर्ताओं या अनुरोधों तक उतर सकते हैं, और उन घटनाओं का मूल कारण खोज सकते हैं जिन्हें कोई सीमा-आधारित चेतावनी कभी न पकड़ती। ऑब्ज़र्वेबिलिटी में निवेश करने वाली टीमें समाधान का औसत समय एक कोटि तक घटा लेती हैं, क्योंकि वे अनुमान में कम और प्रमाण पर कार्रवाई में अधिक समय लगाती हैं।

«निगरानी बताती है कि सिस्टम चल रहा है या नहीं। ऑब्ज़र्वेबिलिटी आपको पूछने देती है कि क्यों नहीं चल रहा। दूसरी बात उन सिस्टमों को चलाने की पूर्वशर्त है जिन्हें आप पूरी तरह नहीं समझते — यानी प्रोडक्शन के हर सिस्टम को।»

तीन स्तंभ: लॉग, मेट्रिक और ट्रेस

ऑब्ज़र्वेबिलिटी की दुनिया तीन पूरक क़िस्म के आँकड़ों पर टिकी है, हर एक का अपना काम। इन्हें अलग-अलग कोठरियों के बजाय एक जुड़ा हुआ संकेत मानना ही असरदार छानबीन की कुंजी है।

लॉग: घटनाओं का अपरिवर्तनीय लेखा

लॉग अलग-अलग घटनाओं के समय-अंकित लेखे हैं। यह सबसे बारीक संकेत है, जो ठीक-ठीक दर्ज करता है कि किसी ख़ास क्षण पर क्या हुआ। अच्छी तरह गढ़ी गई लॉग-पंक्ति में इतना संदर्भ होता है — अनुरोध का पहचानक, सेवा का नाम, अवधि, त्रुटि का ब्योरा — कि कई स्रोतों को मिलाए बिना निष्पादन का रास्ता फिर से बनाया जा सके।

सबसे आम ग़लती है लॉग को असंरचित पाठ मान लेना। सपाट फ़ाइलों में खोजना तब चलता था जब तीन सर्वर थे। बड़े पैमाने पर असंरचित लॉग शोर हैं। हर पंक्ति पढ़ी जा सकने योग्य होनी चाहिए, उसमें संरचित मेटाडेटा हो, और वह आपकी वास्तुकला की हर सेवा में एक जैसी योजना का पालन करे।

मेट्रिक: समय के साथ जुटाए गए माप

मेट्रिक आपके सिस्टम की अवस्था के संख्यात्मक चित्र हैं, जो अंतराल पर लिए जाते हैं। ये किफ़ायती भंडारण और तेज़ जुटान के लिए बने हैं। ये «प्रति सेकंड कितने अनुरोध?» और «99वें प्रतिशतक पर विलंब कितना?» जैसे सवालों का उत्तर देते हैं। लॉग के विपरीत ये हर अनुरोध का ब्योरा छोड़ देते हैं — बारीकी के बदले संपीड़न और गति लेते हैं।

मानक प्रकार — गणक, मापक, हिस्टोग्राम और सारांश — अलग-अलग काम आते हैं। गणक संचयी मान रखते हैं, जैसे कुल अनुरोध। मापक क्षणिक मान दर्ज करते हैं, जैसे स्मृति का उपयोग। हिस्टोग्राम प्रेक्षणों को समायोज्य खाँचों में बाँटते हैं, जैसे विलंब के वितरण के लिए। सही प्रकार चुनना भ्रामक जुटान और व्यर्थ विविधता से बचाता है।

ट्रेस: अनुरोध का पूरा जीवन-चक्र

वितरित ट्रेस एक ही अनुरोध का पीछा करते हैं जब वह सेवाओं की सीमाएँ पार करता है। हर ट्रेस खंडों से बना होता है — नामित संक्रियाएँ, जिनके आरंभ और अंत के समय-चिह्न किसी सेवा या फ़ंक्शन के किए काम को दर्ज करते हैं। माइक्रोसर्विस वास्तुकला में अनुरोध का पूरा जीवन-चक्र फिर से बना सकने वाला यही एकमात्र संकेत है।

ट्रेस के बिना धीमे पृष्ठ-लोड का दोष उन दर्जनों सेवाओं में से किसी पर भी मढ़ा जा सकता है। ट्रेस के साथ आप पहचान लेते हैं कि अड़चन उपयोगकर्ता-सेवा की वह डेटाबेस क्वेरी है जो 800 मिलीसेकंड लेती है, जबकि बाक़ी हर खंड 50 से कम में पूरा हो जाता है। यह सटीकता अकेले लॉग या मेट्रिक से असंभव है।

«लॉग बताते हैं कि क्या हुआ। मेट्रिक बताते हैं कि कितनी बार हुआ। ट्रेस बताते हैं कि सब कैसे जुड़ता है। प्रोडक्शन की किसी घटना से बिना अनुमान लगाए पार पाने के लिए तीनों चाहिए।»

OpenTelemetry की स्थापना और उपकरण-सज्जा

OpenTelemetry टेलीमेट्री बनाने, जुटाने और भेजने का उद्योग-मानक है। यह अलग-अलग भाषाओं में एक ही समुच्चय के इंटरफ़ेस और किट देता है, जो लॉग, मेट्रिक और ट्रेस को विक्रेता-तटस्थ रूप में निकालते हैं। इसे अपनाने से किसी एक विक्रेता से बँधने की मजबूरी मिटती है और आपकी उपकरण-सज्जा तब भी काम करती है, चाहे आप कोई व्यावसायिक मंच लें या अपनी शृंखला बनाएँ।

स्वचालित बनाम हस्तचालित उपकरण-सज्जा

अधिकांश किटें स्वचालित उपकरण-सज्जा देती हैं — लोकप्रिय ढाँचों और लाइब्रेरियों में बिना कोड के काँटे। एक ही आरंभीकरण-कॉल HTTP सर्वर, डेटाबेस क्लाइंट, संदेश-क़तार और gRPC कॉल को सज्जित कर सकती है। स्वचालित ढंग आम रास्ते ढक लेता है, पर व्यापार के लिए निर्णायक कोड-पथों, अपने मध्यवर्ती सॉफ़्टवेयर और डोमेन की संक्रियाओं के लिए हस्तचालित सज्जा चाहिए।

import { NodeSDK } from "@opentelemetry/sdk-node";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-grpc";
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-grpc";
import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
import { ExpressInstrumentation } from "@opentelemetry/instrumentation-express";
import { PgInstrumentation } from "@opentelemetry/instrumentation-pg";
import { Resource } from "@opentelemetry/resources";
import { SEMRESATTRS_SERVICE_NAME } from "@opentelemetry/semantic-conventions";

const sdk = new NodeSDK({
  resource: new Resource({
    [SEMRESATTRS_SERVICE_NAME]: "payment-service",
  }),
  traceExporter: new OTLPTraceExporter({
    url: "http://otel-collector:4317",
  }),
  metricExporter: new OTLPMetricExporter({
    url: "http://otel-collector:4317",
  }),
  instrumentations: [
    new HttpInstrumentation(),
    new ExpressInstrumentation(),
    new PgInstrumentation(),
  ],
});

sdk.start();
process.on("SIGTERM", () => sdk.shutdown());

OpenTelemetry संग्राहक की बनावट

OpenTelemetry संग्राहक एक विक्रेता-तटस्थ बिचौलिया है जो टेलीमेट्री लेता है, संसाधित करता है और आगे भेजता है। यह किसी भी प्रोडक्शन ऑब्ज़र्वेबिलिटी शृंखला की रीढ़ है। हर मेज़बान पर या Kubernetes के भीतर समूह के रूप में संग्राहक रखना उपकरण-सज्जा को गंतव्य के चुनाव से अलग कर देता है, और आपको आँकड़े मंच तक पहुँचने से पहले बाँधने, छानने, नमूने लेने और बदलने देता है।

संग्राहकों में ऐसे संसाधक लगाए जा सकते हैं जो ट्रेस पूरा होने के बाद नमूना लेते हैं: वे धीमे या त्रुटिपूर्ण अनुरोधों के पूरे ट्रेस रखते हैं और स्वस्थ यातायात का अधिकांश छोड़ देते हैं। इससे भंडारण की लागत नाटकीय रूप से घटती है, पर जिन अनुरोधों की सबसे अधिक ज़रूरत है उनकी छानबीन की क्षमता बनी रहती है।

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
    timeout: 1s
    send_batch_size: 1024
  memory_limiter:
    check_interval: 1s
    limit_mib: 512
  filter:
    error_mode: ignore
    traces:
      span:
        - 'attributes["http.target"] == "/healthz"'
        - 'attributes["http.target"] == "/metrics"'
  attributes:
    actions:
      - key: environment
        value: production
        action: upsert

exporters:
  otlp:
    endpoint: "collector.example.com:443"

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, filter, batch, attributes]
      exporters: [otlp]
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, batch, attributes]
      exporters: [otlp]
    logs:
      receivers: [otlp]
      processors: [memory_limiter, batch, attributes]
      exporters: [otlp]

संरचित लॉगिंग के ढर्रे

संरचित लॉगिंग का अर्थ है लॉग की प्रविष्टियाँ मशीन-पठनीय रूप में — आमतौर पर JSON में — और सेवाओं के बीच एक जैसे क्षेत्र-नामों के साथ निकालना। इससे लॉग खोज की समस्या से हटकर प्रश्न की समस्या बन जाते हैं। जब हर टीम अनुरोध-पहचानक, सेवा-नाम, त्रुटि-कोड और अवधि के लिए एक ही परिपाटी अपनाती है, तो आप बिना अपने विश्लेषक लिखे पूरी बुनियाद पर तात्कालिक प्रश्न चला सकते हैं।

लॉग की योजना गढ़ना

हर संरचित लॉग-घटना में कम से कम ये गुण होने चाहिए: समय-चिह्न, गंभीरता का स्तर, सेवा का नाम, ट्रेस का पहचानक, खंड का पहचानक और संदेश। इनसे आगे डोमेन के क्षेत्र जोड़िए, पर नामों की परिपाटी निभाइए। मसलन, एक ही वर्तनी रखिए, उपयोगकर्ता से जुड़े क्षेत्रों पर एक साझा उपसर्ग लगाइए, और त्रुटि का ब्योरा संदेश में जोड़ने के बजाय एक नेस्टेड वस्तु में रखिए।

  • लॉग को ट्रेस से जोड़ने के लिए हमेशा trace_id और span_id शामिल कीजिए
  • ऐसा लॉग-स्तर (debug, info, warn, error) लीजिए जो कार्रवाई योग्य संकेतों से मेल खाए, न कि लिखने वाले की सुविधा से
  • संवेदनशील आँकड़े — निजी जानकारी, गुप्त कुंजियाँ या टोकन — कभी लॉग में न डालिए, विकास परिवेश में भी नहीं
  • संदेश स्थिर रखिए और बदलते आँकड़े संरचित क्षेत्रों में डालिए, ताकि उन्हें जुटाया जा सके
  • सभी सेवाओं में समय-चिह्न का रूप एक कीजिए — RFC 3339 या यूनिक्स मिलीसेकंड

आम फंदे

सबसे महँगी ग़लती है ज़रूरत से ज़्यादा लॉग करना। उपयोगकर्ता-पहचानक या पते जैसे उच्च विविधता वाले क्षेत्र लॉग की मात्रा कई कोटि बढ़ा सकते हैं। भारी डीबग लॉग के लिए नमूनाकरण लीजिए और विस्तृत लॉगिंग को विशिष्ट ट्रेस या त्रुटि की स्थितियों के लिए बचा रखिए। दूसरी ग़लती है नामों की असंगति — एक सेवा user_id, दूसरी customerId, तीसरी user.id उपयोग करे तो बिना रूपांतरण-परत के सेवाओं के आर-पार प्रश्न असंभव हो जाते हैं।

«जिस लॉग-पंक्ति से प्रश्न न किया जा सके, उसका न होना बराबर है। संरचित लॉगिंग पढ़ने में आसानी की बात नहीं — यह हर प्रविष्टि को आपके ऑब्ज़र्वेबिलिटी मंच का प्रथम-श्रेणी नागरिक बनाने की बात है।»

माइक्रोसर्विस में वितरित ट्रेसिंग

माइक्रोसर्विस वास्तुकला की छानबीन के लिए वितरित ट्रेसिंग सबसे कारगर औज़ार है। बीस सेवाओं में फैला एक ट्रेस ठीक-ठीक बताता है कि समय कहाँ जा रहा है, कौन-से अनुरोध विफल हो रहे हैं और त्रुटियाँ कैसे फैलती हैं। ट्रेस के बिना धीमे ख़रीद-प्रवाह की छानबीन का मतलब है दर्जन भर सेवाओं के लॉग देखना और कार्य-कारण का अनुमान लगाना।

ट्रेस-संदर्भ का प्रसार

ट्रेस-संदर्भ हर सेवा-सीमा पर आगे बढ़ना चाहिए — HTTP शीर्षक, संदेश-क़तार के मेटाडेटा, gRPC मेटाडेटा, और यहाँ तक कि निर्धारित कार्यों या पृष्ठभूमि प्रक्रियाओं जैसी असमकालिक सीमाओं के पार भी। HTTP, gRPC और संदेश-व्यवस्था के लिए इसकी लाइब्रेरियाँ उपयोग करने पर OpenTelemetry यह ख़ुद संभाल लेता है। ट्रेस का पहचानक प्रवेश-द्वार से हर अगली सेवा तक बहता है और रास्ते में खंड जुटाता जाता है।

  • सभी प्रवेश-बिंदु सज्जित कीजिए: API द्वार, भार-संतुलक, प्रवेश-नियंत्रक
  • संदेश-क़तारों के पार संदर्भ शीर्षकों या संदेश के मेटाडेटा से आगे बढ़ाइए
  • लॉग के आउटपुट में ट्रेस-पहचानक डालिए, ताकि लॉग और ट्रेस जोड़े जा सकें
  • ऐसा नमूनाकरण लीजिए जो त्रुटि या उच्च विलंब वाले ट्रेस सुरक्षित रखे
  • व्यापार-संदर्भ के लिए खंडों में अपने गुण जोड़िए — ग्राहक की श्रेणी, उत्पाद का कोड, क्षेत्र

ट्रेस पढ़ना और समझना

अच्छी तरह चिह्नित ट्रेस अनुरोध का निर्णायक रास्ता उजागर करता है। सबसे लंबी अवधि वाले खंड पर ध्यान दीजिए — वही आपकी अड़चन है। त्रुटि की घटनाओं या बहुत अलग-अलग गुणों वाले खंड खोजिए। सफल और विफल अनुरोधों के ट्रेस मिलाकर ढर्रे पहचानिए। अगर ट्रेस लगातार दिखाएँ कि कोई ख़ास निचला कॉल समय पार कर रहा है, तो आपके पास निर्भरता की समस्या है, अनुप्रयोग का बग नहीं।

चेतावनियाँ: किस पर चेताएँ और थकान से कैसे बचें

चेतावनी की थकान घटना-प्रतिक्रिया के लिए सबसे बड़ा ख़तरा है। जब किसी टीम को एक पाली में पचास चेतावनियाँ मिलती हैं, तो हर चेतावनी अनदेखी होने लगती है। अच्छी रणनीति का उद्देश्य हर विसंगति पकड़ना नहीं — बल्कि ऐसी छोटी, उच्च-संकेत सूचनाएँ देना है जिनके लिए मानवीय निर्णय चाहिए। बाक़ी सब किसी पटल या लॉग-प्रश्न का विषय है।

स्तरों की व्यवस्था

चेतावनियों को तीन स्तरों में बाँटिए। पहला स्तर तुरंत ड्यूटी वाले को जगाता है, क्योंकि वह उपयोगकर्ता को दिखने वाली समस्या बताता है — त्रुटि की ऊँची दर, सेवा का पूरी तरह ठप होना, या त्रुटि-बजट का सीमा से अधिक तेज़ ख़र्च। दूसरा स्तर अगले कार्य-दिवस की छँटाई के लिए टिकट बनाता है — बढ़ा हुआ विलंब, कमज़ोर पर चालू घटक। तीसरा स्तर केवल सूचना है — निकट भविष्य में समाप्त होता प्रमाणपत्र, पास आती भंडारण-सीमा।

  • केवल लक्षणों पर चेताइए, कारणों पर नहीं। उपयोगकर्ता को 5xx त्रुटि दिखती है — उसी पर चेताइए, CPU के उपयोग पर नहीं
  • ऐसी बहु-शर्त चेतावनियाँ लीजिए जो चलने से पहले लगातार विचलन माँगें (जैसे सीमा से ऊपर पाँच मिनट)
  • संकेत की गुणवत्ता बनाए रखने के लिए प्रति व्यक्ति प्रति पाली अधिकतम तीन जगाने वाली चेतावनियाँ रखिए
  • हर तिमाही नियमों की समीक्षा और छँटाई कीजिए — बासी चेतावनियाँ सिस्टम पर भरोसा खा जाती हैं
  • हर चेतावनी में कार्य-पुस्तिका का लिंक दीजिए, ताकि उत्तर देने वाला पहले तीन क़दम जानता हो

ख़र्च-दर पर चेतावनी

ख़र्च-दर की चेतावनी तब चलती है जब आपका त्रुटि-बजट अपेक्षा से तेज़ी से ख़र्च हो रहा हो। स्थिर सीमाओं वाली चेतावनियों के विपरीत, ये सीधे आपके सेवा-स्तर के लक्ष्यों से बँधी होती हैं। अगर लक्ष्य 30 दिनों में 99.9% उपलब्धता है, तो आपके पास लगभग 43 मिनट का ठहराव है। यह चेतावनी तब चलती है जब अनुमानित ख़र्च खिड़की को योजना से पहले ख़ाली कर देगा, और आपको लक्ष्य टूटने से पहले प्रतिक्रिया का समय देती है।

उपयोगी पटल बनाना

अधिकांश इंजीनियरिंग पटल बेकार पड़े चार्टों के क़ब्रिस्तान हैं। पटल तब उपयोगी है जब वह बिना व्याख्या माँगे किसी ख़ास सवाल का उत्तर दे। सबसे अच्छे पटल एक ही भूमिका और एक ही उपयोग के लिए बनते हैं: घटनाओं की छँटाई के लिए ड्यूटी-पटल, क्षमता-नियोजन के लिए साप्ताहिक समीक्षा-पटल, और लक्ष्य-पालन देखने के लिए टीम-पटल।

ड्यूटी-पटल

यह एक ही परदे में समाना चाहिए और चार सवालों के उत्तर देना चाहिए: सेवा चालू है? त्रुटि की दर कितनी है? विलंब का वितरण कैसा है? त्रुटि-बजट टूट गया है? हर चार्ट पर साफ़ सीमा-रेखा होनी चाहिए, ताकि देखने वाला तुरंत बता सके कि मौजूदा मान स्वस्थ है या नहीं। एक ड्यूटी-पटल पर छह से अधिक चार्ट मत रखिए — घटना के समय मानसिक बोझ मायने रखता है।

  • RED मेट्रिक से शुरू कीजिए: दर (प्रति सेकंड अनुरोध), त्रुटियाँ (विफल अनुरोध), अवधि (विलंब के प्रतिशतक)
  • बुनियाद के लिए USE मेट्रिक जोड़िए: हर संसाधन का उपयोग, संतृप्ति और त्रुटियाँ
  • लक्ष्य-पालन और बजट की ख़र्च-दर को प्रमुख स्थिति-सूचक के रूप में दिखाइए
  • हर चार्ट को उसके लॉग या ट्रेस-प्रश्न से जोड़िए, ताकि एक क्लिक में गहराई में उतरा जा सके
  • विलंब के चार्ट के लिए लघुगणकीय पैमाना लीजिए — रैखिक पैमाने सिरों की महत्वपूर्ण भिन्नता छिपा देते हैं

आम कुपैटर्न

सबसे आम कुपैटर्न वह पटल है जो आपकी बुनियाद के बनाए हर मेट्रिक को दिखाता है। ऐसे «हरे की दीवार» वाले पटल सुरक्षा का झूठा भाव देते हैं और घटना के समय संकेत ढूँढना असंभव कर देते हैं। और भी कुपैटर्न: समय-शृंखला के लिए वृत्त-चार्ट, बेमेल अक्षों पर कई मेट्रिक चढ़ा देना, और सीमा-रेखाओं पर नाम न लिखना। अगर किसी चार्ट को समझाने के लिए टिप्पणी चाहिए, तो उसका पटल पर स्थान नहीं है।

SLI, SLO और त्रुटि-बजट

सेवा-स्तर के सूचक, लक्ष्य और त्रुटि-बजट आपकी टीम और आपके उपयोगकर्ताओं के बीच का अनुबंध हैं। सूचक कच्चे माप हैं — विलंब, त्रुटि की दर, प्रवाह। लक्ष्य वे वचन हैं जो आप निभाते हैं — 99.9% अनुरोध 200 मिलीसेकंड से कम में। त्रुटि-बजट विफलता की स्वीकार्य गुंजाइश है — वही 0.1%, जो टीम को बिना वचन तोड़ने के डर के तैनात करने, प्रयोग करने और दोहराने की छूट देता है।

सार्थक सूचक चुनना

अच्छा सूचक उपयोगकर्ता की ओर देखता है, मापा जा सकता है और कार्रवाई की ओर ले जाता है। उपलब्धता (सफल अनुरोधों का अंश), विलंब (किसी सीमा से नीचे के अनुरोधों का अंश) और ताज़गी (परोसे गए आँकड़ों की आयु) वेब सेवाओं के सबसे आम सूचक हैं। असली बात उपयोगकर्ता के नज़रिए से मापना है — जो अनुरोध आपके सर्वर पर 50 मिलीसेकंड में पूरा होता है पर धीमे मोबाइल नेटवर्क पर दो सेकंड लेता है, वह उपयोगकर्ता के लिए विफलता है।

यथार्थपरक लक्ष्य तय करना

99.999% का लक्ष्य प्रभावशाली लगता है, पर इसकी इंजीनियरिंग लागत बहुत बड़ी है। हर अतिरिक्त नौ के लिए अतिरेक, परीक्षण और संचालन के औज़ारों में लगभग दस गुना निवेश चाहिए। अधिकांश सेवाओं के लिए 99.9% से शुरू कीजिए और ऊँचे लक्ष्य ग्राहक के सामने वाले निर्णायक रास्तों के लिए बचाइए। जो निभा सकते हैं उसी के बारे में ईमानदार रहिए — लगातार टूटने वाला लक्ष्य किसी लक्ष्य के न होने से बुरा है, क्योंकि वह विफलता को सामान्य बना देता है और मापों पर भरोसा तोड़ देता है।

त्रुटि-बजट गति कैसे देता है

त्रुटि-बजट विश्वसनीयता को बंधन से बदलकर मापे जा सकने वाला जोखिम बना देता है। जब बजट भरा हो, टीम आराम से तैनात कर सकती है, यह जानते हुए कि गुंजाइश है। जब बजट चुक जाए, टीम ग़ैर-ज़रूरी रिलीज़ रोक देती है और केवल विश्वसनीयता पर ध्यान देती है। इससे एक साफ़, आँकड़ा-आधारित निर्णय-प्रक्रिया बनती है, जो «यह रिलीज़ पर्याप्त सुरक्षित है या नहीं» जैसी व्यक्तिगत बहसों की जगह ले लेती है।

बिना-सर्वर और किनारे के परिवेश में ऑब्ज़र्वेबिलिटी

बिना-सर्वर और किनारे की गणना अपनी अलग चुनौतियाँ लाती है। फ़ंक्शन क्षणभंगुर हैं, बुनियाद ओझल है, और निष्पादन दुनिया भर के उपस्थिति-बिंदुओं में बँटा है। एजेंट पर टिकी परंपरागत निगरानी विफल हो जाती है, क्योंकि एजेंट चलाने को कोई मेज़बान ही नहीं। यहाँ दूसरा तरीक़ा चाहिए: कोड से भेजी जाने वाली टेलीमेट्री, ठंडे प्रारंभ की बारीक ट्रेसिंग, और वैश्विक तैनातियों में विविधता का सावधान प्रबंधन।

बिना-सर्वर के अपने ढर्रे

ठंडा प्रारंभ विलंब का प्रमुख कारण है। आरंभीकरण को अनुरोध-प्रबंधन से अलग सज्जित कीजिए, ताकि ठंडे प्रारंभ का विलंब व्यापार-तर्क के विलंब से अलग पहचाना जा सके। संरचित लॉगिंग से आह्वान का संदर्भ पकड़िए — अनुरोध का पहचानक, क्षेत्र, फ़ंक्शन का संस्करण, निष्पादन का परिवेश — और आह्वान की संख्या, अवधि तथा त्रुटि-दर के अपने मेट्रिक असमकालिक रूप से भेजिए, ताकि उत्तर का रास्ता न रुके।

  • ठंडे प्रारंभ की अवधि अपने मेट्रिक के रूप में मापिए — क्लाउड प्रदाता के मानक मेट्रिक में यह दिखती ही नहीं
  • अपने मंच की विस्तार-व्यवस्था के अनुकूल OpenTelemetry के संदर्भ-वाहक लीजिए
  • टेलीमेट्री गुच्छों में भेजिए, ताकि फ़ंक्शन के निष्पादन-समय में विलंब न जुड़े
  • जहाँ अपने मेट्रिक के लिए इंटरफ़ेस न हो, वहाँ लॉग से निकलने वाले मेट्रिक बनाइए
  • सारी टेलीमेट्री पर परिवेश, क्षेत्र और फ़ंक्शन का संस्करण अंकित कीजिए, ताकि छँटाई कारगर हो

किनारे की गणना की बातें

किनारे के मंच कोड को दुनिया भर के दर्जनों स्थानों पर चलाते हैं। इस भौगोलिक बिखराव से परंपरागत केंद्रीकृत संग्रह अव्यावहारिक हो जाता है। किनारे के लिए बने औज़ार लीजिए, जो हर बिंदु पर टेलीमेट्री जुटाएँ और उसे थोड़े ख़र्च में केंद्र में समेटें। क्षेत्र-स्तर की त्रुटि-दर पर नज़र रखिए — किसी स्थानीय प्रदाता की गड़बड़ी एक भूभाग में आपकी सेवा बिगाड़ सकती है, जबकि वैश्विक औसत स्वस्थ दिखता रहे।

ऑब्ज़र्वेबिलिटी की संस्कृति बनाना

औज़ार और शृंखलाएँ ज़रूरी हैं, पर काफ़ी नहीं। ऑब्ज़र्वेबिलिटी का सबसे कठिन हिस्सा सांस्कृतिक है। आपकी टीम को सज्जित कोड उतना ही मूल्यवान मानना चाहिए जितना परखा हुआ कोड। हर नई सुविधा की «पूर्णता की परिभाषा» में ऑब्ज़र्वेबिलिटी की सज्जा शामिल होनी चाहिए, ठीक वैसे ही जैसे इकाई परीक्षण और कोड-समीक्षा होते हैं। इसके लिए बुनियाद चाहिए — साझा लाइब्रेरियाँ, लिखी हुई परिपाटियाँ, और हर टीम में एक व्यक्ति जो इस विषय को आगे बढ़ाए।

ऑब्ज़र्वेबिलिटी को प्रथम-श्रेणी विषय बनाना

एक टेलीमेट्री-रचना दस्तावेज़ से शुरू कीजिए, जो हर सेवा के लिए मानक क्षेत्र, मेट्रिक के नामों की परिपाटी और ट्रेसिंग की अपेक्षाएँ तय करे। इसे हर नई सेवा के आरंभ का हिस्सा बनाइए। निरंतर एकीकरण में ऐसी स्वचालित जाँचें लगाइए जो न्यूनतम सज्जा अनिवार्य करें — मसलन, ऐसे पुल-रिक्वेस्ट अस्वीकार कीजिए जो नए HTTP संचालक जोड़ें पर उनके साथ ट्रेस-सज्जा या संरचित लॉग-प्रविष्टियाँ न हों।

  • हर सुविधा की पूर्णता की परिभाषा में ऑब्ज़र्वेबिलिटी की सज्जा शामिल कीजिए
  • नियमित अभ्यास-दिवस कीजिए, जहाँ टीम केवल पटल और ट्रेस-प्रश्नों से छानबीन करे
  • सफलताओं को मनाइए — ऐसी घटना-समीक्षाएँ साझा कीजिए जो दिखाएँ कि अच्छी टेलीमेट्री ने तेज़ समाधान कैसे दिया
  • बारी-बारी ज़िम्मेदार नियुक्त कीजिए जो हर चक्र में टीमों के बीच टेलीमेट्री की गुणवत्ता परखें
  • साझा सज्जा-लाइब्रेरियों में निवेश कीजिए, जो सही काम को ग़लत काम से आसान बना दें

प्रतिक्रिया का चक्र

ऑब्ज़र्वेबिलिटी एक बार का काम नहीं, एक सतत चक्र है: सज्जित कीजिए, भेजिए, देखिए, सीखिए, सुधारिए। जब कोई घटना कोई अंधा कोना उजागर करे — कोई मेट्रिक जो देखी नहीं जा रही थी, कोई लॉग-क्षेत्र जो छूट गया, कोई ट्रेस जो गिरा दिया गया — तो उसे अपने ऑब्ज़र्वेबिलिटी मंच का बग मानकर ठीक कीजिए। समय के साथ आपकी टेलीमेट्री पूरी होती जाती है, छानबीन तेज़ होती जाती है, और टीम में वह भरोसा आता है जो यह जानने से आता है कि वह किसी भी विफलता को समझ सकती है — उन्हें भी जो उसने पहले कभी नहीं देखीं।

«ऑब्ज़र्वेबिलिटी का उद्देश्य घटनाएँ रोकना नहीं है। उद्देश्य यह सुनिश्चित करना है कि जब घटनाएँ हों, तब आपकी टीम के पास उन्हें आपके उपयोगकर्ताओं के ध्यान में आने से पहले सुलझाने के लिए आँकड़े, औज़ार और भरोसा हो।»

ऑब्ज़र्वेबिलिटी अपनाना एक यात्रा है, ख़रीद नहीं। छोटे से शुरू कीजिए — एक निर्णायक सेवा को छोर से छोर तक सज्जित कीजिए, एक उपयोगी पटल बनाइए, और एक सार्थक सेवा-स्तर लक्ष्य लिखिए। मूल्य को ख़ुद बोलने दीजिए। एक बार जब आपकी टीम किसी घटना के बीच अनुमान और जानकारी का फ़र्क़ महसूस कर लेगी, वह कभी पीछे लौटना नहीं चाहेगी।

See what your own repository can account for.

Thirty minutes on a repository you choose, including the part the record cannot attribute.