6 个版本 (3 个破坏性更新)

使用旧的 Rust 2015

0.5.0 2024年1月29日
0.4.2 2021年9月25日
0.4.0 2020年5月23日
0.3.0 2018年2月22日
0.2.0 2018年1月15日

#1064数据库接口

每月37 次下载

Apache-2.0

64KB
2.5K SLoC

Rust 的 PromQL 解析器

此 crate 允许将 PromQL 查询解析为一些 AST。

有关查询语法的说明,请参阅 官方文档,或直接查看代码的 crate 文档


lib.rs:

此 crate 允许将 PromQL 查询解析为一些 AST。

有关查询语法的说明,请参阅 官方文档

示例


use promql::*;

let opts = ParserOptions::new()
.allow_dots(false)
.build();

// query can also be `&str`
let query: &[u8] = br#"
sum(1 - something_used{env="production"} / something_total) by (instance)
and ignoring (instance)
sum(rate(some_queries{instance=~"localhost\\d+"} [5m])) > 100
"#;
let ast = parse(query, &opts).unwrap(); // or show user that their query is invalid

// now we can look for all sorts of things

// AST can represent an operator
if let Node::Operator { op: Op::And(op_mod), args } = ast {
// operators can have modifiers
assert_eq!(op_mod, Some(OpMod {
action: OpModAction::Ignore,
labels: vec!["instance".to_string()],
group: None,
}));

// aggregation functions like sum are represented as functions with optional modifiers (`by (label1, …)`/`without (…)`)
if let Node::Function { ref name, ref aggregation, ref args } = args[0] {
assert_eq!(*name, "sum".to_string());
assert_eq!(*aggregation, Some(AggregationMod {
action: AggregationAction::By,
labels: vec!["instance".to_string()],
}));

//
}
} else {
panic!("top operator is not an 'and'");
}

类型

由于 PromQL,就像 Go 一样,允许在字符串字面量中包含原始字节序列(例如,{omg=''} 等价于 {omg='\u221e'}{omg='\xe2\x88\x9e'}),因此该解析器对大多数字符串字面量生成 Vec<u8>

依赖关系

约2.5MB
约57K SLoC