Skip to content

Commit a724adf

Browse files
authored
Add pint linter for mixin alerts (#1410)
* Update consul and minio * Add update-mixins target * Add validate dashboards check There is no validation against grafana schema when dashboards are generated. So let's try to import them into Grafana instance with grizzly to see if there are any issues. * Rename to test mixin * Fix minio * Update consul * Fix jaeger * Update minio * Fix for grizzly * Merge ci jobs * Add pint alerts ci * Update README * Fix velero-2 linting * change to "make lint" * Update ci (whitespace) * Update ci * Revert names to fix ci
1 parent 70eb60f commit a724adf

File tree

8 files changed

+44
-25
lines changed

8 files changed

+44
-25
lines changed

.github/workflows/test-mixins.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ jobs:
4646
run: echo '${{ steps.changed-mixins.outputs.all_changed_files }}'
4747

4848
lint-mixin:
49-
name: Test Mixin
49+
name: Test mixin
5050
runs-on: ubuntu-latest
5151
permissions:
5252
issues: write
@@ -82,13 +82,13 @@ jobs:
8282
- name: Install CI dependencies
8383
run: make install-ci-deps
8484

85-
- name: Install Mixin dependencies
85+
- name: Install mixin dependencies
8686
working-directory: ./${{ matrix.mixin }}
8787
run: make build
8888

89-
- name: Lint Mixin with Mixtool
89+
- name: Lint mixin
9090
working-directory: ./${{ matrix.mixin }}
91-
run: mixtool lint mixin.libsonnet
91+
run: make lint
9292

9393
- name: Check for unexpected changes in generated files
9494
working-directory: ./${{ matrix.mixin }}

Makefile

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ install-ci-deps: install-promtool
2424
go install github.com/monitoring-mixins/mixtool/cmd/mixtool@main
2525
go install github.com/jsonnet-bundler/jsonnet-bundler/cmd/[email protected]
2626
go install github.com/grafana/grizzly/cmd/grr@latest
27+
go install github.com/cloudflare/pint/cmd/[email protected]
2728

2829
.PHONY: install-promtool
2930
install-promtool:
@@ -35,7 +36,6 @@ install-promtool:
3536
@rm -rf prometheus-$(PROMTOOL_VERSION).$(UNAME_S)-$(ARCH) prometheus-$(PROMTOOL_VERSION).$(UNAME_S)-$(ARCH).tar.gz
3637
@echo "promtool $(PROMTOOL_VERSION) installed successfully"
3738

38-
3939
fmt:
4040
@find . -name '*.libsonnet' -print -o -name '*.jsonnet' -print | \
4141
xargs -n 1 -- $(JSONNET_FMT) -i
@@ -53,17 +53,25 @@ lint-fmt:
5353
lint-mixins:
5454
@RESULT=0; \
5555
for d in $$(find . -maxdepth 1 -regex '.*-mixin\|.*-lib' -a -type d -print); do \
56+
echo "=== Linting mixin: $$d ==="; \
5657
if [ -e "$$d/jsonnetfile.json" ]; then \
57-
echo "Installing dependencies for $$d"; \
58+
echo "Installing dependencies..."; \
5859
pushd "$$d" >/dev/null && jb install && popd >/dev/null; \
5960
fi; \
60-
done; \
61-
for m in $$(find . -maxdepth 2 -name 'mixin.libsonnet' -print); do \
62-
echo "Linting mixin $$m"; \
63-
mixtool lint -J $$(dirname "$$m")/vendor "$$m"; \
61+
if [ -e "$$d/mixin.libsonnet" ]; then \
62+
echo "Running mixtool lint..."; \
63+
mixtool lint -J "$$d/vendor" "$$d/mixin.libsonnet"; \
6464
if [ $$? -ne 0 ]; then \
6565
RESULT=1; \
6666
fi; \
67+
fi; \
68+
if [ -d "$$d/prometheus_rules_out" ]; then \
69+
echo "Running pint..."; \
70+
pint lint "$$d/prometheus_rules_out/"; \
71+
if [ $$? -ne 0 ]; then \
72+
RESULT=1; \
73+
fi; \
74+
fi; \
6775
done; \
6876
exit $$RESULT
6977

Makefile_mixin

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@ fmt:
1717
xargs -n 1 -- $(JSONNET_FMT) -i
1818

1919
.PHONY: lint
20-
lint: build
21-
find . -name 'vendor' -prune -o -name '*.libsonnet' -print -o -name '*.jsonnet' -print | \
20+
lint: build lint-pint
21+
@find . -name 'vendor' -prune -o -name '*.libsonnet' -print -o -name '*.jsonnet' -print | \
2222
while read f; do \
2323
$(JSONNET_FMT) "$$f" | diff -u "$$f" -; \
2424
done
2525
mixtool lint mixin.libsonnet
2626

27+
.PHONY: lint-pint
28+
lint-pint: prometheus_alerts.yaml prometheus_rules.yaml
29+
pint lint prometheus_rules_out/
30+
2731
dashboards_out: mixin.libsonnet $(wildcard **/*.libsonnet) $(wildcard **/*.jsonnet) $(wildcard panels/*) $(wildcard signals/*)
2832
@mkdir -p dashboards_out
2933
mixtool generate dashboards mixin.libsonnet -d dashboards_out

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Based on format described [here](https://monitoring.mixins.dev/):
2020
* [`memcached-mixin`](memcached-mixin/): A set of reuseable and extensible dashboards
2121
for Memcached.
2222

23-
* [`nodejs-mixin`](nodejs-mixin/): A set of reusable and extensible dashboards
23+
* [`nodejs-mixin`](nodejs-mixin/): A set of reuseable and extensible dashboards
2424
for Node.js.
2525

2626
* [`caddy-mixin`](caddy-mixin/): A set of reusable and extensible dashboards
@@ -30,6 +30,13 @@ Based on format described [here](https://monitoring.mixins.dev/):
3030

3131
You can find more in directories with `-mixin` suffix.
3232

33+
### Linting
34+
35+
The monitoring mixins in this repository use two linting tools to ensure quality and consistency:
36+
37+
* [mixtool](https://github.com/monitoring-mixins/mixtool): Validates the structure and syntax of monitoring mixins, ensuring they follow the standard mixin format.
38+
* [pint](https://github.com/cloudflare/pint): Lints Prometheus rules and alerts to catch common mistakes and enforce best practices.
39+
3340
## Observability libraries
3441

3542
Observability library is a flexible format to describe dashboards and alerts in a modular way so libraries can be imported into one another or into monitoring-mixins. Observability libraries can be found in folders with `-observ-lib` suffix. [Common library](https://github.com/grafana/jsonnet-libs/tree/master/common-lib) is also used to apply consistent style options.

velero-2-mixin/dashboards_out/clusterOverview

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@
541541
"label": "Job",
542542
"multi": true,
543543
"name": "job",
544-
"query": "label_values(velero_backup_success_total{job=~\"integrations/velero\"}, job)",
544+
"query": "label_values(velero_backup_success_total{job=\"integrations/velero\"}, job)",
545545
"refresh": 2,
546546
"sort": 1,
547547
"type": "query"
@@ -556,7 +556,7 @@
556556
"label": "Cluster",
557557
"multi": true,
558558
"name": "cluster",
559-
"query": "label_values(velero_backup_success_total{job=~\"integrations/velero\",job=~\"$job\"}, cluster)",
559+
"query": "label_values(velero_backup_success_total{job=\"integrations/velero\",job=~\"$job\"}, cluster)",
560560
"refresh": 2,
561561
"sort": 1,
562562
"type": "query"

velero-2-mixin/dashboards_out/logs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@
160160
"type": "loki",
161161
"uid": "${loki_datasource}"
162162
},
163-
"expr": "sum by (level) (count_over_time({job=~\"integrations/velero\",job=~\"$job\",instance=~\"$instance\",level=~\"$level\"}\n|~ \"$regex_search\"\n\n[$__auto]))\n",
163+
"expr": "sum by (level) (count_over_time({job=\"integrations/velero\",job=~\"$job\",instance=~\"$instance\",level=~\"$level\"}\n|~ \"$regex_search\"\n\n[$__auto]))\n",
164164
"legendFormat": "{{ level }}"
165165
}
166166
],
@@ -202,7 +202,7 @@
202202
"type": "loki",
203203
"uid": "${loki_datasource}"
204204
},
205-
"expr": "{job=~\"integrations/velero\",job=~\"$job\",instance=~\"$instance\",level=~\"$level\"} \n|~ \"$regex_search\"\n\n\n"
205+
"expr": "{job=\"integrations/velero\",job=~\"$job\",instance=~\"$instance\",level=~\"$level\"} \n|~ \"$regex_search\"\n\n\n"
206206
}
207207
],
208208
"title": "Logs",
@@ -233,7 +233,7 @@
233233
"label": "Job",
234234
"multi": true,
235235
"name": "job",
236-
"query": "label_values({job=~\"integrations/velero\"}, job)",
236+
"query": "label_values({job=\"integrations/velero\"}, job)",
237237
"refresh": 2,
238238
"sort": 1,
239239
"type": "query"
@@ -248,7 +248,7 @@
248248
"label": "Instance",
249249
"multi": true,
250250
"name": "instance",
251-
"query": "label_values({job=~\"integrations/velero\",job=~\"$job\"}, instance)",
251+
"query": "label_values({job=\"integrations/velero\",job=~\"$job\"}, instance)",
252252
"refresh": 2,
253253
"sort": 1,
254254
"type": "query"
@@ -263,7 +263,7 @@
263263
"label": "Level",
264264
"multi": true,
265265
"name": "level",
266-
"query": "label_values({job=~\"integrations/velero\",job=~\"$job\",instance=~\"$instance\"}, level)",
266+
"query": "label_values({job=\"integrations/velero\",job=~\"$job\",instance=~\"$instance\"}, level)",
267267
"refresh": 2,
268268
"sort": 1,
269269
"type": "query"

velero-2-mixin/mixin.libsonnet

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ local velero =
44
velerolib.new()
55
+ velerolib.withConfigMixin(
66
{
7-
filteringSelector: 'job=~"integrations/velero"',
7+
filteringSelector: 'job="integrations/velero"',
88
uid: 'velero',
99
enableLokiLogs: true,
1010
}

velero-2-mixin/prometheus_rules_out/prometheus_alerts.yaml

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)