aboutsummaryrefslogtreecommitdiff
path: root/backend/internal/monitor/checker.go
diff options
context:
space:
mode:
authorzwlucas <lucas.fariamo08@gmail.com>2026-05-29 18:57:37 +0000
committerzwlucas <lucas.fariamo08@gmail.com>2026-05-29 18:57:37 +0000
commit6cc0bfd1d79074df790272b8091b1f0226d14283 (patch)
treecab18b0f708cf3b0eaeeeb98e2cf81459365b33e /backend/internal/monitor/checker.go
downloadyaum-6cc0bfd1d79074df790272b8091b1f0226d14283.tar.gz
yaum-6cc0bfd1d79074df790272b8091b1f0226d14283.zip
feat: upload project
Signed-off-by: zwlucas <lucas.fariamo08@gmail.com>
Diffstat (limited to 'backend/internal/monitor/checker.go')
-rw-r--r--backend/internal/monitor/checker.go86
1 files changed, 86 insertions, 0 deletions
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(),
+ }
+}