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
- 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 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 Namespace
- type ParentCondition
- type PollDataSource
- type SseDataSource
- 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 ¶
This section is empty.
Types ¶
type Attributes ¶
type BucketRange ¶ added in v0.2.0
BucketRange represents a single bucket range.
func (*BucketRange) InRange ¶ added in v0.2.0
func (r *BucketRange) InRange(n float64) bool
func (*BucketRange) UnmarshalJSON ¶ added in v0.2.0
func (br *BucketRange) UnmarshalJSON(data []byte) error
type Client ¶ added in v0.2.0
type Client struct {
// contains filtered or unexported fields
}
Client is a GrowthBook SDK client.
func NewApiClient ¶ added in v0.2.0
NewApiClient creates simple client with API host and client key
func NewClient ¶ added in v0.2.0
func NewClient(ctx context.Context, opts ...ClientOption) (*Client, error)
NewClient create a new GrowthBook SDK client.
func (*Client) CallFeatureApi ¶ added in v0.2.0
func (*Client) DecryptFeatures ¶ added in v0.2.0
func (client *Client) DecryptFeatures(encrypted string) (FeatureMap, error)
func (*Client) EnsureLoaded ¶ added in v0.2.0
func (*Client) EvalFeature ¶ added in v0.2.0
func (client *Client) EvalFeature(ctx context.Context, key string) *FeatureResult
EvalFeature evaluates feature based on attributes and features map
func (*Client) Features ¶ added in v0.2.0
func (client *Client) Features() FeatureMap
func (*Client) RunExperiment ¶ added in v0.2.0
func (client *Client) RunExperiment(ctx context.Context, exp *Experiment) *ExperimentResult
func (*Client) SetEncryptedJSONFeatures ¶ added in v0.2.0
SetEncryptedJSONFeatures updates shared features from encrypted JSON. Uses client's decryption key.
func (*Client) SetFeatures ¶ added in v0.2.0
func (client *Client) SetFeatures(features FeatureMap) error
SetFeatures updates shared client features.
func (*Client) SetJSONFeatures ¶ added in v0.2.0
SetJSONFeatures updates shared features from JSON
func (*Client) UpdateFromApiResponse ¶ added in v0.2.0
func (client *Client) UpdateFromApiResponse(resp *FeatureApiResponse) error
UpdateFromApiResponse updates shared data from Growthbook API response
func (*Client) UpdateFromApiResponseJSON ¶ added in v0.2.0
func (*Client) WithAttributeOverrides ¶ added in v0.2.0
func (c *Client) WithAttributeOverrides(attributes Attributes) (*Client, error)
WithAttributeOverrides creates child client instance with updated top-level attributes.
func (*Client) WithAttributes ¶ added in v0.2.0
func (c *Client) WithAttributes(attributes Attributes) (*Client, error)
WithAttributes creates child client instance that uses provided attributes for evaluation.
func (*Client) WithEnabled ¶ added in v0.2.0
WithEnabled creates child client instance with updated enabled switch.
func (*Client) WithExperimentCallback ¶ added in v0.2.0
func (c *Client) WithExperimentCallback(cb ExperimentCallback) (*Client, error)
WithExperimentCallback creates child client with updated experiment callback function.
func (*Client) WithExtraData ¶ added in v0.2.0
WithExtraData creates child client with extra data that will be sent to a callback.
func (*Client) WithFeatureUsageCallback ¶ added in v0.2.0
func (c *Client) WithFeatureUsageCallback(cb FeatureUsageCallback) (*Client, error)
WithFeatureUsageCallback creates child client with udpated feature usage callback function.
func (*Client) WithForcedVariations ¶ added in v0.2.0
func (c *Client) WithForcedVariations(forcedVariations ForcedVariationsMap) (*Client, error)
WithForcedVariations creates child client with updated forced variations.
func (*Client) WithLogger ¶ added in v0.2.0
WithLogger creates child client instance that uses provided logger.
func (*Client) WithQaMode ¶ added in v0.2.0
WithQaMode creates child client instance with updated qaMode switch.
type ClientOption ¶ added in v0.2.0
func WithApiHost ¶ added in v0.2.0
func WithApiHost(apiHost string) ClientOption
WithApiHost sets the GrowthBook API Host.
func WithAttributes ¶ added in v0.2.0
func WithAttributes(attributes Attributes) ClientOption
WithAttributes sets attributes that used to assign variations.
func WithClientKey ¶ added in v0.2.0
func WithClientKey(clientKey string) ClientOption
WithClientKey sets client key used to fetch features from the GrowthBook API.
func WithDecryptionKey ¶ added in v0.2.0
func WithDecryptionKey(decryptionKey string) ClientOption
WithDecryptionKey sets key used to decrypt encrypted features from the API.
func WithEnabled ¶ added in v0.2.0
func WithEnabled(enabled bool) ClientOption
WithEnabled sets enabled switch to globally disable all experiments. Default true.
func WithEncryptedJsonFeatures ¶ added in v0.2.0
func WithEncryptedJsonFeatures(featuresJson string) ClientOption
WithEncryptedJsonFeatures sets features definitions from encrypted JSON string.
func WithExperimentCallback ¶ added in v0.2.0
func WithExperimentCallback(cb ExperimentCallback) ClientOption
WithExperiementCallbaback sets experiment callback function.
func WithExtraData ¶ added in v0.2.0
func WithExtraData(extraData any) ClientOption
WithExtraData sets extra data that will be to callback calls.
func WithFeatureUsageCallback ¶ added in v0.2.0
func WithFeatureUsageCallback(cb FeatureUsageCallback) ClientOption
WithFeatureUsageCallback sets feature usage callback function.
func WithFeatures ¶ added in v0.2.0
func WithFeatures(features FeatureMap) ClientOption
WithFeatures sets features definitions (usually pulled from an API or cache).
func WithForcedVariations ¶ added in v0.2.0
func WithForcedVariations(forcedVariations ForcedVariationsMap) ClientOption
WithForcedVariations force specific experiments to always assign a specific variation (used for QA)
func WithHttpClient ¶ added in v0.2.0
func WithHttpClient(httpClient *http.Client) ClientOption
WithHttpClient sets http client for GrowthBook API calls.
func WithJsonFeatures ¶ added in v0.2.0
func WithJsonFeatures(featuresJson string) ClientOption
WithJsonFeatures sets features definitions from JSON string.
func WithLogger ¶ added in v0.2.0
func WithLogger(logger *slog.Logger) ClientOption
WithLogger sets logger for GrowthBook client.
func WithPollDataSource ¶ added in v0.2.0
func WithPollDataSource(interval time.Duration) ClientOption
func WithQaMode ¶ added in v0.2.0
func WithQaMode(qaMode bool) ClientOption
WithQaMode if true, random assignment is disabled and only explicitly forced variations are used.
func WithSavedGroups ¶ added in v0.2.0
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 ¶ added in v0.2.0
func WithSseDataSource() ClientOption
func WithUrl ¶ added in v0.2.0
func WithUrl(rawUrl string) ClientOption
WithUrl sets url of the current page.
type DataSource ¶ added in v0.2.0
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 ¶ added in v0.2.2
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 ¶ added in v0.1.4
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 ¶ added in v0.2.0
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 ¶ added in v0.2.0
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"`
// The hash version to use (default to 1)
HashVersion int `json:"hashVersion"`
// 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 ¶ added in v0.1.4
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 ¶ added in v0.1.4
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 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 ¶ added in v0.2.0
type ParentCondition ¶ added in v0.2.0
type PollDataSource ¶ added in v0.2.0
type PollDataSource struct {
// contains filtered or unexported fields
}
func (*PollDataSource) Close ¶ added in v0.2.0
func (ds *PollDataSource) Close() error
type SseDataSource ¶ added in v0.2.0
type SseDataSource struct {
// contains filtered or unexported fields
}
func (*SseDataSource) Close ¶ added in v0.2.0
func (ds *SseDataSource) Close() error
type VariationMeta ¶ added in v0.1.4
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
- test_utils.go
- util.go
