aboutsummaryrefslogtreecommitdiff
path: root/backend/internal/monitor/checker.go
blob: 07f807eb27d8cb993a7c81f386eb384990070896 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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(),
	}
}