Observabilitas & Telemetri
distlimit memiliki arsitektur telemetri pluggable via interface metrics.Observer. Saat dinonaktifkan, subsistem telemetri ini memberikan overhead memori 0 B/op dan latensi nol.
📊 Integrasi Prometheus (metrics/prometheus)
Section titled “📊 Integrasi Prometheus (metrics/prometheus)”Collector Prometheus (distprom.Observer) mengekspor metrik untuk jumlah evaluasi, latensi eksekusi, dan event failover circuit breaker.
Instalasi
Section titled “Instalasi”go get github.com/prometheus/client_golangSetup Kode Lengkap
Section titled “Setup Kode Lengkap”package main
import ( "net/http" "time"
"github.com/balramadan/distlimit" "github.com/balramadan/distlimit/algorithm/tokenbucket" "github.com/balramadan/distlimit/driver/memory" distprom "github.com/balramadan/distlimit/metrics/prometheus" distlimitnethttp "github.com/balramadan/distlimit/middleware/nethttp" "github.com/prometheus/client_golang/prometheus/promhttp")
func main() { memDriver := memory.New(5 * time.Minute)
// 1. Inisialisasi Prometheus Observer promObserver := distprom.NewObserver( distprom.WithNamespace("api_gateway"), distprom.WithSubsystem("rate_limiter"), )
// 2. Pasangkan Observer ke Limiter limiter, _ := distlimit.New( memDriver, distlimit.WithLimit(100), distlimit.WithWindow(1*time.Minute), distlimit.WithAlgorithm(tokenbucket.New()), distlimit.WithMetricObserver(promObserver), )
mux := http.NewServeMux()
// 3. Aktifkan Route Labeling pada Middleware apiHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("ok")) }) mux.Handle("/api/v1/users", distlimitnethttp.New( limiter, distlimitnethttp.WithRouteLabeling(true), )(apiHandler))
// 4. Sediakan Endpoint Metrics untuk Scraper Prometheus mux.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8080", mux)}Metrik Prometheus yang Diekspor
Section titled “Metrik Prometheus yang Diekspor”| Nama Metrik | Tipe | Label | Deskripsi |
|---|---|---|---|
distlimit_requests_total |
Counter | status, driver, algorithm, route |
Total evaluasi rate limit. Nilai status: allowed atau blocked. |
distlimit_evaluation_duration_seconds |
Histogram | driver, algorithm, route |
Latensi eksekusi internal evaluasi rate limit dalam detik. |
distlimit_hybrid_fallback_total |
Counter | driver |
Total kegagalan Redis di mana Driver Hybrid beralih ke memori. |
🔭 Integrasi OpenTelemetry (metrics/otel)
Section titled “🔭 Integrasi OpenTelemetry (metrics/otel)”Observer OpenTelemetry (distotel.Observer) mencatat counter dan histogram menggunakan OTel Meter Provider standar.
Instalasi
Section titled “Instalasi”go get go.opentelemetry.io/otelSetup Kode Lengkap
Section titled “Setup Kode Lengkap”package main
import ( "time"
"github.com/balramadan/distlimit" "github.com/balramadan/distlimit/algorithm/tokenbucket" "github.com/balramadan/distlimit/driver/memory" distotel "github.com/balramadan/distlimit/metrics/otel" "go.opentelemetry.io/otel")
func main() { memDriver := memory.New(5 * time.Minute)
// Inisialisasi OpenTelemetry Observer menggunakan MeterProvider global otelObserver := distotel.NewObserver( distotel.WithMeterProvider(otel.GetMeterProvider()), )
limiter, _ := distlimit.New( memDriver, distlimit.WithLimit(100), distlimit.WithWindow(1*time.Minute), distlimit.WithAlgorithm(tokenbucket.New()), distlimit.WithMetricObserver(otelObserver), )
_ = limiter}Jaminan Zero-Allocation
Section titled “Jaminan Zero-Allocation”Saat tidak ada observer yang diberikan (atau saat menggunakan metrics.NewNoopObserver()), distlimit sepenuhnya melompati alokasi string dan timestamp.
Hasil Benchmark
Section titled “Hasil Benchmark”BenchmarkLimiter_NoObserver-2 322239 3223 ns/op 0 B/op 0 allocs/opKey Takeaway Performa: Mengaktifkan rate limiting dengan observabilitas yang dinonaktifkan menghasilkan
0 B/opalokasi memori dan tidak menimbulkan tekanan Garbage Collection pada beban tinggi.