lib

package
v1.7.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 30, 2020 License: MPL-2.0 Imports: 31 Imported by: 1,147

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (

	// SeededSecurely is set to true if a cryptographically secure seed
	// was used to initialize rand.  When false, the start time is used
	// as a seed.
	SeededSecurely bool
)

Functions

func AbsInt added in v0.7.0

func AbsInt(a int) int

func ComputeDistance added in v0.8.0

func ComputeDistance(a *coordinate.Coordinate, b *coordinate.Coordinate) float64

ComputeDistance returns the distance between the two network coordinates in seconds. If either of the coordinates is nil then this will return positive infinity.

func DecodeJSON added in v1.7.0

func DecodeJSON(data io.Reader, out interface{}) error

DecodeJSON is a convenience function to create a JSON decoder set it up to disallow unknown fields and then decode into the given value

func DurationMinusBuffer added in v0.7.0

func DurationMinusBuffer(intv time.Duration, buffer time.Duration, jitter int64) time.Duration

DurationMinusBuffer returns a duration, minus a buffer and jitter subtracted from the duration. This function is used primarily for servicing Consul TTL Checks in advance of the TTL.

func DurationMinusBufferDomain added in v0.7.0

func DurationMinusBufferDomain(intv time.Duration, buffer time.Duration, jitter int64) (min time.Duration, max time.Duration)

DurationMinusBufferDomain returns the domain of valid durations from a call to DurationMinusBuffer. This function is used to check user specified input values to DurationMinusBuffer.

func EnsurePath added in v0.7.3

func EnsurePath(path string, dir bool) error

EnsurePath is used to make sure a path exists

func GenerateCoordinate added in v0.8.0

func GenerateCoordinate(rtt time.Duration) *coordinate.Coordinate

GenerateCoordinate creates a new coordinate with the given distance from the origin. This should only be used for tests.

func GenerateUUID added in v1.4.0

func GenerateUUID(checkFn UUIDCheckFunc) (string, error)

func GetSerfTags added in v1.4.0

func GetSerfTags(serf *serf.Serf) map[string]string

func InitTelemetry added in v1.2.0

func InitTelemetry(cfg TelemetryConfig) (*metrics.InmemSink, error)

InitTelemetry configures go-metrics based on map of telemetry config values as returned by Runtimecfg.Config().

func IsErrEOF added in v1.0.0

func IsErrEOF(err error) bool

IsErrEOF returns true if we get an EOF error from the socket itself, or an EOF equivalent error from yamux.

func MapWalk added in v1.5.0

func MapWalk(input interface{}) (map[string]interface{}, error)

MapWalk will traverse through the supplied input which should be a map[string]interface{} (or something compatible that we can coerce to a map[string]interface{}) and from it create a new map[string]interface{} with all internal values coerced to JSON compatible types. i.e. a []uint8 can be converted (in most cases) to a string so it will not be base64 encoded when output in JSON

func MaxInt added in v0.7.0

func MaxInt(a, b int) int

func MinInt added in v0.7.0

func MinInt(a, b int) int

func PatchSliceOfMaps added in v1.6.0

func PatchSliceOfMaps(m map[string]interface{}, skip []string, skipTree []string) map[string]interface{}

func RandomStagger

func RandomStagger(intv time.Duration) time.Duration

RandomStagger returns an interval between 0 and the duration

func RateScaledInterval

func RateScaledInterval(rate float64, min time.Duration, n int) time.Duration

RateScaledInterval is used to choose an interval to perform an action in order to target an aggregate number of actions per second across the whole cluster.

func SeedMathRand

func SeedMathRand()

SeedMathRand provides weak, but guaranteed seeding, which is better than running with Go's default seed of 1. A call to SeedMathRand() is expected to be called via init(), but never a second time.

func SerfDefaultConfig added in v1.0.2

func SerfDefaultConfig() *serf.Config

SerfDefaultConfig returns a Consul-flavored Serf default configuration, suitable as a basis for a LAN, WAN, segment, or area.

func StartTestServer added in v1.7.3

func StartTestServer(handler http.Handler) (string, func())

StartTestServer fires up a web server on a random unused port to serve the given handler body. The address it is listening on is returned. When the test case terminates the server will be stopped via cleanup functions.

We can't directly use httptest.Server here because that only thinks a port is free if it's not bound. Consul tests frequently reserve ports via `sdk/freeport` so you can have one part of the test try to use a port and _know_ nothing is listening. If you simply assumed unbound ports were free you'd end up with test cross-talk and weirdness.

func StrContains

func StrContains(l []string, s string) bool

StrContains checks if a list contains a string

func TranslateKeys added in v1.5.0

func TranslateKeys(v map[string]interface{}, dict map[string]string)

TranslateKeys recursively translates all keys from m in-place to their canonical form as defined in dict which maps an alias name to the canonical name. If m already has a value for the canonical name then that one is used and the value for the alias name is discarded. Alias names are matched case-insensitive.

Example:

m = TranslateKeys(m, map[string]string{"snake_case": "CamelCase"})

If the canonical string provided is the empty string, the effect is to stop recursing into any key matching the left hand side. In this case the left hand side must use periods to specify a full path e.g. `connect.proxy.config`. The path must be the canonical key names (i.e. CamelCase) AFTER translation so NodeName not node_name. These are still match in a case-insensitive way.

This is needed for example because parts of the Service Definition are "opaque" maps of metadata or config passed to another process or component. If we allow translation to recurse we might mangle the "opaque" keys given where the clash with key names in other parts of the definition :sob:

Example:

m - TranslateKeys(m, map[string]string{
  "foo_bar": "FooBar",
  "widget.config": "",
  // Assume widgets is an array, this will prevent recursing into any
  // item's config field
  "widgets.config": "",
})

func UnmarshalJSON added in v1.7.0

func UnmarshalJSON(data []byte, out interface{}) error

UnmarshalJSON is a convenience function around calling DecodeJSON. It will mainly be useful in many of our UnmarshalJSON methods for structs.

func UpdateSerfTag added in v1.4.0

func UpdateSerfTag(serf *serf.Serf, tag, value string)

func UserAgent added in v1.2.0

func UserAgent() string

UserAgent returns the consistent user-agent string for Consul.

Types

type CoordinateSet added in v0.9.3

type CoordinateSet map[string]*coordinate.Coordinate

CoordinateSet holds all the coordinates for a given node, indexed by network segment name.

func (CoordinateSet) Intersect added in v0.9.3

Intersect tries to return a pair of coordinates which are compatible with the current set and a given set. We employ some special knowledge about network segments to avoid doing a full intersection, since this is in several hot paths. This might return nil for either coordinate in the output pair if an intersection cannot be found. The ComputeDistance function above is designed to deal with that.

type Jitter added in v1.5.0

type Jitter interface {
	AddJitter(baseTime time.Duration) time.Duration
}

Interface used for offloading jitter calculations from the RetryWaiter

type JitterRandomStagger added in v1.5.0

type JitterRandomStagger struct {
	// contains filtered or unexported fields
}

Calculates a random jitter between 0 and up to a specific percentage of the baseTime

func NewJitterRandomStagger added in v1.5.0

func NewJitterRandomStagger(percent int) *JitterRandomStagger

Creates a new JitterRandomStagger

func (*JitterRandomStagger) AddJitter added in v1.5.0

func (j *JitterRandomStagger) AddJitter(baseTime time.Duration) time.Duration

Implments the Jitter interface

type RetryWaiter added in v1.5.0

type RetryWaiter struct {
	// contains filtered or unexported fields
}

RetryWaiter will record failed and successful operations and provide a channel to wait on before a failed operation can be retried.

func NewRetryWaiter added in v1.5.0

func NewRetryWaiter(minFailures int, minWait, maxWait time.Duration, jitter Jitter) *RetryWaiter

Creates a new RetryWaiter

func (*RetryWaiter) Failed added in v1.5.0

func (rw *RetryWaiter) Failed() <-chan struct{}

Marks that an operation failed. The chan returned will be selectable once the calculated retry wait amount of time has elapsed

func (*RetryWaiter) Reset added in v1.5.0

func (rw *RetryWaiter) Reset()

Resets the internal failure counter

func (*RetryWaiter) Success added in v1.5.0

func (rw *RetryWaiter) Success() <-chan struct{}

Marks that an operation is successful which resets the failure count. The chan that is returned will be immediately selectable

func (*RetryWaiter) WaitIf added in v1.5.0

func (rw *RetryWaiter) WaitIf(failure bool) <-chan struct{}

WaitIf is a convenice method to record whether the last operation was a success or failure and return a chan that will be selectablw when the next operation can be done.

func (*RetryWaiter) WaitIfErr added in v1.5.0

func (rw *RetryWaiter) WaitIfErr(err error) <-chan struct{}

WaitIfErr is a convenience method to record whether the last operation was a success or failure based on whether the err is nil and then return a chan that will be selectable when the next operation can be done.

type StopChannelContext added in v1.4.0

type StopChannelContext struct {
	StopCh <-chan struct{}
}

StopChannelContext implements the context.Context interface You provide the channel to select on to determine whether the context should be canceled and other code such as the rate.Limiter will automatically use the channel appropriately

func (*StopChannelContext) Deadline added in v1.4.0

func (c *StopChannelContext) Deadline() (deadline time.Time, ok bool)

func (*StopChannelContext) Done added in v1.4.0

func (c *StopChannelContext) Done() <-chan struct{}

func (*StopChannelContext) Err added in v1.4.0

func (c *StopChannelContext) Err() error

func (*StopChannelContext) Value added in v1.4.0

func (c *StopChannelContext) Value(key interface{}) interface{}

type TelemetryConfig added in v1.2.0

type TelemetryConfig struct {

	// CirconusAPIApp is an app name associated with API token.
	// Default: "consul"
	//
	// hcl: telemetry { circonus_api_app = string }
	CirconusAPIApp string `json:"circonus_api_app,omitempty" mapstructure:"circonus_api_app"`

	// CirconusAPIToken is a valid API Token used to create/manage check. If provided,
	// metric management is enabled.
	// Default: none
	//
	// hcl: telemetry { circonus_api_token = string }
	CirconusAPIToken string `json:"circonus_api_token,omitempty" mapstructure:"circonus_api_token"`

	// CirconusAPIURL is the base URL to use for contacting the Circonus API.
	// Default: "https://api.circonus.com/v2"
	//
	// hcl: telemetry { circonus_api_url = string }
	CirconusAPIURL string `json:"circonus_apiurl,omitempty" mapstructure:"circonus_apiurl"`

	// CirconusBrokerID is an explicit broker to use when creating a new check. The numeric portion
	// of broker._cid. If metric management is enabled and neither a Submission URL nor Check ID
	// is provided, an attempt will be made to search for an existing check using Instance ID and
	// Search Tag. If one is not found, a new HTTPTRAP check will be created.
	// Default: use Select Tag if provided, otherwise, a random Enterprise Broker associated
	// with the specified API token or the default Circonus Broker.
	// Default: none
	//
	// hcl: telemetry { circonus_broker_id = string }
	CirconusBrokerID string `json:"circonus_broker_id,omitempty" mapstructure:"circonus_broker_id"`

	// CirconusBrokerSelectTag is a special tag which will be used to select a broker when
	// a Broker ID is not provided. The best use of this is to as a hint for which broker
	// should be used based on *where* this particular instance is running.
	// (e.g. a specific geo location or datacenter, dc:sfo)
	// Default: none
	//
	// hcl: telemetry { circonus_broker_select_tag = string }
	CirconusBrokerSelectTag string `json:"circonus_broker_select_tag,omitempty" mapstructure:"circonus_broker_select_tag"`

	// CirconusCheckDisplayName is the name for the check which will be displayed in the Circonus UI.
	// Default: value of CirconusCheckInstanceID
	//
	// hcl: telemetry { circonus_check_display_name = string }
	CirconusCheckDisplayName string `json:"circonus_check_display_name,omitempty" mapstructure:"circonus_check_display_name"`

	// CirconusCheckForceMetricActivation will force enabling metrics, as they are encountered,
	// if the metric already exists and is NOT active. If check management is enabled, the default
	// behavior is to add new metrics as they are encountered. If the metric already exists in the
	// check, it will *NOT* be activated. This setting overrides that behavior.
	// Default: "false"
	//
	// hcl: telemetry { circonus_check_metrics_activation = (true|false)
	CirconusCheckForceMetricActivation string `json:"circonus_check_force_metric_activation,omitempty" mapstructure:"circonus_check_force_metric_activation"`

	// CirconusCheckID is the check id (not check bundle id) from a previously created
	// HTTPTRAP check. The numeric portion of the check._cid field.
	// Default: none
	//
	// hcl: telemetry { circonus_check_id = string }
	CirconusCheckID string `json:"circonus_check_id,omitempty" mapstructure:"circonus_check_id"`

	// CirconusCheckInstanceID serves to uniquely identify the metrics coming from this "instance".
	// It can be used to maintain metric continuity with transient or ephemeral instances as
	// they move around within an infrastructure.
	// Default: hostname:app
	//
	// hcl: telemetry { circonus_check_instance_id = string }
	CirconusCheckInstanceID string `json:"circonus_check_instance_id,omitempty" mapstructure:"circonus_check_instance_id"`

	// CirconusCheckSearchTag is a special tag which, when coupled with the instance id, helps to
	// narrow down the search results when neither a Submission URL or Check ID is provided.
	// Default: service:app (e.g. service:consul)
	//
	// hcl: telemetry { circonus_check_search_tag = string }
	CirconusCheckSearchTag string `json:"circonus_check_search_tag,omitempty" mapstructure:"circonus_check_search_tag"`

	// CirconusCheckSearchTag is a special tag which, when coupled with the instance id, helps to
	// narrow down the search results when neither a Submission URL or Check ID is provided.
	// Default: service:app (e.g. service:consul)
	//
	// hcl: telemetry { circonus_check_tags = string }
	CirconusCheckTags string `json:"circonus_check_tags,omitempty" mapstructure:"circonus_check_tags"`

	// CirconusSubmissionInterval is the interval at which metrics are submitted to Circonus.
	// Default: 10s
	//
	// hcl: telemetry { circonus_submission_interval = "duration" }
	CirconusSubmissionInterval string `json:"circonus_submission_interval,omitempty" mapstructure:"circonus_submission_interval"`

	// CirconusCheckSubmissionURL is the check.config.submission_url field from a
	// previously created HTTPTRAP check.
	// Default: none
	//
	// hcl: telemetry { circonus_submission_url = string }
	CirconusSubmissionURL string `json:"circonus_submission_url,omitempty" mapstructure:"circonus_submission_url"`

	// DisableHostname will disable hostname prefixing for all metrics.
	//
	// hcl: telemetry { disable_hostname = (true|false)
	DisableHostname bool `json:"disable_hostname,omitempty" mapstructure:"disable_hostname"`

	// DogStatsdAddr is the address of a dogstatsd instance. If provided,
	// metrics will be sent to that instance
	//
	// hcl: telemetry { dogstatsd_addr = string }
	DogstatsdAddr string `json:"dogstatsd_addr,omitempty" mapstructure:"dogstatsd_addr"`

	// DogStatsdTags are the global tags that should be sent with each packet to dogstatsd
	// It is a list of strings, where each string looks like "my_tag_name:my_tag_value"
	//
	// hcl: telemetry { dogstatsd_tags = []string }
	DogstatsdTags []string `json:"dogstatsd_tags,omitempty" mapstructure:"dogstatsd_tags"`

	// PrometheusRetentionTime is the retention time for prometheus metrics if greater than 0.
	// A value of 0 disable Prometheus support. Regarding Prometheus, it is considered a good
	// practice to put large values here (such as a few days), and at least the interval between
	// prometheus requests.
	//
	// hcl: telemetry { prometheus_retention_time = "duration" }
	PrometheusRetentionTime time.Duration `json:"prometheus_retention_time,omitempty" mapstructure:"prometheus_retention_time"`

	// FilterDefault is the default for whether to allow a metric that's not
	// covered by the filter.
	//
	// hcl: telemetry { filter_default = (true|false) }
	FilterDefault bool `json:"filter_default,omitempty" mapstructure:"filter_default"`

	// AllowedPrefixes is a list of filter rules to apply for allowing metrics
	// by prefix. Use the 'prefix_filter' option and prefix rules with '+' to be
	// included.
	//
	// hcl: telemetry { prefix_filter = []string{"+<expr>", "+<expr>", ...} }
	AllowedPrefixes []string `json:"allowed_prefixes,omitempty" mapstructure:"allowed_prefixes"`

	// BlockedPrefixes is a list of filter rules to apply for blocking metrics
	// by prefix. Use the 'prefix_filter' option and prefix rules with '-' to be
	// excluded.
	//
	// hcl: telemetry { prefix_filter = []string{"-<expr>", "-<expr>", ...} }
	BlockedPrefixes []string `json:"blocked_prefixes,omitempty" mapstructure:"blocked_prefixes"`

	// MetricsPrefix is the prefix used to write stats values to.
	// Default: "consul."
	//
	// hcl: telemetry { metrics_prefix = string }
	MetricsPrefix string `json:"metrics_prefix,omitempty" mapstructure:"metrics_prefix"`

	// StatsdAddr is the address of a statsd instance. If provided,
	// metrics will be sent to that instance.
	//
	// hcl: telemetry { statsd_address = string }
	StatsdAddr string `json:"statsd_address,omitempty" mapstructure:"statsd_address"`

	// StatsiteAddr is the address of a statsite instance. If provided,
	// metrics will be streamed to that instance.
	//
	// hcl: telemetry { statsite_address = string }
	StatsiteAddr string `json:"statsite_address,omitempty" mapstructure:"statsite_address"`
}

TelemetryConfig is embedded in config.RuntimeConfig and holds the configuration variables for go-metrics. It is a separate struct to allow it to be exported as JSON and passed to other process like managed connect proxies so they can inherit the agent's telemetry config.

It is in lib package rather than agent/config because we need to use it in the shared InitTelemetry functions below, but we can't import agent/config due to a dependency cycle.

func (*TelemetryConfig) MergeDefaults added in v1.2.0

func (c *TelemetryConfig) MergeDefaults(defaults *TelemetryConfig)

MergeDefaults copies any non-zero field from defaults into the current config.

type UUIDCheckFunc added in v1.4.0

type UUIDCheckFunc func(string) (bool, error)

UUIDCheckFunc should determine whether the given UUID is actually unique and allowed to be used

Directories

Path Synopsis
Package semaphore implements a simple semaphore that is based on golang.org/x/sync/semaphore but doesn't support weights.
Package semaphore implements a simple semaphore that is based on golang.org/x/sync/semaphore but doesn't support weights.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL