Episode ini membahas dukungan produksi untuk aplikasi Swift: crash reporting dan analytics, logging terstruktur dengan OSLog beserta telemetry dan performance monitoring, health checks dan feedback loop pengguna, serta incident response dan release rollback.

Setelah aplikasi dirilis, pekerjaan berubah bentuk: dari menambahkan fitur menjadi memahami perilaku aplikasi di tangan ribuan pengguna. Episode 21 membahas observability dan production support — crash reporting, logging terstruktur, telemetry, health checks, dan proses menanggapi insiden.
Observability menjawab tiga pertanyaan yang menentukan kualitas produksi: apa yang sedang terjadi, mengapa terjadi, dan bagaimana mencegahnya terulang. Tanpa observability, setiap insiden adalah teka-teki yang mahal.
Crash reporter seperti Firebase Crashlytics mengumpulkan stack trace crash dari perangkat pengguna dan menampilkannya dalam dashboard. Informasi kunci setiap crash:
Analytics mencatat apa yang pengguna lakukan — bukan hanya kapan mereka jatuh. Integrasi ringkas memakai SDK atau telemetri custom:
struct Analytics {
static func catat(_ nama: String, data: [String: String] = [:]) {
var event = data
event["event"] = nama
event["app_version"] = Bundle.main.object(forInfoDictionaryKey:
"CFBundleShortVersionString") as? String ?? "?"
kirimEvent(event)
}
}
Analytics.catat("login_berhasil", data: ["metode": "apple"])Analytics.catat("login_berhasil", ...) mencatat event dengan konteks versi aplikasi. Konsistensi skema event — nama yang stabil, field yang terdokumentasi — membuat data analytics bisa dipertanyakan bertahun-tahun kemudian.
OSLog adalah sistem logging resmi Apple, menggantikan print yang tidak seharusnya dipakai di produksi. Log dikelompokkan berdasarkan subsystem dan category, serta punya level severity:
import OSLog
let logger = Logger(subsystem: "com.example.Aplikasi",
category: "jaringan")
func ambilData() async throws -> Data {
logger.info("Memulai request")
do {
let (data, response) = try await URLSession.shared.data(from: url)
logger.debug("Respons: \(response)")
return data
} catch {
logger.error("Request gagal: \(error.localizedDescription)")
throw error
}
}let logger = Logger(subsystem: "com.example.Aplikasi", category: "jaringan") membuat logger per kategori. Level info, debug, dan error membantu memfilter saat debugging. Log OSLog bisa diakses dari terminal:
log stream --predicate 'subsystem == "com.example.Aplikasi"'log stream --predicate 'subsystem == "..."' menampilkan log aplikasi secara real-time — alat utama saat menguji perilaku produksi di simulator atau perangkat.
Telemetry mengukur kesehatan aplikasi secara kontinu: waktu startup, crash-free rate, latensi request, dan metrik kustom. Alat seperti performance monitoring SDK atau implementasi sendiri dengan mencatat durasi operasi kritis:
let mulai = Date()
let data = try await ambilData()
let durasi = Date().timeIntervalSince(mulai)
print("Durasi request: \(durasi)s")let durasi = Date().timeIntervalSince(mulai) mengukur waktu operasi. Kirim metrik ini secara agregat — misalnya p95 — untuk mendeteksi degradasi performa yang halus sebelum pengguna mengeluh.
Untuk server Swift (episode 19), health check memberi tahu platform orkestrasi apakah instance sehat. Vapor menyediakannya langsung:
import Vapor
let healthRoute = app.get("health") { req in
return HTTPStatus.ok
}app.get("health") { req in return HTTPStatus.ok } mengembalikan status 200 saat server hidup. Platform seperti Kubernetes dan load balancer memanggil endpoint ini secara berkala untuk mendeteksi instance yang tidak responsif.
Keluhan pengguna adalah data observability yang tidak tergantikan. Bangun saluran umpan balik yang jelas: tombol lapor masalah di aplikasi, email support, dan forum. Saat insiden terjadi, informasi dari pengguna sering kali memberi konteks yang tidak tertangkap telemetri.
Proses penanganan insiden yang disarankan:
Rollback mengembalikan rilis ke versi sebelumnya yang stabil. Kill switch menonaktifkan fitur tertentu dari jarak jauh tanpa rilis baru — sangat berharga untuk fitur yang berisiko:
struct Konfigurasi {
static let fiturRisikoAktif = ProcessInfo.processInfo
.environment["FITUR_RISIKO"] != "off"
}ProcessInfo.processInfo.environment["FITUR_RISIKO"] membaca flag dari environment — server bisa mematikan fitur tanpa deploy ulang. Di aplikasi client, pola serupa memakai remote config yang diperbarui server-side.
Info
Insiden yang tertangani baik bukan kegagalan — melainkan investasi. Setiap post-mortem menghasilkan runbook, dashboard baru, dan alert yang membuat insiden serupa berikutnya berakhir jauh lebih cepat.
Inti yang harus dibawa pulang:
Di episode 22 selanjutnya kita akan membahas stable modern features dan future trends — fitur Swift terbaru yang stabil seperti concurrency, macros, dan result builders, peningkatan Swift Package Manager dan ABI stability, kekuatan Swift di ekosistem Apple dan cross-platform, serta strategi menjaga keahlian Swift tetap relevan. Perjalanan panjang kalian akan ditutup!