Documentation ¶
Index ¶
- Constants
- func AppContextGenerator() func() AppContext
- func BreadcrumbsGenerator(min uint64, max uint64, categories []string, levels []string, types []string, ...) func() []Breadcrumb
- func DeviceContextGenerator() func() DeviceContext
- func EventIdGenerator() func() string
- func Flip() bool
- func FromUTCString(date string) (time.Time, error)
- func MeasurementsGenerator(measurements []string) func() map[string]float64
- func NewVirtualRelay() *virtualRelay
- func OperationGenerator(operations []string) func() string
- func OsContextGenerator() func() OsContext
- func RegisterTestType(name string, tester LoadTesterBuilder, splitter LoadSplitter)
- func ReleaseGenerator(numReleases uint64) func() string
- func SpanIdGenerator() func() string
- func SpanStatusGenerator() func() string
- func SpansGenerator(minSpans uint64, maxSpans uint64, operations []string) ...
- func TraceContextGenerator(operations []string) func() TraceContext
- func TransactionGenerator(job TransactionJobCommon) func(time.Duration) Transaction
- func UserGenerator(maxUsers uint64) func() User
- func VersionGenerator(numSegments uint64, maxValue uint64) func() string
- type AppContext
- type Breadcrumb
- type BucketType
- type Contexts
- type DeviceContext
- type GaugeValue
- type LoadSplitter
- type LoadTester
- type LoadTesterBuilder
- type MetricBucket
- type MetricBucketJob
- type OsContext
- type ProjectConfigJob
- type ProjectProfile
- type Session
- type SessionJob
- type Span
- type TestParams
- type TimestampHistogramBucket
- type TraceContext
- type Transaction
- type TransactionJob
- type TransactionJobCommon
- type TransactionJobV2
- type User
Constants ¶
const ( ProjectConfigRequest requestType = 0 InvalidateProjectRequest requestType = 1 )
Variables ¶
This section is empty.
Functions ¶
func AppContextGenerator ¶
func AppContextGenerator() func() AppContext
func BreadcrumbsGenerator ¶
func DeviceContextGenerator ¶
func DeviceContextGenerator() func() DeviceContext
func EventIdGenerator ¶
func EventIdGenerator() func() string
func MeasurementsGenerator ¶
func NewVirtualRelay ¶
func NewVirtualRelay() *virtualRelay
func OperationGenerator ¶
func OsContextGenerator ¶
func OsContextGenerator() func() OsContext
func RegisterTestType ¶
func RegisterTestType(name string, tester LoadTesterBuilder, splitter LoadSplitter)
RegisterTestType registers the necessary test handlers (LoadTesterBuilder and LoadSplitter) with a test type (a string). This enables the service loop to retrieve the proper handlers for a test request. The service loop looks-up the proper handlers by using the request TestParams.Name field and then starts the attack with the retrieved handlers.
func ReleaseGenerator ¶
func SpanIdGenerator ¶
func SpanIdGenerator() func() string
func SpanStatusGenerator ¶
func SpanStatusGenerator() func() string
func SpansGenerator ¶
func TraceContextGenerator ¶
func TraceContextGenerator(operations []string) func() TraceContext
func TransactionGenerator ¶
func TransactionGenerator(job TransactionJobCommon) func(time.Duration) Transaction
func UserGenerator ¶
func VersionGenerator ¶
Types ¶
type AppContext ¶
type AppContext struct { AppStartTime string `json:"app_start_time,omitempty"` DeviceAppHash string `json:"device_app_hash,omitempty"` BuildType string `json:"build_type,omitempty"` AppIdentifier string `json:"app_identifier,omitempty"` AppName string `json:"app_name,omitempty"` AppVersion string `json:"app_version,omitempty"` AppBuild string `json:"app_build,omitempty"` Type string `json:"type,omitempty"` }
type Breadcrumb ¶
type BucketType ¶
type BucketType string
const ( Distribution BucketType = "d" Counter BucketType = "c" Set BucketType = "s" Gauge BucketType = "g" )
type Contexts ¶
type Contexts struct { Os OsContext `json:"os,omitempty"` Device DeviceContext `json:"device,omitempty"` App AppContext `json:"app,omitempty"` Trace TraceContext `json:"trace,omitempty"` }
type DeviceContext ¶
type DeviceContext struct { Name string `json:"name,omitempty"` Family string `json:"family,omitempty"` Model string `json:"model,omitempty"` ModelId string `json:"model_id,omitempty"` Arch string `json:"arch,omitempty"` BatteryLevel float64 `json:"battery_level,omitempty"` Orientation string `json:"orientation,omitempty"` Manufacturer string `json:"manufacturer,omitempty"` Brand string `json:"brand,omitempty"` ScreenResolution string `json:"screen_resolution,omitempty"` ScreenDensity uint64 `json:"screen_density,omitempty"` ScreenDpi uint64 `json:"screen_dpi,omitempty"` Online bool `json:"online,omitempty"` Charging bool `json:"charging,omitempty"` LowMemory bool `json:"low_memory,omitempty"` Simulator bool `json:"simulator,omitempty"` MemorySize uint64 `json:"memory_size,omitempty"` FreeMemory uint64 `json:"free_memory,omitempty"` UsableMemory uint64 `json:"usable_memory,omitempty"` StorageSize uint64 `json:"storage_size,omitempty"` FreeStorage uint64 `json:"free_storage,omitempty"` ExternalStorageSize uint64 `json:"external_storage_size,omitempty"` ExternalFreeStorage uint64 `json:"external_free_storage,omitempty"` BootTime string `json:"boot_time,omitempty"` Timezone string `json:"timezone,omitempty"` Type string `json:"type,omitempty"` }
type GaugeValue ¶
type LoadSplitter ¶
type LoadSplitter func(masterParams TestParams, numWorkers int) ([]TestParams, error)
LoadSplitter is a function that knows how to split a load test request between multiple workers. In the simplest (and most common) case it just splits the load messages/timeInterval to the number of workers by giving each worker the load messages/(timeInterval * numWorkers). If this is your case just use SimpleLoadSplitter, if you need something more sophisticated implement your own that decomposes your TestParams in the proper way required by your test. Note: The function must return a slice of TestParams of size numWorkers.
func GetLoadSplitter ¶
func GetLoadSplitter(testType string) LoadSplitter
GetLoadSplitter a loadSplitter for the current type of test.
type LoadTester ¶
type LoadTester interface { // GetTargeter will be called by the worker at the beginning of an attack in order to // create a targeter for the particular TestParams passed. This Targeter will be used // during the attack to construct requests (this function will be called once per attack) GetTargeter() (vegeta.Targeter, uint64) // ProcessResult will be called by the worker during an attack for each Result returned by the system // under test. If you don't care about the results returned just provide an empty implementation. ProcessResult(res *vegeta.Result, seq uint64) }
LoadTester is an interface implemented by all load tests. This is used by the web_server.worker to handle loads based on the TestParams passed in the request.
type LoadTesterBuilder ¶
type LoadTesterBuilder func(targetUrl string, params json.RawMessage) LoadTester
LoadTesterBuilder is a function that when given a target URL and a read channel of raw JSON messages returns a LoadTester that is able to change the events it generates to reflect the parameter passed through the JSON messages channel. The target url is generally the base url of the server under test. The LoadTester return must be able to create a vegeta.Targeter, that is an object that returns load test requests and therefore must be able to create the urls of the load test requests, the targetUrl is used for this. The target url is coming (in the current implementation) from a CLI parameter. Note: the raw JSON messages received through the channel need to be "compatible" with the specific targeter. Getting the proper builder for a type of message is outside this function's responsibilities (the dispatch is done via GetLoadTester inside the worker)
func GetLoadTester ¶
func GetLoadTester(testType string) LoadTesterBuilder
GetLoadTester returns the TargeterBuilder for a particular type of message.
type MetricBucket ¶
type MetricBucket struct { Name string `json:"name"` Unit string `json:"unit"` Width uint64 `json:"width"` // one of Type BucketType `json:"type"` // Value is []float64 for distribution, float64 for counter, []int32 for set, GaugeValue for gauge Value any `json:"value"` Timestamp int64 `json:"timestamp"` Tags map[string]string `json:"tags"` }
type MetricBucketJob ¶
type MetricBucketJob struct { // NumMetricNames represents the total number of metric names that will be generated NumMetricNames int `json:"numMetricNames"` // NumProjects represents the number of projects that will be used for the metric messages NumProjects int `json:"numProjects"` // NumDistributions created in each messages NumDistributions int `json:"numDistributions"` // NumberGauges created in each message NumGauges int `json:"numGauges"` // NumSets created in each messages NumSets int `json:"numSets"` // NumCounters created in each message NumCounters int `json:"numCounters"` // MinMetricsInDistribution the minimum number of metrics created in each distribution bucket MinMetricsInDistribution int `json:"minMetricsInDistribution"` // MaxMetricsInDistribution the maximum number of metrics created in each distribution bucket MaxMetricsInDistribution int `json:"maxMetricsInDistribution"` // MinMetricsInSets the minimum number of metrics created in each set MinMetricsInSets int `json:"minMetricsInSets"` // MaxMetricsInSets the maximum number of metrics created in each set MaxMetricsInSets int `json:"maxMetricsInSets"` // NumTagsPerMetric Number of tags created for each bucket // To make things predictable each bucket will contain the all the tags // The number of total buckets can be calculated as NumTagsPerMetric^NumValuesPerTag NumTagsPerMetric int `json:"numTagsPerMetric"` // NumValuesPerTag how many distinct values are generated for each tag NumValuesPerTag int `json:"numValuesPerTag"` }
MetricBucketJob is how a metricBucket job is parametrized example: ```json
{ "numMetricNames": 100, "numProjects": 1000, "numDistributions": 7, "numGauges": 0, "numSets": 3, "numCounters": 8, "minMetricsInDistribution": 4, "maxMetricsInDistribution": 25, "minMetricsInSets": 4, "maxMetricsInSets": 30, "numTagsPerMetric": 5, "numValuesPerTag": 3 }
```
type ProjectConfigJob ¶
type ProjectConfigJob struct { // NumRelays is the number of relays to use NumRelays int // NumProjects to use in the requests NumProjects int // MinBatchSize the minimum number of project in a project config request MinBatchSize int // MaxBatchSize the maximum number of projects in a project config request MaxBatchSize int // BatchInterval is the duration of validity of a project config BatchInterval time.Duration // The ratio from the number of requests that are invalidation requests (should be between 0 and 1). ProjectInvalidationRatio float64 // RelayPublicKey public key for Relay authentication RelayPublicKey string // RelayPrivateKey private key for Relay authentication RelayPrivateKey string // RelayId is the id of the Relay used for authentication RelayId string }
ProjectConfigJob is how a projectConfigJob is parametrized
Here's an example of project config parameters: ```json
{ "numRelays": 50, "numProjects": 10000, "minBatchSize": 10, "maxBatchSize": 100, "BatchInterval": "5s", "projectInvalidationRatio": 0.001, "RelayPublicKey": "ftFuDNBFm8-kPpuCuaWMio_mJAW2txCFCsaLMHn2vv0", "RelayPrivateKey": "uZUtRaayN8uuuTTOjbs5EDfqWNwyDfFro6TERx6Wfhs", "RelayId": "aaa12340-a123-123b-4567-0afe1f27e066" }
```
func (ProjectConfigJob) MarshalJSON ¶
func (pcj ProjectConfigJob) MarshalJSON() ([]byte, error)
func (ProjectConfigJob) MarshalYaml ¶
func (pcj ProjectConfigJob) MarshalYaml() ([]byte, error)
func (*ProjectConfigJob) UnmarshalJSON ¶
func (pcj *ProjectConfigJob) UnmarshalJSON(b []byte) error
func (*ProjectConfigJob) UnmarshalYaml ¶
func (pcj *ProjectConfigJob) UnmarshalYaml(b []byte) error
type ProjectProfile ¶
type ProjectProfile struct { // NumProjects number of projects that use this profile NumProjects int `json:"numProjects" yaml:"numProjects"` // Relative frequency of project from this profile in relation with projects from other profiles RelativeFreqWeight float64 `json:"relativeFreqWeight" yaml:"relativeFreqWeight"` // The timestamp histogram for projects in this profile TimestampHistogram []TimestampHistogramBucket `json:"timestampHistogram" yaml:"TimestampHistogram"` }
ProjectProfile represents a group of projects with the same relative frequency and the same timestamp histogram A request will get an array of ProjectProfile, the example below further explains how this works: Consider the following example in JSON format (the timestamp histogram was removed since it is not relevant in the current explanation). ```json [
{ "numProjects": 2, "relativeFreqWeight": 4}, { "numProjects": 3, "relativeFreqWeight": 2}, { "numProjects": 4, "relativeFreqWeight": 1}
] ```
In the example above we have 3 groups, the total number of projects generated is 10+1+5 = 16 Events for a particular project in the first bucket will occur twice as often as events for a particular event in the second bucket and four times as frequent as events for a particular project in the second bucket. In other words considering that projects 1,2 belong to bucket 1, projects 3,4,5 to bucket 2 and projects 6,7,8,9 to bucket 3 here's a perfect distribution of events for the profile above 1 1 1 1 2 2 2 2 3 3 4 4 5 5 6 7 8 9 @doc({"scope":"job"})
func (ProjectProfile) GetNumProjects ¶
func (pp ProjectProfile) GetNumProjects() int
func (ProjectProfile) GetRelativeFreqWeight ¶
func (pp ProjectProfile) GetRelativeFreqWeight() float64
type Session ¶
type Session struct { Init bool `json:"init"` Started string `json:"started"` // a date time Status string `json:"status"` // ok, exited, errored, crashed, abnormal Errors int64 `json:"errors"` Duration float64 `json:"duration"` // duration in seconds SessionId string `json:"sid"` UserId string `json:"did,omitempty"` Sequence int64 `json:"seq"` Timestamp string `json:"timestamp"` // a date time Attributes struct { Release string `json:"release"` Environment string `json:"environment"` } `json:"attrs"` }
Session serialisation format for sessions
type SessionJob ¶
type SessionJob struct { // NumProjects to use in the requests NumProjects int // StartedRange represents the duration range for the start of the session relative to now (all generated sessions will have startTime between 0 and -startRange from now) StartedRange time.Duration // DurationRange the duration of the session ( between 0 and the specified duration) DurationRange time.Duration // NumReleases represents number of unique releases created NumReleases int64 // NumEnvironments represents the number of unique environments created NumEnvironments int64 // NumUsers represents the number or unique users created NumUsers int64 // OkWeight represents the relative weight of session with ok status OkWeight int64 // ExitedWeight represents the relative weight of session with exited status ExitedWeight int64 // ExitedWeight represents the relative weight of session with errored status ErroredWeight int64 // CrashedWeight represents the relative weight of session with crashed status CrashedWeight int64 // AbnormalWeight represents the relative weight of session with abnormal status AbnormalWeight int64 }
SessionJob is how a session load test is parameterized
Here's an example of session parameters:
```json
{ "numProjects": 10000, "startedRange": "1m", "durationRange": "2m", "numReleases": 3, "numEnvironments": 4, "numUsers": 5, "okWeight": 6, "exitedWeight": 7, "erroredWeight": 8, "crashedWeight": 9, "abnormalWeight": 10 }
```
func (SessionJob) MarshalJSON ¶
func (s SessionJob) MarshalJSON() ([]byte, error)
func (SessionJob) MarshalYaml ¶
func (s SessionJob) MarshalYaml() ([]byte, error)
func (*SessionJob) UnmarshalJSON ¶
func (s *SessionJob) UnmarshalJSON(b []byte) error
func (*SessionJob) UnmarshalYaml ¶
func (s *SessionJob) UnmarshalYaml(b []byte) error
type Span ¶
type Span struct { Timestamp float64 `json:"timestamp,omitempty"` StartTimestamp float64 `json:"start_timestamp,omitempty"` ExclusiveTime float64 `json:"exclusive_time,omitempty"` Description string `json:"description,omitempty"` Op string `json:"op,omitempty"` SpanId string `json:"span_id,omitempty"` ParentSpanId string `json:"parent_span_id,omitempty"` TraceId string `json:"trace_id,omitempty"` Status string `json:"status,omitempty"` Tags map[string]string `json:"tags,omitempty"` Data any `json:"data,omitempty"` }
type TestParams ¶
type TestParams struct { Name string Description string TestType string AttackDuration time.Duration // total time of Attack NumMessages int // number of messages to be sent in Per Per time.Duration // the unit of duration in which to send NumMessages Params json.RawMessage Labels [][]string // key value pairs (can be used to annotate the attack result) }
TestParams is Implemented by all parameter test classes
This is how commands are passed in http requests There are 3 main parts to the params:
- Details about the attack duration and intensity ( AttackDuration, Per, NumMessages)
- Type of the attack, (the Name field) used to dispatch the attack to the appropriate targeter
- Parameters specific to the attack (used by the targeter) Params (structure depends on the targeter used) The Description field is optional and used for documenting the attack (e.g. in reporting)
func SimpleLoadSplitter ¶
func SimpleLoadSplitter(masterParams TestParams, numWorkers int) ([]TestParams, error)
SimpleLoadSplitter implements the typical case of load splitting, where there needs to be no special handling of the load (i.e. each request is independent of each other) and therefore all it does is divide the requested attack frequency to the number of workers so that each worker will handle attack_frequency/numWorkers requests.
func (TestParams) MarshalJSON ¶
func (t TestParams) MarshalJSON() ([]byte, error)
func (TestParams) MarshalYaml ¶
func (t TestParams) MarshalYaml() ([]byte, error)
func (*TestParams) UnmarshalJSON ¶
func (t *TestParams) UnmarshalJSON(b []byte) error
func (*TestParams) UnmarshalYaml ¶
func (t *TestParams) UnmarshalYaml(b []byte) error
type TimestampHistogramBucket ¶
type TimestampHistogramBucket struct { // Weight is the relative frequency of requests in this bucket, relative to all other buckets Weight float64 `json:"weight" yaml:"weight"` // MaxDelay The upper bound of the bucket, the lower bound is the previous bucket upper bound or 0 for the first bucket MaxDelay utils.StringDuration `json:"maxDelay" yaml:"maxDelay"` }
TimestampHistogramBucket represents a bucket in a timestamp histogram An array of buckets fully defines a timestamp histogram as in the example below. e.g. consider the following histogram (in json format): ```json [
{ "weight": 5, "maxDelay": "1s"}, { "weight": 3, "maxDelay": "10s"}, { "weight": 2, "maxDelay": "20s"}
]
```
In the example below we have the cumulative weight 5 + 3 + 2 = 10 The request will be generated so that, on average, for every 10 requests 5 will be in the first bucket, 3 in the second and the rest of 2 in the third, or in other words 50% of the requests will have a timestamp delay of between 0s and 1s, 30% will have a timestamp delay of between 1s and 10s and 20% between 10s and 20s **Note:** the weight can be any positive numbers (including 0 if you want to skip an interval), they do not have to add up to 10 (as in the example) or any other number, the same weight would be achieved by using 0.5,0.3,0.2 or 50,30,20. @doc({"scope":"job"})
type TraceContext ¶
type TraceContext struct { Type string `json:"type,omitempty"` TraceId string `json:"trace_id,omitempty"` SpanId string `json:"span_id,omitempty"` ParentSpanId string `json:"parent_span_id,omitempty"` Op string `json:"op,omitempty"` Status string `json:"status,omitempty"` ExclusiveTime float64 `json:"exclusive_time,omitempty"` }
type Transaction ¶
type Transaction struct { Timestamp string `json:"timestamp,omitempty"` // RFC 3339 StartTimestamp string `json:"start_timestamp,omitempty"` // RFC 3339 EventId string `json:"event_id"` Release string `json:"release,omitempty"` Transaction string `json:"transactionJob,omitempty"` Logger string `json:"logger,omitempty"` Environment string `json:"environment,omitempty"` User User `json:"user,omitempty"` Contexts Contexts `json:"contexts,omitempty"` Breadcrumbs []Breadcrumb `json:"breadcrumbs,omitempty"` Measurements map[string]float64 `json:"measurements,omitempty"` Spans []Span `json:"spans,omitempty"` }
Transaction defines the JSON format of a Sentry transactionJob, NOTE: this is just part of a Sentry Event, if we need to emit other Events convert this structure into an Event struct and add the other fields to it .
type TransactionJob ¶
type TransactionJob struct { // NumProjects to use in the requests NumProjects int `json:"numProjects" yaml:"numProjects"` // TransactionTimestampSpread the spread (from Now) of the timestamp, generated transactions will have timestamps between // `Now` and `Now-TransactionTimestampSpread` TransactionTimestampSpread utils.StringDuration `json:"transactionTimestampSpread,omitempty" yaml:"transactionTimestampSpread,omitempty"` // TransactionJobCommon embedded fields, see TransactionJobCommon documentation TransactionJobCommon `yaml:"transactionJobCommon,inline"` }
TransactionJob is how a transactionJob load test is parameterized example: ```json
{ "numProjects": 10000, "transactionDurationMax":"10m" , "transactionDurationMin": "1m" , "transactionTimestampSpread": "5h" , "minSpans": 5, "maxSpans": 40, "numReleases": 1000 , "numUsers": 2000, "minBreadcrumbs": 5, "maxBreadcrumbs": 25, "breadcrumbCategories": ["auth", "web-request", "query"], "breadcrumbLevels": ["fatal", "error", "warning", "info", "debug"], "breadcrumbsTypes": ["default", "http", "error"] , "breadcrumbMessages": [ "Authenticating the user_name", "IOError: [Errno 2] No such file"], "measurements": ["fp","fcp","lcp","fid","cls","ttfb"], "operations": ["browser","http","db","resource.script"] }
```
type TransactionJobCommon ¶
type TransactionJobCommon struct { // TransactionDurationMax the maximum duration for a transactionJob TransactionDurationMax utils.StringDuration `json:"transactionDurationMax,omitempty" yaml:"transactionDurationMax,omitempty"` // TransactionDurationMin the minimum duration for a transactionJob TransactionDurationMin utils.StringDuration `json:"transactionDurationMin,omitempty" yaml:"transactionDurationMin,omitempty"` // MinSpans specifies the minimum number of spans generated in a transactionJob MinSpans uint64 `json:"minSpans,omitempty" yaml:"minSpans,omitempty"` // MaxSpans specifies the maximum number of spans generated in a transactionJob MaxSpans uint64 `json:"maxSpans,omitempty" yaml:"maxSpans,omitempty"` // NumReleases specifies the maximum number of unique releases generated in a test NumReleases uint64 `json:"numReleases,omitempty" yaml:"numReleases,omitempty"` // NumUsers specifies the maximum number of unique users generated in a test NumUsers uint64 `json:"numUsers,omitempty" yaml:"numUsers,omitempty"` // MinBreadcrumbs specifies the minimum number of breadcrumbs that will be generated in a test MinBreadcrumbs uint64 `json:"minBreadcrumbs,omitempty" yaml:"minBreadcrumbs,omitempty"` // MaxBreadcrumbs specifies the maximum number of breadcrumbs that will be generated in a test MaxBreadcrumbs uint64 `json:"maxBreadcrumbs,omitempty" yaml:"maxBreadcrumbs,omitempty"` // BreadcrumbCategories the categories used for breadcrumbs (if not specified defaults will be used *) BreadcrumbCategories []string `json:"breadcrumbCategories,omitempty" yaml:"breadcrumbCategories,omitempty"` // BreadcrumbLevels specifies levels used for breadcrumbs (if not specified defaults will be used *) BreadcrumbLevels []string `json:"breadcrumbLevels,omitempty" yaml:"breadcrumbLevels,omitempty"` // BreadcrumbsTypes specifies the types used for breadcrumbs (if not specified defaults will be used *) BreadcrumbsTypes []string `json:"breadcrumbsTypes,omitempty" yaml:"breadcrumbsTypes,omitempty"` // BreadcrumbMessages specifies messages set in breadcrumbs (if not specified defaults will be used *) BreadcrumbMessages []string `json:"breadcrumbMessages,omitempty" yaml:"breadcrumbMessages,omitempty"` // Measurements specifies measurements to be used (if not specified NO measurements will be generated) Measurements []string `json:"measurements,omitempty" yaml:"measurements,omitempty"` // Operations specifies the operations to be used (if not specified NO operations will be generated) Operations []string `json:"operations,omitempty" yaml:"operations,omitempty"` }
TransactionJobCommon represents the common parameters for transactions jobs (both V1 and V2) NOTE: No YAML support (yaml unlike json does not flatten embedded structures)
type TransactionJobV2 ¶
type TransactionJobV2 struct { // The project profiles ProjectDistribution []ProjectProfile `json:"projectDistribution" yaml:"projectDistribution"` // TransactionJobCommon embedded fields, see TransactionJobCommon documentation TransactionJobCommon `yaml:"transactionJobCommon,inline"` }
TransactionJobV2 is how a transactionJobV2 load test is parameterized example: ```json
{ "projectDistribution": [ { "numProjects": 100, "relativeFreqWeight" : 1.0, "timestampHistogram": [ { "weight": 5, "maxDelay": "1s"}, { "weight": 3, "maxDelay": "10s"}, { "weight": 2, "maxDelay": "20s"}, ] }, { "numProjects": 200, "relativeFreqWeight" : 4.0, "timestampHistogram": [ { "weight": 20, "maxDelay": "1s"}, { "weight": 1, "maxDelay": "5s"} ] } ], "transactionDurationMax":"10m" , "transactionDurationMin": "1m" , "minSpans": 5, "maxSpans": 40, "numReleases": 1000 , "numUsers": 2000, "minBreadcrumbs": 5, "maxBreadcrumbs": 25, "breadcrumbCategories": ["auth", "web-request", "query"], "breadcrumbLevels": ["fatal", "error", "warning", "info", "debug"], "breadcrumbsTypes": ["default", "http", "error"] , "breadcrumbMessages": [ "Authenticating the user_name", "IOError: [Errno 2] No such file"], "measurements": ["fp","fcp","lcp","fid","cls","ttfb"], "operations": ["browser","http","db","resource.script"] }
```