package authserver import ( "fmt" "time" "github.com/gin-gonic/gin" "github.com/penglongli/gin-metrics/ginmetrics" ) const ( metricPath = "/metrics" maxLatencySeconds = 1 authRequests = "auth_request_total" authOperations = "auth_query_total" authSlowReQuests = "auth_slow_request_total" authResponseTime = "auth_query_duration" ) func useMetrics(r gin.IRoutes) { // get global Monitor object m := ginmetrics.GetMonitor() m.SetMetricPath(metricPath) m.SetSlowTime(maxLatencySeconds) _ = m.AddMetric(&ginmetrics.Metric{ Type: ginmetrics.Counter, Name: authRequests, Description: "count all auth requests.", Labels: nil, }) _ = m.AddMetric(&ginmetrics.Metric{ Type: ginmetrics.Counter, Name: authOperations, Description: "count all auth requests by status.", Labels: []string{"status"}, }) _ = m.AddMetric(&ginmetrics.Metric{ Type: ginmetrics.Counter, Name: authSlowReQuests, Description: fmt.Sprintf("count all auth slow requests by status. max_lentency=%d sec.", maxLatencySeconds), Labels: []string{"status"}, }) m.SetDuration([]float64{0.1, 0.3, 1.2, 5, 10}) _ = m.AddMetric(&ginmetrics.Metric{ Type: ginmetrics.Histogram, Name: authResponseTime, Description: "the time auth server took handle the request by status.", Labels: []string{"status"}, Buckets: []float64{0.1, 0.3, 1.2, 5, 10}, }) m.Use(r) } func handleMetrics(success bool, start time.Time) { latency := time.Since(start) _ = ginmetrics.GetMonitor().GetMetric(authRequests).Inc(nil) status := "verified" if !success { status = "denied" } labels := []string{status} // metrics per name and status _ = ginmetrics.GetMonitor().GetMetric(authOperations).Inc(labels) // slow metrics per name, operation and status if int32(latency.Seconds()) > maxLatencySeconds { _ = ginmetrics.GetMonitor().GetMetric(authSlowReQuests).Inc(labels) } // metrics for response time _ = ginmetrics.GetMonitor().GetMetric(authResponseTime).Observe([]string{status}, latency.Seconds()) }