diff --git a/cmd/promtool/main.go b/cmd/promtool/main.go
index 2b5ee9aee1..da4b8dc797 100644
--- a/cmd/promtool/main.go
+++ b/cmd/promtool/main.go
@@ -92,6 +92,8 @@ func main() {
checkCmd := app.Command("check", "Check the resources for validity.")
+ experimental := app.Flag("experimental", "Enable experimental commands.").Bool()
+
sdCheckCmd := checkCmd.Command("service-discovery", "Perform service discovery for the given job name and report the results, including relabeling.")
sdConfigFile := sdCheckCmd.Arg("config-file", "The prometheus config file.").Required().ExistingFile()
sdJobName := sdCheckCmd.Arg("job", "The job to run service discovery for.").Required().String()
@@ -246,7 +248,7 @@ func main() {
"A list of one or more files containing recording rules to be backfilled. All recording rules listed in the files will be backfilled. Alerting rules are not evaluated.",
).Required().ExistingFiles()
- promQLCmd := app.Command("promql", "PromQL formatting and editing.")
+ promQLCmd := app.Command("promql", "PromQL formatting and editing. Requires the --experimental flag.")
promQLFormatCmd := promQLCmd.Command("format", "Format PromQL query to pretty printed form.")
promQLFormatQuery := promQLFormatCmd.Arg("query", "PromQL query.").Required().String()
@@ -386,16 +388,26 @@ func main() {
os.Exit(checkErr(documentcli.GenerateMarkdown(app.Model(), os.Stdout)))
case promQLFormatCmd.FullCommand():
+ checkExperimental(*experimental)
os.Exit(checkErr(formatPromQL(*promQLFormatQuery)))
case promQLLabelsSetCmd.FullCommand():
+ checkExperimental(*experimental)
os.Exit(checkErr(labelsSetPromQL(*promQLLabelsSetQuery, *promQLLabelsSetType, *promQLLabelsSetName, *promQLLabelsSetValue)))
case promQLLabelsDeleteCmd.FullCommand():
+ checkExperimental(*experimental)
os.Exit(checkErr(labelsDeletePromQL(*promQLLabelsDeleteQuery, *promQLLabelsDeleteName)))
}
}
+func checkExperimental(f bool) {
+ if !f {
+ fmt.Fprintln(os.Stderr, "This command is experimental and requires the --experimental flag to be set.")
+ os.Exit(1)
+ }
+}
+
// nolint:revive
var lintError = fmt.Errorf("lint error")
diff --git a/docs/command-line/promtool.md b/docs/command-line/promtool.md
index 673e8c0481..587286e105 100644
--- a/docs/command-line/promtool.md
+++ b/docs/command-line/promtool.md
@@ -14,6 +14,7 @@ Tooling for the Prometheus monitoring system.
| --- | --- |
| -h
, --help
| Show context-sensitive help (also try --help-long and --help-man). |
| --version
| Show application version. |
+| --experimental
| Enable experimental commands. |
| --enable-feature
| Comma separated feature names to enable (only PromQL related and no-default-scrape-port). See https://prometheus.io/docs/prometheus/latest/feature_flags/ for the options and more details. |
@@ -30,6 +31,7 @@ Tooling for the Prometheus monitoring system.
| push | Push to a Prometheus server. |
| test | Unit testing. |
| tsdb | Run tsdb commands. |
+| promql | PromQL formatting and editing. Requires the --experimental flag. |
@@ -609,3 +611,72 @@ Create blocks of data for new recording rules.
| rule-files | A list of one or more files containing recording rules to be backfilled. All recording rules listed in the files will be backfilled. Alerting rules are not evaluated. | Yes |
+
+
+### `promtool promql`
+
+PromQL formatting and editing. Requires the --experimental flag.
+
+
+
+##### `promtool promql format`
+
+Format PromQL query to pretty printed form.
+
+
+
+###### Arguments
+
+| Argument | Description | Required |
+| --- | --- | --- |
+| query | PromQL query. | Yes |
+
+
+
+
+##### `promtool promql label-matchers`
+
+Edit label matchers contained within an existing PromQL query.
+
+
+
+##### `promtool promql label-matchers set`
+
+Set a label matcher in the query.
+
+
+
+###### Flags
+
+| Flag | Description | Default |
+| --- | --- | --- |
+| -t
, --type
| Type of the label matcher to set. | `=` |
+
+
+
+
+###### Arguments
+
+| Argument | Description | Required |
+| --- | --- | --- |
+| query | PromQL query. | Yes |
+| name | Name of the label matcher to set. | Yes |
+| value | Value of the label matcher to set. | Yes |
+
+
+
+
+##### `promtool promql label-matchers delete`
+
+Delete a label from the query.
+
+
+
+###### Arguments
+
+| Argument | Description | Required |
+| --- | --- | --- |
+| query | PromQL query. | Yes |
+| name | Name of the label to delete. | Yes |
+
+