Skip to content

Commit

Permalink
feat: run unit tests for metrics rules
Browse files Browse the repository at this point in the history
Added metrics unit tests file and a Makefile
target to run the tests.

Signed-off-by: Andrej Krejcir <[email protected]>
  • Loading branch information
akrejcir committed Jan 22, 2024
1 parent 86a184d commit b5a7de8
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 1 deletion.
13 changes: 12 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ endif
all: manager

.PHONY: unittest
unittest: generate lint fmt vet manifests
unittest: generate lint fmt vet manifests metrics-rules-test
go test -v -coverprofile cover.out $(SRC_PATHS_TESTS)
cd api && go test -v ./...

Expand Down Expand Up @@ -325,3 +325,14 @@ lint:
.PHONY: lint-metrics
lint-metrics:
./hack/prom_metric_linter.sh --operator-name="kubevirt" --sub-operator-name="ssp"


METRIC_RULES_WRITER ?= $(LOCALBIN)/metrics-rules-writer

.PHONY: build-metric-rules-writer
build-metric-rules-writer: $(LOCALBIN)
go build -o $(METRIC_RULES_WRITER) tools/test-rules-writer/test_rules_writer.go

.PHONY: metrics-rules-test
metrics-rules-test: build-metric-rules-writer
./hack/metrics-rules-test.sh $(METRIC_RULES_WRITER) "./pkg/monitoring/rules/rules-tests.yaml"
52 changes: 52 additions & 0 deletions hack/metrics-rules-test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#!/usr/bin/env bash

source $(dirname "$0")/config.sh

readonly PROM_IMAGE="quay.io/prometheus/prometheus:v2.44.0"

function cleanup() {
local cleanup_files=("${@:?}")

for file in "${cleanup_files[@]}"; do
rm -f "$file"
done
}

function lint() {
local target_file="${1:?}"

${KUBEVIRT_CRI} run --rm --entrypoint=/bin/promtool \
-v "$target_file":/tmp/rules.verify:ro,Z "$PROM_IMAGE" \
check rules /tmp/rules.verify
}

function unit_test() {
local target_file="${1:?}"
local tests_file="${2:?}"

${KUBEVIRT_CRI} run --rm --entrypoint=/bin/promtool \
-v "$tests_file":/tmp/rules.test:ro,Z \
-v "$target_file":/tmp/rules.verify:ro,Z \
"$PROM_IMAGE" \
test rules /tmp/rules.test
}

function main() {
local prom_spec_dumper="${1:?}"
local tests_file="${2:?}"
local target_file

target_file="$(mktemp --tmpdir -u tmp.prom_rules.XXXXX)"
trap "cleanup $target_file" RETURN EXIT INT

"$prom_spec_dumper" > "$target_file"

echo "INFO: Rules file content:"
cat "$target_file"
echo

lint "$target_file"
unit_test "$target_file" "$tests_file"
}

main "$@"
26 changes: 26 additions & 0 deletions pkg/monitoring/rules/rules-tests.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Unit tests for the prometheus rules
rule_files:
- /tmp/rules.verify

tests:
- interval: "1m"
input_series:
- series: 'up{pod="ssp-operator-12345"}'
values: '0x5 1'

alert_rule_test:
- eval_time: "5m"
alertname: "SSPDown"
exp_alerts:
- exp_annotations:
summary: "All SSP operator pods are down."
runbook_url: "test-runbook:SSPDown"
exp_labels:
severity: "critical"
operator_health_impact: "critical"
kubernetes_operator_part_of: "kubevirt"
kubernetes_operator_component: "ssp-operator"

- eval_time: "6m"
alertname: "SSPDown"
exp_alerts: []
33 changes: 33 additions & 0 deletions tools/test-rules-writer/test_rules_writer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package main

import (
"encoding/json"
"fmt"
"os"

promv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"

"kubevirt.io/ssp-operator/pkg/monitoring/rules"
)

func main() {
// TODO -- use real template
const runbookTemplate = "test-runbook:%s"

allRules := append(rules.RecordRules(), rules.AlertRules(runbookTemplate)...)

spec := promv1.PrometheusRuleSpec{
Groups: []promv1.RuleGroup{{
Name: "test.rules",
Rules: allRules,
}},
}

encoder := json.NewEncoder(os.Stdout)
encoder.SetIndent("", " ")
err := encoder.Encode(spec)
if err != nil {
fmt.Fprintf(os.Stderr, "Error encoding prometheus spec: %v", err)
return
}
}

0 comments on commit b5a7de8

Please sign in to comment.