diff --git a/analyticsservice/analytics.go b/analyticsservice/analytics.go index 37aae35..dfbabc5 100644 --- a/analyticsservice/analytics.go +++ b/analyticsservice/analytics.go @@ -26,7 +26,7 @@ const ( variationValueAttribute string = "featureValue" targetAttribute string = "target" sdkVersionAttribute string = "SDK_VERSION" - SdkVersion string = "0.1.22" + SdkVersion string = "0.1.23" sdkTypeAttribute string = "SDK_TYPE" sdkType string = "server" sdkLanguageAttribute string = "SDK_LANGUAGE" @@ -59,8 +59,8 @@ type AnalyticsService struct { evaluationAnalytics SafeAnalyticsCache[string, analyticsEvent] targetAnalytics SafeAnalyticsCache[string, evaluation.Target] seenTargets SafeAnalyticsCache[string, bool] - logEvaluationLimitReached int32 - logTargetLimitReached int32 + logEvaluationLimitReached atomic.Bool + logTargetLimitReached atomic.Bool timeout time.Duration logger logger.Logger metricsClient metricsclient.ClientWithResponsesInterface @@ -136,9 +136,9 @@ func (as *AnalyticsService) listener() { as.evaluationAnalytics.set(analyticsKey, ad) } } else { - if atomic.LoadInt32(&as.logEvaluationLimitReached) == 0 { + if !as.logEvaluationLimitReached.Load() { as.logger.Warnf("%s Evaluation analytic cache reached max size, remaining evaluation metrics for this analytics interval will not be sent", sdk_codes.EvaluationMetricsMaxSizeReached) - atomic.StoreInt32(&as.logEvaluationLimitReached, 1) + as.logEvaluationLimitReached.Store(true) } } @@ -161,9 +161,9 @@ func (as *AnalyticsService) listener() { if as.targetAnalytics.size() < maxTargetEntries { as.targetAnalytics.set(ad.target.Identifier, *ad.target) } else { - if atomic.LoadInt32(&as.logTargetLimitReached) == 0 { + if !as.logTargetLimitReached.Load() { as.logger.Warnf("%s Target analytics cache reached max size, remaining target metrics for this analytics interval will not be sent", sdk_codes.TargetMetricsMaxSizeReached) - atomic.StoreInt32(&as.logTargetLimitReached, 1) + as.logTargetLimitReached.Store(true) } } } @@ -212,8 +212,8 @@ func (as *AnalyticsService) sendDataAndResetCache(ctx context.Context) { as.targetAnalytics = newSafeTargetAnalytics() // Reset flags that keep track of cache limits being reached for logging purposes - atomic.StoreInt32(&as.logEvaluationLimitReached, 0) - atomic.StoreInt32(&as.logTargetLimitReached, 0) + as.logEvaluationLimitReached.Store(false) + as.logTargetLimitReached.Store(false) metricData := make([]metricsclient.MetricsData, 0, evaluationAnalyticsClone.size()) targetData := make([]metricsclient.TargetData, 0, targetAnalyticsClone.size()) diff --git a/apiconfig/api_config.go b/apiconfig/api_config.go new file mode 100644 index 0000000..eb166d3 --- /dev/null +++ b/apiconfig/api_config.go @@ -0,0 +1,8 @@ +package apiconfig + +import "github.com/harness/ff-golang-server-sdk/rest" + +// ApiConfiguration is a type that provides the required configuration for requests +type ApiConfiguration interface { + GetSegmentRulesV2QueryParam() *rest.SegmentRulesV2QueryParam +} diff --git a/client/client.go b/client/client.go index 4cfabb5..60679e0 100644 --- a/client/client.go +++ b/client/client.go @@ -261,7 +261,7 @@ func (c *CfClient) streamConnect(ctx context.Context) { sseClient.Connection = c.config.httpClient conn := stream.NewSSEClient(c.sdkKey, c.token, sseClient, c.repository, c.api, c.config.Logger, - c.config.eventStreamListener, c.config.proxyMode, c.streamConnectedChan, c.streamDisconnectedChan) + c.config.eventStreamListener, c.config.proxyMode, c.streamConnectedChan, c.streamDisconnectedChan, c.config.apiConfig) // Connect kicks off a goroutine that attempts to establish a stream connection // 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 { c.mux.RLock() defer c.mux.RUnlock() c.config.Logger.Info("Retrieving segments started") - segments, err := c.api.GetAllSegmentsWithResponse(ctx, c.environmentID, nil) + requestParams := &rest.GetAllSegmentsParams{ + Rules: c.config.apiConfig.GetSegmentRulesV2QueryParam(), + } + segments, err := c.api.GetAllSegmentsWithResponse(ctx, c.environmentID, requestParams) if err != nil { // log return err diff --git a/client/config.go b/client/config.go index eaa1f60..c3fcb27 100644 --- a/client/config.go +++ b/client/config.go @@ -2,17 +2,19 @@ package client import ( "fmt" + "net/http" + "os" + "time" + "github.com/cenkalti/backoff/v4" "github.com/harness/ff-golang-server-sdk/cache" "github.com/harness/ff-golang-server-sdk/evaluation" "github.com/harness/ff-golang-server-sdk/logger" + "github.com/harness/ff-golang-server-sdk/rest" "github.com/harness/ff-golang-server-sdk/storage" "github.com/harness/ff-golang-server-sdk/stream" "github.com/harness/ff-golang-server-sdk/types" "github.com/hashicorp/go-retryablehttp" - "net/http" - "os" - "time" ) type config struct { @@ -35,6 +37,15 @@ type config struct { authRetryStrategy *backoff.ExponentialBackOff streamingRetryStrategy *backoff.ExponentialBackOff sleeper types.Sleeper + apiConfig *apiConfiguration +} + +type apiConfiguration struct { + segmentRulesV2QueryParam rest.SegmentRulesV2QueryParam +} + +func (a *apiConfiguration) GetSegmentRulesV2QueryParam() *rest.SegmentRulesV2QueryParam { + return &a.segmentRulesV2QueryParam } func newDefaultConfig(log logger.Logger) *config { @@ -71,6 +82,10 @@ func newDefaultConfig(log logger.Logger) *config { return resp, fmt.Errorf(message) } + apiConfig := &apiConfiguration{ + segmentRulesV2QueryParam: "v2", + } + return &config{ url: "https://config.ff.harness.io/api/1.0", eventsURL: "https://events.ff.harness.io/api/1.0", @@ -89,6 +104,7 @@ func newDefaultConfig(log logger.Logger) *config { authRetryStrategy: getDefaultExpBackoff(), streamingRetryStrategy: getDefaultExpBackoff(), sleeper: &types.RealClock{}, + apiConfig: apiConfig, } } diff --git a/resources/client-v1.yaml b/resources/client-v1.yaml index 4105ff4..3d053ef 100644 --- a/resources/client-v1.yaml +++ b/resources/client-v1.yaml @@ -87,6 +87,7 @@ paths: schema: type: string - $ref: '#/components/parameters/clusterQueryOptionalParam' + - $ref: '#/components/parameters/segmentRulesV2QueryParam' security: - BearerAuth: [] responses: @@ -127,6 +128,7 @@ paths: schema: type: string - $ref: '#/components/parameters/clusterQueryOptionalParam' + - $ref: '#/components/parameters/segmentRulesV2QueryParam' security: - BearerAuth: [] responses: @@ -952,6 +954,17 @@ components: description: Unique identifier for the cluster for the account schema: type: string + segmentRulesV2QueryParam: + name: rules + in: query + required: false + description: >- + When set to rules=v2 will return AND rule compatible serving_rules + field. When not set or set to any other value will return old rules + field only compatible with OR rules. + allowEmptyValue: true + schema: + type: string environmentPathParam: name: environmentUUID in: path @@ -1009,4 +1022,4 @@ components: content: application/json: schema: - $ref: '#/components/schemas/Error' + $ref: '#/components/schemas/Error' \ No newline at end of file diff --git a/resources/metrics-v1.yaml b/resources/metrics-v1.yaml index b02788f..0477c58 100644 --- a/resources/metrics-v1.yaml +++ b/resources/metrics-v1.yaml @@ -162,4 +162,4 @@ components: content: application/json: schema: - $ref: '#/components/schemas/Error' + $ref: '#/components/schemas/Error' \ No newline at end of file diff --git a/rest/services.gen.go b/rest/services.gen.go index a65ad94..eac556a 100644 --- a/rest/services.gen.go +++ b/rest/services.gen.go @@ -505,6 +505,22 @@ func NewGetAllSegmentsRequest(server string, environmentUUID string, params *Get } + if params.Rules != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "rules", runtime.ParamLocationQuery, *params.Rules); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + queryURL.RawQuery = queryValues.Encode() } @@ -568,6 +584,22 @@ func NewGetSegmentByIdentifierRequest(server string, environmentUUID string, ide } + if params.Rules != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "rules", runtime.ParamLocationQuery, *params.Rules); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + queryURL.RawQuery = queryValues.Encode() } @@ -1912,75 +1944,77 @@ func ParseStreamResponse(rsp *http.Response) (*StreamResponse, error) { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "283/BQAA///yttJsTlgAAA==", + "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", + "PwAA///YEEMR7VkAAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/rest/types.gen.go b/rest/types.gen.go index ac872d8..799573c 100644 --- a/rest/types.gen.go +++ b/rest/types.gen.go @@ -359,6 +359,9 @@ type PageNumber int // PageSize defines model for pageSize. type PageSize int +// SegmentRulesV2QueryParam defines model for segmentRulesV2QueryParam. +type SegmentRulesV2QueryParam string + // BadRequest defines model for BadRequest. type BadRequest Error @@ -393,12 +396,18 @@ type GetFeatureConfigByIdentifierParams struct { type GetAllSegmentsParams struct { // Cluster Unique identifier for the cluster for the account Cluster *ClusterQueryOptionalParam `form:"cluster,omitempty" json:"cluster,omitempty"` + + // Rules When set to rules=v2 will return AND rule compatible serving_rules field. When not set or set to any other value will return old rules field only compatible with OR rules. + Rules *SegmentRulesV2QueryParam `form:"rules,omitempty" json:"rules,omitempty"` } // GetSegmentByIdentifierParams defines parameters for GetSegmentByIdentifier. type GetSegmentByIdentifierParams struct { // Cluster Unique identifier for the cluster for the account Cluster *ClusterQueryOptionalParam `form:"cluster,omitempty" json:"cluster,omitempty"` + + // Rules When set to rules=v2 will return AND rule compatible serving_rules field. When not set or set to any other value will return old rules field only compatible with OR rules. + Rules *SegmentRulesV2QueryParam `form:"rules,omitempty" json:"rules,omitempty"` } // GetEvaluationsParams defines parameters for GetEvaluations. diff --git a/stream/sse.go b/stream/sse.go index 0270793..145cb04 100644 --- a/stream/sse.go +++ b/stream/sse.go @@ -6,6 +6,7 @@ import ( "fmt" "time" + "github.com/harness/ff-golang-server-sdk/apiconfig" "github.com/harness/ff-golang-server-sdk/sdk_codes" "github.com/harness/ff-golang-server-sdk/pkg/repository" @@ -28,8 +29,8 @@ type SSEClient struct { eventStreamListener EventStreamListener streamConnected chan struct{} streamDisconnected chan error - - proxyMode bool + apiConfig apiconfig.ApiConfiguration + proxyMode bool } var json = jsoniter.ConfigCompatibleWithStandardLibrary @@ -46,6 +47,7 @@ func NewSSEClient( proxyMode bool, streamConnected chan struct{}, streamDisconnected chan error, + apiConfig apiconfig.ApiConfiguration, ) *SSEClient { client.Headers["Authorization"] = fmt.Sprintf("Bearer %s", token) @@ -59,6 +61,7 @@ func NewSSEClient( proxyMode: proxyMode, streamConnected: streamConnected, streamDisconnected: streamDisconnected, + apiConfig: apiConfig, } return sseClient } @@ -230,8 +233,10 @@ func (c *SSEClient) handleEvent(event Event) { updateWithTimeout := func() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*60) defer cancel() - - response, err := c.api.GetSegmentByIdentifierWithResponse(ctx, event.Environment, cfMsg.Identifier, nil) + requestParams := &rest.GetSegmentByIdentifierParams{ + Rules: c.apiConfig.GetSegmentRulesV2QueryParam(), + } + response, err := c.api.GetSegmentByIdentifierWithResponse(ctx, event.Environment, cfMsg.Identifier, requestParams) if err != nil { c.logger.Errorf("error while pulling segment, err: %s", err.Error()) return @@ -246,8 +251,10 @@ func (c *SSEClient) handleEvent(event Event) { updateSegmentsWithTimeout := func() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*60) defer cancel() - - response, err := c.api.GetAllSegmentsWithResponse(ctx, event.Environment, nil) + requestParams := &rest.GetAllSegmentsParams{ + Rules: c.apiConfig.GetSegmentRulesV2QueryParam(), + } + response, err := c.api.GetAllSegmentsWithResponse(ctx, event.Environment, requestParams) if err != nil { c.logger.Errorf("error while pulling segment, err: %s", err.Error()) return