prometheus/promql/parser/prettier_rules.md
Harkishen Singh 44fcf876ca
Adds support for prettifying PromQL expression (#10544)
* Implement Pretty() function for AST nodes.

Signed-off-by: Harkishen-Singh <harkishensingh@hotmail.com>

This commit adds .Pretty() for all nodes of PromQL AST.
Each .Pretty() prettifies the node it belongs to, and under
no circustance, the parent or child node is touch/prettified.

Read more in the "Approach" part in `prettier.go`

* Refactor functions between printer.go & prettier.go

Signed-off-by: Harkishen-Singh <harkishensingh@hotmail.com>

This commit removes redundancy between printer.go and prettier.go
by taking out the common code into separate private functions.

* Add more unit tests for Prettier.

Signed-off-by: Harkishen-Singh <harkishensingh@hotmail.com>

* Add support for spliting function calls with 1 arg & unary expressions.

Signed-off-by: Harkishen-Singh <harkishensingh@hotmail.com>

This commit does 2 things:
1. It adds support to split function calls that have 1 arg and exceeds the max_characters_per_line
to multiple lines.
2. Splits Unary expressions that exceed the max_characters_per_line. This is done by formatting the child node
and then removing the prefix indent, which is already applied before the unary operator.
2022-07-07 18:13:36 +05:30

1,021 B

Prettifying PromQL expressions

This files contains rules for prettifying PromQL expressions.

Note: The current version of prettier does not preserve comments.

Keywords

max_characters_per_line: Maximum number of characters that will be allowed on a single line in a prettified PromQL expression.

Rules

  1. A node exceeding the max_characters_per_line will qualify for split unless
    1. It is a MatrixSelector
    2. It is a VectorSelector. Label sets in a VectorSelector will be in the same line as metric_name, separated by commas and a space Note: Label groupings like by, without, on, ignoring will remain on the same line as their parent node
  2. Nodes that are nested within another node will be prettified only if they exceed the max_characters_per_line
  3. Expressions like sum(expression) without (label_matchers) will be modified to sum without(label_matchers) (expression)
  4. Functional call args will be split to different lines if they exceed the max_characters_per_line