mirror of
https://github.com/ferdzo/fs.git
synced 2026-04-04 20:36:25 +00:00
Auth for metrics, removed unwanted metrics and fixed tests.
This commit is contained in:
@@ -110,13 +110,14 @@ func (h *Handler) handleHealth(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) handleMetrics(w http.ResponseWriter, r *http.Request) {
|
func (h *Handler) handleMetrics(w http.ResponseWriter, r *http.Request) {
|
||||||
payload := metrics.Default.RenderPrometheus()
|
|
||||||
w.Header().Set("Content-Type", "text/plain; version=0.0.4; charset=utf-8")
|
w.Header().Set("Content-Type", "text/plain; version=0.0.4; charset=utf-8")
|
||||||
w.Header().Set("Content-Length", strconv.Itoa(len(payload)))
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
if r.Method == http.MethodHead {
|
if r.Method == http.MethodHead {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
payload := metrics.Default.RenderPrometheus()
|
||||||
|
w.Header().Set("Content-Length", strconv.Itoa(len(payload)))
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
_, _ = w.Write([]byte(payload))
|
_, _ = w.Write([]byte(payload))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -645,7 +646,6 @@ func newLimitedListener(inner net.Listener, maxConns int) net.Listener {
|
|||||||
return inner
|
return inner
|
||||||
}
|
}
|
||||||
metrics.Default.SetConnectionPoolMax(maxConns)
|
metrics.Default.SetConnectionPoolMax(maxConns)
|
||||||
metrics.Default.SetWorkerPoolSize(maxConns)
|
|
||||||
return &limitedListener{
|
return &limitedListener{
|
||||||
Listener: inner,
|
Listener: inner,
|
||||||
slots: make(chan struct{}, maxConns),
|
slots: make(chan struct{}, maxConns),
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ func Middleware(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.URL.Path == "/healthz" || r.URL.Path == "/metrics" {
|
if r.URL.Path == "/healthz" {
|
||||||
metrics.Default.ObserveAuth("bypass", "none", "public_endpoint")
|
metrics.Default.ObserveAuth("bypass", "none", "public_endpoint")
|
||||||
next.ServeHTTP(w, r.WithContext(WithRequestContext(r.Context(), authCtx)))
|
next.ServeHTTP(w, r.WithContext(WithRequestContext(r.Context(), authCtx)))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -90,10 +90,8 @@ func HTTPMiddleware(logger *slog.Logger, cfg Config) func(http.Handler) http.Han
|
|||||||
ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor)
|
ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor)
|
||||||
op := metricOperationLabel(r)
|
op := metricOperationLabel(r)
|
||||||
metrics.Default.IncHTTPInFlightOp(op)
|
metrics.Default.IncHTTPInFlightOp(op)
|
||||||
metrics.Default.IncWorkerPoolActive()
|
|
||||||
defer func() {
|
defer func() {
|
||||||
metrics.Default.DecHTTPInFlightOp(op)
|
metrics.Default.DecHTTPInFlightOp(op)
|
||||||
metrics.Default.DecWorkerPoolActive()
|
|
||||||
}()
|
}()
|
||||||
requestID := middleware.GetReqID(r.Context())
|
requestID := middleware.GetReqID(r.Context())
|
||||||
if requestID != "" {
|
if requestID != "" {
|
||||||
|
|||||||
@@ -75,8 +75,6 @@ type Registry struct {
|
|||||||
connectionPoolWaits atomic.Uint64
|
connectionPoolWaits atomic.Uint64
|
||||||
|
|
||||||
requestQueueLength atomic.Int64
|
requestQueueLength atomic.Int64
|
||||||
workerPoolActive atomic.Int64
|
|
||||||
workerPoolSize atomic.Int64
|
|
||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
|
|
||||||
@@ -364,21 +362,6 @@ func (r *Registry) DecRequestQueueLength() {
|
|||||||
r.requestQueueLength.Add(-1)
|
r.requestQueueLength.Add(-1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Registry) SetWorkerPoolSize(size int) {
|
|
||||||
if size < 0 {
|
|
||||||
size = 0
|
|
||||||
}
|
|
||||||
r.workerPoolSize.Store(int64(size))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Registry) IncWorkerPoolActive() {
|
|
||||||
r.workerPoolActive.Add(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Registry) DecWorkerPoolActive() {
|
|
||||||
r.workerPoolActive.Add(-1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *Registry) ObserveLockWait(lockName string, d time.Duration) {
|
func (r *Registry) ObserveLockWait(lockName string, d time.Duration) {
|
||||||
lockName = strings.TrimSpace(lockName)
|
lockName = strings.TrimSpace(lockName)
|
||||||
if lockName == "" {
|
if lockName == "" {
|
||||||
@@ -520,10 +503,7 @@ func (r *Registry) RenderPrometheus() string {
|
|||||||
connectionMax := float64(r.connectionPoolMax.Load())
|
connectionMax := float64(r.connectionPoolMax.Load())
|
||||||
connectionWaits := r.connectionPoolWaits.Load()
|
connectionWaits := r.connectionPoolWaits.Load()
|
||||||
queueLength := float64(r.requestQueueLength.Load())
|
queueLength := float64(r.requestQueueLength.Load())
|
||||||
workerActive := float64(r.workerPoolActive.Load())
|
|
||||||
workerSize := float64(r.workerPoolSize.Load())
|
|
||||||
|
|
||||||
openFDs, hasOpenFDs := readOpenFDs()
|
|
||||||
resident, hasResident := readResidentMemoryBytes()
|
resident, hasResident := readResidentMemoryBytes()
|
||||||
cpuSeconds, hasCPU := readProcessCPUSeconds()
|
cpuSeconds, hasCPU := readProcessCPUSeconds()
|
||||||
|
|
||||||
@@ -555,8 +535,6 @@ func (r *Registry) RenderPrometheus() string {
|
|||||||
writeCounter(&b, "fs_connection_pool_waits_total", "Number of waits due to pool saturation.", connectionWaits)
|
writeCounter(&b, "fs_connection_pool_waits_total", "Number of waits due to pool saturation.", connectionWaits)
|
||||||
|
|
||||||
writeGauge(&b, "fs_request_queue_length", "Requests waiting for an execution slot.", queueLength)
|
writeGauge(&b, "fs_request_queue_length", "Requests waiting for an execution slot.", queueLength)
|
||||||
writeGauge(&b, "fs_worker_pool_active", "Active workers.", workerActive)
|
|
||||||
writeGauge(&b, "fs_worker_pool_size", "Configured worker pool size.", workerSize)
|
|
||||||
|
|
||||||
writeHistogramVecKV(&b, "fs_lock_wait_seconds", "Time spent waiting for locks.", lockWait, []string{"lock_name"})
|
writeHistogramVecKV(&b, "fs_lock_wait_seconds", "Time spent waiting for locks.", lockWait, []string{"lock_name"})
|
||||||
writeHistogramVecKV(&b, "fs_lock_hold_seconds", "Time locks were held.", lockHold, []string{"lock_name"})
|
writeHistogramVecKV(&b, "fs_lock_hold_seconds", "Time locks were held.", lockHold, []string{"lock_name"})
|
||||||
@@ -594,10 +572,6 @@ func (r *Registry) RenderPrometheus() string {
|
|||||||
if hasResident {
|
if hasResident {
|
||||||
writeGauge(&b, "process_resident_memory_bytes", "Resident memory size in bytes.", resident)
|
writeGauge(&b, "process_resident_memory_bytes", "Resident memory size in bytes.", resident)
|
||||||
}
|
}
|
||||||
if hasOpenFDs {
|
|
||||||
writeGauge(&b, "process_open_fds", "Number of open file descriptors.", openFDs)
|
|
||||||
writeGauge(&b, "fs_open_fds", "Number of open file descriptors.", openFDs)
|
|
||||||
}
|
|
||||||
|
|
||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
@@ -732,8 +706,16 @@ func writeHistogramWithLabelsMap(b *strings.Builder, name string, labels map[str
|
|||||||
}
|
}
|
||||||
fmt.Fprintf(b, "%s_bucket{%s} %d\n", name, labelsToString(bucketLabels), cumulative)
|
fmt.Fprintf(b, "%s_bucket{%s} %d\n", name, labelsToString(bucketLabels), cumulative)
|
||||||
}
|
}
|
||||||
fmt.Fprintf(b, "%s_sum{%s} %.9f\n", name, labelsToString(labels), s.sum)
|
labelsSuffix := formatLabelsSuffix(labels)
|
||||||
fmt.Fprintf(b, "%s_count{%s} %d\n", name, labelsToString(labels), s.count)
|
fmt.Fprintf(b, "%s_sum%s %.9f\n", name, labelsSuffix, s.sum)
|
||||||
|
fmt.Fprintf(b, "%s_count%s %d\n", name, labelsSuffix, s.count)
|
||||||
|
}
|
||||||
|
|
||||||
|
func formatLabelsSuffix(labels map[string]string) string {
|
||||||
|
if len(labels) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return "{" + labelsToString(labels) + "}"
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatLabels(keys, values []string) string {
|
func formatLabels(keys, values []string) string {
|
||||||
@@ -786,14 +768,6 @@ func escapeLabelValue(value string) string {
|
|||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
func readOpenFDs() (float64, bool) {
|
|
||||||
entries, err := os.ReadDir("/proc/self/fd")
|
|
||||||
if err != nil {
|
|
||||||
return 0, false
|
|
||||||
}
|
|
||||||
return float64(len(entries)), true
|
|
||||||
}
|
|
||||||
|
|
||||||
func readResidentMemoryBytes() (float64, bool) {
|
func readResidentMemoryBytes() (float64, bool) {
|
||||||
data, err := os.ReadFile("/proc/self/statm")
|
data, err := os.ReadFile("/proc/self/statm")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
26
metrics/metrics_test.go
Normal file
26
metrics/metrics_test.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package metrics
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRenderPrometheusHistogramNoEmptyLabelSet(t *testing.T) {
|
||||||
|
reg := NewRegistry()
|
||||||
|
reg.ObserveBatchSize(3)
|
||||||
|
reg.ObserveGC(0, 0, 0, 0, true)
|
||||||
|
|
||||||
|
out := reg.RenderPrometheus()
|
||||||
|
if strings.Contains(out, "fs_batch_size_histogram_sum{}") {
|
||||||
|
t.Fatalf("unexpected empty label set for batch sum metric")
|
||||||
|
}
|
||||||
|
if strings.Contains(out, "fs_batch_size_histogram_count{}") {
|
||||||
|
t.Fatalf("unexpected empty label set for batch count metric")
|
||||||
|
}
|
||||||
|
if strings.Contains(out, "fs_gc_duration_seconds_sum{}") {
|
||||||
|
t.Fatalf("unexpected empty label set for gc sum metric")
|
||||||
|
}
|
||||||
|
if strings.Contains(out, "fs_gc_duration_seconds_count{}") {
|
||||||
|
t.Fatalf("unexpected empty label set for gc count metric")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user