【博客707】模版化拆解并获取victoriametrics的metricsql各个元素

本文介绍了如何在Golang中使用Victoriametrics的metricsql进行解析,包括处理聚合函数如sum和rate,以及rollup表达式和labelfilter。还展示了如何扩展metricsql表达式以转换为PromQL格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

golang解析victoriametrics的metricsql

场景:

  • 需要拆解metricsql中的部分元素,比如:rollup function,label filter等
  • 需要对语法合法性进行判断,同时拒绝某些查询函数
  • 我们需要拆解metricsql并进行改造

使用victoriametrics的metricsql项目来解析metricsql

example:

package main

import (
	"fmt"
	"log"

	"github.com/VictoriaMetrics/metricsql"
)

func ExampleParse() {
	expr, err := metricsql.Parse(`sum(rate(foo{bar="baz"}[5m])) by (x,y)`)
	if err != nil {
		log.Fatalf("parse error: %s", err)
	}
	fmt.Printf("parsed expr: %s\n", expr.AppendString(nil))

	ae := expr.(*metricsql.AggrFuncExpr)
	fmt.Printf("aggr func: name=%s, arg=%s, modifier=%s\n", ae.Name, ae.Args[0].AppendString(nil), ae.Modifier.AppendString(nil))

	fe := ae.Args[0].(*metricsql.FuncExpr)
	fmt.Printf("func: name=%s, arg=%s\n", fe.Name, fe.Args[0].AppendString(nil))

	re := fe.Args[0].(*metricsql.RollupExpr)
	fmt.Printf("rollup: expr=%s, window=%s\n", re.Expr.AppendString(nil), re.Window.AppendString(nil))

	me := re.Expr.(*metricsql.MetricExpr)
	fmt.Printf("metric: labelFilter1=%s, labelFilter2=%s", me.LabelFilterss[0][0].AppendString(nil), me.LabelFilterss[0][1].AppendString(nil))

	// Output:
	// parsed expr: sum(rate(foo{bar="baz"}[5m])) by(x,y)
	// aggr func: name=sum, arg=rate(foo{bar="baz"}[5m]), modifier=by(x,y)
	// func: name=rate, arg=foo{bar="baz"}[5m]
	// rollup: expr=foo{bar="baz"}, window=5m
	// metric: labelFilter1=__name__="foo", labelFilter2=bar="baz"
}

func ExampleExpandWithExprs() {
	// mql can contain arbitrary MetricsQL extensions - see https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/MetricsQL
	mql := `WITH (
		commonFilters = {job="$job", instance="$instance"},
		f(a, b) = 100*(a/b),
	)
	f(disk_free_bytes{commonFilters}, disk_total_bytes{commonFilters})`

	// Convert mql to PromQL
	pql, err := metricsql.ExpandWithExprs(mql)
	if err != nil {
		log.Fatalf("cannot expand with expressions: %s", err)
	}

	fmt.Printf("%s\n", pql)

	// Output:
	// 100 * (disk_free_bytes{job="$job",instance="$instance"} / disk_total_bytes{job="$job",instance="$instance"})
}

func main() {
	ExampleParse()
	ExampleExpandWithExprs()
}

result:

go run main.go 
parsed expr: sum(rate(foo{bar="baz"}[5m])) by(x,y)
aggr func: name=sum, arg=rate(foo{bar="baz"}[5m]), modifier=by(x,y)
func: name=rate, arg=foo{bar="baz"}[5m]
rollup: expr=foo{bar="baz"}, window=5m
metric: labelFilter1=__name__="foo", labelFilter2=bar="baz"100 * (disk_free_bytes{job="$job",instance="$instance"} / disk_total_bytes{job="$job",instance="$instance"})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值