Prometheus का उपयोग करके Watermill की वास्तविक समय में मॉनिटरिंग
मापदंड
Watermill का मॉनिटरिंग प्रकारकों और मध्यवर्तियों के लिए डेकोरेटर का उपयोग करके किया जा सकता है। हम अधिकृत Go के लिए प्रोमेथीअस क्लाइंट का डिफ़ॉल्ट अंगीकारित व्यावसायिक कार्यान्वयन प्रदान करते हैं।
components/metrics
पैकेज PrometheusMetricsBuilder
को निर्योजित करता है, जिसमें संबंधित प्रोमेथीअस रजिस्ट्री को अद्यतन करने के लिए प्रयोजनीय फ़ंक्शन प्रदान करते हैं:
पूरा स्रोत कोड: github.com/ThreeDotsLabs/watermill/components/metrics/builder.go
// ...
// PrometheusMetricsBuilder प्रकार के विधियाँ प्रोवाइड करता है जो प्रकाशक, सब्सक्राइबर और हैंडलर को सजाने के लिए हैं।
type PrometheusMetricsBuilder struct {
// PrometheusRegistry मौजूदा प्रोमेथीअस रजिस्ट्री को भर सकता है या डिफ़ॉल्ट रजिस्ट्री का उपयोग करने के लिए खाली हो सकता है।
PrometheusRegistry prometheus.Registerer
नेमस्पेस string
सबसिस्टम string
}
// AddPrometheusRouterMetrics एक सुविधाजनक फ़ंक्शन है जो संदेश राउटर पर सभी हैंडलर्स के लिए मापदंड मध्यवर्ती जोड़ने के लिए है। यह भी हैंडलर्स के प्रकाशक और सब्सक्राइबर को सजाता है।
func (b PrometheusMetricsBuilder) AddPrometheusRouterMetrics(r *message.Router) {
// ...
प्रकाशक, सब्सक्राइबर और हैंडलरों को सजाना
यदि आप Watermill के रूटर का उपयोग कर रहे हैं (जो अधिकांश मामलों में सिफ़ारिश किया जाता है), तो आप सुनिश्चित करने के लिए सुविधाजनक फ़ंक्शन AddPrometheusRouterMetrics
का उपयोग कर सकते हैं की इस रूटर पर जोड़े गए सभी हैंडलर्स को सजाया जाए ताकि प्रोमेथीअस रजिस्ट्री को अद्यतन किया जा सके, साथ ही उनके प्रकाशक और सब्सक्राइबर को भी:
पूरा स्रोत कोड: github.com/ThreeDotsLabs/watermill/components/metrics/builder.go
// ...
// AddPrometheusRouterMetrics एक सुविधाजनक फ़ंक्शन है जो संदेश राउटर पर सभी हैंडलर्स के लिए मापदंड मध्यवर्ती जोड़ने के लिए है। यह भी हैंडलर्स के प्रकाशक और सब्सक्राइबर को सजाता है।
func (b PrometheusMetricsBuilder) AddPrometheusRouterMetrics(r *message.Router) {
r.AddPublisherDecorators(b.DecoratePublisher)
r.AddSubscriberDecorators(b.DecorateSubscriber)
r.AddMiddleware(b.NewRouterMiddleware().Middleware)
}
// ...
AddPrometheusRouterMetrics
का उपयोग का उदाहरण:
पूरा स्रोत कोड: github.com/ThreeDotsLabs/watermill/_examples/basic/4-metrics/main.go
// ...
// हम नेमस्पेस और सबसिस्टम को खाली छोड़ देते हैं
metricsBuilder := metrics.NewPrometheusMetricsBuilder(prometheusRegistry, "", "")
metricsBuilder.AddPrometheusRouterMetrics(router)
// ...
उपरोक्त कोड टुकड़े में, हम नेमस्पेस
और सबसिस्टम
पैरामीटर को खाली छोड़ देते हैं। प्रोमेथीअस क्लाइंट पुस्तकालय इन पैरामीटर का उपयोग करती है मीट्रिक नामों को प्रीफ़िक्स करने के लिए। आप नेमस्पेस या सबसिस्टम का उपयोग करना चाहेंगे, लेकिन कृपया ध्यान दें कि इससे मीट्रिक नाम पर प्रभाव पड़ेगा, इसलिए आपको ग्राफ़ाना डैशबोर्ड को अनुसार समायोजित करना होगा।
स्वतंत्र प्रकाशक और सब्सक्राइबर भी PrometheusMetricsBuilder
के विशिष्ट विधियों का उपयोग करके सजा सकते हैं:
पूरा स्रोत कोड: github.com/ThreeDotsLabs/watermill/_examples/basic/4-metrics/main.go
// ...
subWithMetrics, err := metricsBuilder.DecorateSubscriber(pubSub)
if err != nil {
panic(err)
}
pubWithMetrics, err := metricsBuilder.DecoratePublisher(pub)
if err != nil {
panic(err)
}
// ...
/metrics एंडप्वाइंट को बयां करें
प्रोमेथियस के काम करने के सिद्धांत के अनुसार, किसी सेवा को डेटा स्क्रैपिंग के लिए एक एचटीटीपी एंडप्वाइंट को बयां करने की आवश्यकता होती है। सामान्यत: यह एक GET एंडप्वाइंट होता है, और पथ सामान्यत: /metrics
होता है।
इस एंडप्वाइंट को प्रदान करने के लिए, दो सुविधाजनक फ़ंक्शन उपलब्ध होते हैं, एक पहले से बनाए गए प्रोमेथियस रजिस्ट्री का उपयोग करके और दूसरा एक नए रजिस्ट्री को साथ में बनाकर:
पूर्ण स्रोत कोड: github.com/ThreeDotsLabs/watermill/components/metrics/http.go
// ...
// CreateRegistryAndServeHTTP दिये गए पते पर एक एचटीटीपी सर्वर स्थापित करता है ताकि /metrics एंडप्वाइंट प्रोमेथियस को बयां किया जा सके।
// यह एक नया प्रोमेथियस रजिस्ट्री (मेट्रिक पंजीकरण के लिए) और सर्वर को बंद करने के लिए एक रद्दीकरण फ़ंक्शन वापस करता है।
func CreateRegistryAndServeHTTP(addr string) (registry *prometheus.Registry, cancel func()) {
registry = prometheus.NewRegistry()
return registry, ServeHTTP(addr, registry)
}
// ServeHTTP दिये गए पते पर एक एचटीटीपी सर्वर स्थापित करता है ताकि /metrics एंडप्वाइंट प्रोमेथियस को बयां किया जा सके।
// यह मौजूदा प्रोमेथियस रजिस्ट्री को स्वीकार करता है और सर्वर को बंद करने के लिए एक रद्दीकरण फ़ंक्शन वापस करता है।
func ServeHTTP(addr string, registry *prometheus.Registry) (cancel func()) {
// ...
यहाँ उपयोग का एक उदाहरण है:
पूर्ण स्रोत कोड: github.com/ThreeDotsLabs/watermill/_examples/basic/4-metrics/main.go
// ...
prometheusRegistry, closeMetricsServer := metrics.CreateRegistryAndServeHTTP(*metricsAddr)
defer closeMetricsServer()
// हम नेमस्पेस और सबसिस्टम खाली छोड़ देते हैं
metricsBuilder := metrics.NewPrometheusMetricsBuilder(prometheusRegistry, "", "")
metricsBuilder.AddPrometheusRouterMetrics(router)
// ...
उदाहरण एप्लिकेशन
डैशबोर्ड का काम कैसे होता है, इसे समझने के लिए, आप मीट्रिक्स उदाहरण पर जा सकते हैं।
उदाहरण के README में दिए गए निर्देशों का पालन करके इसे चलाकर और Grafana में Prometheus डेटा स्रोत जोड़ सकते हैं।
Grafana डैशबोर्ड
हमने पूर्व तैयार किया हुआ है Grafana डैशबोर्ड, जिसे पूर्व में चर्चित मेट्रिक्स कार्यान्वयन के साथ उपयोग के लिए किया जा सकता है। यह समयावधि, विफलता दर, और प्रकाशन/प्रोसेसिंग अवधि के बारे में मूलभूत जानकारी प्रदान करता है।
इस डैशबोर्ड को स्थानीय रूप से देखना चाहते हैं, तो आप उदाहरण एप्लिकेशन का उपयोग कर सकते हैं।
प्रोमेथियस को निकाली गई मीट्रिक्स के अधिक जानकारी के लिए, Exported metrics देखें।
डैशबोर्ड को आयात करना
ग्राफाना डैशबोर्ड को आयात करने के लिए, बाएं मेनू से Dashboard/Manage का चयन करें, फिर +आयात
पर क्लिक करें।
डैशबोर्ड का URL डालें https://grafana.com/dashboards/9777 (या केवल आईडी, 9777), फिर Load पर क्लिक करें।
फिर प्रोमेथियस डेटा स्रोत का चयन करें जिसका उपयोग /metrics
एंडप्वाइंट से स्क्रेप करने के लिए किया गया है। आयात
पर क्लिक करें और आपका काम खत्म हो जाता है!
निर्यात किए गए माप
निम्नलिखित PrometheusMetricsBuilder
द्वारा प्रोमेथियस रजिस्ट्री में दर्ज सभी मापको सूचीबद्ध किया गया है।
प्रोमेथियस माप प्रकारों के बारे में अधिक जानकारी के लिए, कृपया प्रोमेथियस दस्तावेज़ीकरण पर जाएं।
ऑब्जेक्ट | माप | विवरण | लेबल/मान |
---|---|---|---|
सब्सक्राइबर | subscriber_messages_received_total |
एक प्रोमेथियस काउंटर। सब्सक्राइबर द्वारा प्राप्त संदेशों की संख्या का गणना करता है। | acked या तो "acked" या "nacked" होता है। |
अगर सब्सक्राइबर हैंडलर के भीतर काम करता है, तो handler_name सेट करें; अन्यथा, " |
|||
subscriber_name सब्सक्राइबर की पहचान करता है। यदि यह fmt.Stringer इंटरफ़ेस को अमल करता है, तो यह String() का परिणाम है; अन्यथा, यह package.structName है। |
|||
हैंडलर | handler_execution_time_seconds |
एक प्रोमेथियस हिस्टोग्राम। मिडलवेयर द्वारा लपेटे गए हैंडलर समारोह के कार्य का निष्पादन समय दर्ज करता है। | handler_name है हैंडलर का नाम। |
success "true" या "false" होता है, इस आधार पर कि क्या लपेटे गए हैंडलर कार्य एक त्रुटि लौटाता है। |
|||
प्रकाशक | publish_time_seconds |
एक प्रोमेथियस हिस्टोग्राम। प्रकाशक के सजीवित प्रकाशन कार्य का निष्पादन समय दर्ज करता है। | success "true" या "false" होता है, इस आधार पर कि क्या सजीवित प्रकाशक ने त्रुटि लौटाई है। |
अगर प्रकाशक हैंडलर के भीतर काम करता है, तो handler_name सेट करें; अन्यथा, " |
|||
publisher_name प्रकाशक की पहचान करता है। यदि यह fmt.Stringer इंटरफ़ेस को अमल करता है, तो यह String() का परिणाम है; अन्यथा, यह package.structName है। |
इसके अलावा, प्रत्येक माप के पास प्रोमेथियस द्वारा प्रदत्त node
लेबल होता है, जिसका मान उस माप स्रोत के उदाहरण से संबंधित होता है, और एक job
प्रोमेथियस कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट किया जाता है।
नोट: जैसा कि ऊपर उल्लेख किया गया है, किसी भी गैर-खाली namespace
या subsystem
का उपयोग माप का नाम प्रिफ़िक्स बनाएगा। आपको उसके संबंधित समायोजन करने की आवश्यकता हो सकती है, जैसे कि ग्राफाना डैशबोर्ड की पैनल परिभाषा में।
अनुकूलन
अगर आपको लगता है कि किसी निश्चित माप को अनदेखा किया गया है, तो आप इस मौलिक अनुमान को आसानी से बढ़ा सकते हैं। सबसे अच्छा तरीका है कि आप प्रमेथियस क्लाइंट यहां विवरण देखकर ServeHTTP
मेथड के साथ उपयोग किया गया प्रोमेथियस रजिस्ट्री बाद में मापको दर्ज करें।
इन मापों को अपडेट करने का एक संक्षिप्त तरीका डेकोरेटर्स का उपयोग करके है। पूरा स्रोत कोड github.com/ThreeDotsLabs/watermill/message/decorator.go पर उपलब्ध है।
// ...
// MessageTransformSubscriberDecorator एक सब्सक्राइबर डेकोरेटर बनाता है जो प्राप्त हर संदेश पर परिवर्तन फ़ंक्शन को कॉल करता है।
func MessageTransformSubscriberDecorator(transform func(*Message)) SubscriberDecorator {
if transform == nil {
panic("परिवर्तन कार्य शून्य है")
}
return func(sub Subscriber) (Subscriber, error) {
return &messageTransformSubscriberDecorator{
sub: sub,
transform: transform,
}, nil
}
}
// MessageTransformPublisherDecorator एक प्रकाशक डेकोरेटर बनाता है जो प्राप्त हर संदेश पर परिवर्तन फ़ंक्शन को विवरणकारी करता है।
func MessageTransformPublisherDecorator(transform func(*Message)) PublisherDecorator {
if transform == nil {
panic("परिवर्तन कार्य शून्य है")
}
return func(pub Publisher) (Publisher, error) {
return &messageTransformPublisherDecorator{
Publisher: pub,
transform: transform,
}, nil
}
}
type messageTransformSubscriberDecorator struct {
// ...
और/या रूटर में मिडलवेयर्स में।
एक सरल तरीका है कि आप केवल हैंडलर कार्यों में आवश्यक मापों को अपडेट करें।