Deployment tanpa observability adalah terbang tanpa instrumen. Episode ini mengaktifkan log terstruktur JSON, endpoint metrics Prometheus, dashboard Grafana, alerting untuk kegagalan autentikasi dan error 5xx, serta agregasi log terpusat dengan Loki.

Episode 25 men-deploy Authelia ke Kubernetes dengan HPA, probes, dan network policy. Infrastruktur berjalan, tapi ada satu pertanyaan yang belum terjawab: bagaimana kalian tahu Authelia benar-benar sehat? Penerbangan tidak mengandalkan perasaan pilot — ia mengandalkan instrumen. Episode 26 membangun instrumen itu: log terstruktur, metrics, dashboard, dan alerting.
Mengapa observability untuk Authelia sangat penting? Karena Authelia adalah gerbang. Masalah kecil di gerbang — server down, session storage rusak, lonjakan brute force — berdampak ke seluruh aplikasi di belakangnya. Semakin dini terdeteksi, semakin kecil blast radius-nya. Monitoring di sini bukan pelengkap, melainkan jaring pengaman untuk seluruh arsitektur yang dibangun sejak episode 13.
Authelia menulis log ke stdout (standar untuk container) dengan dua format: text dan json. Untuk produksi, gunakan JSON — format terstruktur yang bisa diparsing mesin, difilter, dan diagregasi tanpa ambiguitas. Aktifkan lewat blok log di konfigurasi:
log:
level: info
format: json
file_path: ''file_path dikosongkan agar log tetap mengalir ke stdout dan ditangani runtime (Docker logging driver, kubelet, dsb). Jangan menulis log ke file di dalam container — file itu akan hilang saat container diganti, dan tidak ter-rotasi otomatis.
Contoh baris log JSON yang dihasilkan saat permintaan diproses:
{"time":"2026-08-03T10:00:00Z","level":"info","msg":"Request processed","method":"GET","path":"/api/verify","status_code":200,"latency_ms":12}Dengan format seperti ini, kalian bisa membuat query "semua request ke /api/verify yang mengembalikan 5xx dalam 5 menit terakhir" — sesuatu yang hampir mustahil dilakukan dengan log teks biasa.
Level log Authelia: trace, debug, info, warn, error. Aturan praktisnya:
info — seimbang antara informasi dan volume.debug — memperlihatkan keputusan otorisasi dan alur sesi.trace — sangat berisik dan bisa menyertakan data sensitif.Ubah level tanpa restart dengan hot reload, tapi ingat: debug dan trace di produksi permanen adalah kebocoran performa dan risiko privasi — topik yang sudah kalian pelajari di episode 23.
Authelia membawa Prometheus exporter bawaan. Aktifkan lewat blok telemetry — endpoint-nya berdiri di port terpisah (default :9959) sehingga tidak tercampur dengan trafik autentikasi:
telemetry:
metrics:
enabled: true
address: 'tcp://:9959/metrics'Important
Catatan penting: address di atas sudah menyertakan path /metrics. Tanpa path tersebut, endpoint akan merespons 404 — keluhan paling umum di forum Authelia. Cek langsung dengan curl -fsS http://127.0.0.1:9959/metrics untuk memastikan metrics tersaji.
Jangan pernah expose port 9959 ke publik. Metrics tidak berisi kredensial, tapi ia memberi peta lengkap pola autentikasi — cukup berharga bagi penyerang untuk fase reconnaissance.
Authelia mengekspos counter dan histogram berprefix authelia_. Metrik paling penting untuk dipantau:
| Metrik | Vector | Arti |
|---|---|---|
authelia_request_total | code, method | Semua request HTTP; dasar untuk mengukur 5xx |
authelia_authz_total | code | Request otorisasi (endpoint verify) |
authelia_authn_total | success, banned | Autentikasi 1FA — sumber deteksi brute force |
authelia_authn_second_factor_total | success, banned, type | Autentikasi 2FA per jenis (totp, webauthn, duo) |
authelia_authn_passkey_total | success | Autentikasi passkey |
authelia_authn_duration | success | Histogram waktu autentikasi |
Dari sini kalian bisa menghitung rasio sukses-gagal autentikasi, mendeteksi lonjakan banned=true (tanda brute force yang tertahan regulation), dan mengukur latensi autentikasi. Perhatikan bahwa nama metrik bisa berubah antar versi — saat pindah versi, bandingkan output /metrics sebelum memperbarui dashboard.
Tambahkan job scraping di prometheus.yml. Jika Authelia berjalan di Docker Compose, cukup targetkan nama service-nya; di Kubernetes, gunakan ServiceMonitor:
scrape_configs:
- job_name: authelia
metrics_path: /metrics
scheme: http
static_configs:
- targets: ['authelia:9959']Dengan job ini, Prometheus mengambil metrik setiap 15 detik dan menyimpannya di time series — bahan dasar untuk dashboard dan alert.
Authelia menyediakan community dashboard yang bisa diimpor langsung ke Grafana sebagai titik awal. Dashboard itu menunjukkan ringkasan request, tingkat kegagalan autentikasi, dan latensi — lengkap dengan panel yang memakai metrik di atas.
Jangan berhenti di dashboard bawaan. Buat panel kustom yang menjawab pertanyaan operasional kalian sendiri:
authelia_authn_duration)authelia_authn_total dengan banned="true")Dashboard yang bagus adalah yang mengubah angka menjadi keputusan, bukan sekadar koleksi panel yang indah.
Dashboard hanya berguna saat kalian sedang menontonnya. Alerting bekerja 24 jam. Definisikan aturan di Prometheus — contoh untuk tiga skenario paling penting:
groups:
- name: authelia
rules:
- alert: AutheliaDown
expr: up{job="authelia"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Authelia tidak merespons scraping"
- alert: AuthenticationFailuresSpike
expr: rate(authelia_authn_total{success="false"}[5m]) > 10
for: 2m
labels:
severity: warning
annotations:
summary: "Lonjakan kegagalan autentikasi 1FA"
- alert: HighServerErrors
expr: sum(rate(authelia_request_total{code=~"5.."}[5m])) > 0.05
for: 5m
labels:
severity: warning
annotations:
summary: "Terlalu banyak respons 5xx dari Authelia"Teruskan alert ke kanal yang benar-benar dilihat tim: Telegram, Discord, Slack, atau email — bisa lewat Alertmanager. Dua alarm yang paling sering menyelamatkan produksi adalah lonjakan gagal autentikasi (indikasi serangan atau konfigurasi rusak) dan AutheliaDown (indikasi seluruh gerbang tutup).
Metrics memberi tahu apakah ada masalah; log memberi tahu mengapa. Saat ada insiden, kalian butuh membaca log dari semua instance sekaligus, bukan membuka terminal satu per satu. Loki — pair natural Prometheus dari Grafana — menerima log JSON Authelia dan mengindeksnya berdasarkan label:
discovery.relabel "authelia" {
targets = discovery.docker.targets("docker", {}).output
rule {
source_labels = ["__meta_docker_container_name"]
regex = "authelia-.*"
action = "keep"
}
rule {
source_labels = ["__meta_docker_container_name"]
target_label = "container"
}
}Dengan label container="authelia", query Loki seperti {container=~"authelia.*"} |= "level\":\"error" langsung menampilkan semua error dari semua instance dalam satu tempat. Promtail untuk file-based atau kube-prometheus-stack untuk Kubernetes adalah alternatif yang umum.
Episode 26 melengkapi lapisan observability: mengaktifkan log terstruktur JSON dengan level yang tepat, menyalakan endpoint metrics Prometheus di port 9959, memanennya dengan job scraping, menampilkan di dashboard Grafana, menegakkan alerting untuk skenario kritis, dan mengagregasi log terpusat dengan Loki.
Poin kunci:
log.format: json dan biarkan log mengalir ke stdout.telemetry.metrics.address dengan path /metrics — tanpa path, endpoint 404.authelia_authn_total dan authelia_authn_second_factor_total untuk pola serangan.AutheliaDown, lonjakan gagal autentikasi, dan 5xx.Semua data sudah terkumpul — sekarang pertanyaannya: apa yang terjadi kalau semuanya hilang? Di episode 27 kita bedah Backup & Disaster Recovery: apa yang wajib di-backup, strategi, prosedur restore, dan skenario bencana. Sampai jumpa di episode 27!