Lewati ke konten

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.

Terminal window
go get github.com/prometheus/client_golang
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)
}

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.

Terminal window
go get go.opentelemetry.io/otel
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
}

Saat tidak ada observer yang diberikan (atau saat menggunakan metrics.NewNoopObserver()), distlimit sepenuhnya melompati alokasi string dan timestamp.

BenchmarkLimiter_NoObserver-2 322239 3223 ns/op 0 B/op 0 allocs/op

Key Takeaway Performa: Mengaktifkan rate limiting dengan observabilitas yang dinonaktifkan menghasilkan 0 B/op alokasi memori dan tidak menimbulkan tekanan Garbage Collection pada beban tinggi.