81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"time"
|
|
|
|
"git.xeserv.us/xena/mercy/internal/common"
|
|
"github.com/nats-io/go-nats"
|
|
)
|
|
|
|
func main() {
|
|
uri := os.Getenv("NATS_URL")
|
|
nc, err := common.NatsConnect(uri)
|
|
if err != nil {
|
|
log.Fatal("Error establishing connection to NATS:", err)
|
|
}
|
|
|
|
log.Printf("Connected to NATS at: %s", nc.ConnectedUrl())
|
|
|
|
nc.QueueSubscribe("tasks:http", "worker", func(m *nats.Msg) {
|
|
var hc common.HTTPCheckRequest
|
|
err := json.Unmarshal(m.Data, &hc)
|
|
if err != nil {
|
|
log.Printf("tasks:http: error when decoding json: %v", err)
|
|
return
|
|
}
|
|
|
|
req, err := http.NewRequest(http.MethodGet, hc.URL, nil)
|
|
if err != nil {
|
|
log.Printf("tasks:http: error when creating request: %v", err)
|
|
return
|
|
}
|
|
ctx, cancel := context.WithTimeout(context.Background(), hc.FailThreshold)
|
|
defer cancel()
|
|
|
|
req = req.WithContext(ctx)
|
|
|
|
result := common.CheckResult{Preamble: hc.Preamble}
|
|
before := time.Now()
|
|
|
|
resp, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
switch err {
|
|
case context.Canceled:
|
|
result.Result = common.Failed
|
|
default:
|
|
log.Printf("tasks:http: error when fetching url %s: %v", hc.URL, err)
|
|
result.ErrData = err.Error()
|
|
}
|
|
}
|
|
|
|
if resp.StatusCode/100 == 2 {
|
|
result.Result = common.OK
|
|
}
|
|
|
|
if now := time.Now(); before.Add(hc.DegradedThreshold).Before(now) {
|
|
result.Result = common.Degraded
|
|
}
|
|
|
|
result.Timestamp = time.Now()
|
|
data, err := json.Marshal(&result)
|
|
if err != nil {
|
|
log.Printf("tasks:http: error encoding json for %#v: %v", result, err)
|
|
return
|
|
}
|
|
|
|
err = nc.Publish("results", data)
|
|
if err != nil {
|
|
log.Printf("tasks:http: error publishing results: %v", err)
|
|
}
|
|
})
|
|
|
|
for {
|
|
select {}
|
|
}
|
|
}
|