NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules · #1706 by repository stars
Last release 2 days ago
21 Sep 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
397 releases · first in 2021
One column per quarter.
When running pint ci all checks will be skipped if any commit contains [skip ci] or [no ci] string in the commit message.
pint ci all checks will be skipped if any commit contains
[skip ci] or [no ci] string in the commit message.By default pint will now parse all files in strict mode, where all rule files must have the exact syntax Prometheus expects:
groups:
- name: example
rules:
- record: ...
expr: ...
Previous releases were only looking for individual rules so groups object
wasn't required. Now pint will fail to read any file that doesn't follow
Prometheus syntax exactly.
To enable old behaviour add parser { relaxed = ["(.+)", ...]} option in
the config file. See Configuration for details.
To enable old (relaxed) behaviour for all files add:
parser {
relaxed = ["(.*)"]
}
promql/vector_matching checks to detect more issues.pint ci.Fixed false positive reports from alerts/template check when absent() function is receiving labels from a binary expression.
alerts/template check when absent() function
is receiving labels from a binary expression.When running pint watch exported metric can include owner label for each rule. This is useful to route alerts based on pint_problem metrics to the rig
pint watch exported metric can include owner label for each rule.
This is useful to route alerts based on pint_problem metrics to the right team.
To set a rule owner add a # pint file/owner $owner comment in a file, to set
an owner for all rules in that file. You can also set an owner per rule, by adding
# pint rule/owner $owner comment around given rule.
To enforce ownership comments in all files pass --require-owner flag to pint lint.Nothing published for this version
promql/series check no longer runs duplicated checks on source metrics when a query depends on a recording rule added in the same PR.
promql/series check no longer runs duplicated checks on source metrics when
a query depends on a recording rule added in the same PR.promql/series check was reporting that a metric stopped being exported when check queries would require a few retries.
promql/series check was reporting that a metric stopped being exported when check
queries would require a few retries.promql/series check was reporting both Warning and Bug problems for the same metric when it was using newly added recording rule.
promql/series check was reporting both Warning and Bug problems for the
same metric when it was using newly added recording rule.Nothing published for this version
Fixed false positive reports from promql/fragile when foo OR bar is used inside aggregation.
promql/fragile when foo OR bar is used inside
aggregation.Use more efficient queries for promql/series check.
promql/series check.Improved query cache hit rate and added pint_prometheus_cache_hits_total metric to track the number of cache hits.
pint_prometheus_cache_hits_total metric
to track the number of cache hits.When a range query returns query processing would load too many samples into memory error and we retry it with smaller time range cache this informati
query processing would load too many samples into memory
error and we retry it with smaller time range cache this information and start with
that smaller time range for future calls to speed up running pint watch.Always print the number of detected problems when running pint lint.
pint lint.promql/series check was refactored and will now detect a range of
problems. See promql/series for details.promql/regexp severity is now Bug instead of a Warning.promql/rate check will no longer produce warnings, it will only
report issues that cause queries to never return anything.Allow matching alerting rules by for field - #148. Example:
Allow matching alerting rules by for field - #148. Example:
rule {
match {
for = ">= 10m"
}
}
Regexp matchers used in check rules can now reference rule fields. See Configuration for details.
filename label to pint_problem metric - #170.pint ci handling when a file was added to git and then removed in the
next commit.Nothing published for this version
Don't use fail-over Prometheus servers in case of errors caused by the query itself, like many-to-many matching not allowed.
many-to-many matching not allowed.yaml/parse error will be raised if a rule file contains duplicated keys, example:
yaml/parse error will be raised if a rule file contains duplicated keys, example:
- record: foo
expr: sum(my_metric)
expr: sum(my_metric) without(instance)
prometheus config block now allows to specify fail-over URIs using failover field.
If fail-over URIs are set and main URI fails to respond pint will attempt to use them
in the order specified until one of them works.prometheus config block now allows to define how upstream errors are handled using
required field. If required is set to true any check that depends on remote
Prometheus server will be reported as bug if it's unable to talk to it.
If required is set to false pint will only emit warning level results.
Default value for required is false. Set it to true if you want to hard fail
in case of remote Prometheus issues. Note that setting it to true might block
PRs when running pint ci until pint is able to talk to Prometheus again.pint/parse to yaml/parse and added missing documentation for it.Added pint_last_run_time_seconds and pint_rules_parsed_total metrics when running pint watch.
pint_last_run_time_seconds and pint_rules_parsed_total metrics when running pint watch.promql/comparison only applies to alerts, so it was renamed to
alerts/comparison.alerts/count check will now retry range queries with shorter time window
on found duplicate series for the match group ... errors from Prometheus.pint_prometheus_queries_total and pint_prometheus_query_errors_total metrics were not incremented correctly.
pint_prometheus_queries_total and pint_prometheus_query_errors_total metrics
were not incremented correctly.Added promql/regexp check that will warn about unnecessary regexp matchers.
promql/regexp check that will warn about unnecessary regexp matchers.pint_prometheus_queries_total and pint_prometheus_query_errors_total
metric when running pint watch.Fixed a number of bug with promql/vector_matching check.
promql/vector_matching check.query/series check was renamed to promql/series.
query/series check was renamed to promql/series.promql/vector_matching check.Removed lines label from pint_problem metric exported when running pint watch.
lines label from pint_problem metric exported when running pint watch.match and ignore blocks can now be specified per each rule.Export pint_version metric when running pint watch.
pint_version metric when running pint watch.--min-severity flag to pint watch command.Added --max-problems flag to pint watch command.
--max-problems flag to pint watch command.stripPort template function.Added new promql/fragile check.
promql/fragile check.--workers flag to control the number of worker threads for running checks.
--workers flag to control the number of worker threads for running checks.More aggressive range reduction for query processing would load too many samples into memory errors when sending range queries to Prometheus servers.
query processing would load too many samples into memory
errors when sending range queries to Prometheus servers.Added command filter to match / ignore blocks. This allows to include skip some checks when (for example) running pint watch but include them in pint
command filter to match / ignore blocks. This allows to include
skip some checks when (for example) running pint watch but include them
in pint lint run.Cache each Prometheus server responses to minimise the number of API calls.
pint watch will start a daemon that will continuously check all matching rules
and expose metrics describing all discovered problems.alerts/annotation and rule/label now include required flag value in
# pint disable ... comments.
Rename # pint disable alerts/annotation($name) to
# pint disable alerts/annotation($name:$required) and
# pint disable rule/label($name) to # pint disable rule/label($name:$required).--offline and --disabled flags are now global, use pint --offline lint instead
of pint lint --offline.promql/rate, query/series and promql/vector_matching checks were not enabled
for all defined prometheus {} blocks unless there was at least one rule {} block.annotation based match blocks didn't work correctly.Nothing published for this version
File renames were not handled correctly when running git ci on branches with multiple commits.
git ci on branches with
multiple commits.Allow disabling query/series check for individual series using # pint disable query/series(my_metric_name) comments.
query/series check for individual series using
# pint disable query/series(my_metric_name) comments.### Fixed - Fixed docker builds.
aggregate check didn't report stripping required labels on queries using aggregation with no grouping labels (sum(foo)).
aggregate check didn't report stripping required labels on queries
using aggregation with no grouping labels (sum(foo)).aggregate check didn't test for name and label matches on alert rules.template check will now include alert query line numbers when reporting issues.
template check will now include alert query line numbers when reporting issues.Labels returned by absent() are only from equal match types (absent(foo="bar"), not absent(foo=~"bar.+") but alerts/template didn't test for match typ
absent() are only from equal match types (absent(foo="bar"),
not absent(foo=~"bar.+") but alerts/template didn't test for match type when
checking for labels sourced from absent() queries.aggregate check was refactored and uses to run a single test for both by and without conditions. As a result this check might now find issues previous
aggregate check was refactored and uses to run a single test for both
by and without conditions. As a result this check might now find issues
previously undetected.
Check suppression comments will need to be migrated:
# pint disable promql/by becomes # pint disable promql/aggregate# pint disable promql/without becomes # pint disable promql/aggregate# pint ignore promql/by becomes # pint ignore promql/aggregate# pint ignore promql/without becomes # pint ignore promql/aggregate--no-color flag for disabling output colouring.
--no-color flag for disabling output colouring.rule {...} blocks where configured.Specifying multiple # pint disable ... comments on a single rule would only apply last comment. This now works correctly and all comments will be appl
# pint disable ... comments on a single rule would only apply
last comment. This now works correctly and all comments will be applied.Nothing published for this version
Added alerts/for check that will look for invalid for values in alerting rules. This check is enabled by default.
alerts/for check that will look for invalid for values in alerting rules.
This check is enabled by default.comparison check is now enabled by default and require no configuration.
Remove comparison{ ... } blocks from pint config file when upgrading.template check is now enabled by default and require no configuration.
Remove template{ ... } blocks from pint config file when upgrading.rate check is now enabled by default for all configured Prometheus servers.
Remove rate{ ... } blocks from pint config file when upgrading.series check is now enabled by default for all configured Prometheus servers.
Remove series{ ... } blocks from pint config file when upgrading.vector_matching check is now enabled by default for all configured Prometheus servers.
Remove vector_matching{ ... } blocks from pint config file when upgrading.Support parseDuration function in alert templates added in Prometheus 2.32.0
parseDuration function in alert templates added in Prometheus 2.32.0Fixed series check handling of queries with {__name__="foo"} selectors.
series check handling of queries with {__name__="foo"} selectors.Fixed template check handling of absent calls on aggregated metrics, like absent(sum(nonexistent{job="myjob"})).
template check handling of absent calls on aggregated metrics, like
absent(sum(nonexistent{job="myjob"})).template check will now warn if any template is referencing a label that is not passed to absent(). Example:
template check will now warn if any template is referencing a label that is not passed to
absent().
Example:
{% raw %}
- alert: Foo
expr: absent(foo{env="prod"})
annotations:
summary: "foo metric is missing for job {{ $labels.job }}"
{% endraw %}
Would generate a warning since absent() can only return labels that are explicitly
passed to it and the above call only passes env label.
This can be fixed by updating the query to absent(foo{env="prod", job="bar"}).
comparison check will now warn when alert query uses bool modifier after condition, which can cause alert to always fire. Example:
comparison check will now warn when alert query uses
bool
modifier after condition, which can cause alert to always fire.
Example:
- alert: Foo
expr: rate(error_count[5m]) > bool 5
Having bool as part of > 5 condition means that the query will return value 1 when condition
is met, and 0 when it's not. Rather than returning value of rate(error_count[5m]) only when
that value is > 5. Since all results of an alerting rule expr are considered alerts such alert
rule could always fire, regardless of the value returned by rate(error_count[5m]).
comparison check will now ignore absent(foo) alert queries without any condition.--offline flag for pint ci command.
--offline flag for pint ci command.template check panic when alert query had a syntax error.rule block can now specify ignore conditions that have the same syntax as match but will disable rule for matching alerting and recording rules #48.
rule block can now specify ignore conditions that have the same syntax as match
but will disable rule for matching alerting and recording rules #48.match and ignore blocks can now filter alerting and recording rules by name.
record will be used as name for recording rules and alert for alerting rules.--offline flag for pint lint command. When passed only checks that don't send any live queries to Prometheus server will be run.
--offline flag for pint lint command. When passed only checks that don't send
any live queries to Prometheus server will be run.
template check will now warn if template if referencing a label that is being
stripped by aggregation.
Example:
{% raw %}
- alert: Foo
expr: count(up) without(instance) == 0
annotations:
summary: "foo is down on {{ $labels.instance }}"
{% endraw %}
Would generate a warning since instance label is being stripped by without(instance).
Nothing published for this version
Fixed file descriptor leak due to missing file Close() #69.
Close() #69.Retry queries that error with query processing would load too many samples into memory using a smaller time range.
query processing would load too many samples into memory
using a smaller time range.Nothing published for this version
Nothing published for this version
vector_matching check for finding queries with incorrect on() or ignoring() keywords.
vector_matching check for finding queries with incorrect on() or ignoring()
keywords.comparison check would trigger false positive for rules using unless keyword.### Fixed - # pint skip/line place between # pint skip/begin and # pint skip/end lines would reset ignore rules causing lines that should be ignored t
# pint skip/line place between # pint skip/begin and # pint skip/end lines would
reset ignore rules causing lines that should be ignored to be parsed.value check was replaced by template, which covers the same functionality and more. See docs for details.
value check was replaced by template, which covers the same functionality and more.
See docs for details.Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →