当前位置: 首页 > news >正文

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

golang解析victoriametrics的metricsql

场景:

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

使用victoriametrics的metricsql项目来解析metricsql

example:

package mainimport ("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/MetricsQLmql := `WITH (commonFilters = {job="$job", instance="$instance"},f(a, b) = 100*(a/b),)f(disk_free_bytes{commonFilters}, disk_total_bytes{commonFilters})`// Convert mql to PromQLpql, 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"})
http://www.lryc.cn/news/192644.html

相关文章:

  • nodejs + express 实现 http文件下载服务程序
  • Qt多文本编辑器项目实战
  • CVE-2017-7529 Nginx越界读取内存漏洞
  • 力扣每日一题136:只出现一次的数字
  • 导航栏参考代码
  • 区块链(11):java区块链项目之页面部分实现
  • RootSIFT---SIFT图像特征的扩展
  • ChatGPT角色扮演教程,Prompt词分享
  • zabbix监控——自定义监控内容
  • 中断机制-中断协商机制、中断方法
  • three.js入门 —— 实现第一个3D案例
  • 《动手学深度学习 Pytorch版》 8.4 循环神经网络
  • 什么是物联网阀控水表?
  • Kafka 开启SASL/SCRAM认证 及 ACL授权(一)认证
  • 关于智能控制领域中模糊控制算法的概述
  • 剖析伦敦银最新价格走势图
  • 通用人工智能技术(深度学习,大模型,Chatgpt,多模态,强化学习,具身智能)
  • makefile的特性-部分语法记录
  • 【Java 进阶篇】JavaScript 正则表达式(RegExp)详解
  • 51单片机之串口通信例程
  • Hadoop高可用集群(HA)一键启动脚本
  • C#开发的OpenRA游戏之金钱系统(1)
  • Puppeteer监听网络请求、爬取网页图片(二)
  • GoLang连接mysql数据库
  • 软件工程与计算总结(八)软件设计基础
  • someip 入门
  • C# 使用Parallel去执行并行下载
  • @Component 和 @Bean的区别
  • 百度测试开发工程师面试心得
  • 发现更多美景!XnViewMP for Mac/Windows 图片浏览软件