Skip to content

Commit f27115f

Browse files
authored
FFM-11212 Don't log cache warning more than once (#152)
1 parent 5d1c3b7 commit f27115f

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

analyticsservice/analytics.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"fmt"
77
"strconv"
8+
"sync/atomic"
89
"time"
910

1011
"github.com/harness/ff-golang-server-sdk/sdk_codes"
@@ -54,14 +55,16 @@ type analyticsEvent struct {
5455

5556
// AnalyticsService provides a way to cache and send analytics to the server
5657
type AnalyticsService struct {
57-
analyticsChan chan analyticsEvent
58-
evaluationAnalytics SafeAnalyticsCache[string, analyticsEvent]
59-
targetAnalytics SafeAnalyticsCache[string, evaluation.Target]
60-
seenTargets SafeAnalyticsCache[string, bool]
61-
timeout time.Duration
62-
logger logger.Logger
63-
metricsClient metricsclient.ClientWithResponsesInterface
64-
environmentID string
58+
analyticsChan chan analyticsEvent
59+
evaluationAnalytics SafeAnalyticsCache[string, analyticsEvent]
60+
targetAnalytics SafeAnalyticsCache[string, evaluation.Target]
61+
seenTargets SafeAnalyticsCache[string, bool]
62+
logEvaluationLimitReached int32
63+
logTargetLimitReached int32
64+
timeout time.Duration
65+
logger logger.Logger
66+
metricsClient metricsclient.ClientWithResponsesInterface
67+
environmentID string
6568
}
6669

6770
// NewAnalyticsService creates and starts a analytics service to send data to the client
@@ -133,7 +136,10 @@ func (as *AnalyticsService) listener() {
133136
as.evaluationAnalytics.set(analyticsKey, ad)
134137
}
135138
} else {
136-
as.logger.Warnf("%s Evaluation analytic cache reached max size, remaining evaluation metrics for this analytics interval will not be sent", sdk_codes.EvaluationMetricsMaxSizeReached)
139+
if atomic.LoadInt32(&as.logEvaluationLimitReached) == 0 {
140+
as.logger.Warnf("%s Evaluation analytic cache reached max size, remaining evaluation metrics for this analytics interval will not be sent", sdk_codes.EvaluationMetricsMaxSizeReached)
141+
atomic.StoreInt32(&as.logEvaluationLimitReached, 1)
142+
}
137143
}
138144

139145
// Check if target is nil or anonymous
@@ -155,7 +161,10 @@ func (as *AnalyticsService) listener() {
155161
if as.targetAnalytics.size() < maxTargetEntries {
156162
as.targetAnalytics.set(ad.target.Identifier, *ad.target)
157163
} else {
158-
as.logger.Warnf("%s Target analytics cache reached max size, remaining target metrics for this analytics interval will not be sent", sdk_codes.TargetMetricsMaxSizeReached)
164+
if atomic.LoadInt32(&as.logTargetLimitReached) == 0 {
165+
as.logger.Warnf("%s Target analytics cache reached max size, remaining target metrics for this analytics interval will not be sent", sdk_codes.TargetMetricsMaxSizeReached)
166+
atomic.StoreInt32(&as.logTargetLimitReached, 1)
167+
}
159168
}
160169
}
161170
}
@@ -202,6 +211,10 @@ func (as *AnalyticsService) sendDataAndResetCache(ctx context.Context) {
202211
targetAnalyticsClone := as.targetAnalytics
203212
as.targetAnalytics = newSafeTargetAnalytics()
204213

214+
// Reset flags that keep track of cache limits being reached for logging purposes
215+
atomic.StoreInt32(&as.logEvaluationLimitReached, 0)
216+
atomic.StoreInt32(&as.logTargetLimitReached, 0)
217+
205218
metricData := make([]metricsclient.MetricsData, 0, evaluationAnalyticsClone.size())
206219
targetData := make([]metricsclient.TargetData, 0, targetAnalyticsClone.size())
207220

0 commit comments

Comments
 (0)