···88 id INTEGER PRIMARY KEY,
99 name TEXT NOT NULL,
1010 url TEXT NOT NULL,
1111- headers TEXT
1111+ headers TEXT,
1212+ enabled INTEGER NOT NULL DEFAULT TRUE
1213);
13141415-- service_status stores historical status checks.
+1
models/models.go
···1515 Name string `json:"name"`
1616 URL string `json:"url"`
1717 Headers map[string]string `json:"headers,omitempty"`
1818+ Enabled bool `json:"enabled"`
1819}
19202021// Status repesents a single service status being written
+41-38
services/monitor.go
···104104 continue
105105 }
106106107107- statuses := make([]models.Status, len(services))
107107+ var statuses []models.Status
108108 mu := sync.RWMutex{}
109109110110 var wg sync.WaitGroup
111111- for i, svc := range services {
112112- wg.Go(func() {
113113- client := http.Client{
114114- Timeout: 2 * time.Second,
115115- }
116116- req, err := http.NewRequest(http.MethodGet, svc.URL, nil)
117117- if err != nil {
118118- s.logger.Error("error creating new request",
119119- slog.String("url", svc.URL),
120120- slog.Any("error", err))
121121- return
122122- }
123123- if svc.Headers != nil {
124124- for k, v := range svc.Headers {
125125- req.Header.Add(k, v)
111111+ for _, svc := range services {
112112+ if svc.Enabled {
113113+ s.logger.Info("service enabled, getting status", slog.String("name", svc.Name), slog.Bool("enabled", svc.Enabled))
114114+ wg.Go(func() {
115115+ client := http.Client{
116116+ Timeout: 2 * time.Second,
117117+ }
118118+ req, err := http.NewRequest(http.MethodGet, svc.URL, nil)
119119+ if err != nil {
120120+ s.logger.Error("error creating new request",
121121+ slog.String("url", svc.URL),
122122+ slog.Any("error", err))
123123+ return
124124+ }
125125+ if svc.Headers != nil {
126126+ for k, v := range svc.Headers {
127127+ req.Header.Add(k, v)
128128+ }
129129+ }
130130+ var status models.Status
131131+ start := time.Now()
132132+ resp, err := client.Do(req)
133133+ if err != nil {
134134+ s.logger.Error("error getting URL",
135135+ slog.String("url", svc.URL),
136136+ slog.Any("error", err))
137137+ // Server error response OK for now; just need
138138+ // to indicate a problem.
139139+ status.HTTPStatus = http.StatusServiceUnavailable
140140+ }
141141+ status.ServiceID = svc.ID
142142+ status.Duration = time.Since(start)
143143+ status.Timestamp = start
144144+ if resp != nil {
145145+ status.HTTPStatus = resp.StatusCode
126146 }
127127- }
128128- var status models.Status
129129- start := time.Now()
130130- resp, err := client.Do(req)
131131- if err != nil {
132132- s.logger.Error("error getting URL",
133133- slog.String("url", svc.URL),
134134- slog.Any("error", err))
135135- // Server error response OK for now; just need
136136- // to indicate a problem.
137137- status.HTTPStatus = http.StatusServiceUnavailable
138138- }
139139- status.ServiceID = svc.ID
140140- status.Duration = time.Since(start)
141141- status.Timestamp = start
142142- if resp != nil {
143143- status.HTTPStatus = resp.StatusCode
144144- }
145147146146- mu.Lock()
147147- statuses[i] = status
148148- mu.Unlock()
149149- })
148148+ mu.Lock()
149149+ statuses = append(statuses, status)
150150+ mu.Unlock()
151151+ })
152152+ }
150153 }
151154 wg.Wait()
152155