PromQL validation
Nines uses the Prometheus parser and type checker pinned in go.mod.
- Input validation is shared by the CLI, API, operator and tools that call the service.
- It runs offline without contacting Prometheus or Mimir.
nines validate --offline -f examples/api-availability.slo.yaml --agent
nines rules generate --offline -f examples/api-availability.slo.yaml --tenant commerce
- Both
goodQueryandtotalQuerymust be valid PromQL expressions returning instant vectors.- For example,
sum(increase(http_requests_total[1m]))andvector(100)are valid types. - An incomplete
sum(, unknown function, scalar100, string literal or range vectorhttp_requests_total[1m]is rejected with the affected field in the diagnostic. - The vector requirement matches the collector and rule compiler's interval-count contract.
- A valid type alone does not make an expression an appropriate event count.
- For example,
- Provider-window selectors retain their restriction to metric names with exact label matchers and also pass through PromQL parsing.
- This catches invalid escapes that a selector-shape check alone would miss.
- Manual-ingestion SLOs may still omit both queries.
- Every generated recording and burn-rate alert expression is parsed and checked before the rule group is returned for export or deployment, including provider-window and operator-owned groups.
- Interval queries are printed from their parsed syntax trees before nesting, so trailing comments cannot swallow generated syntax.
- Canonical formatting may change a rule plan's digest; fetch and review a fresh plan before applying it.
- Offline validation does not establish that metrics exist, selectors match traffic, each input returns one aggregated series, values represent interval counts, good counts do not exceed total counts, or a query is affordable.
- It also cannot prove compatibility with every backend version or extensions such as MetricsQL and LogQL.
- Collection and integration diagnostics provide separate runtime evidence.
- There is no additional
promtoolinstallation requirement for these checks.
- Previously accepted malformed or incorrectly typed queries now fail validation.
- Correct them before applying a definition or starting a server that loads them from storage.
- A successful validation receipt describes schema, PromQL types and generated-expression checks, rather than claiming telemetry or SLO correctness.