Latihan 1: Error Monitoring (Sentry-style) — Debugging
Latihan 1 dari materi Error Monitoring (Sentry-style) di Debugging — praktek dengan editor kode interaktif, test case otomatis, dan hint terpandu. Langsung jalan di browser.
Lengkapi createMonitor(release) supaya bekerja seperti Sentry versi mini: laporan error dengan fingerprint yang sama digabung jadi satu event.
createMonitor(release) mengembalikan objek dengan empat method:
capture(error, context): error berbentuk { message, stack }, context berbentuk { userId, url, tags } (boleh ada yang gak dikirim).
Hitung fingerprint: baris pertama error.stack (error.stack.split('\n')[0]), atau error.message kalau stack kosong.
Sudah ada event dengan fingerprint itu? Naikkan count-nya, jangan bikin event baru.
Belum ada? Tambahkan event { id, message, fingerprint, release, userId, url, tags, timestamp, count: 1 }, dengan tags jadi {} kalau gak dikirim.
getEvents(): kembalikan array event yang sudah digabung.
getEventsByTag(key, value): kembalikan event yang tags[key] === value.
getTopErrors(n): kembalikan n event dengan count terbesar, urut dari yang terbesar, tanpa mengubah urutan array aslinya.
Kode awal sudah berisi tiga mon.capture(...) dan empat console.log, biarkan begitu. Output-nya harus persis empat baris ini, berurutan:
2
2
1
Cannot read property
Ada juga dua cek dengan data lain: error yang sama ditangkap dua kali harus jadi 1 event dengan count 2, dan getEventsByTag('env', 'prod') serta getTopErrors(1) masing-masing harus mengembalikan tepat 1 event.
Hint
Kuncinya fingerprint. Dua laporan dengan fingerprint yang sama adalah satu issue, jadi yang berubah cuma angka count-nya.
Simpan const events = [] di dalam createMonitor. Di capture, hitung fingerprint, cari dengan events.find(e => e.fingerprint === fingerprint). Ketemu: count++ lalu return. Gak ketemu: push event baru dengan count: 1 dan tags: context.tags || {}.