Skip to content

Commit d2fb709

Browse files
authored
FFM-11360 Use target-segments v2-rule parameter / Swap to atomic wrapper in analytics (#157)
1 parent 57d3bd4 commit d2fb709

File tree

9 files changed

+181
-91
lines changed

9 files changed

+181
-91
lines changed

Diff for: analyticsservice/analytics.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const (
2626
variationValueAttribute string = "featureValue"
2727
targetAttribute string = "target"
2828
sdkVersionAttribute string = "SDK_VERSION"
29-
SdkVersion string = "0.1.22"
29+
SdkVersion string = "0.1.23"
3030
sdkTypeAttribute string = "SDK_TYPE"
3131
sdkType string = "server"
3232
sdkLanguageAttribute string = "SDK_LANGUAGE"
@@ -59,8 +59,8 @@ type AnalyticsService struct {
5959
evaluationAnalytics SafeAnalyticsCache[string, analyticsEvent]
6060
targetAnalytics SafeAnalyticsCache[string, evaluation.Target]
6161
seenTargets SafeAnalyticsCache[string, bool]
62-
logEvaluationLimitReached int32
63-
logTargetLimitReached int32
62+
logEvaluationLimitReached atomic.Bool
63+
logTargetLimitReached atomic.Bool
6464
timeout time.Duration
6565
logger logger.Logger
6666
metricsClient metricsclient.ClientWithResponsesInterface
@@ -136,9 +136,9 @@ func (as *AnalyticsService) listener() {
136136
as.evaluationAnalytics.set(analyticsKey, ad)
137137
}
138138
} else {
139-
if atomic.LoadInt32(&as.logEvaluationLimitReached) == 0 {
139+
if !as.logEvaluationLimitReached.Load() {
140140
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)
141+
as.logEvaluationLimitReached.Store(true)
142142
}
143143
}
144144

@@ -161,9 +161,9 @@ func (as *AnalyticsService) listener() {
161161
if as.targetAnalytics.size() < maxTargetEntries {
162162
as.targetAnalytics.set(ad.target.Identifier, *ad.target)
163163
} else {
164-
if atomic.LoadInt32(&as.logTargetLimitReached) == 0 {
164+
if !as.logTargetLimitReached.Load() {
165165
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)
166+
as.logTargetLimitReached.Store(true)
167167
}
168168
}
169169
}
@@ -212,8 +212,8 @@ func (as *AnalyticsService) sendDataAndResetCache(ctx context.Context) {
212212
as.targetAnalytics = newSafeTargetAnalytics()
213213

214214
// 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)
215+
as.logEvaluationLimitReached.Store(false)
216+
as.logTargetLimitReached.Store(false)
217217

218218
metricData := make([]metricsclient.MetricsData, 0, evaluationAnalyticsClone.size())
219219
targetData := make([]metricsclient.TargetData, 0, targetAnalyticsClone.size())

Diff for: apiconfig/api_config.go

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package apiconfig
2+
3+
import "github.com/harness/ff-golang-server-sdk/rest"
4+
5+
// ApiConfiguration is a type that provides the required configuration for requests
6+
type ApiConfiguration interface {
7+
GetSegmentRulesV2QueryParam() *rest.SegmentRulesV2QueryParam
8+
}

Diff for: client/client.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ func (c *CfClient) streamConnect(ctx context.Context) {
261261
sseClient.Connection = c.config.httpClient
262262

263263
conn := stream.NewSSEClient(c.sdkKey, c.token, sseClient, c.repository, c.api, c.config.Logger,
264-
c.config.eventStreamListener, c.config.proxyMode, c.streamConnectedChan, c.streamDisconnectedChan)
264+
c.config.eventStreamListener, c.config.proxyMode, c.streamConnectedChan, c.streamDisconnectedChan, c.config.apiConfig)
265265

266266
// Connect kicks off a goroutine that attempts to establish a stream connection
267267
// while this is happening we set streamConnectedBool to true - if any errors happen
@@ -558,7 +558,10 @@ func (c *CfClient) retrieveSegments(ctx context.Context) error {
558558
c.mux.RLock()
559559
defer c.mux.RUnlock()
560560
c.config.Logger.Info("Retrieving segments started")
561-
segments, err := c.api.GetAllSegmentsWithResponse(ctx, c.environmentID, nil)
561+
requestParams := &rest.GetAllSegmentsParams{
562+
Rules: c.config.apiConfig.GetSegmentRulesV2QueryParam(),
563+
}
564+
segments, err := c.api.GetAllSegmentsWithResponse(ctx, c.environmentID, requestParams)
562565
if err != nil {
563566
// log
564567
return err

Diff for: client/config.go

+19-3
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@ package client
22

33
import (
44
"fmt"
5+
"net/http"
6+
"os"
7+
"time"
8+
59
"github.com/cenkalti/backoff/v4"
610
"github.com/harness/ff-golang-server-sdk/cache"
711
"github.com/harness/ff-golang-server-sdk/evaluation"
812
"github.com/harness/ff-golang-server-sdk/logger"
13+
"github.com/harness/ff-golang-server-sdk/rest"
914
"github.com/harness/ff-golang-server-sdk/storage"
1015
"github.com/harness/ff-golang-server-sdk/stream"
1116
"github.com/harness/ff-golang-server-sdk/types"
1217
"github.com/hashicorp/go-retryablehttp"
13-
"net/http"
14-
"os"
15-
"time"
1618
)
1719

1820
type config struct {
@@ -35,6 +37,15 @@ type config struct {
3537
authRetryStrategy *backoff.ExponentialBackOff
3638
streamingRetryStrategy *backoff.ExponentialBackOff
3739
sleeper types.Sleeper
40+
apiConfig *apiConfiguration
41+
}
42+
43+
type apiConfiguration struct {
44+
segmentRulesV2QueryParam rest.SegmentRulesV2QueryParam
45+
}
46+
47+
func (a *apiConfiguration) GetSegmentRulesV2QueryParam() *rest.SegmentRulesV2QueryParam {
48+
return &a.segmentRulesV2QueryParam
3849
}
3950

4051
func newDefaultConfig(log logger.Logger) *config {
@@ -71,6 +82,10 @@ func newDefaultConfig(log logger.Logger) *config {
7182
return resp, fmt.Errorf(message)
7283
}
7384

85+
apiConfig := &apiConfiguration{
86+
segmentRulesV2QueryParam: "v2",
87+
}
88+
7489
return &config{
7590
url: "https://config.ff.harness.io/api/1.0",
7691
eventsURL: "https://events.ff.harness.io/api/1.0",
@@ -89,6 +104,7 @@ func newDefaultConfig(log logger.Logger) *config {
89104
authRetryStrategy: getDefaultExpBackoff(),
90105
streamingRetryStrategy: getDefaultExpBackoff(),
91106
sleeper: &types.RealClock{},
107+
apiConfig: apiConfig,
92108
}
93109
}
94110

Diff for: resources/client-v1.yaml

+14-1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ paths:
8787
schema:
8888
type: string
8989
- $ref: '#/components/parameters/clusterQueryOptionalParam'
90+
- $ref: '#/components/parameters/segmentRulesV2QueryParam'
9091
security:
9192
- BearerAuth: []
9293
responses:
@@ -127,6 +128,7 @@ paths:
127128
schema:
128129
type: string
129130
- $ref: '#/components/parameters/clusterQueryOptionalParam'
131+
- $ref: '#/components/parameters/segmentRulesV2QueryParam'
130132
security:
131133
- BearerAuth: []
132134
responses:
@@ -952,6 +954,17 @@ components:
952954
description: Unique identifier for the cluster for the account
953955
schema:
954956
type: string
957+
segmentRulesV2QueryParam:
958+
name: rules
959+
in: query
960+
required: false
961+
description: >-
962+
When set to rules=v2 will return AND rule compatible serving_rules
963+
field. When not set or set to any other value will return old rules
964+
field only compatible with OR rules.
965+
allowEmptyValue: true
966+
schema:
967+
type: string
955968
environmentPathParam:
956969
name: environmentUUID
957970
in: path
@@ -1009,4 +1022,4 @@ components:
10091022
content:
10101023
application/json:
10111024
schema:
1012-
$ref: '#/components/schemas/Error'
1025+
$ref: '#/components/schemas/Error'

Diff for: resources/metrics-v1.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,4 @@ components:
162162
content:
163163
application/json:
164164
schema:
165-
$ref: '#/components/schemas/Error'
165+
$ref: '#/components/schemas/Error'

0 commit comments

Comments
 (0)