5.7 KiB
Hasil Uji B3 — Titik Go/No-Go BATCH B (review R18)
Tanggal: 2026-10-01 · Image diuji:
sicabe/airflow:3.3.2-om203-py313(ID33990a6c2b88) 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-pinapache-airflow==3.3.2terlepas 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 |