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) } log.Printf() }) for { select {} } }