Documentation ¶
Index ¶
- Constants
- Variables
- func MakeAllVersionedDataMap(features map[string]*FeatureFlag, segments map[string]*Segment) map[VersionedDataKind]map[string]VersionedData
- func ParseFloat64(input interface{}) *float64
- func ParseTime(input interface{}) *time.Time
- func ToJsonRawMessage(input interface{}) (json.RawMessage, error)
- type BaseEvent
- type Clause
- type Config
- type CustomEvent
- type DerivedAttribute
- type EvalResult
- type Event
- type Explanation
- type Feature
- type FeatureFlag
- type FeatureFlagVersionedDataKind
- type FeatureRequestEvent
- type FeatureStore
- type HttpStatusError
- type IdentifyEvent
- type InMemoryFeatureStore
- func (store *InMemoryFeatureStore) All(kind VersionedDataKind) (map[string]VersionedData, error)
- func (store *InMemoryFeatureStore) Delete(kind VersionedDataKind, key string, version int) error
- func (store *InMemoryFeatureStore) Get(kind VersionedDataKind, key string) (VersionedData, error)
- func (store *InMemoryFeatureStore) Init(allData map[VersionedDataKind]map[string]VersionedData) error
- func (store *InMemoryFeatureStore) Initialized() bool
- func (store *InMemoryFeatureStore) Upsert(kind VersionedDataKind, item VersionedData) error
- type LDClient
- func (client *LDClient) AllFlags(user User) map[string]interface{}
- func (client *LDClient) BoolVariation(key string, user User, defaultVal bool) (bool, error)
- func (client *LDClient) Close()
- func (client *LDClient) Evaluate(key string, user User, defaultVal interface{}) (interface{}, *int, error)
- func (client *LDClient) Float64Variation(key string, user User, defaultVal float64) (float64, error)
- func (client *LDClient) Flush()
- func (client *LDClient) Identify(user User) error
- func (client *LDClient) Initialized() bool
- func (client *LDClient) IntVariation(key string, user User, defaultVal int) (int, error)
- func (client *LDClient) IsOffline() bool
- func (client *LDClient) JsonVariation(key string, user User, defaultVal json.RawMessage) (json.RawMessage, error)
- func (client *LDClient) SecureModeHash(user User) string
- func (client *LDClient) StringVariation(key string, user User, defaultVal string) (string, error)
- func (client *LDClient) Toggle(key string, user User, defaultVal bool) (bool, error)deprecated
- func (client *LDClient) Track(key string, user User, data interface{}) error
- type Logger
- type Operator
- type Prerequisite
- type Rollout
- type Rule
- type Segment
- type SegmentExplanation
- type SegmentRule
- type SegmentVersionedDataKind
- type Target
- type TargetRule
- type UpdateProcessor
- type User
- type Variation
- type VariationOrRollout
- type VersionedData
- type VersionedDataKind
- type WeightedVariation
Constants ¶
const ( FEATURE_REQUEST_EVENT = "feature" CUSTOM_EVENT = "custom" IDENTIFY_EVENT = "identify" )
const ( LatestFlagsPath = "/sdk/latest-flags" LatestSegmentsPath = "/sdk/latest-segments" LatestAllPath = "/sdk/latest-all" )
const MinimumPollInterval = 30 * time.Second
The minimum value for Config.PollInterval. If you specify a smaller interval, the minimum will be used instead.
const Version = "3.1.0"
Variables ¶
var DefaultConfig = Config{ BaseUri: "https://app.launchdarkly.com", StreamUri: "https://stream.launchdarkly.com", EventsUri: "https://events.launchdarkly.com", Capacity: 1000, FlushInterval: 5 * time.Second, PollInterval: MinimumPollInterval, Logger: log.New(os.Stderr, "[LaunchDarkly]", log.LstdFlags), Timeout: 3000 * time.Millisecond, Stream: true, FeatureStore: nil, UseLdd: false, SendEvents: true, Offline: false, }
Provides the default configuration options for the LaunchDarkly client. The easiest way to create a custom configuration is to start with the default config, and set the custom options from there. For example:
var config = DefaultConfig config.Capacity = 2000
var ErrClientNotInitialized = errors.New("Feature flag evaluation called before LaunchDarkly client initialization completed")
var ErrInitializationTimeout = errors.New("Timeout encountered waiting for LaunchDarkly client initialization")
var OpsList = []Operator{ OperatorIn, OperatorEndsWith, OperatorStartsWith, OperatorMatches, OperatorContains, OperatorLessThan, OperatorLessThanOrEqual, OperatorGreaterThan, OperatorGreaterThanOrEqual, OperatorBefore, OperatorAfter, OperatorSegmentMatch, OperatorSemVerEqual, OperatorSemVerLessThan, OperatorSemVerGreaterThan, }
var VersionedDataKinds = [...]VersionedDataKind{ Features, Segments, }
A list of supported VersionedDataKind's. Among other things, this list might be used by feature stores to know what data (namespaces) to expect.
Functions ¶
func MakeAllVersionedDataMap ¶
func MakeAllVersionedDataMap( features map[string]*FeatureFlag, segments map[string]*Segment) map[VersionedDataKind]map[string]VersionedData
func ParseFloat64 ¶
func ParseFloat64(input interface{}) *float64
Parses numeric value as float64 from a string or another numeric type. Returns nil pointer if input is nil or unparsable.
func ParseTime ¶
Converts any of the following into a pointer to a time.Time value:
RFC3339/ISO8601 timestamp (example: 2016-04-16T17:09:12.759-07:00) Unix epoch milliseconds as string Unix milliseconds as number
Passing in a time.Time value will return a pointer to the input value. Unparsable inputs will return nil More info on RFC3339: http://stackoverflow.com/questions/522251/whats-the-difference-between-iso-8601-and-rfc-3339-date-formats
func ToJsonRawMessage ¶
func ToJsonRawMessage(input interface{}) (json.RawMessage, error)
Converts input to a *json.RawMessage if possible.
Types ¶
type Config ¶
type Config struct { BaseUri string StreamUri string EventsUri string Capacity int FlushInterval time.Duration SamplingInterval int32 PollInterval time.Duration Logger Logger Timeout time.Duration Stream bool FeatureStore FeatureStore UseLdd bool SendEvents bool Offline bool AllAttributesPrivate bool PrivateAttributeNames []string UpdateProcessor UpdateProcessor }
Exposes advanced configuration options for the LaunchDarkly client.
type CustomEvent ¶
type CustomEvent struct { BaseEvent Data interface{} `json:"data"` }
func NewCustomEvent ¶
func NewCustomEvent(key string, user User, data interface{}) CustomEvent
Constructs a new custom event, but does not send it. Typically, Track should be used to both create the event and send it to LaunchDarkly.
func (CustomEvent) GetBase ¶
func (evt CustomEvent) GetBase() BaseEvent
func (CustomEvent) GetKind ¶
func (evt CustomEvent) GetKind() string
type DerivedAttribute ¶
type DerivedAttribute struct { Value interface{} `json:"value" bson:"value"` LastDerived time.Time `json:"lastDerived" bson:"lastDerived"` }
The Derived attribute map is for internal use by LaunchDarkly only. Derived attributes sent to LaunchDarkly are ignored.
type EvalResult ¶
type EvalResult struct { Value interface{} Explanation *Explanation PrerequisiteRequestEvents []FeatureRequestEvent //to be sent to LD }
type Explanation ¶
type Explanation struct { Kind string `json:"kind" bson:"kind"` *Target `json:"target,omitempty"` *Rule `json:"rule,omitempty"` *Prerequisite `json:"prerequisite,omitempty"` *VariationOrRollout `json:"fallthrough,omitempty"` }
An explanation is one of: target, rule, prerequisite that wasn't met, or fallthrough rollout/variation
type Feature ¶
type Feature struct { Name *string `json:"name"` Key *string `json:"key"` Kind *string `json:"kind"` Salt *string `json:"salt"` On *bool `json:"on"` Variations *[]Variation `json:"variations"` CommitDate *time.Time `json:"commitDate"` CreationDate *time.Time `json:"creationDate"` Version int `json:"version,omitempty"` Deleted bool `json:"deleted,omitempty"` }
Legacy (v1) feature
func (Feature) EvaluateExplain ¶
func (f Feature) EvaluateExplain(user User) (value interface{}, targetMatch *TargetRule, rulesPassed bool)
type FeatureFlag ¶
type FeatureFlag struct { Key string `json:"key" bson:"key"` Version int `json:"version" bson:"version"` On bool `json:"on" bson:"on"` Prerequisites []Prerequisite `json:"prerequisites" bson:"prerequisites"` Salt string `json:"salt" bson:"salt"` Sel string `json:"sel" bson:"sel"` Targets []Target `json:"targets" bson:"targets"` Rules []Rule `json:"rules" bson:"rules"` Fallthrough VariationOrRollout `json:"fallthrough" bson:"fallthrough"` OffVariation *int `json:"offVariation" bson:"offVariation"` Variations []interface{} `json:"variations" bson:"variations"` Deleted bool `json:"deleted" bson:"deleted"` }
func (*FeatureFlag) Clone ¶
func (f *FeatureFlag) Clone() VersionedData
func (FeatureFlag) EvaluateExplain ¶
func (f FeatureFlag) EvaluateExplain(user User, store FeatureStore) (*EvalResult, error)
func (*FeatureFlag) GetKey ¶
func (f *FeatureFlag) GetKey() string
func (*FeatureFlag) GetVersion ¶
func (f *FeatureFlag) GetVersion() int
func (*FeatureFlag) IsDeleted ¶
func (f *FeatureFlag) IsDeleted() bool
type FeatureFlagVersionedDataKind ¶
type FeatureFlagVersionedDataKind struct{}
var Features FeatureFlagVersionedDataKind
func (FeatureFlagVersionedDataKind) GetDefaultItem ¶
func (fk FeatureFlagVersionedDataKind) GetDefaultItem() interface{}
func (FeatureFlagVersionedDataKind) GetNamespace ¶
func (fk FeatureFlagVersionedDataKind) GetNamespace() string
func (FeatureFlagVersionedDataKind) MakeDeletedItem ¶
func (fk FeatureFlagVersionedDataKind) MakeDeletedItem(key string, version int) VersionedData
type FeatureRequestEvent ¶
type FeatureRequestEvent struct { BaseEvent Value interface{} `json:"value"` Default interface{} `json:"default"` Version *int `json:"version,omitempty"` PrereqOf *string `json:"prereqOf,omitempty"` }
func NewFeatureRequestEvent ¶
func NewFeatureRequestEvent(key string, user User, value, defaultVal interface{}, version *int, prereqOf *string) FeatureRequestEvent
Used to just create the event. Normally, you don't need to call this; the event is created and queued automatically during feature flag evaluation.
func (FeatureRequestEvent) GetBase ¶
func (evt FeatureRequestEvent) GetBase() BaseEvent
func (FeatureRequestEvent) GetKind ¶
func (evt FeatureRequestEvent) GetKind() string
type FeatureStore ¶
type FeatureStore interface { Get(kind VersionedDataKind, key string) (VersionedData, error) All(kind VersionedDataKind) (map[string]VersionedData, error) Init(map[VersionedDataKind]map[string]VersionedData) error Delete(kind VersionedDataKind, key string, version int) error Upsert(kind VersionedDataKind, item VersionedData) error Initialized() bool }
A data structure that maintains the live collection of features and related objects. It is used by LaunchDarkly when streaming mode is enabled, and stores data returned by the streaming API. Custom FeatureStore implementations can be passed to the LaunchDarkly client via a custom Config object. LaunchDarkly provides two FeatureStore implementations: one backed by an in-memory map, and one backed by Redis. Implementations must be thread-safe.
type HttpStatusError ¶
func (HttpStatusError) Error ¶
func (e HttpStatusError) Error() string
type IdentifyEvent ¶
type IdentifyEvent struct {
BaseEvent
}
func NewIdentifyEvent ¶
func NewIdentifyEvent(user User) IdentifyEvent
Constructs a new identify event, but does not send it. Typically, Identify should be used to both create the event and send it to LaunchDarkly.
func (IdentifyEvent) GetBase ¶
func (evt IdentifyEvent) GetBase() BaseEvent
func (IdentifyEvent) GetKind ¶
func (evt IdentifyEvent) GetKind() string
type InMemoryFeatureStore ¶
A memory based FeatureStore implementation, backed by a lock-striped map.
func NewInMemoryFeatureStore ¶
func NewInMemoryFeatureStore(logger Logger) *InMemoryFeatureStore
Creates a new in-memory FeatureStore instance.
func (*InMemoryFeatureStore) All ¶
func (store *InMemoryFeatureStore) All(kind VersionedDataKind) (map[string]VersionedData, error)
func (*InMemoryFeatureStore) Delete ¶
func (store *InMemoryFeatureStore) Delete(kind VersionedDataKind, key string, version int) error
func (*InMemoryFeatureStore) Get ¶
func (store *InMemoryFeatureStore) Get(kind VersionedDataKind, key string) (VersionedData, error)
func (*InMemoryFeatureStore) Init ¶
func (store *InMemoryFeatureStore) Init(allData map[VersionedDataKind]map[string]VersionedData) error
func (*InMemoryFeatureStore) Initialized ¶
func (store *InMemoryFeatureStore) Initialized() bool
func (*InMemoryFeatureStore) Upsert ¶
func (store *InMemoryFeatureStore) Upsert(kind VersionedDataKind, item VersionedData) error
type LDClient ¶
type LDClient struct {
// contains filtered or unexported fields
}
The LaunchDarkly client. Client instances are thread-safe. Applications should instantiate a single instance for the lifetime of their application.
func MakeClient ¶
Creates a new client instance that connects to LaunchDarkly with the default configuration. In most cases, you should use this method to instantiate your client. The optional duration parameter allows callers to block until the client has connected to LaunchDarkly and is properly initialized.
func MakeCustomClient ¶
Creates a new client instance that connects to LaunchDarkly with a custom configuration. The optional duration parameter allows callers to block until the client has connected to LaunchDarkly and is properly initialized.
func (*LDClient) AllFlags ¶
Returns a map from feature flag keys to values for a given user. If the result of the flag's evaluation would result in the default value, `nil` will be returned. This method does not send analytics events back to LaunchDarkly
func (*LDClient) BoolVariation ¶
Returns the value of a boolean feature flag for a given user. Returns defaultVal if there is an error, if the flag doesn't exist, the client hasn't completed initialization, or the feature is turned off.
func (*LDClient) Close ¶
func (client *LDClient) Close()
Shuts down the LaunchDarkly client. After calling this, the LaunchDarkly client should no longer be used.
func (*LDClient) Float64Variation ¶
func (client *LDClient) Float64Variation(key string, user User, defaultVal float64) (float64, error)
Returns the value of a feature flag (whose variations are floats) for the given user. Returns defaultVal if there is an error, if the flag doesn't exist, or the feature is turned off.
func (*LDClient) Initialized ¶
Returns whether the LaunchDarkly client is initialized.
func (*LDClient) IntVariation ¶
Returns the value of a feature flag (whose variations are integers) for the given user. Returns defaultVal if there is an error, if the flag doesn't exist, or the feature is turned off.
func (*LDClient) JsonVariation ¶
func (client *LDClient) JsonVariation(key string, user User, defaultVal json.RawMessage) (json.RawMessage, error)
Returns the value of a feature flag (whose variations are JSON) for the given user. Returns defaultVal if there is an error, if the flag doesn't exist, or the feature is turned off.
func (*LDClient) SecureModeHash ¶
func (*LDClient) StringVariation ¶
Returns the value of a feature flag (whose variations are strings) for the given user. Returns defaultVal if there is an error, if the flag doesn't exist, or the feature is turned off.
type Operator ¶
type Operator string
const ( OperatorIn Operator = "in" OperatorEndsWith Operator = "endsWith" OperatorStartsWith Operator = "startsWith" OperatorMatches Operator = "matches" OperatorContains Operator = "contains" OperatorLessThan Operator = "lessThan" OperatorLessThanOrEqual Operator = "lessThanOrEqual" OperatorGreaterThan Operator = "greaterThan" OperatorGreaterThanOrEqual Operator = "greaterThanOrEqual" OperatorBefore Operator = "before" OperatorAfter Operator = "after" OperatorSegmentMatch Operator = "segmentMatch" OperatorSemVerEqual Operator = "semVerEqual" OperatorSemVerLessThan Operator = "semVerLessThan" OperatorSemVerGreaterThan Operator = "semVerGreaterThan" )
type Prerequisite ¶
type Rollout ¶
type Rollout struct { Variations []WeightedVariation `json:"variations" bson:"variations"` BucketBy *string `json:"bucketBy,omitempty" bson:"bucketBy,omitempty"` }
type Rule ¶
type Rule struct { VariationOrRollout `bson:",inline"` Clauses []Clause `json:"clauses" bson:"clauses"` }
Expresses a set of AND-ed matching conditions for a user, along with either a fixed variation or a set of rollout percentages
type Segment ¶
type Segment struct { Key string `json:"key" bson:"key"` Included []string `json:"included" bson:"included"` Excluded []string `json:"excluded" bson:"excluded"` Salt string `json:"salt" bson:"salt"` Rules []SegmentRule `json:"rules" bson:"rules"` Version int `json:"version" bson:"version"` Deleted bool `json:"deleted" bson:"deleted"` }
func (*Segment) Clone ¶
func (s *Segment) Clone() VersionedData
func (Segment) ContainsUser ¶
func (s Segment) ContainsUser(user User) (bool, *SegmentExplanation)
func (*Segment) GetVersion ¶
type SegmentExplanation ¶
type SegmentExplanation struct { Kind string MatchedRule *SegmentRule }
type SegmentRule ¶
type SegmentRule struct { Clauses []Clause `json:"clauses" bson:"clauses"` Weight *int `json:"weight,omitempty" bson:"weight,omitempty"` BucketBy *string `json:"bucketBy,omitempty" bson:"bucketBy,omitempty"` }
func (SegmentRule) MatchesUser ¶
func (r SegmentRule) MatchesUser(user User, key, salt string) bool
type SegmentVersionedDataKind ¶
type SegmentVersionedDataKind struct{}
var Segments SegmentVersionedDataKind
func (SegmentVersionedDataKind) GetDefaultItem ¶
func (sk SegmentVersionedDataKind) GetDefaultItem() interface{}
func (SegmentVersionedDataKind) GetNamespace ¶
func (sk SegmentVersionedDataKind) GetNamespace() string
func (SegmentVersionedDataKind) MakeDeletedItem ¶
func (sk SegmentVersionedDataKind) MakeDeletedItem(key string, version int) VersionedData
type TargetRule ¶
type UpdateProcessor ¶
type UpdateProcessor interface { Initialized() bool Close() Start(closeWhenReady chan<- struct{}) }
type User ¶
type User struct { Key *string `json:"key,omitempty" bson:"key,omitempty"` Secondary *string `json:"secondary,omitempty" bson:"secondary,omitempty"` Ip *string `json:"ip,omitempty" bson:"ip,omitempty"` Country *string `json:"country,omitempty" bson:"country,omitempty"` Email *string `json:"email,omitempty" bson:"email,omitempty"` FirstName *string `json:"firstName,omitempty" bson:"firstName,omitempty"` LastName *string `json:"lastName,omitempty" bson:"lastName,omitempty"` Avatar *string `json:"avatar,omitempty" bson:"avatar,omitempty"` Name *string `json:"name,omitempty" bson:"name,omitempty"` Anonymous *bool `json:"anonymous,omitempty" bson:"anonymous,omitempty"` Custom *map[string]interface{} `json:"custom,omitempty" bson:"custom,omitempty"` Derived map[string]*DerivedAttribute `json:"derived,omitempty" bson:"derived,omitempty"` // PrivateAttributes contains a list of attribute names that were included in the user, // but were marked as private. As such, these attributes are not included in the fields above. PrivateAttributes []string `json:"privateAttrs,omitempty" bson:"privateAttrs,omitempty"` // This contains list of attributes to keep private, whether they appear at the top-level or Custom // The attribute "key" is always sent regardless of whether it is in this list, and "custom" cannot be used to // eliminate all custom attributes PrivateAttributeNames []string `json:"-" bson:"-"` }
A User contains specific attributes of a user browsing your site. The only mandatory property property is the Key, which must uniquely identify each user. For authenticated users, this may be a username or e-mail address. For anonymous users, this could be an IP address or session ID.
Besides the mandatory Key, User supports two kinds of optional attributes: interpreted attributes (e.g. Ip and Country) and custom attributes. LaunchDarkly can parse interpreted attributes and attach meaning to them. For example, from an Ip address, LaunchDarkly can do a geo IP lookup and determine the user's country.
Custom attributes are not parsed by LaunchDarkly. They can be used in custom rules-- for example, a custom attribute such as "customer_ranking" can be used to launch a feature to the top 10% of users on a site.
func NewAnonymousUser ¶
NewAnonymousUser creates a new anonymous user identified by the given key.
type Variation ¶
type Variation struct { Value interface{} `json:"value"` Weight int `json:"weight"` Targets []TargetRule `json:"targets"` UserTarget *TargetRule `json:"userTarget,omitempty"` }
type VariationOrRollout ¶
type VariationOrRollout struct { Variation *int `json:"variation,omitempty" bson:"variation,omitempty"` Rollout *Rollout `json:"rollout,omitempty" bson:"rollout,omitempty"` }
Contains either the fixed variation or percent rollout to serve. Invariant: one of the variation or rollout must be non-nil.
type VersionedData ¶
type VersionedData interface { // Return the string key for this object. GetKey() string // Return the version number for this object. GetVersion() int // Return whether or not this object has been deleted. IsDeleted() bool }
Common interface for string-keyed, versioned objects such as feature flags.
type VersionedDataKind ¶
type VersionedDataKind interface { // Return a short string that serves as the unique name for the collection of these objects, e.g. "features". GetNamespace() string // Return a pointer to a newly created null value of this object type. This is used for JSON unmarshalling. GetDefaultItem() interface{} // Return a value of this object type with the specified key and version, and Deleted=true. MakeDeletedItem(key string, version int) VersionedData }
Data structure that describes a kind of VersionedData objects that may exist in a store.