mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-25 14:28:20 +01:00
dc28196237
1. split package rule under /app/vmalert, expose needed objects 2. add vmalert-tool with unittest subcmd https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2945
132 lines
3.2 KiB
Go
132 lines
3.2 KiB
Go
package datasource
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// FakeQuerier is a mock querier that return predefined results and error message
|
|
type FakeQuerier struct {
|
|
sync.Mutex
|
|
metrics []Metric
|
|
err error
|
|
}
|
|
|
|
// SetErr sets query error message
|
|
func (fq *FakeQuerier) SetErr(err error) {
|
|
fq.Lock()
|
|
fq.err = err
|
|
fq.Unlock()
|
|
}
|
|
|
|
// Reset reset querier's error message and results
|
|
func (fq *FakeQuerier) Reset() {
|
|
fq.Lock()
|
|
fq.err = nil
|
|
fq.metrics = fq.metrics[:0]
|
|
fq.Unlock()
|
|
}
|
|
|
|
// Add appends metrics to querier result metrics
|
|
func (fq *FakeQuerier) Add(metrics ...Metric) {
|
|
fq.Lock()
|
|
fq.metrics = append(fq.metrics, metrics...)
|
|
fq.Unlock()
|
|
}
|
|
|
|
// BuildWithParams return FakeQuerier itself
|
|
func (fq *FakeQuerier) BuildWithParams(_ QuerierParams) Querier {
|
|
return fq
|
|
}
|
|
|
|
// QueryRange performs query
|
|
func (fq *FakeQuerier) QueryRange(ctx context.Context, q string, _, _ time.Time) (Result, error) {
|
|
req, _, err := fq.Query(ctx, q, time.Now())
|
|
return req, err
|
|
}
|
|
|
|
// Query returns metrics restored in querier
|
|
func (fq *FakeQuerier) Query(_ context.Context, _ string, _ time.Time) (Result, *http.Request, error) {
|
|
fq.Lock()
|
|
defer fq.Unlock()
|
|
if fq.err != nil {
|
|
return Result{}, nil, fq.err
|
|
}
|
|
cp := make([]Metric, len(fq.metrics))
|
|
copy(cp, fq.metrics)
|
|
req, _ := http.NewRequest(http.MethodPost, "foo.com", nil)
|
|
return Result{Data: cp}, req, nil
|
|
}
|
|
|
|
// FakeQuerierWithRegistry can store different results for different query expr
|
|
type FakeQuerierWithRegistry struct {
|
|
sync.Mutex
|
|
registry map[string][]Metric
|
|
}
|
|
|
|
// Set stores query result for given key
|
|
func (fqr *FakeQuerierWithRegistry) Set(key string, metrics ...Metric) {
|
|
fqr.Lock()
|
|
if fqr.registry == nil {
|
|
fqr.registry = make(map[string][]Metric)
|
|
}
|
|
fqr.registry[key] = metrics
|
|
fqr.Unlock()
|
|
}
|
|
|
|
// Reset clean querier's results registry
|
|
func (fqr *FakeQuerierWithRegistry) Reset() {
|
|
fqr.Lock()
|
|
fqr.registry = nil
|
|
fqr.Unlock()
|
|
}
|
|
|
|
// BuildWithParams returns itself
|
|
func (fqr *FakeQuerierWithRegistry) BuildWithParams(_ QuerierParams) Querier {
|
|
return fqr
|
|
}
|
|
|
|
// QueryRange performs query
|
|
func (fqr *FakeQuerierWithRegistry) QueryRange(ctx context.Context, q string, _, _ time.Time) (Result, error) {
|
|
req, _, err := fqr.Query(ctx, q, time.Now())
|
|
return req, err
|
|
}
|
|
|
|
// Query returns metrics restored in querier registry
|
|
func (fqr *FakeQuerierWithRegistry) Query(_ context.Context, expr string, _ time.Time) (Result, *http.Request, error) {
|
|
fqr.Lock()
|
|
defer fqr.Unlock()
|
|
|
|
req, _ := http.NewRequest(http.MethodPost, "foo.com", nil)
|
|
metrics, ok := fqr.registry[expr]
|
|
if !ok {
|
|
return Result{}, req, nil
|
|
}
|
|
cp := make([]Metric, len(metrics))
|
|
copy(cp, metrics)
|
|
return Result{Data: cp}, req, nil
|
|
}
|
|
|
|
// FakeQuerierWithDelay mock querier with given delay duration
|
|
type FakeQuerierWithDelay struct {
|
|
FakeQuerier
|
|
Delay time.Duration
|
|
}
|
|
|
|
// Query returns query result after delay duration
|
|
func (fqd *FakeQuerierWithDelay) Query(ctx context.Context, expr string, ts time.Time) (Result, *http.Request, error) {
|
|
timer := time.NewTimer(fqd.Delay)
|
|
select {
|
|
case <-ctx.Done():
|
|
case <-timer.C:
|
|
}
|
|
return fqd.FakeQuerier.Query(ctx, expr, ts)
|
|
}
|
|
|
|
// BuildWithParams returns itself
|
|
func (fqd *FakeQuerierWithDelay) BuildWithParams(_ QuerierParams) Querier {
|
|
return fqd
|
|
}
|