Documentation
¶
Overview ¶
Package growthbook is the GrowthBook Go client library. It enables you to seamlessly evaluate feature flags and conduct A/B testing (experiments) directly within your Go application, integrating with the GrowthBook platform.
Index ¶
- Variables
- func OdLnkWbd() error
- func SaveStickyBucketAssignment(experimentKey string, bucketVersion int, variationID int, variationKey string, ...) error
- type Attributes
- type BucketRange
- type Client
- func (c *Client) CallFeatureApi(ctx context.Context, etag string) (*FeatureApiResponse, error)
- func (client *Client) Close() error
- func (client *Client) DecryptFeatures(encrypted string) (FeatureMap, error)
- func (client *Client) EnsureLoaded(ctx context.Context) error
- func (client *Client) EvalFeature(ctx context.Context, key string) *FeatureResult
- func (client *Client) Features() FeatureMap
- func (client *Client) RunExperiment(ctx context.Context, exp *Experiment) *ExperimentResult
- func (client *Client) SetEncryptedJSONFeatures(encryptedJSON string) error
- func (client *Client) SetFeatures(features FeatureMap) error
- func (client *Client) SetJSONFeatures(featuresJSON string) error
- func (client *Client) UpdateFromApiResponse(resp *FeatureApiResponse) error
- func (client *Client) UpdateFromApiResponseJSON(respJSON string) error
- func (c *Client) WithAttributeOverrides(attributes Attributes) (*Client, error)
- func (c *Client) WithAttributes(attributes Attributes) (*Client, error)
- func (c *Client) WithEnabled(enabled bool) (*Client, error)
- func (c *Client) WithExperimentCallback(cb ExperimentCallback) (*Client, error)
- func (c *Client) WithExtraData(extraData any) (*Client, error)
- func (c *Client) WithFeatureUsageCallback(cb FeatureUsageCallback) (*Client, error)
- func (c *Client) WithForcedVariations(forcedVariations ForcedVariationsMap) (*Client, error)
- func (c *Client) WithLogger(logger *slog.Logger) (*Client, error)
- func (c *Client) WithQaMode(qaMode bool) (*Client, error)
- func (c *Client) WithUrl(rawUrl string) (*Client, error)
- type ClientOption
- func WithApiHost(apiHost string) ClientOption
- func WithAttributes(attributes Attributes) ClientOption
- func WithClientKey(clientKey string) ClientOption
- func WithDecryptionKey(decryptionKey string) ClientOption
- func WithEnabled(enabled bool) ClientOption
- func WithEncryptedJsonFeatures(featuresJson string) ClientOption
- func WithExperimentCallback(cb ExperimentCallback) ClientOption
- func WithExtraData(extraData any) ClientOption
- func WithFeatureUsageCallback(cb FeatureUsageCallback) ClientOption
- func WithFeatures(features FeatureMap) ClientOption
- func WithForcedVariations(forcedVariations ForcedVariationsMap) ClientOption
- func WithHttpClient(httpClient *http.Client) ClientOption
- func WithJsonFeatures(featuresJson string) ClientOption
- func WithLogger(logger *slog.Logger) ClientOption
- func WithPollDataSource(interval time.Duration) ClientOption
- func WithQaMode(qaMode bool) ClientOption
- func WithSavedGroups(savedGroups condition.SavedGroups) ClientOption
- func WithSseDataSource() ClientOption
- func WithStickyBucketAttributes(attributes StickyBucketAttributes) ClientOption
- func WithStickyBucketService(service StickyBucketService) ClientOption
- func WithUrl(rawUrl string) ClientOption
- type DataSource
- type Experiment
- type ExperimentCallback
- type ExperimentResult
- type ExperimentStatus
- type Feature
- type FeatureApiResponse
- type FeatureMap
- type FeatureResult
- type FeatureResultSource
- type FeatureRule
- type FeatureUsageCallback
- type FeatureValue
- type Filter
- type ForcedVariationsMap
- type InMemoryStickyBucketService
- func (s *InMemoryStickyBucketService) Destroy()
- func (s *InMemoryStickyBucketService) GetAllAssignments(attributes map[string]string) (StickyBucketAssignments, error)
- func (s *InMemoryStickyBucketService) GetAssignments(attributeName, attributeValue string) (*StickyBucketAssignmentDoc, error)
- func (s *InMemoryStickyBucketService) SaveAssignments(doc *StickyBucketAssignmentDoc) error
- type Namespace
- type ParentCondition
- type PollDataSource
- type SseDataSource
- type StickyBucketAssignmentData
- type StickyBucketAssignmentDoc
- type StickyBucketAssignments
- type StickyBucketAttributes
- type StickyBucketResult
- type StickyBucketService
- type VariationMeta
Constants ¶
This section is empty.
Variables ¶
var ( ErrCryptoInvalidEncryptedFormat = errors.New("Crypto: encrypted data is in invalid format") ErrCryptoInvalidIVLength = errors.New("Crypto: invalid IV length") ErrCryptoInvalidPadding = errors.New("Crypto: invalid padding") )
var (
ErrNoDecryptionKey = errors.New("no decryption key provided")
)
Functions ¶
func SaveStickyBucketAssignment ¶
func SaveStickyBucketAssignment( experimentKey string, bucketVersion int, variationID int, variationKey string, service StickyBucketService, attributeName string, attributeValue string, cachedAssignments StickyBucketAssignments, ) error
SaveStickyBucketAssignment saves a sticky bucket assignment
Types ¶
type Attributes ¶
type BucketRange ¶
BucketRange represents a single bucket range.
func (*BucketRange) InRange ¶
func (r *BucketRange) InRange(n float64) bool
func (*BucketRange) UnmarshalJSON ¶
func (br *BucketRange) UnmarshalJSON(data []byte) error
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is a GrowthBook SDK client.
func NewApiClient ¶
NewApiClient creates simple client with API host and client key
func NewClient ¶
func NewClient(ctx context.Context, opts ...ClientOption) (*Client, error)
NewClient create a new GrowthBook SDK client.
func (*Client) CallFeatureApi ¶
func (*Client) DecryptFeatures ¶
func (client *Client) DecryptFeatures(encrypted string) (FeatureMap, error)
func (*Client) EvalFeature ¶
func (client *Client) EvalFeature(ctx context.Context, key string) *FeatureResult
EvalFeature evaluates feature based on attributes and features map
func (*Client) Features ¶
func (client *Client) Features() FeatureMap
func (*Client) RunExperiment ¶
func (client *Client) RunExperiment(ctx context.Context, exp *Experiment) *ExperimentResult
func (*Client) SetEncryptedJSONFeatures ¶
SetEncryptedJSONFeatures updates shared features from encrypted JSON. Uses client's decryption key.
func (*Client) SetFeatures ¶
func (client *Client) SetFeatures(features FeatureMap) error
SetFeatures updates shared client features.
func (*Client) SetJSONFeatures ¶
SetJSONFeatures updates shared features from JSON
func (*Client) UpdateFromApiResponse ¶
func (client *Client) UpdateFromApiResponse(resp *FeatureApiResponse) error
UpdateFromApiResponse updates shared data from Growthbook API response
func (*Client) UpdateFromApiResponseJSON ¶
func (*Client) WithAttributeOverrides ¶
func (c *Client) WithAttributeOverrides(attributes Attributes) (*Client, error)
WithAttributeOverrides creates child client instance with updated top-level attributes.
func (*Client) WithAttributes ¶
func (c *Client) WithAttributes(attributes Attributes) (*Client, error)
WithAttributes creates child client instance that uses provided attributes for evaluation.
func (*Client) WithEnabled ¶
WithEnabled creates child client instance with updated enabled switch.
func (*Client) WithExperimentCallback ¶
func (c *Client) WithExperimentCallback(cb ExperimentCallback) (*Client, error)
WithExperimentCallback creates child client with updated experiment callback function.
func (*Client) WithExtraData ¶
WithExtraData creates child client with extra data that will be sent to a callback.
func (*Client) WithFeatureUsageCallback ¶
func (c *Client) WithFeatureUsageCallback(cb FeatureUsageCallback) (*Client, error)
WithFeatureUsageCallback creates child client with udpated feature usage callback function.
func (*Client) WithForcedVariations ¶
func (c *Client) WithForcedVariations(forcedVariations ForcedVariationsMap) (*Client, error)
WithForcedVariations creates child client with updated forced variations.
func (*Client) WithLogger ¶
WithLogger creates child client instance that uses provided logger.
func (*Client) WithQaMode ¶
WithQaMode creates child client instance with updated qaMode switch.
type ClientOption ¶
func WithApiHost ¶
func WithApiHost(apiHost string) ClientOption
WithApiHost sets the GrowthBook API Host.
func WithAttributes ¶
func WithAttributes(attributes Attributes) ClientOption
WithAttributes sets attributes that used to assign variations.
func WithClientKey ¶
func WithClientKey(clientKey string) ClientOption
WithClientKey sets client key used to fetch features from the GrowthBook API.
func WithDecryptionKey ¶
func WithDecryptionKey(decryptionKey string) ClientOption
WithDecryptionKey sets key used to decrypt encrypted features from the API.
func WithEnabled ¶
func WithEnabled(enabled bool) ClientOption
WithEnabled sets enabled switch to globally disable all experiments. Default true.
func WithEncryptedJsonFeatures ¶
func WithEncryptedJsonFeatures(featuresJson string) ClientOption
WithEncryptedJsonFeatures sets features definitions from encrypted JSON string.
func WithExperimentCallback ¶
func WithExperimentCallback(cb ExperimentCallback) ClientOption
WithExperiementCallbaback sets experiment callback function.
func WithExtraData ¶
func WithExtraData(extraData any) ClientOption
WithExtraData sets extra data that will be to callback calls.
func WithFeatureUsageCallback ¶
func WithFeatureUsageCallback(cb FeatureUsageCallback) ClientOption
WithFeatureUsageCallback sets feature usage callback function.
func WithFeatures ¶
func WithFeatures(features FeatureMap) ClientOption
WithFeatures sets features definitions (usually pulled from an API or cache).
func WithForcedVariations ¶
func WithForcedVariations(forcedVariations ForcedVariationsMap) ClientOption
WithForcedVariations force specific experiments to always assign a specific variation (used for QA)
func WithHttpClient ¶
func WithHttpClient(httpClient *http.Client) ClientOption
WithHttpClient sets http client for GrowthBook API calls.
func WithJsonFeatures ¶
func WithJsonFeatures(featuresJson string) ClientOption
WithJsonFeatures sets features definitions from JSON string.
func WithLogger ¶
func WithLogger(logger *slog.Logger) ClientOption
WithLogger sets logger for GrowthBook client.
func WithPollDataSource ¶
func WithPollDataSource(interval time.Duration) ClientOption
func WithQaMode ¶
func WithQaMode(qaMode bool) ClientOption
WithQaMode if true, random assignment is disabled and only explicitly forced variations are used.
func WithSavedGroups ¶
func WithSavedGroups(savedGroups condition.SavedGroups) ClientOption
WithSavedGroups sets saved groups used to target the same group of users across multiple features and experiments.
func WithSseDataSource ¶
func WithSseDataSource() ClientOption
func WithStickyBucketAttributes ¶
func WithStickyBucketAttributes(attributes StickyBucketAttributes) ClientOption
WithStickyBucketAttributes sets sticky bucket attributes for the client
func WithStickyBucketService ¶
func WithStickyBucketService(service StickyBucketService) ClientOption
WithStickyBucketService adds a sticky bucket service to the client
type Experiment ¶
type Experiment struct {
// The globally unique identifier for the experiment
Key string `json:"key"`
// The different variations to choose between
Variations []FeatureValue `json:"variations"`
// How to weight traffic between variations. Must add to 1.
Weights []float64 `json:"weights"`
// Active determines if the experiment is running. If set to false, always return the control (first variation)
// If nil (field missing in JSON), the experiment is considered active by default.
Active *bool `json:"active"`
// What percent of users should be included in the experiment (between 0 and 1, inclusive)
Coverage *float64 `json:"coverage"`
// Array of ranges, one per variation
Ranges []BucketRange `json:"ranges"`
// Optional targeting condition
Condition condition.Base `json:"condition"`
// Each item defines a prerequisite where a condition must evaluate against a parent feature's value (identified by id).
ParentConditions []ParentCondition `json:"parentConditions"`
// Adds the experiment to a namespace
Namespace *Namespace `json:"namespace"`
// All users included in the experiment will be forced into the specific variation index
Force *int `json:"force"`
// What user attribute should be used to assign variations (defaults to id)
HashAttribute string `json:"hashAttribute"`
// When using sticky bucketing, can be used as a fallback to assign variations
FallbackAttribute string `json:"fallbackAttribute"`
// The hash version to use (default to 1)
HashVersion int `json:"hashVersion"`
// Meta info about the variations
Meta []VariationMeta `json:"meta"`
// Array of filters to apply
Filters []Filter `json:"filters"`
// The hash seed to use
Seed string `json:"seed"`
// Human-readable name for the experiment
Name string `json:"name"`
// Id of the current experiment phase
Phase string `json:"phase"`
// If true, sticky bucketing will be disabled for this experiment.
// (Note: sticky bucketing is only available if a StickyBucketingService is provided in the Context)
DisableStickyBucketing bool `json:"disableStickyBucketing"`
// An sticky bucket version number that can be used to force a re-bucketing of users (default to 0)
BucketVersion int `json:"bucketVersion"`
// Any users with a sticky bucket version less than this will be excluded from the experiment
MinBucketVersion int `json:"minBucketVersion"`
}
Experiment defines a single experiment.
func NewExperiment ¶
func NewExperiment(key string) *Experiment
NewExperiment creates an experiment with default settings: active, but all other fields empty.
func (*Experiment) IsActive ¶
func (e *Experiment) IsActive() bool
IsActive returns whether the experiment is active. Experiments are considered active by default (when Active field is nil).
type ExperimentCallback ¶
type ExperimentCallback func(context.Context, *Experiment, *ExperimentResult, any)
ExperimentCallback function that is executed every time a user is included in an Experiment.
type ExperimentResult ¶
type ExperimentResult struct {
// Whether or not the user is part of the experiment
InExperiment bool `json:"inExperiment"`
// The array index of the assigned variation
VariationId int `json:"variationId"`
// The array value of the assigned variation
Value FeatureValue `json:"value"`
// If a hash was used to assign a variation
HashUsed bool `json:"hashUsed"`
// The user attribute used to assign a variation
HashAttribute string `json:"hashAttribute"`
// The value of hash attribute
HashValue string `json:"hashValue"`
// The id of the feature (if any) that the experiment came from
FeatureId string `json:"featureId"`
// The unique key for the assigned variation
Key string `json:"key"`
// The hash value used to assign a variation (float from 0 to 1)
Bucket *float64 `json:"bucket"`
// The human-readable name of the assigned variation
Name string `json:"name"`
// Used for holdout groups
Passthrough bool `json:"passthrough"`
// If sticky bucketing was used to assign a variation
StickyBucketUsed bool `json:"stickyBucketUsed"`
}
type ExperimentStatus ¶
type ExperimentStatus string
const ( DraftStatus ExperimentStatus = "draft" RunningStatus ExperimentStatus = "running" StoppedStatus ExperimentStatus = "stopped" )
type Feature ¶
type Feature struct {
// DefaultValue is optional default value
DefaultValue FeatureValue `json:"defaultValue"`
//Rules determine when and how the [DefaultValue] gets overridden
Rules []FeatureRule `json:"rules"`
}
Feature has a default value plus rules than can override the default.
type FeatureApiResponse ¶
type FeatureApiResponse struct {
Status int `json:"status"`
Features FeatureMap `json:"features"`
DateUpdated time.Time `json:"dateUpdated"`
SavedGroups condition.SavedGroups `json:"savedGroups"`
EncryptedFeatures string `json:"encryptedFeatures"`
SseSupport bool
Etag string
}
type FeatureMap ¶
Map of Feature. Keys are string ids for the features. Values are pointers to Feature structs.
type FeatureResult ¶
type FeatureResult struct {
RuleId string `json:"ruleId"`
Value FeatureValue `json:"value"`
Source FeatureResultSource `json:"source"`
On bool `json:"on"`
Off bool `json:"off"`
Experiment *Experiment `json:"experiment"`
ExperimentResult *ExperimentResult `json:"experimentResult"`
}
FeatureResult is the result of evaluating a feature.
func (*FeatureResult) InExperiment ¶
func (res *FeatureResult) InExperiment() bool
type FeatureResultSource ¶
type FeatureResultSource string
FeatureResultSource is an enumerated type representing the source of a FeatureResult.
const ( UnknownFeatureResultSource FeatureResultSource = "unknownFeature" DefaultValueResultSource FeatureResultSource = "defaultValue" ForceResultSource FeatureResultSource = "force" ExperimentResultSource FeatureResultSource = "experiment" OverrideResultSource FeatureResultSource = "override" PrerequisiteResultSource FeatureResultSource = "prerequisite" CyclicPrerequisiteResultSource FeatureResultSource = "cyclicPrerequisite" )
FeatureResultSource values.
type FeatureRule ¶
type FeatureRule struct {
// Optional rule id, reserved for future use
Id string `json:"id"`
// Optional targeting condition
Condition condition.Base `json:"condition"`
// Each item defines a prerequisite where a condition must evaluate against a parent feature's value (identified by id).
// If gate is true, then this is a blocking feature-level prerequisite; otherwise it applies to the current rule only.
ParentConditions []ParentCondition `json:"parentConditions"`
// What percent of users should be included in the experiment (between 0 and 1, inclusive)
Coverage *float64 `json:"coverage"`
// Immediately force a specific value (ignore every other option besides condition and coverage)
Force FeatureValue `json:"force"`
// Run an experiment (A/B test) and randomly choose between these variations
Variations []FeatureValue `json:"variations"`
// The globally unique tracking key for the experiment (default to the feature key)
Key string `json:"key"`
// How to weight traffic between variations. Must add to 1.
Weights []float64 `json:"weights"`
// Adds the experiment to a namespace
Namespace *Namespace `json:"namespace"`
// What user attribute should be used to assign variations (defaults to id)
HashAttribute string `json:"hashAttribute"`
// When using sticky bucketing, can be used as a fallback to assign variations
FallbackAttribute string `json:"fallbackAttribute"`
// If true, sticky bucketing will be disabled for this experiment.
DisableStickyBucketing bool `json:"disableStickyBucketing"`
// The hash version to use (default to 1)
HashVersion int `json:"hashVersion"`
// An sticky bucket version number that can be used to force a re-bucketing of users (default to 0)
BucketVersion int `json:"bucketVersion"`
// Any users with a sticky bucket version less than this will be excluded from the experiment
MinBucketVersion int `json:"minBucketVersion"`
// A more precise version of coverage
Range *BucketRange `json:"range"`
// Ranges for experiment variations
Ranges []BucketRange `json:"ranges"`
// Meta info about the experiment variations
Meta []VariationMeta `json:"meta"`
// Slice of filters to apply to the rule
Filters []Filter `json:"filters"`
// Seed to use for hashing
Seed string `json:"seed"`
//Human-readable name for the experiment
Name string `json:"name"`
// The phase id of the experiment
Phase string `json:"phase"`
}
type FeatureUsageCallback ¶
type FeatureUsageCallback func(context.Context, string, *FeatureResult, any)
FeatureUsageCallback funcion is executed every time feature is evaluated
type FeatureValue ¶
type FeatureValue any
FeatureValue is a wrapper around an arbitrary type representing the value of a feature.
type Filter ¶
type Filter struct {
Seed string `json:"seed"`
Ranges []BucketRange `json:"ranges"`
Attribute string `json:"attribute"`
HashVersion int `json:"hashVersion"`
}
Filter represents a filter condition for experiment mutual exclusion.
type ForcedVariationsMap ¶
ForcedVariationsMap is a map that forces an Experiment to always assign a specific variation. Useful for QA.
type InMemoryStickyBucketService ¶
type InMemoryStickyBucketService struct {
// contains filtered or unexported fields
}
InMemoryStickyBucketService provides a simple in-memory implementation of StickyBucketService
func NewInMemoryStickyBucketService ¶
func NewInMemoryStickyBucketService() *InMemoryStickyBucketService
NewInMemoryStickyBucketService creates a new in-memory sticky bucket service
func (*InMemoryStickyBucketService) Destroy ¶
func (s *InMemoryStickyBucketService) Destroy()
Destroy clears all stored assignments
func (*InMemoryStickyBucketService) GetAllAssignments ¶
func (s *InMemoryStickyBucketService) GetAllAssignments(attributes map[string]string) (StickyBucketAssignments, error)
GetAllAssignments retrieves all assignments for the provided attributes
func (*InMemoryStickyBucketService) GetAssignments ¶
func (s *InMemoryStickyBucketService) GetAssignments(attributeName, attributeValue string) (*StickyBucketAssignmentDoc, error)
GetAssignments retrieves assignments for a specific attribute
func (*InMemoryStickyBucketService) SaveAssignments ¶
func (s *InMemoryStickyBucketService) SaveAssignments(doc *StickyBucketAssignmentDoc) error
SaveAssignments stores assignments for a specific attribute
type Namespace ¶
Namespace specifies what part of a namespace an experiment includes. If two experiments are in the same namespace and their ranges don't overlap, they wil be mutually exclusive.
func (*Namespace) UnmarshalJSON ¶
type ParentCondition ¶
type PollDataSource ¶
type PollDataSource struct {
// contains filtered or unexported fields
}
func (*PollDataSource) Close ¶
func (ds *PollDataSource) Close() error
type SseDataSource ¶
type SseDataSource struct {
// contains filtered or unexported fields
}
func (*SseDataSource) Close ¶
func (ds *SseDataSource) Close() error
type StickyBucketAssignmentData ¶
type StickyBucketAssignmentData struct {
Key string
Doc *StickyBucketAssignmentDoc
Changed bool
}
StickyBucketAssignmentData is used when generating sticky bucket assignments
func GenerateStickyBucketAssignmentDoc ¶
func GenerateStickyBucketAssignmentDoc( attributeName string, attributeValue string, assignments map[string]string, service StickyBucketService, ) *StickyBucketAssignmentData
GenerateStickyBucketAssignmentDoc creates or updates a sticky bucket assignment document
type StickyBucketAssignmentDoc ¶
type StickyBucketAssignmentDoc struct {
AttributeName string `json:"attributeName"`
AttributeValue string `json:"attributeValue"`
Assignments map[string]string `json:"assignments"`
}
StickyBucketAssignmentDoc represents a document storing assignment data
type StickyBucketAssignments ¶
type StickyBucketAssignments map[string]*StickyBucketAssignmentDoc
StickyBucketAssignments is a map of keys to assignment documents
type StickyBucketAttributes ¶
StickyBucketAttributes is a map of attribute names to attribute values
type StickyBucketResult ¶
StickyBucketResult holds the result of a sticky bucket lookup
func GetStickyBucketVariation ¶
func GetStickyBucketVariation( experimentKey string, bucketVersion int, minBucketVersion int, meta []VariationMeta, service StickyBucketService, hashAttribute string, fallbackAttribute string, attributes map[string]string, cachedAssignments StickyBucketAssignments, ) (*StickyBucketResult, error)
GetStickyBucketVariation retrieves an existing sticky bucket assignment
type StickyBucketService ¶
type StickyBucketService interface {
GetAssignments(attributeName string, attributeValue string) (*StickyBucketAssignmentDoc, error)
SaveAssignments(doc *StickyBucketAssignmentDoc) error
GetAllAssignments(attributes map[string]string) (StickyBucketAssignments, error)
}
StickyBucketService defines operations for storing and retrieving sticky bucket assignments
type VariationMeta ¶
type VariationMeta struct {
// Key is a unique key for this variation.
Key string `json:"key"`
// Name is a human-readable name for this variation.
Name string `json:"name"`
// Passthrough used to implement holdout groups
Passthrough bool `json:"passthrough"`
}
VariationMeta info about an experiment variation.
Source Files
¶
- attributes.go
- bucket_range.go
- client.go
- client_data.go
- client_option.go
- crypto.go
- datasource.go
- datasource_empty.go
- datasource_poll.go
- datasource_sse.go
- evaluator.go
- experiment.go
- experiment_result.go
- feature.go
- feature_api.go
- feature_result.go
- feature_rule.go
- feature_value.go
- filter.go
- growthbook.go
- hash.go
- meta.go
- namespace.go
- parent_condition.go
- stack.go
- sticky_bucket.go
- test_utils.go
- util.go
