@@ -26,7 +26,7 @@ const (
26
26
variationValueAttribute string = "featureValue"
27
27
targetAttribute string = "target"
28
28
sdkVersionAttribute string = "SDK_VERSION"
29
- SdkVersion string = "0.1.24 "
29
+ SdkVersion string = "0.1.25 "
30
30
sdkTypeAttribute string = "SDK_TYPE"
31
31
sdkType string = "server"
32
32
sdkLanguageAttribute string = "SDK_LANGUAGE"
@@ -62,16 +62,17 @@ type analyticsEvent struct {
62
62
63
63
// AnalyticsService provides a way to cache and send analytics to the server
64
64
type AnalyticsService struct {
65
- analyticsChan chan analyticsEvent
66
- evaluationAnalytics SafeAnalyticsCache [string , analyticsEvent ]
67
- targetAnalytics SafeAnalyticsCache [string , evaluation.Target ]
68
- seenTargets SafeSeenTargetsCache [string , bool ]
69
- logEvaluationLimitReached atomic.Bool
70
- logTargetLimitReached atomic.Bool
71
- timeout time.Duration
72
- logger logger.Logger
73
- metricsClient metricsclient.ClientWithResponsesInterface
74
- environmentID string
65
+ analyticsChan chan analyticsEvent
66
+ evaluationAnalytics SafeAnalyticsCache [string , analyticsEvent ]
67
+ targetAnalytics SafeAnalyticsCache [string , evaluation.Target ]
68
+ seenTargets SafeSeenTargetsCache [string , bool ]
69
+ logEvaluationLimitReached atomic.Bool
70
+ logTargetLimitReached atomic.Bool
71
+ timeout time.Duration
72
+ logger logger.Logger
73
+ metricsClient metricsclient.ClientWithResponsesInterface
74
+ environmentID string
75
+ seenTargetsClearingInterval time.Duration
75
76
}
76
77
77
78
// NewAnalyticsService creates and starts a analytics service to send data to the client
@@ -83,12 +84,13 @@ func NewAnalyticsService(timeout time.Duration, logger logger.Logger, seenTarget
83
84
serviceTimeout = 1 * time .Hour
84
85
}
85
86
as := AnalyticsService {
86
- analyticsChan : make (chan analyticsEvent ),
87
- evaluationAnalytics : newSafeEvaluationAnalytics (),
88
- targetAnalytics : newSafeTargetAnalytics (),
89
- seenTargets : newSafeSeenTargets (seenTargetsMaxSize , seenTargetsClearingSchedule ),
90
- timeout : serviceTimeout ,
91
- logger : logger ,
87
+ analyticsChan : make (chan analyticsEvent ),
88
+ evaluationAnalytics : newSafeEvaluationAnalytics (),
89
+ targetAnalytics : newSafeTargetAnalytics (),
90
+ seenTargets : newSafeSeenTargets (seenTargetsMaxSize ),
91
+ timeout : serviceTimeout ,
92
+ logger : logger ,
93
+ seenTargetsClearingInterval : seenTargetsClearingSchedule ,
92
94
}
93
95
go as .listener ()
94
96
@@ -101,6 +103,7 @@ func (as *AnalyticsService) Start(ctx context.Context, client metricsclient.Clie
101
103
as .metricsClient = client
102
104
as .environmentID = environmentID
103
105
go as .startTimer (ctx )
106
+ go as .startSeenTargetsClearingSchedule (ctx , as .seenTargetsClearingInterval )
104
107
}
105
108
106
109
func (as * AnalyticsService ) startTimer (ctx context.Context ) {
@@ -110,6 +113,7 @@ func (as *AnalyticsService) startTimer(ctx context.Context) {
110
113
timeStamp := time .Now ().UnixNano () / (int64 (time .Millisecond ) / int64 (time .Nanosecond ))
111
114
as .sendDataAndResetCache (ctx , timeStamp )
112
115
case <- ctx .Done ():
116
+ close (as .analyticsChan )
113
117
as .logger .Infof ("%s Metrics stopped" , sdk_codes .MetricsStopped )
114
118
return
115
119
}
@@ -324,6 +328,22 @@ func (as *AnalyticsService) processTargetMetrics(targetAnalytics SafeAnalyticsCa
324
328
return targetData
325
329
}
326
330
331
+ func (as * AnalyticsService ) startSeenTargetsClearingSchedule (ctx context.Context , clearingInterval time.Duration ) {
332
+ ticker := time .NewTicker (clearingInterval )
333
+
334
+ for {
335
+ select {
336
+ case <- ticker .C :
337
+ as .logger .Infof ("Clearing seen targets" )
338
+ as .seenTargets .clear ()
339
+
340
+ case <- ctx .Done ():
341
+ ticker .Stop ()
342
+ return
343
+ }
344
+ }
345
+ }
346
+
327
347
func getEvaluationAnalyticKey (event analyticsEvent ) string {
328
348
return fmt .Sprintf ("%s-%s-%s-%s" , event .featureConfig .Feature , event .variation .Identifier , event .variation .Value , globalTarget )
329
349
}
0 commit comments