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 次下载
64KB
2.5K SLoC
Rust 的 PromQL 解析器
此 crate 允许将 PromQL 查询解析为一些 AST。
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