कैसे अनुमान लगाना बंद करें और अपने कोड को पूरी तरह से देखना शुरू करें?
\n\nक्या आप कभी रात में मॉनिटर के सामने बैठे हैं, लॉग्स को देख रहे हैं जो एरर के बारे में चिल्ला रहे हैं, लेकिन कारण के बारे में चुप हैं? या यह समझने की कोशिश कर रहे हैं कि आपका C# माइक्रोसर्विस 10 सेकंड में जवाब क्यों दे रहा है, जबकि कल सब कुछ तेज़ था? परिचित लगता है? उस दुनिया में आपका स्वागत है जहाँ Observability (अवलोकनीयता) के बिना आपका कोड एक ब्लैक बॉक्स है।
\n\nइस लेख में हम उबाऊ व्याख्यान नहीं पढ़ेंगे। हम अवलोकनीयता के तीन स्तंभों को समझेंगे: ट्रेसिंग, मेट्रिक्स और लॉग्स — और दिखाएंगे कि उन्हें C# के साथ कैसे जोड़ा जाए। आप सीखेंगे कि आग बुझाना कैसे बंद करें और उन्हें रोकना कैसे शुरू करें। चलिए शुरू करते हैं!
\n\nObservability क्या है और यह सिर्फ "लॉगिंग" से अलग क्यों है?
\n\nबहुत से लोग Observability को सामान्य लॉग संग्रह के साथ भ्रमित करते हैं। लेकिन अंतर बहुत बड़ा है। Observability एक सिस्टम की वह संपत्ति है जो आपको बिना नया कोड जोड़े, इसकी स्थिति के बारे में कोई भी प्रश्न पूछने की अनुमति देती है। तीन स्तंभ जिन पर सब कुछ टिका है:
\n- \n
- लॉग्स (Logs) — अलग-अलग घटनाएँ। "उपयोगकर्ता ने बटन दबाया", "कनेक्शन त्रुटि"। यह "क्या हुआ?" है। \n
- मेट्रिक्स (Metrics) — एकत्रित डेटा। "प्रति सेकंड अनुरोध", "मेमोरी खपत"। यह "कितना और कितनी बार?" है। \n
- ट्रेसिंग (Traces) — सिस्टम के माध्यम से अनुरोध का पथ। "अनुरोध आया, DB में गया, फिर कैश में, वापस आया"। यह "इतना धीमा क्यों?" है। \n
C# .NET इकोसिस्टम में, ये तीन स्तंभ OpenTelemetry जैसी लाइब्रेरीज़ के साथ जुड़ते हैं। और अब हम देखेंगे कि यह कोड में कैसा दिखता है।
\n\nप्रयोग सेट करना: Observability के साथ एक एप्लिकेशन लिखना
\n\nकल्पना करें कि हमारे पास ASP.NET Core पर एक सरल सेवा है जो ऑर्डर प्रोसेस करती है। हम देखना चाहते हैं:
\n- \n
- ऑर्डर प्रोसेसिंग का हर कदम (ट्रेसिंग)। \n
- कितने ऑर्डर प्रोसेस हुए और कितने एरर के साथ (मेट्रिक्स)। \n
- एक्सेप्शन का विवरण (लॉग्स)। \n
चरण 1: Serilog के साथ लॉगिंग सेट करना
\n\nचलिए सबसे समझने योग्य चीज़ से शुरू करते हैं — लॉग्स। हम Serilog का उपयोग करेंगे (लेकिन NLog का भी उपयोग कर सकते हैं)। यह स्ट्रक्चर्ड लॉग्स लिख सकता है, जिन्हें बाद में आसानी से पार्स किया जा सकता है।
\n\n// NuGet: Serilog, Serilog.AspNetCore, Serilog.Sinks.Console\nusing Serilog;\n\n// Program.cs में सेटअप\nLog.Logger = new LoggerConfiguration()\n .WriteTo.Console()\n .WriteTo.File("logs/app.log", rollingInterval: RollingInterval.Day)\n .Enrich.WithProperty("Application", "OrderService")\n .CreateLogger();\n\nvar builder = WebApplication.CreateBuilder(args);\nbuilder.Host.UseSerilog(); // डिफ़ॉल्ट लॉगर को बदलें\n\n// कंट्रोलर में उपयोग का उदाहरण\n[ApiController]\n[Route("api/[controller]")]\npublic class OrderController : ControllerBase\n{\n private readonly ILogger<OrderController> _logger;\n\n public OrderController(ILogger<OrderController> logger) => _logger = logger;\n\n [HttpPost]\n public IActionResult CreateOrder(Order order)\n {\n _logger.LogInformation("Creating order {OrderId} for user {User}", order.Id, order.UserId);\n // ... लॉजिक ...\n _logger.LogWarning("Order {OrderId} is delayed due to stock issues", order.Id);\n return Ok();\n }\n}\n\nध्यान दें: हम नामित प्लेसहोल्डर ({OrderId}) का उपयोग कर रहे हैं। यह सिर्फ टेक्स्ट नहीं है — यह स्ट्रक्चर्ड डेटा है। Elasticsearch या Grafana Loki में आप किसी विशिष्ट OrderId के सभी लॉग्स खोज सकते हैं।
चरण 2: Prometheus और .NET के साथ मेट्रिक्स
\n\nमेट्रिक्स "आंकड़ों" के लिए जिम्मेदार हैं। प्रति सेकंड कितने अनुरोध? कितनी 500 एरर? C# में हम System.Diagnostics.Metrics से Meters या prometheus-net लाइब्रेरी का उपयोग करते हैं।
चलिए प्रोसेस किए गए ऑर्डर का एक सरल काउंटर बनाते हैं:
\n\n// NuGet: prometheus-net.AspNetCore\nusing Prometheus;\n\n// Program.cs में मेट्रिक्स जोड़ें\nvar builder = WebApplication.CreateBuilder(args);\n