Bagaimana cara saya memecahkan masalah data yang hilang di basis data Prometheus saya?

13

Saya secara bertahap mengintegrasikan Prometheus ke dalam alur kerja pemantauan saya, untuk mengumpulkan metrik terperinci tentang menjalankan infrastruktur.

Selama ini, saya perhatikan bahwa saya sering mengalami masalah yang aneh: kadang-kadang seorang eksportir yang seharusnya menarik data dari Prometheus menjadi tidak responsif. Mungkin karena kesalahan konfigurasi jaringan - tidak dapat diakses lagi - atau hanya karena eksportir macet.

Apa pun alasannya, saya menemukan bahwa beberapa data yang saya harapkan untuk dilihat di Prometheus tidak ada dan tidak ada apa pun dalam seri untuk periode waktu tertentu. Terkadang, satu eksportir gagal (waktu habis?) Juga tampaknya menyebabkan yang lain gagal (batas waktu pertama mendorong seluruh pekerjaan di atas batas waktu tingkat atas? Hanya berspekulasi).

Kesenjangan dalam data

Yang saya lihat adalah celah dalam seri, seperti yang ditunjukkan pada visualisasi di atas. Tidak ada dalam log ketika ini terjadi. Metrik-diri Prometheus juga tampak cukup mandul. Saya baru saja harus menggunakan cara manual untuk meniru apa yang dilakukan Prometheus dan melihat di mana ia rusak. Ini menjengkelkan. Pasti ada cara yang lebih baik! Meskipun saya tidak memerlukan lansiran waktu nyata, saya setidaknya ingin dapat melihat bahwa eksportir gagal mengirimkan data. Bahkan boolean "hei periksa data Anda" bendera akan menjadi awal.

Bagaimana cara saya mendapatkan informasi yang bermakna tentang Prometheus yang gagal mendapatkan data dari eksportir? Bagaimana saya mengerti mengapa ada celah tanpa harus melakukan simulasi manual pengumpulan data Prometheus? Apa praktik yang masuk akal dalam hal ini, mungkin bahkan ketika diperluas untuk memantau pengumpulan data secara umum, di luar Prometheus?

Sander
sumber
Apakah Anda memiliki entri log atau peringatan / kesalahan yang relevan dengan masalah?
kenorb
Tidak ada apa-apa, saya hanya melihat celah dalam seri data. Output Prometheus hanya memiliki garis normal normal tentang menyimpan perubahan yang tertunda setiap beberapa menit dan yang lainnya (kecuali saya melewatkan beberapa log tersembunyi untuk dilihat).
Sander
Kami juga menghadapi masalah ini. @Sander apakah Anda dapat menemukan penyebabnya?
Deepak N
@DeepakN tidak, saya tidak memiliki wawasan yang berguna untuk ditambahkan di sini, sayangnya. Itu tetap menjadi titik sakit ketika menggunakan Prometheus.
Sander

Jawaban:

5

Saya pikir Anda dapat melakukan semacam peringatan pada metrik ratedengan sesuatu seperti ini:

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

Gagasan utamanya adalah memberi tahu kapan saja angka metrik berada pada 0 selama 3 menit, dengan nama metrik yang tepat dan label di suatu tempat yang memberi tahu dari mana eksportir itu datang itu harus memberi Anda informasi yang benar.

Memilih metrik yang tepat untuk dipantau oleh eksportir bisa jadi rumit, tanpa wawasan yang lebih banyak sulit untuk memberikan saran yang lebih baik dari kehampaan. Posting blog
ini bisa menjadi inspirasi juga untuk deteksi yang lebih umum.

Tensibai
sumber
rate menghitung rate per detik untuk penghitung yang diberikan. Ini tidak ada hubungannya dengan tingkat di mana metrik dikikis (-> scrape_interval). Contoh Anda akan mengingatkan jika penghitung yang diberikan (metric_name) tidak meningkat selama 3 menit yang mungkin bukan yang diinginkan OP.
Johannes 'fish' Ziemke
@ Johannes'fish'Ziemke Itu sebabnya saya katakan menemukan metrik yang tepat bisa jadi rumit. Menggunakan timemetrik pada eksportir simpul misalnya akan dilakukan. Jika Anda memiliki cara yang lebih baik untuk memberi tahu eksportir yang gagal, jangan ragu untuk menambahkan jawaban
Tensibai
@ Johannes'fish'Ziemke Selamat datang di devops.se btw :)
Tensibai
1

Ada beberapa alasan yang mungkin menyebabkan kesenjangan. Kemungkinan besar eksportir tidak dapat dijangkau dalam hal ini jangka upwaktu akan menjadi 0. Anda dapat mengingatkan ini seperti ini (diambil dari 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.",
  }

Pada halaman status Anda juga harus melihat bahwa itu turun termasuk pesan kesalahan. Sayangnya tidak ada cara untuk melihat kesalahan masa lalu tetapi ada masalah untuk melacak ini: https://github.com/prometheus/prometheus/issues/2820

Server Prometheus Anda juga dapat kelebihan beban sehingga pengikisan terhenti yang juga akan menjelaskan kesenjangannya. Dalam hal ini Anda akan melihat Storage needs throttling. Scrapes and rule evaluations will be skipped.kesalahan dalam log dan meningkatkan prometheus_target_skipped_scrapes_totalmetrik. Anda juga harus mengingatkan hal itu, misalnya:

ALERT PrometheusSkipsScrapes
  IF rate(prometheus_target_skipped_scrapes_total[2m]) > 0
  FOR 5m
Yohanes 'ikan' Ziemke
sumber
1

Saya tidak yakin apakah ini masalah yang sama yang Anda lihat. Tapi kami melihat celah acak ini untuk aplikasi Java yang tidak secara khusus mengatur pengaturan GC. Berarti kami melihat kesenjangan ketika pengumpulan data berhenti karena aktivitas untuk contoh berhenti saat JVM melakukan GC Penuh. Jika Anda menggunakan Java, ini bisa terjadi. Perbaikan kami adalah secara eksplisit menggunakan pengumpul sampah G1 (Java 8+) dengan batas yang ditentukan pada panjang aktivitas GC untuk mencegah kesenjangan waktu ini dalam pengumpulan data.

cwa
sumber