Java में ऑब्ज़र्वेबिलिटी: "यह क्यों गिरा?" से "मुझे पता है एक मिनट में क्या होगा" तक
\n\nकल्पना करें: आपका Java एप्लिकेशन प्रोडक्शन में चल रहा है। सब कुछ ठीक है। और फिर — बम! — उपयोगकर्ता शिकायत करते हैं कि पेज लोड होने में 10 सेकंड लग रहे हैं। आप सर्वर में जाते हैं, लॉग्स देखते हैं, ढेर सारे INFO और एक भी ERROR नहीं दिखता। क्या करें? कहाँ देखें?
क्लासिकल मॉनिटरिंग में, आप जाँचते हैं: क्या सर्वर चालू है, कितनी मेमोरी उपयोग हो रही है, क्या प्रोसेस क्रैश हुआ है। लेकिन यह ऐसा है जैसे डैशबोर्ड पर बल्ब जल रहा है या नहीं — उपयोगी है, लेकिन पर्याप्त नहीं। ऑब्ज़र्वेबिलिटी (अवलोकनीयता) अगला स्तर है। यह सिस्टम के बाहरी आउटपुट डेटा: लॉग्स, मेट्रिक्स और ट्रेसेस के आधार पर उसकी आंतरिक स्थिति को समझने की क्षमता है।
\n\nइस लेख में, मैं दिखाऊंगा कि वास्तविक उदाहरणों के साथ Java में ऑब्ज़र्वेबिलिटी कैसे लागू करें। हम OpenTelemetry, Micrometer, Spring Boot Actuator और क्लासिक SLF4J का उपयोग करेंगे। आप सीखेंगे कि लॉग्स, मेट्रिक्स और ट्रेसेस को एक एकीकृत तस्वीर में कैसे जोड़ा जाए, न कि केवल "सब कुछ एक साथ इकट्ठा करना"।
\n\nऑब्ज़र्वेबिलिटी क्या है और यह केवल "लॉग्स इकट्ठा करना" क्यों नहीं है?
\n\nऑब्ज़र्वेबिलिटी नियंत्रण सिद्धांत से आई है। एक सिस्टम अवलोकनीय है यदि उसके आउटपुट डेटा से आंतरिक स्थिति को पुनर्स्थापित किया जा सके। Java की दुनिया में, इसका अर्थ है तीन स्तंभ:
\n\n- \n
- लॉग्स — घटनाओं के संरचित रिकॉर्ड (क्या हुआ?); \n
- मेट्रिक्स — संख्यात्मक संकेतक (कितना? कितनी देर?); \n
- ट्रेसेस — कॉल की श्रृंखलाएँ (अनुरोध ने कौन सा रास्ता अपनाया?)। \n
ऑब्ज़र्वेबिलिटी के बिना, आप अंधे हैं। आप जानते हैं कि CPU 95% लोड है, लेकिन यह नहीं जानते कि कौन सा विशेष एंडपॉइंट इसे लोड कर रहा है। आप लॉग में एक त्रुटि देखते हैं, लेकिन यह नहीं समझते कि किस उपयोगकर्ता ने इसे ट्रिगर किया और कौन सी सेवाएँ शामिल थीं। Java में ऑब्ज़र्वेबिलिटी केवल "एक लाइब्रेरी इंस्टॉल करना" नहीं है, बल्कि एक विकास संस्कृति है।
\n\nOpenTelemetry: ऑब्ज़र्वेबिलिटी के लिए एक सार्वभौमिक उपकरण
\n\nपहले एक चिड़ियाघर था: ट्रेसिंग के लिए Zipkin, मेट्रिक्स के लिए Prometheus, लॉग्स के लिए ELK। प्रत्येक का अपना SDK था। OpenTelemetry (OTel) उन्हें एकीकृत करने आया। यह टेलीमेट्री संग्रह के लिए एक ओपन-सोर्स मानक है। यह Java को मूल रूप से सपोर्ट करता है और Spring Boot, Micronaut, Quarkus में आसानी से एम्बेड हो जाता है।
\n\nयह कैसे काम करता है? आप अपने Java एप्लिकेशन में एक एजेंट या SDK जोड़ते हैं, और OTel स्वचालित रूप से HTTP अनुरोधों, डेटाबेस कॉल्स, मैसेज क्यू को इंटरसेप्ट करता है। आपको प्रत्येक टूल के लिए अलग से कोड लिखने की आवश्यकता नहीं है।
\n\nउदाहरण: Spring Boot में OpenTelemetry सेटअप
\n\npom.xml में डिपेंडेंसी जोड़ें:
<dependency>\n <groupId>io.opentelemetry</groupId>\n <artifactId>opentelemetry-api</artifactId>\n <version>1.40.0</version>\n</dependency>\n<dependency>\n <groupId>io.opentelemetry</groupId>\n <artifactId>opentelemetry-sdk</artifactId>\n <version>1.40.0</version>\n</dependency>\n<dependency>\n <groupId>io.opentelemetry.instrumentation</groupId>\n <artifactId>opentelemetry-spring-boot-starter</artifactId>\n <version>2.6.0</version>\n</dependency>\n\nअब कॉन्फ़िगरेशन (application.yml) में एक्सपोर्टर निर्दिष्ट करें, उदाहरण के लिए, Jaeger या OTLP-कलेक्टर में:
otel:\n exporter:\n otlp:\n endpoint: http://localhost:4317\n traces:\n exporter: otlp\n metrics:\n exporter: otlp\n logs:\n exporter: otlp\n\nवोइला! अब आपके कंट्रोलर पर प्रत्येक HTTP अनुरोध स्वचालित रूप से एक ट्रेस बनाता है। आप देख सकते हैं कि प्रत्येक डेटाबेस कॉल, बाहरी API या थ्रेड में देरी में कितना समय लगा।
\n\nJava में ट्रेसिंग: "बॉटलनेक" कैसे खोजें
\n\nट्रेसिंग शायद ऑब्ज़र्वेबिलिटी का सबसे शक्तिशाली हिस्सा है। जब आपका एप्लिकेशन दर्जनों माइक्रोसर्विसेज से बना होता है, तो ट्रेसेस यह समझने का एकमात्र तरीका है कि अनुरोध 2 सेकंड क्यों लेता है, जबकि प्रत्येक सर्व