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:
parent
b252ba1c30
commit
327c5e195d
1 changed files with 17 additions and 27 deletions
|
|
@ -937,7 +937,6 @@ func fetchDownloadLinksFromMS(productID, skuID string) ([]byte, error) {
|
|||
jar = &simpleCookieJar{}
|
||||
}
|
||||
|
||||
|
||||
proxyQ := url.Values{}
|
||||
proxyQ.Set("profile", PROFILE)
|
||||
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 {
|
||||
rdb.HIncrBy(ctx, "msdl:telemetry:errors", p.Error, 1)
|
||||
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
|
||||
// IP) so /metrics can show whether rejections are
|
||||
// concentrated in a few sources or spread across many,
|
||||
// without ever storing raw IPs.
|
||||
day := time.Now().UTC().Format("2006-01-02")
|
||||
countKey := "msdl:telemetry:sentinel_count:" + day
|
||||
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)
|
||||
rdb.Incr(ctx, "msdl:telemetry:sentinel_count")
|
||||
rdb.PFAdd(ctx, "msdl:telemetry:sentinel_hll", ip)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1789,7 +1783,7 @@ func handleMetrics(w http.ResponseWriter, r *http.Request) {
|
|||
evalCacheMu.RUnlock()
|
||||
|
||||
telemetry := loadTelemetryFromRedis()
|
||||
sentinelToday := loadSentinelTodayFromRedis()
|
||||
sentinelErrors, sentinelDistinctSources := loadSentinelStatsFromRedis()
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(map[string]interface{}{
|
||||
|
|
@ -1820,27 +1814,23 @@ func handleMetrics(w http.ResponseWriter, r *http.Request) {
|
|||
"neg_cache_size": negSize,
|
||||
"total_ms_fetches": skuFetches + linkFetches,
|
||||
"telemetry": telemetry,
|
||||
"sentinel_today": sentinelToday,
|
||||
"sentinel_errors": sentinelErrors,
|
||||
"sentinel_distinct_sources_est": sentinelDistinctSources,
|
||||
})
|
||||
}
|
||||
|
||||
// loadSentinelTodayFromRedis returns today's Sentinel-rejection count and an
|
||||
// approximate distinct-source count (from the HyperLogLog seeded in
|
||||
// handleTelemetry). Returns nil when Redis is unavailable.
|
||||
func loadSentinelTodayFromRedis() map[string]interface{} {
|
||||
// loadSentinelStatsFromRedis returns the all-time Sentinel-rejection count
|
||||
// and an approximate distinct-source count (from the HyperLogLog seeded in
|
||||
// handleTelemetry). Returns (0, 0) when Redis is unavailable.
|
||||
func loadSentinelStatsFromRedis() (int64, int64) {
|
||||
if rdb == nil {
|
||||
return nil
|
||||
return 0, 0
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
|
||||
defer cancel()
|
||||
day := time.Now().UTC().Format("2006-01-02")
|
||||
count, _ := rdb.Get(ctx, "msdl:telemetry:sentinel_count:"+day).Int64()
|
||||
distinct, _ := rdb.PFCount(ctx, "msdl:telemetry:sentinel_hll:"+day).Result()
|
||||
return map[string]interface{}{
|
||||
"date": day,
|
||||
"errors_today": count,
|
||||
"distinct_sources_est": distinct,
|
||||
}
|
||||
count, _ := rdb.Get(ctx, "msdl:telemetry:sentinel_count").Int64()
|
||||
distinct, _ := rdb.PFCount(ctx, "msdl:telemetry:sentinel_hll").Result()
|
||||
return count, distinct
|
||||
}
|
||||
|
||||
func warmEvalCache() {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue