Prometheus: Add BE support for Adhoc Filters (#85969)
--------- Co-authored-by: ismail simsek <ismailsimsek09@gmail.com>
This commit is contained in:
co-authored by
ismail simsek
parent
8520892923
commit
a12669951b
@@ -0,0 +1,105 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestApplyQueryFilters(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
query string
|
||||
adhocFilters []ScopeFilter
|
||||
scopeFilters []ScopeFilter
|
||||
expected string
|
||||
expectErr bool
|
||||
}{
|
||||
{
|
||||
name: "No filters with no existing filter",
|
||||
query: `http_requests_total`,
|
||||
expected: `http_requests_total`,
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "No filters with existing filter",
|
||||
query: `http_requests_total{job="prometheus"}`,
|
||||
expected: `http_requests_total{job="prometheus"}`,
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "Adhoc filter with existing filter",
|
||||
query: `http_requests_total{job="prometheus"}`,
|
||||
adhocFilters: []ScopeFilter{
|
||||
{Key: "method", Value: "get", Operator: FilterOperatorEquals},
|
||||
},
|
||||
expected: `http_requests_total{job="prometheus",method="get"}`,
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "Adhoc filter with no existing filter",
|
||||
query: `http_requests_total`,
|
||||
adhocFilters: []ScopeFilter{
|
||||
{Key: "method", Value: "get", Operator: FilterOperatorEquals},
|
||||
{Key: "job", Value: "prometheus", Operator: FilterOperatorEquals},
|
||||
},
|
||||
expected: `http_requests_total{job="prometheus",method="get"}`,
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "Scope filter",
|
||||
query: `http_requests_total{job="prometheus"}`,
|
||||
scopeFilters: []ScopeFilter{
|
||||
{Key: "status", Value: "200", Operator: FilterOperatorEquals},
|
||||
},
|
||||
expected: `http_requests_total{job="prometheus",status="200"}`,
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "Adhoc and Scope filter no existing filter",
|
||||
query: `http_requests_total`,
|
||||
scopeFilters: []ScopeFilter{
|
||||
{Key: "status", Value: "200", Operator: FilterOperatorEquals},
|
||||
},
|
||||
adhocFilters: []ScopeFilter{
|
||||
{Key: "job", Value: "prometheus", Operator: FilterOperatorEquals},
|
||||
},
|
||||
expected: `http_requests_total{job="prometheus",status="200"}`,
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "Adhoc and Scope filter conflict - adhoc wins",
|
||||
query: `http_requests_total{job="prometheus"}`,
|
||||
scopeFilters: []ScopeFilter{
|
||||
{Key: "status", Value: "404", Operator: FilterOperatorEquals},
|
||||
},
|
||||
adhocFilters: []ScopeFilter{
|
||||
{Key: "status", Value: "200", Operator: FilterOperatorEquals},
|
||||
},
|
||||
expected: `http_requests_total{job="prometheus",status="200"}`,
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "Adhoc filters with more complex expression",
|
||||
query: `capacity_bytes{job="prometheus"} + available_bytes{job="grafana"} / 1024`,
|
||||
adhocFilters: []ScopeFilter{
|
||||
{Key: "job", Value: "alloy", Operator: FilterOperatorEquals},
|
||||
},
|
||||
expected: `capacity_bytes{job="alloy"} + available_bytes{job="alloy"} / 1024`,
|
||||
expectErr: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
expr, err := ApplyQueryFilters(tt.query, tt.scopeFilters, tt.adhocFilters)
|
||||
|
||||
if tt.expectErr {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expr, tt.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user