Files
sicabe-core/deploy/output/b3-hasil-uji.md
T

115 lines
5.7 KiB
Markdown
Raw Normal View History

2026-10-09 02:35:14 +07:00
# Hasil Uji B3 — Titik Go/No-Go BATCH B (review R18)
> **Tanggal**: 2026-10-01 · **Image diuji**: `sicabe/airflow:3.3.2-om203-py313` (ID `33990a6c2b88`)
> **Metode**: stack eksperimen terisolasi (`airflow332-exp`, port 12184/12185) + config & DAG
> produksi di-mount **read-only** + uji koneksi/OPA/dbt dari container sekali pakai.
> ⚠️ Produksi **tidak tersentuh** sepanjang uji.
---
## 1. VERDICT: 🔴 **NO-GO untuk Python 3.13**
BATCH B **tidak boleh dilanjutkan** dengan base Python 3.13. Penyebab tunggal: **dbt tidak
berfungsi** di Python 3.13 pada tumpukan dependensi kita — dan dbt adalah tulang punggung
lapisan silver/gold.
**Yang tetap sahih**: seluruh hasil B3 lainnya, serta A1 (pin `sqlalchemy<2.1`), A2, dan B1.
**Yang perlu diulang**: hanya **B2** (build image) dengan base Python **3.11**.
---
## 2. Yang LOLOS ✅
| Uji | Hasil |
|---|---|
| **DAG produksi (4 berkas, dari volume produksi)** | ✅ `dag_sitomat_gold_build.py`, `dag_sitomat_gold_build_prod.py` **impor bersih**. `sicabe_dq_gold_native.py` berhasil dimuat sampai tahap *generate workflow* (gagal hanya karena `openmetadata-server` tidak ter-resolve dari container uji saya — bukan masalah versi) |
| **Plugin OpenMetadata** | ✅ `/pluginsv2/api/v2/openmetadata/health-auth` → **200**; `/pluginsv2/` → **200** |
| **Trino** | ✅ `SELECT 1` → `[[1]]`; `SHOW TABLES FROM iceberg.bronze` → `orders`, `orders_incremental` |
| **MinIO** | ✅ bucket `['iceberg-data']` via `S3Hook` |
| **MySQL (klien eksternal)** | ✅ `('8.0.40', 'asdp')` via `MySQLdb`/`MySqlHook` |
| **PostgreSQL** | ✅ Postgres 15.18 via `PostgresHook` |
| **OPA** | ✅ aturan bronze utuh (`bronze_orders`: ddl/select/write) + keputusan INSERT bronze = **true** |
| **Metadata DB / migrasi** | ✅ `airflow db migrate` bersih; OM 2.0.3 (API `{"version":"2.0.3"}`) |
---
## 3. Yang GAGAL 🔴 — dbt
### 3.1 Gejala
```
$ dbt debug --profile trino --target prod
AttributeError: __class_getitem__
mashumaro/core/meta/helpers.py:624 → typing_extensions.Annotated.__class_getitem__
/usr/python/lib/python3.13/typing.py:548
```
`dbt compile` gagal dengan galat yang sama.
⚠️ **`dbt --version` justru berhasil** — sehingga pemeriksaan dangkal (`import dbt`,
`dbt --version`) **tidak menangkap** kerusakan ini.
### 3.2 Akar masalah & tiga versi yang diuji
| `mashumaro` | dbt (`debug`/`compile`) | `pip check` |
|---|---|---|
| **3.10** (maksimum yang diizinkan `collate-data-diff <3.11`) | ❌ **GAGAL** | ✅ **bersih** ← *rusak, tapi terlihat sehat* |
| **3.17** | ✅ **debug OK ("All checks passed!") + compile OK** (SQL `orders_silver` ter-compile) | ⚠️ melanggar `dbt-core <3.15` **dan** `collate-data-diff <3.11` |
| **3.23** | ✅ berhasil | ⚠️ melanggar keduanya |
### 3.3 Kesimpulan teknis
**Tidak ada versi `mashumaro` yang sekaligus (a) memenuhi batas dependensi kita dan
(b) berfungsi di Python 3.13.** Yang mengikat ketat adalah `collate-data-diff` (dipakai jalur
lineage dbt OpenMetadata) yang menuntut `<3.11.0`, sedangkan perbaikan kompatibilitas 3.13
berada di versi ≥ ~3.11.
➡️ Jadi masalahnya bukan pilihan paket, melainkan **kombinasi Python 3.13 + tumpukan ini**.
### 3.4 Pelajaran metodologis (penting)
`pip check` **bersih** pada konfigurasi yang **tidak berfungsi**. Artinya:
> Batas dependensi yang dideklarasikan ≠ kebenaran fungsional.
Uji kelayakan untuk tumpukan ini **wajib menjalankan perintah nyata** (mis. `dbt debug`,
`dbt compile`), bukan hanya mengimpor modul atau membaca `--version`.
---
## 4. Koreksi atas rekomendasi K1
Rekomendasi awal saya (K1 = Python **3.13**) dinilai **salah** dan dicabut. Dasarnya waktu itu
adalah "artefak eksperimen sudah tervalidasi end-to-end" — padahal validasi itu **tidak
lengkap**: eksperimen memeriksa `import dbt` dan `dbt --version`, tetapi **tidak pernah
menjalankan `dbt` sungguhan**. B3 — yang memang dirancang sebagai gerbang — yang menemukannya.
**K1 direvisi menjadi Python 3.11**, dengan alasan:
- tujuan BATCH B adalah **Airflow 3.3.2 + OM 2.0.3 + provider MySQL**, bukan Python 3.13;
- `openmetadata-ingestion[airflow]` 2.0.3.0 mem-pin `apache-airflow==3.3.2` **terlepas dari
Python** → 3.3.2 di Python 3.11 tetap koheren;
- Python 3.11 mempertahankan seluruh dependensi lain di set yang **sudah terbukti di produksi**
→ risiko jauh lebih rendah.
---
## 5. Langkah berikutnya (B2 revisi)
| Sub | Isi |
|---|---|
| B2r.1 | `Dockerfile.332` → base `slim-3.3.2-python3.11` (stage builder `mysqlclient` disesuaikan dengan kondisi header Python 3.11 pada base itu) |
| B2r.2 | Regenerasi lock 3.3.2/py3.11 **dengan lock 3.3.1 sebagai `--constraint`** (platform identik → diff minimal; teknik yang terbukti di A1) |
| B2r.3 | Build ulang image (tag tetap `sicabe/airflow:3.3.2-om203-py313`, menimpa image yang no-go) |
| B3r | **Ulangi B3 dengan `dbt debug` + `dbt compile` sebagai syarat WAJIB** (bukan opsional) |
---
## 6. Catatan kesalahan uji saya (agar tidak terulang)
| # | Kesalahan | Akibat |
|---|---|---|
| 1 | Memakai `airflow dags list` untuk menguji folder yang di-mount | `dags list` membaca **metadata DB**, bukan folder → uji pertama tidak sah (diperbaiki dengan impor langsung tiap berkas DAG) |
| 2 | Menguji DAG dari container yang tidak berada di jaringan yang tepat | `openmetadata-server` tidak ter-resolve → kegagalan palsu |
| 3 | Mount dbt **read-only** | dbt perlu menulis `logs/` → keluar `exit 2` **tanpa keluaran sama sekali** (menyesatkan) |
| 4 | `pip install "mashumaro>=3.9,<3.18"` tanpa `--upgrade` | pip tidak menaikkan (3.10 sudah memenuhi rentang) → uji sempat tidak konklusif |
| 5 | Salah mount point volume config OM | kegagalan palsu pada DAG DQ |
| 6 | Pemeriksaan awal hanya `import dbt` / `dbt --version` | kerusakan dbt lolos sampai B3 |