From 731545ad341ed4588a44ff38bc7df06fb21995d0 Mon Sep 17 00:00:00 2001 From: Jess G Date: Thu, 1 Apr 2021 13:38:00 -0700 Subject: [PATCH] Add documentation for recording rule backfiller (#8674) * add docs for rule backfiller Signed-off-by: jessicagreben --- cmd/promtool/main.go | 6 +++--- docs/storage.md | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/cmd/promtool/main.go b/cmd/promtool/main.go index 9a2532376..01a7181e2 100644 --- a/cmd/promtool/main.go +++ b/cmd/promtool/main.go @@ -148,11 +148,11 @@ func main() { // TODO(aSquare14): add flag to set default block duration importFilePath := openMetricsImportCmd.Arg("input file", "OpenMetrics file to read samples from.").Required().String() importDBPath := openMetricsImportCmd.Arg("output directory", "Output directory for generated blocks.").Default(defaultDBPath).String() - importRulesCmd := importCmd.Command("rules", "Create new blocks of data from Prometheus data for new rules from recording rule files.") + importRulesCmd := importCmd.Command("rules", "Create blocks of data for new recording rules.") importRulesURL := importRulesCmd.Flag("url", "The URL for the Prometheus API with the data where the rule will be backfilled from.").Default("http://localhost:9090").URL() - importRulesStart := importRulesCmd.Flag("start", "The time to start backfilling the new rule from. Must be a RFC3339 formated date or Unix timestamp. Required."). + importRulesStart := importRulesCmd.Flag("start", "The time to start backfilling the new rule from. Must be a RFC3339 formatted date or Unix timestamp. Required."). Required().String() - importRulesEnd := importRulesCmd.Flag("end", "If an end time is provided, all recording rules in the rule files provided will be backfilled to the end time. Default will backfill up to 3 hours ago. Must be a RFC3339 formated date or Unix timestamp.").String() + importRulesEnd := importRulesCmd.Flag("end", "If an end time is provided, all recording rules in the rule files provided will be backfilled to the end time. Default will backfill up to 3 hours ago. Must be a RFC3339 formatted date or Unix timestamp.").String() importRulesOutputDir := importRulesCmd.Flag("output-dir", "Output directory for generated blocks.").Default("data/").String() importRulesEvalInterval := importRulesCmd.Flag("eval-interval", "How frequently to evaluate rules when backfilling if a value is not set in the recording rule files."). Default("60s").Duration() diff --git a/docs/storage.md b/docs/storage.md index bc989b158..3d32f58be 100644 --- a/docs/storage.md +++ b/docs/storage.md @@ -150,3 +150,34 @@ promtool tsdb create-blocks-from openmetrics [] ``` After the creation of the blocks, move it to the data directory of Prometheus. If there is an overlap with the existing blocks in Prometheus, the flag `--storage.tsdb.allow-overlapping-blocks` needs to be set. Note that any backfilled data is subject to the retention configured for your Prometheus server (by time or size). + +## Backfilling for Recording Rules + +### Overview + +When a new recording rule is created, there is no historical data for it. Recording rule data only exists from the creation time on. `promtool` makes it possible to create historical recording rule data. + +### Usage + +To see all options, use: `$ promtool tsdb create-blocks-from rules --help`. + +Example usage: +``` +$ promtool tsdb create-blocks-from rules \ + --start 1617079873 \ + --end 1617097873 \ + --url http://mypromserver.com:9090 \ + rules.yaml rules2.yaml +``` + +The recording rule files provided should be a normal [Prometheus rules file](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/). + +The output of `promtool tsdb create-blocks-from rules` command is a directory that contains blocks with the historical rule data for all rules in the recording rule files. By default the output directory is `data/`. In order to make use of this new block data, the blocks must be moved to a running Prometheus instance data dir `storage.tsdb.path` that has the flag `--storage.tsdb.allow-overlapping-blocks` enabled. Once moved, the new blocks will merge with existing blocks when the next compaction runs. + +### Limitations + +- If you run the rule backfiller multiple times with the overlapping start/end times, blocks containing the same data will be created each time the rule backfiller is run. +- All rules in the recording rule files will be evaluated. +- If the `interval` is set in the recording rule file that will take priority over the `eval-interval` flag in the rule backfill command. +- Alerts are currently ignored if they are in the recording rule file. +- Rules in the same group cannot see the results of previous rules. Meaning that rules that refer to other rules being backfilled is not supported. A workaround is to backfill mulitple times and create the dependent data first (and move dependent data to the Prometheus server data dir so that it is accessible from the Prometheus API).