diff --git a/pkg/services/ngalert/image/service.go b/pkg/services/ngalert/image/service.go index 75076d8d2f0..130d917b614 100644 --- a/pkg/services/ngalert/image/service.go +++ b/pkg/services/ngalert/image/service.go @@ -132,9 +132,13 @@ func (s *ScreenshotImageService) NewImage(ctx context.Context, r *models.AlertRu return nil, ErrNoPanel } + logger := s.logger.FromContext(ctx).New( + "dashboard", *r.DashboardUID, + "panel", *r.PanelID) + // If there is an image is in the cache return it instead of taking another screenshot if image, ok := s.cache.Get(ctx, r.GetKey().String()); ok { - s.logger.Debug("Found cached image", "token", image.Token) + logger.Debug("Found cached image", "token", image.Token) return &image, nil } @@ -155,6 +159,8 @@ func (s *ScreenshotImageService) NewImage(ctx context.Context, r *models.AlertRu // To prevent concurrent screenshots of the same dashboard panel we use singleflight, // deduplicated on a base64 hash of the screenshot options. optsHash := base64.StdEncoding.EncodeToString(opts.Hash()) + logger.Debug("Requesting screenshot") + result, err, _ := s.singleflight.Do(optsHash, func() (interface{}, error) { // Once deduplicated concurrent screenshots are then rate-limited screenshot, err := s.limiter.Do(ctx, opts, s.screenshots.Take) @@ -165,19 +171,23 @@ func (s *ScreenshotImageService) NewImage(ctx context.Context, r *models.AlertRu return nil, err } + logger.Debug("Took screenshot", "path", screenshot.Path) image := models.Image{Path: screenshot.Path} // Uploading images is optional if s.uploads != nil { if image, err = s.uploads.Upload(ctx, image); err != nil { - s.logger.Warn("Failed to upload image", "path", image.Path, "error", err) + logger.Warn("Failed to upload image", "error", err) + } else { + logger.Debug("Uploaded image", "url", image.URL) } } if err := s.store.SaveImage(ctx, &image); err != nil { return nil, fmt.Errorf("failed to save image: %w", err) } - s.logger.Debug("Saved new image", "token", image.Token) + logger.Debug("Saved image", "token", image.Token) + return image, nil }) if err != nil { @@ -186,7 +196,9 @@ func (s *ScreenshotImageService) NewImage(ctx context.Context, r *models.AlertRu image := result.(models.Image) if err = s.cache.Set(ctx, r.GetKey().String(), image); err != nil { - s.logger.Warn("Failed to cache image", "token", image.Token, "error", err) + s.logger.Warn("Failed to cache image", + "token", image.Token, + "error", err) } return &image, nil