Episode ini membahas observability aplikasi .NET: logging dengan Serilog dan Microsoft.Extensions.Logging, metrics dan tracing dengan OpenTelemetry, health checks dan monitoring endpoints, serta incident response dan troubleshooting di production.

Aplikasi di production akan gagal — pertanyaannya hanya kapan. Saat itu terjadi, kalian harus bisa menjawab tiga pertanyaan dengan cepat: apa yang salah, di mana terjadinya, dan seberapa parah dampaknya. Inilah definisi observability.
Observability bukan sekadar menulis log. Dia adalah disiplin menerbitkan tiga sinyal — log, metrics, dan traces — secara konsisten dari seluruh layanan.
Episode 20 ini membangun sistem observability yang lengkap: logging dengan Serilog, telemetri dengan OpenTelemetry, health checks, dan cara menangani insiden di production.
Di episode 6 kalian berkenalan dengan ILogger. Serilog memperkuatnya dengan log terstruktur dan sink yang beragam — file, console, hingga platform observability:
dotnet add src/Toko.Api package Serilog.AspNetCoreLog.Logger = new LoggerConfiguration()
.WriteTo.Console()
.WriteTo.File("logs/toko-.log", rollingInterval: RollingInterval.Day)
.Enrich.FromLogContext()
.CreateLogger();
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog();WriteTo.File dengan rollingInterval: RollingInterval.Day membuat satu file log per hari, mencegah file membengkak. Serilog mengirim log terstruktur JSON, bukan sekadar teks, sehingga mudah di-query di platform observability.
Selalu gunakan placeholder bernama, bukan concatenation:
logger.LogInformation(
"Order {OrderId} diproses oleh {UserId} sebesar {Total:C}",
orderId, userId, total);Placeholder {OrderId}, {UserId}, dan {Total} menjadi field terpisah di log terstruktur — memungkinkan pencarian seperti "semua order dengan ID X".
OpenTelemetry adalah standar industri untuk telemetri. Library ini menangkap metrics dan traces secara otomatis dari ASP.NET Core dan HttpClient:
dotnet add src/Toko.Api package OpenTelemetry.Extensions.Hosting
dotnet add src/Toko.Api package OpenTelemetry.Instrumentation.AspNetCorebuilder.Services.AddOpenTelemetry()
.WithTracing(tracing =>
{
tracing.AddAspNetCoreInstrumentation();
tracing.AddHttpClientInstrumentation();
})
.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation();
});AddAspNetCoreInstrumentation otomatis merekam durasi tiap request sebagai trace, dan metrik seperti jumlah request per endpoint. Traces dari layanan yang berbeda bisa disatukan untuk melihat perjalanan satu request melintasi microservices.
Untuk instrumentasi manual, gunakan ActivitySource:
ActivitySource Sumber = new("Toko.Orders");
using var activity = Sumber.StartActivity("ProsesOrder");
activity?.SetTag("order.id", orderId);
activity?.SetTag("order.total", total);StartActivity memulai segmen trace dengan tag yang berisi konteks. Ini yang menciptakan correlation ID yang kalian lihat di episode 17.
Platform orkestrasi perlu tahu apakah aplikasi hidup dan siap menerima traffic. ASP.NET Core menyediakan health checks bawaan:
builder.Services.AddHealthChecks()
.AddDbContextCheck<TokoContext>();
var app = builder.Build();
app.MapHealthChecks("/health", new HealthCheckOptions
{
ResponseWriter = async (ctx, report) =>
{
ctx.Response.ContentType = "application/json";
await ctx.Response.WriteAsJsonAsync(report);
}
});MapHealthChecks("/health") menyediakan endpoint /health yang melaporkan status aplikasi dan database. Kubernetes memakai endpoint ini sebagai liveness dan readiness probe untuk memutuskan kapan pod layak menerima traffic.
curl -s http://localhost:8080/healthPerintah curl -s http://localhost:8080/health mengembalikan status Healthy atau Unhealthy beserta detail pemeriksaan. Rutin polling ke endpoint ini adalah fondasi alerting.
Saat insiden terjadi, ikuti alur yang terstruktur:
Log tersebar di banyak pod; kumpulkan dengan kubectl:
kubectl logs deployment/toko-api --tail=200Perintah kubectl logs menampilkan log pod terbaru. Untuk log terpusat, arahkan sink Serilog ke platform seperti Loki atau CloudWatch agar semua log tersedia dalam satu tempat pencarian.
Inti yang harus dibawa pulang:
Di episode 21 selanjutnya kita berpindah ke sisi klien: desktop dan cross-platform apps — .NET MAUI untuk aplikasi lintas platform, dasar WPF dan WinForms, interoperabilitas dengan native libraries, serta packaging dan distribusi aplikasi desktop.