Crate promql_parser

source ·
Expand description

PromQL Lexer and Parser

The goal of this project is to build a PromQL lexer and parser capable of parsing PromQL that conforms with Prometheus Query.

Example

The parser entry point is parser::parse(), which takes a string slice of Promql and returns the parse result, either an AST (parser::Expr) or an error message. Other query parameters like time range and step are included in parser::EvalStmt.

use promql_parser::parser;

let promql = r#"http_requests_total{environment=~"staging|testing|development",method!="GET"} @ 1609746000 offset 5m"#;

match parser::parse(promql) {
    Ok(ast) => println!("AST: {:?}", ast),
    Err(info) => println!("Err: {:?}", info),
}

or you can directly run examples under this repo:

cargo run --example parser

This outputs:

AST: VectorSelector(VectorSelector { name: Some("http_requests_total"), matchers: Matchers { matchers: {Matcher { op: NotEqual, name: "method", value: "GET" }, Matcher { op: Re(staging|testing|development), name: "environment", value: "staging|testing|development" }, Matcher { op: Equal, name: "__name__", value: "http_requests_total" }} }, offset: Some(Pos(300s)), at: Some(At(SystemTime { tv_sec: 1609746000, tv_nsec: 0 })) })

PromQL compliance

This crate declares compatible with prometheus 0372e25, which is prometheus release v2.40 at Nov 29, 2022. Any revision on PromQL after this commit is not guaranteed.

Modules

  • Label matchers and Well-known label names used by Prometheus components.
  • The parser implementation.
  • Internal utilities for parser.