mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
azuremonitor: limit macro regex to known macros (#24528)
This commit is contained in:
parent
7992f8bfbc
commit
64046e9a27
@ -9,7 +9,7 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/tsdb"
|
"github.com/grafana/grafana/pkg/tsdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
const rsIdentifier = `([_a-zA-Z0-9]+)`
|
const rsIdentifier = `__(timeFilter|timeFrom|timeTo|interval|contains|escapeMulti)`
|
||||||
const sExpr = `\$` + rsIdentifier + `(?:\(([^\)]*)\))?`
|
const sExpr = `\$` + rsIdentifier + `(?:\(([^\)]*)\))?`
|
||||||
const escapeMultiExpr = `\$__escapeMulti\(('.*')\)`
|
const escapeMultiExpr = `\$__escapeMulti\(('.*')\)`
|
||||||
|
|
||||||
@ -18,6 +18,15 @@ type kqlMacroEngine struct {
|
|||||||
query *tsdb.Query
|
query *tsdb.Query
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Macros:
|
||||||
|
// - $__timeFilter() -> timestamp ≥ datetime(2018-06-05T18:09:58.907Z) and timestamp ≤ datetime(2018-06-05T20:09:58.907Z)
|
||||||
|
// - $__timeFilter(datetimeColumn) -> datetimeColumn ≥ datetime(2018-06-05T18:09:58.907Z) and datetimeColumn ≤ datetime(2018-06-05T20:09:58.907Z)
|
||||||
|
// - $__from -> datetime(2018-06-05T18:09:58.907Z)
|
||||||
|
// - $__to -> datetime(2018-06-05T20:09:58.907Z)
|
||||||
|
// - $__interval -> 5m
|
||||||
|
// - $__contains(col, 'val1','val2') -> col in ('val1', 'val2')
|
||||||
|
// - $__escapeMulti('\\vm\eth0\Total','\\vm\eth2\Total') -> @'\\vm\eth0\Total',@'\\vm\eth2\Total'
|
||||||
|
|
||||||
//KqlInterpolate interpolates macros for Kusto Query Language (KQL) queries
|
//KqlInterpolate interpolates macros for Kusto Query Language (KQL) queries
|
||||||
func KqlInterpolate(query *tsdb.Query, timeRange *tsdb.TimeRange, kql string, defaultTimeField ...string) (string, error) {
|
func KqlInterpolate(query *tsdb.Query, timeRange *tsdb.TimeRange, kql string, defaultTimeField ...string) (string, error) {
|
||||||
engine := kqlMacroEngine{}
|
engine := kqlMacroEngine{}
|
||||||
@ -76,17 +85,17 @@ func (m *kqlMacroEngine) Interpolate(query *tsdb.Query, timeRange *tsdb.TimeRang
|
|||||||
|
|
||||||
func (m *kqlMacroEngine) evaluateMacro(name string, defaultTimeField string, args []string) (string, error) {
|
func (m *kqlMacroEngine) evaluateMacro(name string, defaultTimeField string, args []string) (string, error) {
|
||||||
switch name {
|
switch name {
|
||||||
case "__timeFilter":
|
case "timeFilter":
|
||||||
timeColumn := defaultTimeField
|
timeColumn := defaultTimeField
|
||||||
if len(args) > 0 && args[0] != "" {
|
if len(args) > 0 && args[0] != "" {
|
||||||
timeColumn = args[0]
|
timeColumn = args[0]
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("['%s'] >= datetime('%s') and ['%s'] <= datetime('%s')", timeColumn, m.timeRange.GetFromAsTimeUTC().Format(time.RFC3339), timeColumn, m.timeRange.GetToAsTimeUTC().Format(time.RFC3339)), nil
|
return fmt.Sprintf("['%s'] >= datetime('%s') and ['%s'] <= datetime('%s')", timeColumn, m.timeRange.GetFromAsTimeUTC().Format(time.RFC3339), timeColumn, m.timeRange.GetToAsTimeUTC().Format(time.RFC3339)), nil
|
||||||
case "__timeFrom", "__from":
|
case "timeFrom", "__from":
|
||||||
return fmt.Sprintf("datetime('%s')", m.timeRange.GetFromAsTimeUTC().Format(time.RFC3339)), nil
|
return fmt.Sprintf("datetime('%s')", m.timeRange.GetFromAsTimeUTC().Format(time.RFC3339)), nil
|
||||||
case "__timeTo", "__to":
|
case "timeTo", "__to":
|
||||||
return fmt.Sprintf("datetime('%s')", m.timeRange.GetToAsTimeUTC().Format(time.RFC3339)), nil
|
return fmt.Sprintf("datetime('%s')", m.timeRange.GetToAsTimeUTC().Format(time.RFC3339)), nil
|
||||||
case "__interval":
|
case "interval":
|
||||||
var interval time.Duration
|
var interval time.Duration
|
||||||
if m.query.IntervalMs == 0 {
|
if m.query.IntervalMs == 0 {
|
||||||
to := m.timeRange.MustGetTo().UnixNano()
|
to := m.timeRange.MustGetTo().UnixNano()
|
||||||
@ -103,7 +112,7 @@ func (m *kqlMacroEngine) evaluateMacro(name string, defaultTimeField string, arg
|
|||||||
interval = time.Millisecond * time.Duration(m.query.IntervalMs)
|
interval = time.Millisecond * time.Duration(m.query.IntervalMs)
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%dms", int(interval/time.Millisecond)), nil
|
return fmt.Sprintf("%dms", int(interval/time.Millisecond)), nil
|
||||||
case "__contains":
|
case "contains":
|
||||||
if len(args) < 2 || args[0] == "" || args[1] == "" {
|
if len(args) < 2 || args[0] == "" || args[1] == "" {
|
||||||
return "", fmt.Errorf("macro %v needs colName and variableSet", name)
|
return "", fmt.Errorf("macro %v needs colName and variableSet", name)
|
||||||
}
|
}
|
||||||
@ -114,6 +123,8 @@ func (m *kqlMacroEngine) evaluateMacro(name string, defaultTimeField string, arg
|
|||||||
|
|
||||||
expression := strings.Join(args[1:], ",")
|
expression := strings.Join(args[1:], ",")
|
||||||
return fmt.Sprintf("['%s'] in (%s)", args[0], expression), nil
|
return fmt.Sprintf("['%s'] in (%s)", args[0], expression), nil
|
||||||
|
case "escapeMulti":
|
||||||
|
return "", fmt.Errorf("escapeMulti macro not formatted correctly")
|
||||||
default:
|
default:
|
||||||
return "", fmt.Errorf("Unknown macro %v", name)
|
return "", fmt.Errorf("Unknown macro %v", name)
|
||||||
}
|
}
|
||||||
|
@ -29,11 +29,18 @@ func TestAzureLogAnalyticsMacros(t *testing.T) {
|
|||||||
Err require.ErrorAssertionFunc
|
Err require.ErrorAssertionFunc
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "invalid macro should throw error",
|
name: "invalid macro should be ignored",
|
||||||
query: &tsdb.Query{},
|
query: &tsdb.Query{},
|
||||||
kql: "$__invalid()",
|
kql: "$__invalid()",
|
||||||
expected: "",
|
expected: "$__invalid()",
|
||||||
Err: require.Error,
|
Err: require.NoError,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Kusto variables should be ignored",
|
||||||
|
query: &tsdb.Query{},
|
||||||
|
kql: ") on $left.b == $right.y",
|
||||||
|
expected: ") on $left.b == $right.y",
|
||||||
|
Err: require.NoError,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "$__contains macro with a multi template variable that has multiple selected values as a parameter should build in clause",
|
name: "$__contains macro with a multi template variable that has multiple selected values as a parameter should build in clause",
|
||||||
|
Loading…
Reference in New Issue
Block a user