-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
77 lines (65 loc) · 1.75 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package main
import (
"encoding/json"
"fmt"
"os"
"reflect"
"github.com/VictoriaMetrics/metricsql"
)
func AddLabelsToExpr(existingLabels [][]metricsql.LabelFilter,
byLabels []string, labels map[string]string,
) [][]metricsql.LabelFilter {
for k, val := range labels {
for _, by := range byLabels {
if by == k {
existingLabels[0] = append(existingLabels[0], metricsql.LabelFilter{Label: k, Value: val})
}
}
}
return existingLabels
}
func AddLabelsToPromql(expr interface{}, labels map[string]string) {
switch v := expr.(type) {
case *metricsql.AggrFuncExpr:
byLabels := v.Modifier.Args
for _, a := range v.Args {
switch arg := a.(type) {
case *metricsql.FuncExpr:
re := arg.Args[0].(*metricsql.RollupExpr)
me := re.Expr.(*metricsql.MetricExpr)
me.LabelFilterss = AddLabelsToExpr(me.LabelFilterss, byLabels, labels)
re.Expr = me
v.Args[0] = re
case *metricsql.MetricExpr:
arg.LabelFilterss = AddLabelsToExpr(arg.LabelFilterss, byLabels, labels)
v.Args[0] = arg
case metricsql.Expr:
AddLabelsToPromql(a, labels)
}
}
expr = v
case *metricsql.BinaryOpExpr:
AddLabelsToPromql(v.Left, labels)
AddLabelsToPromql(v.Right, labels)
case *metricsql.NumberExpr:
fmt.Printf("Number: %s \n", v.AppendString(nil))
default:
fmt.Printf("unknown expr.: %+v", reflect.TypeOf(expr))
}
}
func main() {
expr, err := metricsql.Parse(os.Args[1])
if err != nil {
fmt.Printf("error in parsing : %+v\n", err)
os.Exit(1)
}
labels := map[string]string{}
if len(os.Args) > 2 {
if err = json.Unmarshal([]byte(os.Args[2]), &labels); err != nil {
fmt.Printf("error in unmarshaling: %+v\n", err)
os.Exit(1)
}
}
AddLabelsToPromql(expr, labels)
fmt.Printf("parsed expr: %s\n", expr.AppendString(nil))
}