ალერტი ჩაირთო და ვერავინ დაინახა: cluster ლეიბლი აგრეგაციაში დაიკარგა
ნოდი ოთხი საათი 90–98% CPU-ზე იჯდა და OOM kill-ით დასრულდა. CPU ალერტი ჩაირთო, მაგრამ avg by(instance)-მა ის ლეიბლი გადააგდო, რომლითაც ყველა მარშრუტი და დაშბორდი ირჩევდა.
Gambchamp-ში საბრძოლო EKS კლასტერის სამუშაო ნოდი ღამით დაახლოებით ოთხი საათი 90–98% CPU-ზე იჯდა და HostOomKillDetected-ით დასრულდა. OOM-ის ალერტი გუნდის არხამდე მივიდა. ნოდის CPU-ის ალერტი — არა, და Grafana-ს „ალერტების ისტორიის“ პანელშიც არ იყო. პირველი დასკვნა ბუნებრივია: CPU-ის ალერტი არ ჩაირთო, ესე იგი ზღვარი არასწორია.
„არ ჩაირთო“ — მტკიცება, რომელიც შემოწმებას საჭიროებს
ჩართვა, მარშრუტიზაცია და ჩვენება სამი სხვადასხვა ეტაპია, ALERTS სერია კი პირველზე პირდაპირ გვეუბნება. ინციდენტის ფანჯრის range-მოთხოვნამ აჩვენა, რომ HighCpuLoad ჩაირთო: pending 23:00 UTC-მდე ცოტა ხნით ადრე, firing 02:40-დან 03:43-მდე.
კითხვა შეიცვალა: „რატომ არ ჩაირთო“-დან „სად წავიდა“-მდე.
ლეიბლი, რომელიც გაქრა
წესი avg by(instance)-ით აგრეგირებდა. ეს ყველა სხვა ლეიბლს აგდებს, მათ შორის cluster-ს. ორივე მომხმარებელი კი cluster-ით ირჩევდა:
- ამ პროდუქტის ცალკე Alertmanager
clusterლეიბლით მარშრუტიზირებს; - Grafana-ს პანელი ითხოვს
ALERTS{alertstate="firing", cluster=~"$cluster"}-ს.
ლეიბლის გარეშე ალერტი მხოლოდ საერთო ნაგულისხმევ მარშრუტში მოხვდა, სადაც ამ გუნდიდან არავინ იყურებოდა. OOM-ის ალერტი მივიდა, რადგან count by(node, cluster)-ით აგრეგირებს — ლეიბლი შეინარჩუნა.
შესწორება
ნოდების საერთო წესში avg by(instance) გახდა avg by(instance, cluster), for: 1h კი — for: 15m: საათი ძალიან დიდხანს არის ნოდისთვის, რომელიც OOM-ისკენ მიდის. ახალი წესის შვიდდღიანმა ბექტესტმა მთელ ფლოტზე მხოლოდ ორ ნოდზე იმუშავა, ასე რომ, მოკლე დაყოვნება ხმაურს არ ამატებს.
ცვლილება Argo CD-ით წავიდა, შემდეგ vmalert-ს POST /-/reload — მას შემდეგ, რაც შევამოწმე, რომ ახალი წესი მართლა მივიდა პოდის ტომამდე. Reload რესტარტის ნაცვლად ყველა სხვა წესის ჯგუფის for: ტაიმერებს ინახავს.
დასკვნები
- თუ მარშრუტი ან დაშბორდი ლეიბლით ირჩევს, ყოველი აგრეგაცია, რომელიც მათ კვებავს, ამ ლეიბლს უნდა ინახავდეს.
- „ალერტი არ ჩაირთო“ ჰიპოთეზაა. შეამოწმე
ALERTSზღვრების შეცვლამდე. - მოძებნე წესებში
sum/avg/max by(...)cluster-ის გარეშე — თითოეული იგივე ბრმა ლაქაა. - წესების შეცვლისას რესტარტს reload ამჯობინე, რომ სხვა ალერტებმა pending ტაიმერები შეინარჩუნონ.