मैं अपने प्रोमेथियस डेटाबेस में गुम डेटा का निवारण कैसे करूँ?


13

मैं धीरे-धीरे प्रोमेथियस को मेरी निगरानी वर्कफ़्लो में एकीकृत कर रहा हूं , ताकि बुनियादी ढांचे को चलाने के बारे में विस्तृत मैट्रिक्स इकट्ठा कर सके।

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

जो भी कारण हो सकता है, मुझे लगता है कि प्रोमेथियस में मुझे जो डेटा देखने की उम्मीद है, उनमें से कुछ गायब है और एक निश्चित समय अवधि के लिए श्रृंखला में कुछ भी नहीं है। कभी-कभी, एक निर्यातक विफल (टाइमिंग आउट?) भी दूसरों को विफल करने का कारण लगता है (पहले टाइमआउट ने शीर्ष स्तर के टाइमआउट के ऊपर पूरी नौकरी को धक्का दे दिया? सिर्फ अटकलें लगाईं)।

डेटा में गैप

मैं देख रहा हूं कि श्रृंखला में एक अंतराल है, जैसा कि ऊपर के दृश्य में दिखाया गया है। ऐसा होने पर लॉग में कुछ भी नहीं है। प्रोमेथियस सेल्फ मेट्रिक्स भी काफी बंजर लगते हैं। मुझे सिर्फ प्रोमेथियस क्या कर रहा है और यह देखने के लिए कि वह कहां टूटता है, को दोहराने के लिए मैन्युअल रूप से सहारा लेना पड़ा है। यह विडंबनापूर्ण है। इसके लिए अवश्य ही एक बेहतर तरीका होना चाहिए! जबकि मुझे रियलटाइम अलर्ट की आवश्यकता नहीं है, मैं कम से कम यह देखना चाहता हूं कि एक निर्यातक डेटा देने में विफल रहे। यहां तक ​​कि एक बूलियन "हे अपने डेटा की जांच करें" झंडा एक शुरुआत होगी।

मैं निर्यातकों से डेटा प्राप्त करने में विफल प्रोमेथियस के बारे में सार्थक जानकारी कैसे प्राप्त करूं? मैं कैसे समझ सकता हूं कि प्रोमेथियस डेटा सभा के मैनुअल सिमुलेशन को पूरा करने के बिना अंतराल क्यों मौजूद हैं? प्रोमेथियस से परे, सामान्य रूप से डेटा संग्रह की निगरानी के लिए विस्तारित होने पर भी इस संबंध में क्या समझदार प्रथाएं हैं?


क्या आपके पास समस्या के लिए कोई लॉग एंट्री या चेतावनी / त्रुटियाँ हैं?
kenorb

कुछ भी नहीं, मैं सिर्फ डेटा श्रृंखला में एक अंतर देखता हूं। प्रोमेथियस आउटपुट में बस कुछ ही मिनटों और व्हाट्सएप के लंबित परिवर्तनों को बचाने के बारे में सामान्य नियमित लाइनें हैं (जब तक कि मुझे देखने के लिए कुछ छिपे हुए लॉग याद न हों)।
सेंडर

हम भी इस मुद्दे का सामना कर रहे हैं। @ कारण क्या आप इसका कारण खोजने में सक्षम थे?
दीपक एन

@DeepakN नहीं, मेरे पास यहां जोड़ने के लिए कोई उपयोगी जानकारी नहीं है, दुर्भाग्य से। प्रोमेथियस का उपयोग करते समय यह एक दर्द बिंदु रहता है।
सैंडर

जवाबों:


5

मुझे लगता है कि कुछ इस तरह से आप मीट्रिक पर किसी तरह की चेतावनी दे सकते हैं rate:

ALERT DropInMetricsFromExporter
  IF rate(<metric_name>[1m]) == 0
  FOR 3m
  ANNOTATIONS {
    summary = "Rate of metrics is 0 {{ $labels.<your_label> }}",
    description = "Rate of metric dropped, actually: {{ $value }}%",
}

मुख्य विचार यह है कि जब भी मेट्रिक दर 3 मिनट के लिए हो, तो उचित मेट्रिक नाम और एक लेबल कहीं न कहीं यह बताने वाला है कि यह किस निर्यातक से आता है, आपको इसकी सही जानकारी देनी चाहिए।

निर्यातक द्वारा मॉनिटर करने के लिए सही मीट्रिक चुनना जटिल हो सकता है, बिना अधिक जानकारी के निर्वात से बेहतर सलाह देना कठिन है।
यह ब्लॉग पोस्ट एक अधिक सामान्य खोज के लिए एक प्रेरणा भी हो सकती है।


दर किसी दिए गए काउंटर के लिए प्रति सेकंड की दर की गणना करती है। इसका उस दर से कोई लेना-देना नहीं है जिस पर मेट्रिक्स बिखरे हुए हैं (-> scrape_interval)। यदि आपका उदाहरण काउंटर (मेट्रिक_नाम) 3 मिनट के लिए नहीं बढ़ता है जो ओपी चाहता है तो संभवतया सतर्क नहीं होगा।
जोहान्स की मछली 'ज़ीमेके

@ जोहान्सफिश'ज़िम्के यही कारण है कि मैंने कहा कि सही मीट्रिक ढूंढना जटिल हो सकता है। timeउदाहरण के लिए नोड निर्यातक पर मीट्रिक का उपयोग करना होगा। यदि आपके पास किसी निर्यातक के विफल होने पर अलर्ट करने का एक बेहतर तरीका है, तो एक उत्तर जोड़ने के लिए स्वतंत्र महसूस करें
Tensibai

@ जोहान्सफिश'ज़िम्के devops.se btw पर आपका स्वागत है :)
Tensibai

1

कुछ कारण हैं जिनके कारण अंतर हो सकता है। सबसे अधिक संभावना है कि निर्यातक पहुंच में नहीं आता है, ऐसे में समय up0. होगा। आप इस पर इस तरह से सतर्क हो सकते हैं ( https://prometheus.io/docs/alerting/rules/#templating से लिया गया ):

# Alert for any instance that is unreachable for >5 minutes.
ALERT InstanceDown
  IF up == 0
  FOR 5m
  LABELS { severity = "page" }
  ANNOTATIONS {
    summary = "Instance {{ $labels.instance }} down",
    description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.",
  }

स्थिति पृष्ठ पर आपको यह भी देखना चाहिए कि यह एक त्रुटि संदेश सहित है। दुर्भाग्य से पिछली त्रुटि को देखने का कोई तरीका नहीं है, लेकिन इसे ट्रैक करने के लिए एक समस्या है: https://github.com/prometheus/prometheus/issues/2820

आपके प्रोमेथियस सर्वर को भी अधिभारित किया जा सकता है जिससे स्क्रैपिंग रुक जाती है जो अंतराल को भी समझाता है। उस स्थिति में आपको Storage needs throttling. Scrapes and rule evaluations will be skipped.लॉग में त्रुटियों को देखना चाहिए और prometheus_target_skipped_scrapes_totalमैट्रिक्स में बढ़ जाना चाहिए । आपको उस पर भी सतर्क रहना चाहिए, जैसे:

ALERT PrometheusSkipsScrapes
  IF rate(prometheus_target_skipped_scrapes_total[2m]) > 0
  FOR 5m

1

मुझे यकीन नहीं है कि यह वही समस्या है जो आप देख रहे हैं। लेकिन हमने जावा अनुप्रयोगों के लिए इन यादृच्छिक अंतरालों को देखा जो विशेष रूप से जीसी सेटिंग्स सेट नहीं करते थे। मतलब जब डेटा संग्रह बंद हो जाता है तो हम अंतराल देख रहे थे क्योंकि उदाहरण के लिए गतिविधि रुक ​​गई जबकि JVM एक पूर्ण GC कर रहा था। यदि आप जावा का उपयोग कर रहे हैं तो ऐसा हो सकता है। हमारा संग्रह स्पष्ट रूप से G1 कचरा कलेक्टर (जावा 8+) का उपयोग करने के लिए किया गया था, जो कि डेटा संग्रह में इन समय अंतराल को रोकने के लिए GC गतिविधि की लंबाई पर एक निर्दिष्ट सीमा के साथ है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.