Episode ini menjadikan aplikasi kalian terobservasi: logging terstruktur dengan Serilog, metrics, tracing, dan integrasi OpenTelemetry, health checks dan monitoring endpoints, serta incident management, diagnostics, dan kesiapan support produksi.

Di produksi, kalian tidak bisa menebak apa yang terjadi di dalam aplikasi — kalian harus melihatnya. Episode 20 membahas observability: kemampuan memahami keadaan sistem dari luarnya lewat tiga pilar — logs, metrics, dan traces.
Kalian akan memperkuat logging dengan Serilog, mengintegrasikan OpenTelemetry untuk tracing dan metrics, memasang health checks, serta menyiapkan prosedur incident management dan diagnostics. Observability bukan pelengkap — ini adalah mata kalian di produksi.
Serilog menulis log sebagai event terstruktur dengan properti bernama — bukan sekadar string. Install dan konfigurasi:
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.ConsoleLalu aktifkan di host:
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.Enrich.FromLogContext()
.CreateLogger();
var builder = Host.CreateApplicationBuilder(args);
builder.Logging.ClearProviders();
builder.Logging.AddSerilog();WriteTo.Console() mengirim log ke console dalam format terstruktur, dan Enrich.FromLogContext() menambahkan konteks seperti trace id ke setiap event. Serilog menggantikan console logging polos dengan output yang bisa di-parse dan diagregasi.
Log terstruktur dikirim ke banyak sink: console untuk pengembangan, Elasticsearch atau Seq untuk agregasi, dan file untuk arsip. Satu pernyataan log dengan property terstruktur memungkinkan query "semua error untuk user X dalam 10 menit" — sesuatu yang mustahil dengan log teks bebas.
OpenTelemetry menyatukan metrics, traces, dan logs dengan satu SDK lintas bahasa. Di .NET:
dotnet add package OpenTelemetry.Extensions.Hosting
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocolAktifkan instrumentasi otomatis untuk HTTP, database, dan HttpClient:
builder.Services.AddOpenTelemetry()
.WithTracing(tracing => tracing
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddEntityFrameworkCoreInstrumentation())
.WithMetrics(metrics => metrics
.AddAspNetCoreInstrumentation()
.AddMeter("Microsoft.AspNetCore.Hosting"));WithTracing menangkap jalur setiap request dari API ke database, dan WithMetrics merekam metrik seperti jumlah request dan durasi. Semuanya diekspor ke backend seperti Prometheus, Grafana, atau OTLP collector.
Sebuah trace terdiri dari span-span yang menceritakan satu request: middleware HTTP, call database, panggilan ke layanan lain. Saat pengguna melapor lambat, trace menunjukkan di span mana waktu hilang — tanpa menebak.
Health check memberi tahu orchestrator dan tim operasi bahwa aplikasi sehat. Tambahkan endpoint:
builder.Services.AddHealthChecks()
.AddDbContextCheck<AppDbContext>();
app.MapHealthChecks("/health");
app.MapHealthChecks("/health/ready");AddDbContextCheck memverifikasi koneksi database — ini adalah pemeriksaan yang nyata, bukan sekadar "aplikasi masih hidup". Endpoint /health/ready dipakai Kubernetes sebagai readiness probe (episode 19), dan /health/live untuk liveness.
Metrik tanpa alert hanyalah grafik yang indah. Pasang aturan alert pada metrik penting: error rate naik, latency p99 melebihi target, atau health check gagal berulang kali. Alert yang baik menyebutkan apa yang salah dan menunjuk ke dashboard yang relevan.
Saat insiden terjadi, ikuti alur yang disepakati: deteksi (alert), klasifikasi severity, komunikasi ke tim, diagnosis, mitigasi, lalu post-mortem. Tujuan utamanya adalah mengurangi waktu pemulihan — MTTR — bukan sekadar menemukan penyebab.
Saat perlu menyelidiki proses berjalan, alat diagnostik dari episode 15 bekerja di produksi:
dotnet-dump collect --process-id 12345
dotnet-dump analyze dump.dmpdotnet-dump collect merekam snapshot memori proses, dan dotnet-dump analyze memeriksanya secara interaktif — mencari thread tersendat, objek besar, atau deadlock. Kombinasi dump dengan trace dan log memberikan gambaran lengkap sebuah insiden.
Tip
Strukturkan log dengan properti terstruktur sejak awal. Mengubah sistem logging setelah produksi berjalan jauh lebih mahal daripada melakukannya dengan benar sekarang.
Inti yang harus dibawa pulang:
Di episode 21 selanjutnya kita akan membahas desktop dan cross-platform apps — .NET MAUI untuk aplikasi mobile dan desktop lintas platform, WPF dan WinForms untuk Windows, Blazor WebAssembly dan Blazor Server, serta packaging, distribution, dan deployment aplikasi desktop dan mobile.