आपका Go-एप्लिकेशन चुप क्यों है, और इसे कैसे ठीक करें?
\nआपने Go में एक आदर्श माइक्रोसर्विस लिखी है। यह सभी परीक्षण पास करती है, जल्दी शुरू होती है और बहुत कम मेमोरी खपत करती है। आप इसे प्रोडक्शन में डिप्लॉय करते हैं — और एक घंटे बाद उपयोगकर्ता धीमी गति की शिकायत करते हैं। आप सर्वर पर जाते हैं, खाली टर्मिनल देखते हैं और समझ जाते हैं: एप्लिकेशन चुप है। कोई लॉग नहीं, कोई मेट्रिक्स नहीं, कोई समझ नहीं कि क्या गलत हुआ।
\nपरिचित स्थिति? Go-एप्लिकेशन की observability (अवलोकनीयता) की दुनिया में आपका स्वागत है। निगरानी और लॉगिंग के बिना, आपका कोड एक ब्लैक बॉक्स है। आज हम देखेंगे कि इसे एक पारदर्शी सिस्टम में कैसे बदला जाए, जहाँ हर देरी और हर त्रुटि साफ दिखाई दे।
\nमैं तीन काम के उपकरण, Go में वास्तविक कोड उदाहरण दिखाऊंगा और एक चेकलिस्ट दूंगा जो आपके प्रोडक्शन को बचाएगी। चलिए शुरू करते हैं!
\n\n1. संरचित लॉगिंग: कंसोल में लिखना कैसे बंद करें और जीना शुरू करें
\nभोला fmt.Println("त्रुटि:", err) पुरानी बात है। आधुनिक Go लॉगिंग में व्यवस्था चाहिए: JSON प्रारूप, स्तर (debug, info, warn, error), खोज के लिए फ़ील्ड। मिलिए राजा से — Uber की लाइब्रेरी zap।
zap ही क्यों?
\n- \n
- गति: यह उच्च लोड पर मानक
logसे 10-100 गुना तेज़ है। \n - संरचना: आप कुंजी और मान जोड़ते हैं, स्ट्रिंग को प्लस से नहीं जोड़ते। \n
- लचीलापन: फ़ाइल, stdout, Elasticsearch — कहीं भी लिख सकते हैं। \n
स्थापना और बुनियादी उदाहरण
\ngo get -u go.uber.org/zap\n\nसरल लॉगर का कोड:
\npackage main\n\nimport (\n "go.uber.org/zap"\n)\n\nfunc main() {\n logger, _ := zap.NewProduction()\n defer logger.Sync() // बाहर निकलने से पहले बफर फ्लश करें\n\n logger.Info("सेवा शुरू हुई",\n zap.String("env", "production"),\n zap.Int("port", 8080),\n )\n\n // त्रुटि के साथ उदाहरण\n err := someFunction()\n if err != nil {\n logger.Error("ऑपरेशन निष्पादित करने में विफल",\n zap.Error(err),\n zap.String("module", "database"),\n )\n }\n}\n\nआउटपुट में आपको साफ JSON मिलता है:
\n{"level":"info","ts":1700000000.123,"msg":"सेवा शुरू हुई","env":"production","port":8080}\n\nअब Kibana या Grafana Loki जैसा कोई भी उपकरण इन लॉग को फ़ील्ड के अनुसार पार्स कर सकता है। पिछले एक घंटे में "database" मॉड्यूल की सभी त्रुटियाँ खोजनी हैं? एक क्लिक।
\n\nसुझाव: रहस्य और PII को लॉग न करें
\nजाँच जोड़ें: यदि फ़ील्ड में पासवर्ड या ईमेल है — तो इसे मास्क करें। संवेदनशील डेटा के लिए zap.String("user", "***") का उपयोग करें।
2. मेट्रिक्स और निगरानी: कोड को डैशबोर्ड में बदलना
\nलॉग अच्छे हैं, लेकिन वे अतीत के बारे में बताते हैं। मेट्रिक्स आपके एप्लिकेशन की वास्तविक समय की नब्ज हैं। Go एप्लिकेशन की निगरानी के लिए डी-फैक्टो मानक Prometheus + इसकी क्लाइंट लाइब्रेरी है।
\n\nक्या मापें?
\n- \n
- RPS (अनुरोध प्रति सेकंड) — सेवा पर लोड। \n
- Latency (p50, p95, p99) — प्रतिक्रिया समय। \n
- Error rate — त्रुटियों का प्रतिशत। \n
- Goroutines — गोरूटीन लीक। \n
- Memory / CPU — संसाधन। \n
उदाहरण: HTTP सर्वर मेट्रिक्स जोड़ना
\npackage main\n\nimport (\n "net/http"\n "github.com/prometheus/client_golang/prometheus"\n "github.com/prometheus/client_golang/prometheus/promhttp"\n)\n\nvar (\n requestCount = prometheus.NewCounterVec(\n prometheus.CounterOpts{\n Name: "http_requests_total",\n Help: "HTTP अनुरोधों की कुल संख्या",\n },\n []string{"method", "endpoint", "status"},\n )\n requestDuration = prometheus.NewHistogramVec(\n prometheus.HistogramOpts{\n Name: "http_request