mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-05-19 16:27:37 +00:00
Improve performance when serving /api/state in mock mode by optimizing alert handling and JSON serialization. Changes: - Add UpdateAlertSnapshots() to cache alerts without blocking - Use lazy population of alert snapshots to avoid lock contention - Switch to json.Marshal for better performance with large payloads - Add debug logging to track /api/state performance - Simplify GetState() logic in mock mode Performance improvements: - Eliminates alert manager lock during /api/state requests - Reduces JSON encoding overhead for large mock datasets - Ensures sub-second response times even with 7 nodes and 90+ guests Testing: - Mock mode returns state instantly without blocking - Alert snapshots populate correctly on first request - Debug logs confirm fast execution path
45 lines
1.2 KiB
Go
45 lines
1.2 KiB
Go
package utils
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
// Float64Ptr returns a pointer to the given float64 value
|
|
func Float64Ptr(v float64) *float64 {
|
|
return &v
|
|
}
|
|
|
|
// GenerateID generates a unique ID with the given prefix
|
|
func GenerateID(prefix string) string {
|
|
return fmt.Sprintf("%s-%d", prefix, time.Now().UnixNano())
|
|
}
|
|
|
|
// WriteJSONResponse writes a JSON response to the http.ResponseWriter
|
|
func WriteJSONResponse(w http.ResponseWriter, data interface{}) error {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
// Use Marshal instead of Encoder for better performance with large payloads
|
|
jsonData, err := json.Marshal(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = w.Write(jsonData)
|
|
return err
|
|
}
|
|
|
|
// WriteJSONError writes a JSON error response to the http.ResponseWriter
|
|
func WriteJSONError(w http.ResponseWriter, message string, code int) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.WriteHeader(code)
|
|
_ = json.NewEncoder(w).Encode(map[string]string{"error": message})
|
|
}
|
|
|
|
// DecodeJSONBody decodes a JSON request body into the given interface
|
|
func DecodeJSONBody(r *http.Request, v interface{}) error {
|
|
if err := json.NewDecoder(r.Body).Decode(v); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|