ฉันจะแก้ไขปัญหาข้อมูลที่ขาดหายไปในฐานข้อมูลโพรได้อย่างไร


13

ฉันค่อยๆรวมโพรเมทเข้ากับเวิร์กโฟลว์การตรวจสอบของฉันเพื่อรวบรวมตัวชี้วัดโดยละเอียดเกี่ยวกับการเรียกใช้โครงสร้างพื้นฐาน

ในระหว่างนี้ฉันสังเกตเห็นว่าฉันมักพบเจอกับปัญหาที่แปลกประหลาด: บางครั้งผู้ส่งออกที่โพรควรจะดึงข้อมูลจากไม่ตอบสนอง อาจเป็นเพราะการกำหนดค่าเครือข่ายไม่ถูกต้อง - ไม่สามารถเข้าถึงได้อีกต่อไป - หรือเพียงเพราะผู้ส่งออกขัดข้อง

ไม่ว่าจะด้วยเหตุผลอะไรฉันก็พบว่าข้อมูลบางอย่างที่ฉันคาดว่าจะเห็นในโพรหายไปและไม่มีอะไรในซีรีส์ในช่วงระยะเวลาหนึ่ง บางครั้งผู้ส่งออกหนึ่งรายล้มเหลว (หมดเวลาหรือไม่) ดูเหมือนว่าจะทำให้ผู้อื่นล้มเหลว (การหมดเวลาครั้งแรกผลักงานทั้งหมดให้สูงกว่าการหมดเวลาระดับบนสุด

ช่องว่างในข้อมูล

ทั้งหมดที่ฉันเห็นคือช่องว่างในซีรีส์ดังที่แสดงในภาพข้อมูลด้านบน ไม่มีสิ่งใดในบันทึกเมื่อสิ่งนี้เกิดขึ้น ตัวชี้วัดโพรอีอุสเองก็ดูเหมือนจะแห้งแล้งเช่นกัน ฉันต้องรีสอร์ตพยายามทำซ้ำสิ่งที่โพรอุสกำลังทำอยู่และดูว่ามันหยุดอยู่ตรงไหน นี่มันช่างน่าเบื่อ จะต้องมีวิธีที่ดีกว่า! แม้ว่าฉันไม่ต้องการการแจ้งเตือนแบบเรียลไทม์ แต่อย่างน้อยฉันก็ต้องการเห็นว่าผู้ส่งออกไม่สามารถส่งข้อมูลได้ แม้แต่บูลีน "เฮ้ตรวจสอบข้อมูลของคุณ" จะเป็นการเริ่มต้น

ฉันจะรับข้อมูลที่มีความหมายเกี่ยวกับโพรไม่สามารถรับข้อมูลจากผู้ส่งออกได้อย่างไร ฉันจะเข้าใจได้อย่างไรว่ามีช่องว่างโดยไม่ต้องทำการจำลองด้วยตนเองของการรวบรวมข้อมูลโพร อะไรคือวิธีปฏิบัติที่สมเหตุสมผลในเรื่องนี้บางทีแม้เมื่อขยายไปถึงการตรวจสอบการเก็บรวบรวมข้อมูลโดยทั่วไปนอกเหนือจากโพร?


คุณมีรายการบันทึกหรือคำเตือน / ข้อผิดพลาดที่เกี่ยวข้องกับปัญหาหรือไม่
kenorb

ไม่มีอะไรเลยฉันแค่เห็นช่องว่างในชุดข้อมูล Prometheus output นั้นมีบรรทัดปกติปกติเกี่ยวกับการบันทึกการเปลี่ยนแปลงที่รอดำเนินการทุกสองสามนาทีและ whatnot (เว้นแต่ฉันจะพลาดบันทึกที่ซ่อนอยู่เพื่อดู)
Sander

เรากำลังเผชิญกับปัญหานี้เช่นกัน @Sander คุณสามารถหาสาเหตุได้หรือไม่
Deepak N

@DeepakN ไม่ฉันไม่มีข้อมูลเชิงลึกที่เป็นประโยชน์ในการเพิ่มที่นี่โชคไม่ดี มันยังคงเป็นจุดปวดเมื่อใช้โพร
Sander

คำตอบ:


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 }}%",
}

แนวคิดหลักคือการแจ้งเตือนเมื่อใดก็ตามที่อัตราการวัดอยู่ที่ 0 เป็นเวลา 3 นาทีด้วยชื่อตัวชี้วัดที่เหมาะสมและป้ายกำกับที่บอกได้ว่าผู้ส่งออกรายใดที่มาพร้อมควรให้ข้อมูลที่ถูกต้องแก่คุณ

การเลือกตัวชี้วัดที่เหมาะสมในการตรวจสอบโดยผู้ส่งออกอาจมีความซับซ้อนโดยไม่ต้องมีข้อมูลเชิงลึกมากขึ้นยากที่จะให้คำแนะนำที่ดีกว่าจากสุญญากาศ โพสต์บล็อก
นี้อาจเป็นแรงบันดาลใจสำหรับการตรวจสอบทั่วไปเพิ่มเติม


rate คำนวณอัตราต่อวินาทีสำหรับตัวนับที่กำหนด สิ่งนี้ไม่เกี่ยวข้องกับอัตราการคัดลอกตัวชี้วัด (-> scrape_interval) ตัวอย่างของคุณจะแจ้งเตือนหากตัวนับที่กำหนด (metric_name) ไม่เพิ่มขึ้นเป็นเวลา 3 นาทีซึ่งอาจไม่ใช่สิ่งที่ OP ต้องการ
Ziemke 'ปลา' ของโยฮันเนสใน

@ Johannes'fish'Ziemke นั่นเป็นเหตุผลที่ฉันพูดว่าการหาตัวชี้วัดที่เหมาะสมอาจซับซ้อน การใช้timeเมทริกบนตัวเอ็กซ์พอร์ตโหนดจะทำเช่นนั้น หากคุณมีวิธีที่ดีกว่าในการเตือนผู้ส่งออกที่ล้มเหลว
อย่า

@ Johannes'fish'Ziemke ยินดีต้อนรับสู่ devops.se btw :)
Tensibai

1

มีสาเหตุบางประการที่อาจทำให้เกิดช่องว่าง ผู้ส่งออกส่วนใหญ่ไม่สามารถเข้าถึงได้ซึ่งในกรณีนี้upไทม์ซีรี่ส์จะเป็น 0 คุณสามารถแจ้งเตือนเกี่ยวกับสิ่งนี้ (นำมาจาก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

เซิร์ฟเวอร์ Prometheus ของคุณสามารถทำงานหนักเกินไปซึ่งทำให้การขูดเพื่อหยุดซึ่งจะอธิบายช่องว่างได้เช่นกัน ในกรณีนี้คุณควรเห็น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

ฉันไม่แน่ใจว่านี่เป็นปัญหาเดียวกันกับที่คุณเห็นหรือไม่ แต่เราเห็นช่องว่างแบบสุ่มเหล่านี้สำหรับแอปพลิเคชัน Java ที่ไม่ได้ตั้งค่า GC เป็นพิเศษ หมายความว่าเราเห็นช่องว่างเมื่อการรวบรวมข้อมูลหยุดทำงานเนื่องจากกิจกรรมสำหรับอินสแตนซ์หยุดลงในขณะที่ JVM กำลังทำ Full GC หากคุณกำลังใช้ Java สิ่งนี้สามารถเกิดขึ้นได้ การแก้ไขของเราคือใช้ตัวเก็บรวบรวมขยะ G1 (Java 8+) อย่างชัดเจนโดยมีข้อ จำกัด ตามความยาวของกิจกรรม GC เพื่อป้องกันช่องว่างเวลาเหล่านี้ในการรวบรวมข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.