From 37c3b2a78017e3acfb36664d74062a100c7b8f90 Mon Sep 17 00:00:00 2001 From: Tim Wundenberg Date: Mon, 9 Sep 2024 23:16:27 +0200 Subject: [PATCH] feat: inc generic metric if error occurs #161 --- service/auth.go | 23 +++++++++++------------ service/workout.go | 3 +-- utils/http.go | 21 +++++++++++++++++++++ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/service/auth.go b/service/auth.go index f2d1820..3853e9d 100644 --- a/service/auth.go +++ b/service/auth.go @@ -5,7 +5,6 @@ import ( "crypto/subtle" "database/sql" "encoding/base64" - "log/slog" "net/http" "net/mail" "strings" @@ -96,12 +95,12 @@ func HandleSignUpVerifyResponsePage(db *sql.DB) http.HandlerFunc { `, token) if err != nil { - slog.Error("Could not update user: " + err.Error()) + utils.LogError("Could not update user", err) return } i, err := result.RowsAffected() if err != nil { - slog.Error("Could not get rows affected: " + err.Error()) + utils.LogError("Could not get rows affected", err) return } @@ -144,7 +143,7 @@ func HandleSignUpComp(db *sql.DB) http.HandlerFunc { userId, err := uuid.NewRandom() if err != nil { - slog.Error("Could not generate UUID: %v", err) + utils.LogError("Could not generate UUID", err) auth.Error("Internal Server Error").Render(r.Context(), w) return } @@ -152,7 +151,7 @@ func HandleSignUpComp(db *sql.DB) http.HandlerFunc { salt := make([]byte, 16) _, err = rand.Read(salt) if err != nil { - slog.Error("Could not generate salt: %v", err) + utils.LogError("Could not generate salt", err) auth.Error("Internal Server Error").Render(r.Context(), w) return } @@ -172,7 +171,7 @@ func HandleSignUpComp(db *sql.DB) http.HandlerFunc { } auth.Error("Internal Server Error").Render(r.Context(), w) - slog.Error("Could not insert user: %v", err) + utils.LogError("Could not insert user", err) return } @@ -250,7 +249,7 @@ func HandleSignOutComp(db *sql.DB) http.HandlerFunc { if user != nil { _, err := db.Exec("DELETE FROM session WHERE session_id = ?", user.SessionId) if err != nil { - slog.Error("Could not delete session: %v", err) + utils.LogError("Could not delete session%v", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } @@ -289,14 +288,14 @@ func sendVerificationEmail(db *sql.DB, r *http.Request, userId string, email str var b []byte = make([]byte, 32) _, err := rand.Reader.Read(b) if err != nil { - slog.Error("Could not generate token: " + err.Error()) + utils.LogError("Could not generate token", err) return } token := base64.StdEncoding.EncodeToString(b) _, err = db.Exec("INSERT INTO user_token (user_uuid, type, token, created_at) VALUES (?, 'email_verify', ?, datetime())", userId, token) if err != nil { - slog.Error("Could not insert token: " + err.Error()) + utils.LogError("Could not insert token", err) return } @@ -310,7 +309,7 @@ func tryCreateSessionAndSetCookie(r *http.Request, w http.ResponseWriter, db *sq var session_id_bytes []byte = make([]byte, 32) _, err := rand.Reader.Read(session_id_bytes) if err != nil { - slog.Error("Could not generate session ID: " + err.Error()) + utils.LogError("Could not generate session ID", err) auth.Error("Internal Server Error").Render(r.Context(), w) return false } @@ -319,12 +318,12 @@ func tryCreateSessionAndSetCookie(r *http.Request, w http.ResponseWriter, db *sq // Delete old inactive sessions _, err = db.Exec("DELETE FROM session WHERE created_at < datetime('now','-8 hours') AND user_uuid = ?", user_uuid) if err != nil { - slog.Error("Could not delete old sessions: " + err.Error()) + utils.LogError("Could not delete old sessions", err) } _, err = db.Exec("INSERT INTO session (session_id, user_uuid, created_at) VALUES (?, ?, datetime())", session_id, user_uuid) if err != nil { - slog.Error("Could not insert session: " + err.Error()) + utils.LogError("Could not insert session", err) auth.Error("Internal Server Error").Render(r.Context(), w) return false } diff --git a/service/workout.go b/service/workout.go index 3c67e09..a43cea6 100644 --- a/service/workout.go +++ b/service/workout.go @@ -1,7 +1,6 @@ package service import ( - "log/slog" "me-fit/template" "me-fit/template/workout" "me-fit/utils" @@ -66,7 +65,7 @@ func HandleWorkoutNewComp(db *sql.DB) http.HandlerFunc { var rowId int err = db.QueryRow("INSERT INTO workout (user_id, date, type, sets, reps) VALUES (?, ?, ?, ?, ?) RETURNING rowid", user.Id, date, typeStr, sets, reps).Scan(&rowId) if err != nil { - slog.Error(err.Error()) + utils.LogError("Could not insert workout", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } diff --git a/utils/http.go b/utils/http.go index 8dd3b31..72f1a79 100644 --- a/utils/http.go +++ b/utils/http.go @@ -6,6 +6,9 @@ import ( "me-fit/types" "net/http" "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" ) type ContextKey string @@ -14,6 +17,24 @@ const ( ContextKeyUser ContextKey = "user_id" ) +var ( + errorMetric = promauto.NewCounter( + prometheus.CounterOpts{ + Name: "mefit_error_total", + Help: "The total number of errors during processing", + }, + ) +) + +func LogError(message string, err error) { + slog.Error(message + ": " + err.Error()) + errorMetric.Inc() +} +func LogErrorMsg(message string) { + slog.Error(message) + errorMetric.Inc() +} + func DoRedirect(w http.ResponseWriter, r *http.Request, url string) { isHtmx := r.Header.Get("HX-Request") == "true" if isHtmx {