monitor.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package feed
  2. import (
  3. "context"
  4. "errors"
  5. "net/http"
  6. "time"
  7. )
  8. type SiteStatusRequest struct {
  9. URL string `yaml:"url"`
  10. AllowInsecure bool `yaml:"allow-insecure"`
  11. }
  12. type SiteStatus struct {
  13. Code int
  14. TimedOut bool
  15. ResponseTime time.Duration
  16. Error error
  17. }
  18. func getSiteStatusTask(statusRequest *SiteStatusRequest) (SiteStatus, error) {
  19. request, err := http.NewRequest(http.MethodGet, statusRequest.URL, nil)
  20. if err != nil {
  21. return SiteStatus{
  22. Error: err,
  23. }, nil
  24. }
  25. ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
  26. defer cancel()
  27. request = request.WithContext(ctx)
  28. requestSentAt := time.Now()
  29. var response *http.Response
  30. if !statusRequest.AllowInsecure {
  31. response, err = defaultClient.Do(request)
  32. } else {
  33. response, err = defaultInsecureClient.Do(request)
  34. }
  35. status := SiteStatus{ResponseTime: time.Since(requestSentAt)}
  36. if err != nil {
  37. if errors.Is(err, context.DeadlineExceeded) {
  38. status.TimedOut = true
  39. }
  40. status.Error = err
  41. return status, nil
  42. }
  43. defer response.Body.Close()
  44. status.Code = response.StatusCode
  45. return status, nil
  46. }
  47. func FetchStatusForSites(requests []*SiteStatusRequest) ([]SiteStatus, error) {
  48. job := newJob(getSiteStatusTask, requests).withWorkers(20)
  49. results, _, err := workerPoolDo(job)
  50. if err != nil {
  51. return nil, err
  52. }
  53. return results, nil
  54. }