mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2025-03-11 15:34:56 +00:00
Merge branch 'public-single-node' into pmm-6401-read-prometheus-data-files
This commit is contained in:
commit
d5dde7f6b1
5 changed files with 102 additions and 15 deletions
16
app/victoria-metrics/testdata/graphite/name-plus-negative-filter.json
vendored
Normal file
16
app/victoria-metrics/testdata/graphite/name-plus-negative-filter.json
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"name": "name-plus-negative-filter",
|
||||||
|
"issue": "",
|
||||||
|
"data": [
|
||||||
|
"name-plus-negative-filter;foo=123 1 {TIME_S-1m}",
|
||||||
|
"name-plus-negative-filter;bar=123 2 {TIME_S-1m}",
|
||||||
|
"name-plus-negative-filter;foo=qwe 3 {TIME_S-1m}"
|
||||||
|
],
|
||||||
|
"query": ["/api/v1/query?query={__name__='name-plus-negative-filter',foo!='123'}&time={TIME_S-1m}"],
|
||||||
|
"result_query": {
|
||||||
|
"status":"success",
|
||||||
|
"data":{"resultType":"vector","result":[
|
||||||
|
{"metric":{"__name__":"name-plus-negative-filter","foo":"qwe"},"value":["{TIME_S-1m}","3"]}
|
||||||
|
]}
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,6 +25,7 @@
|
||||||
* [High-performance Graphite storage solution on top of VictoriaMetrics](https://golangexample.com/a-high-performance-graphite-storage-solution/)
|
* [High-performance Graphite storage solution on top of VictoriaMetrics](https://golangexample.com/a-high-performance-graphite-storage-solution/)
|
||||||
* [Cloud Native Model Driven Telemetry Stack on OpenShift](https://cer6erus.medium.com/cloud-native-model-driven-telemetry-stack-on-openshift-80712621f5bc)
|
* [Cloud Native Model Driven Telemetry Stack on OpenShift](https://cer6erus.medium.com/cloud-native-model-driven-telemetry-stack-on-openshift-80712621f5bc)
|
||||||
* [Observability, Availability & DORA’s Research Program](https://medium.com/alteos-tech-blog/observability-availability-and-doras-research-program-85deb6680e78)
|
* [Observability, Availability & DORA’s Research Program](https://medium.com/alteos-tech-blog/observability-availability-and-doras-research-program-85deb6680e78)
|
||||||
|
* [Tame Kubernetes Costs with Percona Monitoring and Management and Prometheus Operator](https://www.percona.com/blog/2021/02/12/tame-kubernetes-costs-with-percona-monitoring-and-management-and-prometheus-operator/)
|
||||||
|
|
||||||
|
|
||||||
## Our articles
|
## Our articles
|
||||||
|
|
|
@ -3,6 +3,11 @@
|
||||||
# tip
|
# tip
|
||||||
|
|
||||||
|
|
||||||
|
# [v1.54.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.54.1)
|
||||||
|
|
||||||
|
* BUGFIX: properly handle queries containing a filter on metric name plus any number of negative filters and zero non-negative filters. For example, `node_cpu_seconds_total{mode!="idle"}`. The bug was introduced in [v1.54.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.54.0).
|
||||||
|
|
||||||
|
|
||||||
# [v1.54.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.54.0)
|
# [v1.54.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.54.0)
|
||||||
|
|
||||||
* FEATURE: optimize searching for matching metrics for `metric{<label_filters>}` queries if `<label_filters>` contains at least a single filter. For example, the query `up{job="foobar"}` should find the matching time series much faster than previously.
|
* FEATURE: optimize searching for matching metrics for `metric{<label_filters>}` queries if `<label_filters>` contains at least a single filter. For example, the query `up{job="foobar"}` should find the matching time series much faster than previously.
|
||||||
|
|
|
@ -28,14 +28,15 @@ func convertToCompositeTagFilterss(tfss []*TagFilters) []*TagFilters {
|
||||||
func convertToCompositeTagFilters(tfs *TagFilters) *TagFilters {
|
func convertToCompositeTagFilters(tfs *TagFilters) *TagFilters {
|
||||||
// Search for metric name filter, which must be used for creating composite filters.
|
// Search for metric name filter, which must be used for creating composite filters.
|
||||||
var name []byte
|
var name []byte
|
||||||
|
hasPositiveFilter := false
|
||||||
for _, tf := range tfs.tfs {
|
for _, tf := range tfs.tfs {
|
||||||
if len(tf.key) == 0 && !tf.isNegative && !tf.isRegexp {
|
if len(tf.key) == 0 && !tf.isNegative && !tf.isRegexp {
|
||||||
name = tf.value
|
name = tf.value
|
||||||
break
|
} else if !tf.isNegative {
|
||||||
|
hasPositiveFilter = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(name) == 0 {
|
if len(name) == 0 {
|
||||||
// There is no metric name filter, so composite filters cannot be created.
|
|
||||||
atomic.AddUint64(&compositeFilterMissingConversions, 1)
|
atomic.AddUint64(&compositeFilterMissingConversions, 1)
|
||||||
return tfs
|
return tfs
|
||||||
}
|
}
|
||||||
|
@ -44,7 +45,7 @@ func convertToCompositeTagFilters(tfs *TagFilters) *TagFilters {
|
||||||
compositeFilters := 0
|
compositeFilters := 0
|
||||||
for _, tf := range tfs.tfs {
|
for _, tf := range tfs.tfs {
|
||||||
if len(tf.key) == 0 {
|
if len(tf.key) == 0 {
|
||||||
if tf.isNegative || tf.isRegexp || string(tf.value) != string(name) {
|
if !hasPositiveFilter || tf.isNegative || tf.isRegexp || string(tf.value) != string(name) {
|
||||||
tfsNew = append(tfsNew, tf)
|
tfsNew = append(tfsNew, tf)
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -148,6 +148,70 @@ func TestConvertToCompositeTagFilters(t *testing.T) {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// A name filter with a single negative filter
|
||||||
|
f([]TagFilter{
|
||||||
|
{
|
||||||
|
Key: nil,
|
||||||
|
Value: []byte("bar"),
|
||||||
|
IsNegative: false,
|
||||||
|
IsRegexp: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: []byte("foo"),
|
||||||
|
Value: []byte("abc"),
|
||||||
|
IsNegative: true,
|
||||||
|
IsRegexp: false,
|
||||||
|
},
|
||||||
|
}, []TagFilter{
|
||||||
|
{
|
||||||
|
Key: nil,
|
||||||
|
Value: []byte("bar"),
|
||||||
|
IsNegative: false,
|
||||||
|
IsRegexp: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: []byte("\xfe\x03barfoo"),
|
||||||
|
Value: []byte("abc"),
|
||||||
|
IsNegative: true,
|
||||||
|
IsRegexp: false,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// A name filter with a negative and a positive filter
|
||||||
|
f([]TagFilter{
|
||||||
|
{
|
||||||
|
Key: nil,
|
||||||
|
Value: []byte("bar"),
|
||||||
|
IsNegative: false,
|
||||||
|
IsRegexp: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: []byte("foo"),
|
||||||
|
Value: []byte("abc"),
|
||||||
|
IsNegative: true,
|
||||||
|
IsRegexp: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: []byte("a"),
|
||||||
|
Value: []byte("b.+"),
|
||||||
|
IsNegative: false,
|
||||||
|
IsRegexp: true,
|
||||||
|
},
|
||||||
|
}, []TagFilter{
|
||||||
|
{
|
||||||
|
Key: []byte("\xfe\x03barfoo"),
|
||||||
|
Value: []byte("abc"),
|
||||||
|
IsNegative: true,
|
||||||
|
IsRegexp: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Key: []byte("\xfe\x03bara"),
|
||||||
|
Value: []byte("b.+"),
|
||||||
|
IsNegative: false,
|
||||||
|
IsRegexp: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
// Two name filters with non-name filter.
|
// Two name filters with non-name filter.
|
||||||
f([]TagFilter{
|
f([]TagFilter{
|
||||||
{
|
{
|
||||||
|
@ -171,19 +235,19 @@ func TestConvertToCompositeTagFilters(t *testing.T) {
|
||||||
}, []TagFilter{
|
}, []TagFilter{
|
||||||
{
|
{
|
||||||
Key: nil,
|
Key: nil,
|
||||||
Value: []byte("baz"),
|
Value: []byte("bar"),
|
||||||
IsNegative: false,
|
IsNegative: false,
|
||||||
IsRegexp: false,
|
IsRegexp: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Key: []byte("\xfe\x03barfoo"),
|
Key: []byte("\xfe\x03bazfoo"),
|
||||||
Value: []byte("abc"),
|
Value: []byte("abc"),
|
||||||
IsNegative: false,
|
IsNegative: false,
|
||||||
IsRegexp: false,
|
IsRegexp: false,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
// A name filter with negative regexp non-name filter, which can be converted to non-regexp.
|
// A name filter with regexp non-name filter, which can be converted to non-regexp.
|
||||||
f([]TagFilter{
|
f([]TagFilter{
|
||||||
{
|
{
|
||||||
Key: nil,
|
Key: nil,
|
||||||
|
@ -194,19 +258,19 @@ func TestConvertToCompositeTagFilters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Key: []byte("foo"),
|
Key: []byte("foo"),
|
||||||
Value: []byte("abc"),
|
Value: []byte("abc"),
|
||||||
IsNegative: true,
|
IsNegative: false,
|
||||||
IsRegexp: true,
|
IsRegexp: true,
|
||||||
},
|
},
|
||||||
}, []TagFilter{
|
}, []TagFilter{
|
||||||
{
|
{
|
||||||
Key: []byte("\xfe\x03barfoo"),
|
Key: []byte("\xfe\x03barfoo"),
|
||||||
Value: []byte("abc"),
|
Value: []byte("abc"),
|
||||||
IsNegative: true,
|
IsNegative: false,
|
||||||
IsRegexp: false,
|
IsRegexp: false,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
// A name filter with negative regexp non-name filter.
|
// A name filter with regexp non-name filter.
|
||||||
f([]TagFilter{
|
f([]TagFilter{
|
||||||
{
|
{
|
||||||
Key: nil,
|
Key: nil,
|
||||||
|
@ -217,14 +281,14 @@ func TestConvertToCompositeTagFilters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Key: []byte("foo"),
|
Key: []byte("foo"),
|
||||||
Value: []byte("abc.+"),
|
Value: []byte("abc.+"),
|
||||||
IsNegative: true,
|
IsNegative: false,
|
||||||
IsRegexp: true,
|
IsRegexp: true,
|
||||||
},
|
},
|
||||||
}, []TagFilter{
|
}, []TagFilter{
|
||||||
{
|
{
|
||||||
Key: []byte("\xfe\x03barfoo"),
|
Key: []byte("\xfe\x03barfoo"),
|
||||||
Value: []byte("abc.+"),
|
Value: []byte("abc.+"),
|
||||||
IsNegative: true,
|
IsNegative: false,
|
||||||
IsRegexp: true,
|
IsRegexp: true,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -269,7 +333,7 @@ func TestConvertToCompositeTagFilters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Key: []byte("foo"),
|
Key: []byte("foo"),
|
||||||
Value: []byte("abc"),
|
Value: []byte("abc"),
|
||||||
IsNegative: true,
|
IsNegative: false,
|
||||||
IsRegexp: true,
|
IsRegexp: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -282,7 +346,7 @@ func TestConvertToCompositeTagFilters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Key: []byte("\xfe\x03barfoo"),
|
Key: []byte("\xfe\x03barfoo"),
|
||||||
Value: []byte("abc"),
|
Value: []byte("abc"),
|
||||||
IsNegative: true,
|
IsNegative: false,
|
||||||
IsRegexp: false,
|
IsRegexp: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -304,14 +368,14 @@ func TestConvertToCompositeTagFilters(t *testing.T) {
|
||||||
{
|
{
|
||||||
Key: []byte("foo"),
|
Key: []byte("foo"),
|
||||||
Value: []byte("abc"),
|
Value: []byte("abc"),
|
||||||
IsNegative: true,
|
IsNegative: false,
|
||||||
IsRegexp: false,
|
IsRegexp: false,
|
||||||
},
|
},
|
||||||
}, []TagFilter{
|
}, []TagFilter{
|
||||||
{
|
{
|
||||||
Key: []byte("\xfe\x03barfoo"),
|
Key: []byte("\xfe\x03barfoo"),
|
||||||
Value: []byte("abc"),
|
Value: []byte("abc"),
|
||||||
IsNegative: true,
|
IsNegative: false,
|
||||||
IsRegexp: false,
|
IsRegexp: false,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue