Episode ini membahas observability untuk aplikasi Hermes: memantau metrik runtime seperti startup, memori, dan eksekusi JavaScript, mengintegrasikannya dengan analytics dan performance tools, lalu menetapkan performance budgets yang bisa ditegakkan di CI.

Episode 19 menutup dengan pipeline CI yang menghasilkan artefak tervalidasi. Tapi build yang baik bukan bukti aplikasi berjalan baik di lapangan — kalian butuh observability: kemampuan melihat apa yang sebenarnya terjadi di perangkat pengguna. Tanpa itu, semua optimasi hanyalah dugaan.
Roadmap episode 20: metrik runtime yang wajib dipantau, cara menangkapnya di aplikasi, integrasi dengan analytics dan performance tools, lalu menetapkan performance budgets yang bisa ditegakkan.
Fokus pada tiga dimensi yang paling sering menjadi sumber keluhan:
Sebagai patokan awal, pakai tabel berikut — angka-angkanya disesuaikan dengan profil aplikasi kalian sendiri:
| Metrik | Nilai target (contoh) | Sumber |
|---|---|---|
| Cold start | di bawah 2000ms | marker aplikasi |
| Long task | di bawah 100ms | PerformanceObserver |
| Heap puncak | di bawah 180MB | HermesInternal |
| Ukuran bytecode | di bawah 4.2MB | artefak build |
Angka di atas hanya contoh — yang terpenting, metrik diukur di produksi, bukan hanya di emulator developer.
Hermes di React Native menyediakan Performance API modern. PerformanceObserver bisa memantau long tasks tanpa menginstrumentasi setiap fungsi:
import { PerformanceObserver } from "react-native-performance";
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.entryType === "longtask" && entry.duration >= 100) {
reportMetric("long_task", entry.duration);
}
}
});
observer.observe({ type: "longtask", buffered: true });Untuk startup, tandai momen penting dengan performance.mark lalu hitung selisihnya dengan performance.measure di akhir:
import { performance } from "react-native-performance";
performance.mark("app:initStart");
// inisialisasi modul, restore state, render pertama
performance.mark("app:initEnd");
performance.measure("app:init", "app:initStart", "app:initEnd");Untuk memori, global.HermesInternal mengekspos info heap yang bisa disnapshot secara berkala:
function sampleHeap() {
const info = global.HermesInternal.getHeapInfo();
reportMetric("heap_used", info.hermes_allocatedBytes ?? 0);
reportMetric("heap_size", info.hermes_heapSize ?? 0);
}
setInterval(sampleHeap, 60_000);Info
Bungkus semua akses HermesInternal dengan pengecekan global.HermesInternal agar kode tetap aman di platform yang tidak menyediakannya, misalnya saat aplikasi dijalankan dengan engine lain pada masa development.
Metrik yang dikumpulkan di perangkat harus dikirim ke pusat analisis. Dua pendekatan yang umum:
Prinsip yang berlaku di keduanya: batch dan kirim secara berkala, jangan kirim per event. Mengirim ratusan request kecil justru mengganggu performa yang sedang kalian ukur:
const queue = [];
export function reportMetric(name, value) {
queue.push({ name, value, ts: Date.now() });
}
setInterval(() => {
if (queue.length === 0) return;
const batch = queue.splice(0, queue.length);
fetch("https://analytics.kalian.app/ingest", {
method: "POST",
body: JSON.stringify({ app: "belajar-hermes", events: batch }),
}).catch(() => {});
}, 30_000);Jangan lupa redaksi data: jangan pernah menyertakan informasi pribadi dalam event metrik — lihat episode 13 tentang runtime privacy.
Budget tanpa penegakan hanyalah harapan. Tulis budget sebagai file yang bisa dibaca oleh CI dan aplikasi sekaligus:
{
"coldStartMs": 2000,
"ttidMs": 350,
"bundleSizeKb": 4200,
"heapPeakMb": 180,
"longTaskMs": 100
}Di CI, ukur ukuran bytecode dan tolak perubahan yang melewati batas bundle:
import fs from "node:fs";
const budget = JSON.parse(fs.readFileSync("budget.json", "utf8"));
const sizeKb = fs.statSync("index.android.hbc").size / 1024;
if (sizeKb > budget.bundleSizeKb) {
throw new Error(
`bundle ${Math.round(sizeKb)}kB melebihi budget ${budget.bundleSizeKb}kB`,
);
}
console.log("budget bundle terpenuhi");Budget runtime (cold start, long task, heap) baru bisa ditegakkan lewat agregasi data produksi. Tetapkan kuartil ke-95 sebagai standar, dan jadikan regresi lintas versi sebagai alasan untuk menunda rilis.
Observability mengubah optimasi dari kebiasaan menjadi proses: metrik diukur di produksi, dikirim secara teragregasi, dan dibandingkan terhadap budget yang eksplisit. Kalau angka menurun antar rilis, kalian tahu persis kapan harus menyelidiki — bukan menunggu laporan pengguna.
Inti yang harus dibawa pulang:
PerformanceObserver dan HermesInternal untuk menangkap metrik tanpa mengubah banyak kode.Di episode 21, kita bahas Scaling Teams & Release Automation: berbagi konvensi build, on-boarding developer baru ke Hermes runtime, dan mendokumentasikan standar performa serta build. Sampai jumpa!