Ketika Terjadi Masalah
Mode kegagalan, strategi debugging, dan self-healing.
Diagnosis Kegagalan Umum Langkah demi Langkah
Setiap sistem pasti mengalami kegagalan. Perbedaan antara sistem yang baik dan sistem yang rapuh adalah seberapa cepat Anda dapat menemukan dan memperbaiki masalahnya. Telusuri lima mode kegagalan paling umum di Forest Analyzer, pelajari gejala, akar penyebab, dan perbaikan untuk masing-masing.
Kegagalan Autentikasi GEE
Ini adalah error paling umum. Jika GEE_SERVICE_ACCOUNT_KEY_FILE tidak ada atau kredensial telah kedaluwarsa, semua analisis gagal. Tidak ada bagian lain dalam pipeline yang dapat mengkompensasi — analyzer memunculkan:
Titik kegagalan tunggal ini memengaruhi perhitungan cakupan hutan, peringatan GLAD, peringatan RADD, analisis NDVI, citra satelit, dan klasifikasi tutupan lahan. Semua yang bergantung pada GEE berhenti bekerja sekaligus.
Daftar periksa debugging:
- Periksa
.env— apakahGEE_SERVICE_ACCOUNT=truesudah diatur? - Apakah file kunci di
GEE_SERVICE_ACCOUNT_KEY_FILEbenar-benar ada di disk? - Buka file kunci — apakah JSON-nya valid? (Unduhan yang terpotong adalah penyebab umum.)
- Apakah service account telah diberi akses ke proyek GEE yang ditentukan di
GEE_PROJECT_ID? - Periksa log startup untuk
"Provider initialized successfully"vs"Provider initialization failed".
Kehabisan Pool Koneksi Database
Sistem memelihara pool berisi 15 koneksi database. Ketika semuanya sedang digunakan, permintaan baru beralih ke koneksi langsung yang lebih lambat. Anda akan melihat ini di log:
Ini bukan crash total — ini adalah degradasi halus. Tetapi ini menandakan bahwa sistem menerima beban lebih dari yang diharapkan, atau ada kebocoran koneksi.
Daftar periksa debugging:
- Periksa pengaturan
DB_POOL_SIZEdanDB_MAX_OVERFLOWdi.env. - Cari kebocoran koneksi — jalur kode di mana koneksi diambil tetapi tidak pernah dikembalikan ke pool.
- Periksa apakah analisis berjalan sangat lama, menahan koneksi tetap terbuka.
- Pantau jumlah permintaan bersamaan — lonjakan lalu lintas mungkin hanya melebihi kapasitas.
DB_POOL_SIZE atau memperbaiki kebocoran koneksi menyelesaikan masalah.
Analisis Macet
Sebuah analisis tetap berstatus PROCESSING selama lebih dari 30 menit. Ini biasanya berarti permintaan GEE timeout atau proses worker crash di tengah analisis.
Sistem memiliki watchdog bawaan: job latar belakang stuck_analysis_fixer berjalan setiap 2 menit. Ia menemukan analisis yang macet di status PROCESSING lebih dari 30 menit dan meresetnya ke PENDING untuk percobaan ulang otomatis. Setelah 3 kali percobaan ulang gagal, analisis ditandai sebagai ERROR.
Daftar periksa debugging:
- Query tabel antrian:
SELECT status, retry_count, error_message FROM analysis_queue WHERE id = '...' - Periksa log worker — apakah worker crash atau kehilangan koneksi GEE?
- Verifikasi GEE merespons (log startup atau permintaan uji coba manual).
- Jika
retry_countsudah mencapai 3, fixer telah menyerah. Investigasi manual diperlukan.
POST /api/queue/retry/{queue_id}.
Error ImageCollection vs Image
Anda melihat error GEE ini di log:
Penyebab: Dua dataset kunci adalah ImageCollection, bukan Image tunggal:
- Peringatan RADD:
projects/radar-wur/raddalert/v1 - ESA WorldCover:
ESA/WorldCover/v200
Jika Anda mencoba memuat salah satunya dengan ee.Image("..."), GEE menolaknya karena aset tersebut berisi beberapa gambar, bukan satu.
Perbaikan: Gunakan ee.ImageCollection("...").first() untuk WorldCover, atau filter dan komposit untuk RADD:
Email Tidak Terkirim
Seorang pengguna mendaftar tetapi tidak pernah menerima email aktivasi. Atau analisis selesai tetapi email notifikasi tidak sampai. Ini sering kali masalah konfigurasi, bukan bug kode.
Daftar periksa debugging:
- Periksa folder spam/junk pengguna terlebih dahulu — email otomatis sering masuk ke sana.
- Verifikasi kredensial SMTP di
.env:SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASSWORD. - Jika menggunakan Gmail,
SMTP_PASSWORDharus berupa password khusus aplikasi, bukan password akun. Gmail memblokir login dari "aplikasi yang kurang aman" secara default. - Periksa log email_service di backend untuk error pengiriman atau timeout koneksi.
- Uji dengan
POST /api/auth/resend-activationuntuk memicu email baru dan amati lognya.
Resep Debugging
Prosedur cepat dan terarah untuk memeriksa aspek-aspek spesifik kesehatan sistem.
Cara memeriksa apakah queue worker berjalan
Queue worker dimulai secara otomatis dalam fungsi startup_event() ketika server backend diluncurkan. Cari baris ini di log backend:
Jika server di-restart, worker ikut restart bersamanya — tidak ada proses terpisah yang perlu dikelola. Jika baris log tersebut tidak ada, worker gagal dimulai. Periksa error import atau masalah konfigurasi di analysis_queue_worker.py.
Cara mencoba ulang analisis yang gagal secara manual
Kirim permintaan POST ke endpoint retry:
Ini mereset status job dari FAILED atau ERROR kembali ke PENDING dan menambah hitungan percobaan ulang. Queue worker akan mengambilnya pada siklus polling berikutnya. Gunakan GET /api/queue/status/{queue_id} untuk memantau progresnya setelah itu.
Cara memeriksa konektivitas GEE
Lihat log startup backend untuk pesan inisialisasi provider:
Jika provider gagal diinisialisasi, semua fitur yang bergantung pada GEE (analisis hutan, peringatan, citra, NDVI, tutupan lahan) tidak akan tersedia. Periksa path GEE_SERVICE_ACCOUNT_KEY_FILE dan kredensialnya.
Cara menemukan mengapa analisis tertentu gagal
- Panggil endpoint status:
GET /api/queue/status/{queue_id}. Responsnya menyertakan fielderror_messagedengan alasan kegagalan. - Untuk detail lebih lanjut, query database secara langsung:
SELECT id, status, error_message, retry_count, updated_at FROM analysis_queue WHERE id = 'xxx' - Cocokkan timestamp
updated_atdengan log backend untuk stack trace lengkap.
Cara menambah batas koneksi database
Atur nilai-nilai ini di file .env Anda:
Ini memberi Anda 10 koneksi pool ditambah hingga 20 koneksi overflow (total 30). Pastikan juga max_connections PostgreSQL di sisi server cukup tinggi untuk mengakomodasi ini — default biasanya 100, yang seharusnya cukup untuk sebagian besar deployment.
Pola Ketahanan
Bagaimana Forest Analyzer menangani kegagalan secara terencana, bukan secara kebetulan.
Self-Healing dengan Stuck Analysis Fixer
Sebuah thread latar belakang aktif setiap 2 menit dan meng-query database untuk analisis yang macet di status PROCESSING lebih dari 30 menit. Ketika menemukannya, ia mereset status ke PENDING sehingga queue worker mencoba ulang secara otomatis. Setelah 3 kali percobaan ulang gagal, analisis ditandai sebagai ERROR — pada titik itu, masalahnya persisten dan memerlukan investigasi manusia.
Ini adalah pola watchdog: monitor independen yang menangkap masalah yang tidak dapat dideteksi oleh sistem utama tentang dirinya sendiri. Queue worker tidak tahu bahwa ia crash — tetapi stuck analysis fixer menyadari bahwa pekerjaan tidak pernah selesai.
Degradasi Halus
Beberapa subsistem dirancang untuk gagal secara independen tanpa menjatuhkan seluruh aplikasi:
- Fallback connection pool: Ketika pool habis, sistem membuat koneksi langsung (lebih lambat) alih-alih menolak permintaan secara langsung.
- Hasil kosong dari provider: Ketika provider GEE gagal mengambil citra satelit atau data peringatan, ia mengembalikan objek hasil kosong alih-alih memunculkan exception. Laporan PDF tetap dihasilkan — hanya melewatkan bagian yang datanya hilang.
- Alert scheduler opsional: Jika alert scheduler gagal dimulai, sisa sistem tetap berjalan normal. Pengguna kehilangan pemeriksaan peringatan berkala, tetapi analisis sesuai permintaan tetap berfungsi.
- Pengiriman email: Jika SMTP salah konfigurasi, hasil analisis tetap disimpan ke database. Pengguna dapat mengambilnya dari API meskipun email notifikasi tidak pernah sampai.
Setiap subsistem gagal secara independen lebih baik daripada seluruh sistem crash. Sistem lebih memilih hasil parsial daripada tidak ada hasil sama sekali.
Pola Pikir Debugging: Ikuti Jalur Data
Ketika sesuatu rusak, telusuri jalur data melalui sistem:
Kerusakan hampir selalu terjadi di batas — di mana satu sistem berkomunikasi dengan sistem lain. Batas-batas ini adalah tempat kredensial kedaluwarsa, jaringan timeout, dan format data tidak cocok.
Tiga kategori kegagalan paling umum:
- Kredensial kedaluwarsa: Kunci service account GEE, token JWT, password SMTP. Perbaikannya selalu di
.envatau file kunci. - Timeout jaringan: Permintaan GEE melalui koneksi lambat, query database pada geometri besar. Perbaikannya biasanya menambah timeout atau mengurangi ukuran payload.
- Ketidakcocokan format data: ImageCollection vs Image, GeoJSON tidak valid, field null yang tidak diharapkan. Perbaikannya ada di kode yang menyiapkan atau mengonsumsi data.
Uji Pemahaman Anda
Referensi Pemecahan Masalah
Error Umum
| Error | Penyebab | Perbaikan |
|---|---|---|
Forest analysis requires GEE |
Kredensial GEE hilang atau tidak valid | Periksa GEE_SERVICE_ACCOUNT_KEY_FILE di .env |
Connection pool exhausted |
Terlalu banyak permintaan bersamaan | Naikkan DB_POOL_SIZE / DB_MAX_OVERFLOW |
Image.load: Asset is not an Image |
Memuat ImageCollection sebagai Image | Gunakan .first() atau filter + .max() |
Expected homogeneous collection |
Tipe gambar campuran di RADD | .select('Alert') sebelum .max() |
Invalid email or password |
Akun belum diaktivasi | Periksa email aktivasi / kirim ulang |
Activation link expired |
Token lebih dari 24 jam | Kirim ulang email aktivasi |
Layanan Latar Belakang
| Layanan | Interval | Tujuan |
|---|---|---|
| Alert Scheduler | 24 jam (06:00 UTC) | Memeriksa plot yang berlangganan untuk peringatan deforestasi baru |
| Stuck Analysis Fixer | 2 menit | Menyelamatkan analisis yang macet di status PROCESSING |
| Queue Worker | Polling berkelanjutan | Memproses job analisis yang tertunda |
Titik Pemeriksaan Kesehatan
| Apa | Cara Memeriksa |
|---|---|
| Database | GET /api/docs — jika Swagger UI dimuat, database sudah terhubung |
| Provider GEE | Periksa log startup untuk "Provider initialized successfully" |
| Queue Worker | Periksa log untuk "Queue worker started" |
| Email (SMTP) | Kirim uji coba melalui POST /api/auth/resend-activation |
| Alert Scheduler | Periksa log atau panggil get_scheduler_status() |