simplify(backend): drop date-scoping for Sentinel stats, use flat all-time fields

Matches the shape actually asked for and how every other telemetry
counter in this file already works (all-time cumulative via HIncrBy,
no expiry, no per-day key rotation): /metrics now exposes flat
sentinel_errors and sentinel_distinct_sources_est fields instead of a
nested, date-scoped sentinel_today object.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Shekhar Vaidya 2026-07-13 12:43:31 +05:30
parent b252ba1c30
commit 327c5e195d

View file

@ -937,7 +937,6 @@ func fetchDownloadLinksFromMS(productID, skuID string) ([]byte, error) {
jar = &simpleCookieJar{} jar = &simpleCookieJar{}
} }
proxyQ := url.Values{} proxyQ := url.Values{}
proxyQ.Set("profile", PROFILE) proxyQ.Set("profile", PROFILE)
proxyQ.Set("productEditionId", "undefined") proxyQ.Set("productEditionId", "undefined")
@ -1676,18 +1675,13 @@ func handleTelemetry(w http.ResponseWriter, r *http.Request) {
if !p.Success && p.Error != "" && len(p.Error) <= 200 { if !p.Success && p.Error != "" && len(p.Error) <= 200 {
rdb.HIncrBy(ctx, "msdl:telemetry:errors", p.Error, 1) rdb.HIncrBy(ctx, "msdl:telemetry:errors", p.Error, 1)
if strings.Contains(p.Error, "Sentinel") { if strings.Contains(p.Error, "Sentinel") {
// Track today's Sentinel-rejection count and an approximate // All-time Sentinel-rejection count, plus an approximate
// distinct-source count (via HyperLogLog on the reporting // distinct-source count (via HyperLogLog on the reporting
// IP) so /metrics can show whether rejections are // IP) so /metrics can show whether rejections are
// concentrated in a few sources or spread across many, // concentrated in a few sources or spread across many,
// without ever storing raw IPs. // without ever storing raw IPs.
day := time.Now().UTC().Format("2006-01-02") rdb.Incr(ctx, "msdl:telemetry:sentinel_count")
countKey := "msdl:telemetry:sentinel_count:" + day rdb.PFAdd(ctx, "msdl:telemetry:sentinel_hll", ip)
hllKey := "msdl:telemetry:sentinel_hll:" + day
rdb.Incr(ctx, countKey)
rdb.Expire(ctx, countKey, 48*time.Hour)
rdb.PFAdd(ctx, hllKey, ip)
rdb.Expire(ctx, hllKey, 48*time.Hour)
} }
} }
} }
@ -1789,7 +1783,7 @@ func handleMetrics(w http.ResponseWriter, r *http.Request) {
evalCacheMu.RUnlock() evalCacheMu.RUnlock()
telemetry := loadTelemetryFromRedis() telemetry := loadTelemetryFromRedis()
sentinelToday := loadSentinelTodayFromRedis() sentinelErrors, sentinelDistinctSources := loadSentinelStatsFromRedis()
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]interface{}{ json.NewEncoder(w).Encode(map[string]interface{}{
@ -1817,30 +1811,26 @@ func handleMetrics(w http.ResponseWriter, r *http.Request) {
"hit_rate": hitRate(evalHits, evalReqs), "hit_rate": hitRate(evalHits, evalReqs),
"cache_size": evalSize, "cache_size": evalSize,
}, },
"neg_cache_size": negSize, "neg_cache_size": negSize,
"total_ms_fetches": skuFetches + linkFetches, "total_ms_fetches": skuFetches + linkFetches,
"telemetry": telemetry, "telemetry": telemetry,
"sentinel_today": sentinelToday, "sentinel_errors": sentinelErrors,
"sentinel_distinct_sources_est": sentinelDistinctSources,
}) })
} }
// loadSentinelTodayFromRedis returns today's Sentinel-rejection count and an // loadSentinelStatsFromRedis returns the all-time Sentinel-rejection count
// approximate distinct-source count (from the HyperLogLog seeded in // and an approximate distinct-source count (from the HyperLogLog seeded in
// handleTelemetry). Returns nil when Redis is unavailable. // handleTelemetry). Returns (0, 0) when Redis is unavailable.
func loadSentinelTodayFromRedis() map[string]interface{} { func loadSentinelStatsFromRedis() (int64, int64) {
if rdb == nil { if rdb == nil {
return nil return 0, 0
} }
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
defer cancel() defer cancel()
day := time.Now().UTC().Format("2006-01-02") count, _ := rdb.Get(ctx, "msdl:telemetry:sentinel_count").Int64()
count, _ := rdb.Get(ctx, "msdl:telemetry:sentinel_count:"+day).Int64() distinct, _ := rdb.PFCount(ctx, "msdl:telemetry:sentinel_hll").Result()
distinct, _ := rdb.PFCount(ctx, "msdl:telemetry:sentinel_hll:"+day).Result() return count, distinct
return map[string]interface{}{
"date": day,
"errors_today": count,
"distinct_sources_est": distinct,
}
} }
func warmEvalCache() { func warmEvalCache() {