package router import ( "context" "encoding/json" "net/http" "time" metrics "openreplay/backend/pkg/metrics/http" ) func recordMetrics(requestStart time.Time, url string, code, bodySize int) { if bodySize > 0 { metrics.RecordRequestSize(float64(bodySize), url, code) } metrics.IncreaseTotalRequests() metrics.RecordRequestDuration(float64(time.Now().Sub(requestStart).Milliseconds()), url, code) } func (e *Router) ResponseOK(ctx context.Context, w http.ResponseWriter, requestStart time.Time, url string, bodySize int) { w.WriteHeader(http.StatusOK) e.log.Info(ctx, "response ok") recordMetrics(requestStart, url, http.StatusOK, bodySize) } func (e *Router) ResponseWithJSON(ctx context.Context, w http.ResponseWriter, res interface{}, requestStart time.Time, url string, bodySize int) { e.log.Info(ctx, "response ok") body, err := json.Marshal(res) if err != nil { e.log.Error(ctx, "can't marshal response: %s", err) } w.Header().Set("Content-Type", "application/json") w.Write(body) recordMetrics(requestStart, url, http.StatusOK, bodySize) } type response struct { Error string `json:"error"` } func (e *Router) ResponseWithError(ctx context.Context, w http.ResponseWriter, code int, err error, requestStart time.Time, url string, bodySize int) { e.log.Error(ctx, "response error, code: %d, error: %s", code, err) body, err := json.Marshal(&response{err.Error()}) if err != nil { e.log.Error(ctx, "can't marshal response: %s", err) } w.WriteHeader(code) w.Write(body) recordMetrics(requestStart, url, code, bodySize) }