From 6cc0bfd1d79074df790272b8091b1f0226d14283 Mon Sep 17 00:00:00 2001 From: zwlucas Date: Fri, 29 May 2026 15:57:37 -0300 Subject: feat: upload project Signed-off-by: zwlucas --- backend/internal/monitor/checker.go | 86 +++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 backend/internal/monitor/checker.go (limited to 'backend/internal/monitor/checker.go') diff --git a/backend/internal/monitor/checker.go b/backend/internal/monitor/checker.go new file mode 100644 index 0000000..07f807e --- /dev/null +++ b/backend/internal/monitor/checker.go @@ -0,0 +1,86 @@ +package monitor + +import ( + "context" + "io" + "net/http" + "strings" + "time" + + "yaum/internal/model" +) + +var httpClient = &http.Client{ + Timeout: 10 * time.Second, +} + +func CheckHTTP(ctx context.Context, url string, keyword string) model.Heartbeat { + start := time.Now() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return heartbeatFromError(start, err) + } + + resp, err := httpClient.Do(req) + elapsed := time.Since(start).Milliseconds() + + if err != nil { + return model.Heartbeat{ + StatusCode: 0, + ResponseTimeMs: elapsed, + IsUp: false, + ErrorMessage: err.Error(), + TestedAt: time.Now(), + } + } + defer resp.Body.Close() + + isUp := resp.StatusCode >= 200 && resp.StatusCode < 400 + errMsg := "" + + body, readErr := io.ReadAll(resp.Body) + if readErr != nil { + isUp = false + errMsg = "Erro ao ler corpo: " + readErr.Error() + } else { + bodyStr := string(body) + + if keyword != "" && isUp { + if !strings.Contains(bodyStr, keyword) { + isUp = false + errMsg = "Palavra-chave nao encontrada" + } + } + + if !isUp { + snippet := strings.TrimSpace(bodyStr) + if len(snippet) > 300 { + snippet = snippet[:300] + } + if errMsg == "" { + errMsg = snippet + } else { + errMsg += " | " + snippet + } + } + } + + return model.Heartbeat{ + StatusCode: resp.StatusCode, + ResponseTimeMs: elapsed, + IsUp: isUp, + ErrorMessage: errMsg, + TestedAt: time.Now(), + } +} + +func heartbeatFromError(start time.Time, err error) model.Heartbeat { + return model.Heartbeat{ + StatusCode: 0, + ResponseTimeMs: time.Since(start).Milliseconds(), + IsUp: false, + ErrorMessage: err.Error(), + TestedAt: time.Now(), + } +} -- cgit v1.2.3