diff --git a/internal/episodes/service/cache_store.go b/internal/episodes/service/cache_store.go index 3d7041f..43d9e65 100644 --- a/internal/episodes/service/cache_store.go +++ b/internal/episodes/service/cache_store.go @@ -132,13 +132,12 @@ func (s *EpisodeService) markFailure(ctx context.Context, anime domain.Anime, ca } func (s *EpisodeService) getCached(ctx context.Context, anime domain.Anime) (domain.CanonicalEpisodeList, bool) { - return s.getDecodedCached(ctx, anime, "episode_availability") + return s.getDecodedCached(ctx, anime) } func (s *EpisodeService) getFreshCached(ctx context.Context, anime domain.Anime) (domain.CanonicalEpisodeList, bool) { row, err := s.queries.GetEpisodeAvailabilityCache(ctx, int64(anime.MalID)) if err != nil { - s.metrics.ObserveCache("episode_availability_fresh", "miss") return domain.CanonicalEpisodeList{}, false } @@ -147,11 +146,10 @@ func (s *EpisodeService) getFreshCached(ctx context.Context, anime domain.Anime) return domain.CanonicalEpisodeList{}, false } - payload, ok := s.decodeCachedPayload(anime, row.Data, "episode_availability_fresh") + payload, ok := s.decodeCachedPayload(anime, row.Data) if !ok { return domain.CanonicalEpisodeList{}, false } - s.metrics.ObserveCache("episode_availability_fresh", "hit") observability.Info( "episodes_cache_served", "episodes", @@ -165,23 +163,20 @@ func (s *EpisodeService) getFreshCached(ctx context.Context, anime domain.Anime) return payload, true } -func (s *EpisodeService) getDecodedCached(ctx context.Context, anime domain.Anime, metric string) (domain.CanonicalEpisodeList, bool) { +func (s *EpisodeService) getDecodedCached(ctx context.Context, anime domain.Anime) (domain.CanonicalEpisodeList, bool) { row, err := s.queries.GetEpisodeAvailabilityCache(ctx, int64(anime.MalID)) if err != nil { - s.metrics.ObserveCache(metric, "miss") return domain.CanonicalEpisodeList{}, false } - payload, ok := s.decodeCachedPayload(anime, row.Data, metric) + payload, ok := s.decodeCachedPayload(anime, row.Data) if !ok { return domain.CanonicalEpisodeList{}, false } - s.metrics.ObserveCache(metric, "hit") return payload, true } func (s *EpisodeService) isFreshEpisodeCache(anime domain.Anime, row db.EpisodeAvailabilityCache, now time.Time) bool { if row.NextRefreshAt.Valid && !row.NextRefreshAt.Time.After(now) { - s.metrics.ObserveCache("episode_availability_fresh", "miss") observability.Info( "episodes_cache_due_for_refresh", "episodes", @@ -194,7 +189,6 @@ func (s *EpisodeService) isFreshEpisodeCache(anime domain.Anime, row db.EpisodeA return false } if anime.Airing && row.UpdatedAt.Before(now.Add(-airingFallbackRefreshInterval)) { - s.metrics.ObserveCache("episode_availability_fresh", "miss") observability.Info( "episodes_cache_too_old_for_airing", "episodes", @@ -209,10 +203,9 @@ func (s *EpisodeService) isFreshEpisodeCache(anime domain.Anime, row db.EpisodeA return true } -func (s *EpisodeService) decodeCachedPayload(anime domain.Anime, raw string, metric string) (domain.CanonicalEpisodeList, bool) { +func (s *EpisodeService) decodeCachedPayload(anime domain.Anime, raw string) (domain.CanonicalEpisodeList, bool) { var payload domain.CanonicalEpisodeList if err := json.Unmarshal([]byte(raw), &payload); err != nil { - s.metrics.ObserveCache(metric, "miss") observability.Warn( "episodes_cached_payload_invalid", "episodes", @@ -226,7 +219,6 @@ func (s *EpisodeService) decodeCachedPayload(anime domain.Anime, raw string, met } if !isCanonicalEpisodePayloadValid(payload, anime.Episodes) { - s.metrics.ObserveCache(metric, "miss") observability.Info( "episodes_cached_payload_rejected", "episodes", diff --git a/internal/episodes/service/provider_mapping.go b/internal/episodes/service/provider_mapping.go index 084ccf7..44cdba9 100644 --- a/internal/episodes/service/provider_mapping.go +++ b/internal/episodes/service/provider_mapping.go @@ -45,7 +45,6 @@ func (s *EpisodeService) cachedProviderID(ctx context.Context, anime domain.Anim Provider: provider.Name(), }) if err != nil { - s.metrics.ObserveCache("episode_provider_mapping", "miss") if errors.Is(err, sql.ErrNoRows) { return "", false, nil } @@ -63,15 +62,12 @@ func (s *EpisodeService) cachedProviderID(ctx context.Context, anime domain.Anim } if row.FailedUntil.Valid && row.FailedUntil.Time.After(s.clock.Now()) { - s.metrics.ObserveCache("episode_provider_mapping", "hit") return "", true, fmt.Errorf("cached provider mapping failure active until %s: %s", row.FailedUntil.Time.Format(time.RFC3339), row.LastError) } if strings.TrimSpace(row.ProviderShowID) == "" { - s.metrics.ObserveCache("episode_provider_mapping", "miss") return "", false, nil } - s.metrics.ObserveCache("episode_provider_mapping", "hit") observability.Info( "episodes_provider_id_cache_hit", "episodes", diff --git a/internal/episodes/service/service.go b/internal/episodes/service/service.go index d2891ca..791033f 100644 --- a/internal/episodes/service/service.go +++ b/internal/episodes/service/service.go @@ -26,21 +26,19 @@ type EpisodeService struct { providers []domain.EpisodeAvailabilityProvider clock Clock enabled bool - metrics *observability.Metrics } -func NewEpisodeService(queries *db.Queries, jikanClient *jikan.Client, providers []domain.EpisodeAvailabilityProvider, enabled bool, metrics *observability.Metrics) domain.EpisodeService { - return NewEpisodeServiceWithClock(queries, jikanClient, providers, enabled, realClock{}, metrics) +func NewEpisodeService(queries *db.Queries, jikanClient *jikan.Client, providers []domain.EpisodeAvailabilityProvider, enabled bool) domain.EpisodeService { + return NewEpisodeServiceWithClock(queries, jikanClient, providers, enabled, realClock{}) } -func NewEpisodeServiceWithClock(queries *db.Queries, jikanClient *jikan.Client, providers []domain.EpisodeAvailabilityProvider, enabled bool, clock Clock, metrics *observability.Metrics) *EpisodeService { +func NewEpisodeServiceWithClock(queries *db.Queries, jikanClient *jikan.Client, providers []domain.EpisodeAvailabilityProvider, enabled bool, clock Clock) *EpisodeService { return &EpisodeService{ queries: queries, jikan: jikanClient, providers: providers, clock: clock, enabled: enabled, - metrics: metrics, } } diff --git a/internal/episodes/worker.go b/internal/episodes/worker.go index e112475..856fd7d 100644 --- a/internal/episodes/worker.go +++ b/internal/episodes/worker.go @@ -11,7 +11,7 @@ import ( const workerInterval = time.Minute -func RegisterWorker(lc fx.Lifecycle, svc domain.EpisodeService, metrics *observability.Metrics) { +func RegisterWorker(lc fx.Lifecycle, svc domain.EpisodeService) { ctx, cancel := context.WithCancel(context.Background()) lc.Append(fx.Hook{ @@ -31,7 +31,6 @@ func RegisterWorker(lc fx.Lifecycle, svc domain.EpisodeService, metrics *observa err := svc.RefreshTrackedDue(tickCtx, 25) tickCancel() if err != nil { - metrics.ObserveWorkerTick("episodes_availability", err) observability.Warn( "episodes_worker_tick_failed", "episodes", @@ -41,8 +40,6 @@ func RegisterWorker(lc fx.Lifecycle, svc domain.EpisodeService, metrics *observa }, err, ) - } else { - metrics.ObserveWorkerTick("episodes_availability", nil) } select {