mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-26 20:30:10 +01:00
4edb97f4da
app/vmalert: detect alerting rules which don't match any series at all vmalert starts to understand /query responses which contain object: ``` "stats":{"seriesFetched": "42"} ``` If object is present, vmalert parses it and populates a new field `SeriesFetched`. This field is then used to populate the new metric `vmalert_alerting_rules_last_evaluation_series_fetched` and to display warnings in the vmalert's UI. If response doesn't contain the new object (Prometheus or VictoriaMetrics earlier than v1.90), then `SeriesFetched=nil`. In this case, UI will contain no additional warnings. And `vmalert_alerting_rules_last_evaluation_series_fetched` will be set to `-1`. Negative value of the metric will help to compile correct alerting rule in follow-up. Thanks for the initial implementation to @Haleygo See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4056 See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4039 Signed-off-by: hagen1778 <roman@victoriametrics.com>
111 lines
2.9 KiB
Go
111 lines
2.9 KiB
Go
package datasource
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
)
|
|
|
|
// Querier interface wraps Query and QueryRange methods
|
|
type Querier interface {
|
|
// Query executes instant request with the given query at the given ts.
|
|
// It returns list of Metric in response, the http.Request used for sending query
|
|
// and error if any. Returned http.Request can't be reused and its body is already read.
|
|
// Query should stop once ctx is cancelled.
|
|
Query(ctx context.Context, query string, ts time.Time) (Result, *http.Request, error)
|
|
// QueryRange executes range request with the given query on the given time range.
|
|
// It returns list of Metric in response and error if any.
|
|
// QueryRange should stop once ctx is cancelled.
|
|
QueryRange(ctx context.Context, query string, from, to time.Time) (Result, error)
|
|
}
|
|
|
|
// Result represents expected response from the datasource
|
|
type Result struct {
|
|
// Data contains list of received Metric
|
|
Data []Metric
|
|
// SeriesFetched contains amount of time series processed by datasource
|
|
// during query evaluation.
|
|
// If nil, then this feature is not supported by the datasource.
|
|
// SeriesFetched is supported by VictoriaMetrics since v1.90.
|
|
SeriesFetched *int
|
|
}
|
|
|
|
// QuerierBuilder builds Querier with given params.
|
|
type QuerierBuilder interface {
|
|
// BuildWithParams creates a new Querier object with the given params
|
|
BuildWithParams(params QuerierParams) Querier
|
|
}
|
|
|
|
// QuerierParams params for Querier.
|
|
type QuerierParams struct {
|
|
DataSourceType string
|
|
EvaluationInterval time.Duration
|
|
QueryParams url.Values
|
|
Headers map[string]string
|
|
Debug bool
|
|
}
|
|
|
|
// Metric is the basic entity which should be return by datasource
|
|
type Metric struct {
|
|
Labels []Label
|
|
Timestamps []int64
|
|
Values []float64
|
|
}
|
|
|
|
// SetLabel adds or updates existing one label
|
|
// by the given key and label
|
|
func (m *Metric) SetLabel(key, value string) {
|
|
for i, l := range m.Labels {
|
|
if l.Name == key {
|
|
m.Labels[i].Value = value
|
|
return
|
|
}
|
|
}
|
|
m.AddLabel(key, value)
|
|
}
|
|
|
|
// SetLabels sets the given map as Metric labels
|
|
func (m *Metric) SetLabels(ls map[string]string) {
|
|
var i int
|
|
m.Labels = make([]Label, len(ls))
|
|
for k, v := range ls {
|
|
m.Labels[i] = Label{
|
|
Name: k,
|
|
Value: v,
|
|
}
|
|
i++
|
|
}
|
|
}
|
|
|
|
// AddLabel appends the given label to the label set
|
|
func (m *Metric) AddLabel(key, value string) {
|
|
m.Labels = append(m.Labels, Label{Name: key, Value: value})
|
|
}
|
|
|
|
// DelLabel deletes the given label from the label set
|
|
func (m *Metric) DelLabel(key string) {
|
|
for i, l := range m.Labels {
|
|
if l.Name == key {
|
|
m.Labels = append(m.Labels[:i], m.Labels[i+1:]...)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Label returns the given label value.
|
|
// If label is missing empty string will be returned
|
|
func (m *Metric) Label(key string) string {
|
|
for _, l := range m.Labels {
|
|
if l.Name == key {
|
|
return l.Value
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// Label represents metric's label
|
|
type Label struct {
|
|
Name string
|
|
Value string
|
|
}
|