mirror of
https://github.com/grafana/grafana.git
synced 2025-08-03 04:22:13 +08:00
Prometheus: Support utf8 metrics and labels in scopes (#99015)
* support utf8 in scopes * separate the utf8 tests * remove redundant test after enabling utf8 validation in prometheus
This commit is contained in:
@ -145,6 +145,37 @@ func TestApplyQueryFiltersAndGroupBy_Filters(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyQueryFiltersAndGroupBy_Filters_utf8(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
query string
|
||||
adhocFilters []ScopeFilter
|
||||
scopeFilters []ScopeFilter
|
||||
expected string
|
||||
expectErr bool
|
||||
}{
|
||||
{
|
||||
name: "No filters with existing utf8 filter",
|
||||
query: `http_requests_total{"job.name"="prometheus"}`,
|
||||
expected: `http_requests_total{"job.name"="prometheus"}`,
|
||||
expectErr: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
expr, err := ApplyFiltersAndGroupBy(tt.query, tt.scopeFilters, tt.adhocFilters, nil)
|
||||
|
||||
if tt.expectErr {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, tt.expected, expr, tt.name)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyQueryFiltersAndGroupBy_GroupBy(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
@ -197,7 +228,45 @@ func TestApplyQueryFiltersAndGroupBy_GroupBy(t *testing.T) {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expr, tt.expected)
|
||||
require.Equal(t, tt.expected, expr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyQueryFiltersAndGroupBy_GroupBy_utf8(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
query string
|
||||
groupBy []string
|
||||
expected string
|
||||
expectErr bool
|
||||
}{
|
||||
{
|
||||
name: "GroupBy with no aggregate expression and utf8 metric",
|
||||
groupBy: []string{"job"},
|
||||
query: `{"http.requests_total"}`,
|
||||
expected: `{__name__="http.requests_total"}`,
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "GroupBy with aggregate expression with existing utf8 group by",
|
||||
groupBy: []string{"status"},
|
||||
query: `sum by ("utf8.job") (http_requests_total)`,
|
||||
expected: `sum by ("utf8.job", status) (http_requests_total)`,
|
||||
expectErr: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
expr, err := ApplyFiltersAndGroupBy(tt.query, nil, nil, tt.groupBy)
|
||||
|
||||
if tt.expectErr {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, tt.expected, expr)
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -237,7 +306,72 @@ func TestApplyQueryFiltersAndGroupBy(t *testing.T) {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, expr, tt.expected)
|
||||
require.Equal(t, tt.expected, expr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyQueryFiltersAndGroupBy_utf8(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
query string
|
||||
adhocFilters []ScopeFilter
|
||||
scopeFilters []ScopeFilter
|
||||
groupby []string
|
||||
expected string
|
||||
expectErr bool
|
||||
}{
|
||||
{
|
||||
name: "Adhoc filters with more complex expression and utf8 metric name",
|
||||
query: `sum({"capacity_bytes", job="prometheus"} + {"available_bytes", job="grafana"}) / 1024`,
|
||||
adhocFilters: []ScopeFilter{
|
||||
{Key: "job", Value: "alloy", Operator: FilterOperatorEquals},
|
||||
},
|
||||
scopeFilters: []ScopeFilter{
|
||||
{Key: "vol", Value: "/", Operator: FilterOperatorEquals},
|
||||
},
|
||||
groupby: []string{"job"},
|
||||
expected: `sum by (job) ({__name__="capacity_bytes",job="alloy",vol="/"} + {__name__="available_bytes",job="alloy",vol="/"}) / 1024`,
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "Adhoc filters with more complex expression with utf8 label",
|
||||
query: `sum(capacity_bytes{job="prometheus", "utf8.label"="value"} + available_bytes{job="grafana"}) / 1024`,
|
||||
adhocFilters: []ScopeFilter{
|
||||
{Key: "job", Value: "alloy", Operator: FilterOperatorEquals},
|
||||
},
|
||||
scopeFilters: []ScopeFilter{
|
||||
{Key: "vol", Value: "/", Operator: FilterOperatorEquals},
|
||||
},
|
||||
groupby: []string{"job"},
|
||||
expected: `sum by (job) (capacity_bytes{"utf8.label"="value",job="alloy",vol="/"} + available_bytes{job="alloy",vol="/"}) / 1024`,
|
||||
expectErr: false,
|
||||
},
|
||||
{
|
||||
name: "Adhoc filters with more complex expression with utf8 metric and label",
|
||||
query: `sum({"capacity_bytes", job="prometheus", "utf8.label"="value"} + available_bytes{job="grafana"}) / 1024`,
|
||||
adhocFilters: []ScopeFilter{
|
||||
{Key: "job", Value: "alloy", Operator: FilterOperatorEquals},
|
||||
},
|
||||
scopeFilters: []ScopeFilter{
|
||||
{Key: "vol", Value: "/", Operator: FilterOperatorEquals},
|
||||
},
|
||||
groupby: []string{"job"},
|
||||
expected: `sum by (job) ({"utf8.label"="value",__name__="capacity_bytes",job="alloy",vol="/"} + available_bytes{job="alloy",vol="/"}) / 1024`,
|
||||
expectErr: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
expr, err := ApplyFiltersAndGroupBy(tt.query, tt.scopeFilters, tt.adhocFilters, tt.groupby)
|
||||
|
||||
if tt.expectErr {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, tt.expected, expr)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
Reference in New Issue
Block a user