Skip to content

Commit 8bcf35d

Browse files
Merge pull request #358 from grafana/add-promsonnet-lib
A Promsonnet library for creating Prometheus Rules
2 parents f160ba9 + 1e35b55 commit 8bcf35d

File tree

4 files changed

+147
-0
lines changed

4 files changed

+147
-0
lines changed

promsonnet/README.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#PromSonnet
2+
3+
`PromSonnet` is intended as a very simple library for creating Prometheus
4+
alerts and rules. It is 'patching friendly', as in, it maintains the
5+
rules internally as a map, which allows users to easily patch alerts and
6+
recording rules after the fact. In contrast, lists require complex
7+
iteration logic.
8+
9+
Take this example:
10+
11+
```
12+
local prom = import 'prom.libsonnet';
13+
local promRuleGroupSet = prom.v1.ruleGroupSet;
14+
local promRuleGroup = prom.v1.ruleGroup;
15+
{
16+
prometheus_metamon::
17+
promRuleGroup.new('prometheus_metamon')
18+
+ promRuleGroup.rule.newAlert(
19+
'PrometheusDown', {
20+
expr: 'up{job="prometheus"}==0',
21+
'for': '5m',
22+
labels: {
23+
namespace: 'prometheus',
24+
severity: 'critical',
25+
},
26+
annotations: {
27+
},
28+
}
29+
),
30+
31+
prometheusAlerts+:
32+
promRuleGroupSet.new()
33+
+ promRuleGroupSet.addGroup($.prometheus_metamon),
34+
}
35+
```
36+
37+
If we wanted to change the `for` from `5m` to `10m`, we could do this
38+
simply with code such as:
39+
40+
```
41+
{
42+
prometheusAlerts+: {
43+
groups_map+:: {
44+
prometheus_metamon+:: {
45+
rules+:: {
46+
PrometheusDown+:: {
47+
for: '10m',
48+
},
49+
},
50+
},
51+
},
52+
},
53+
}
54+
```
55+
56+
We no longer need to iterate over all alerts to do so.
57+
58+
You can execute either of these examples in the `promsonnet` directory
59+
via:
60+
```
61+
$ jsonnet example.jsonnet
62+
$ # or:
63+
$ jsonnet patch.jsonnet
64+
```

promsonnet/example.jsonnet

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
local prom = import 'prom.libsonnet';
2+
local promRuleGroupSet = prom.v1.ruleGroupSet;
3+
local promRuleGroup = prom.v1.ruleGroup;
4+
{
5+
prometheus_metamon::
6+
promRuleGroup.new('prometheus_metamon')
7+
+ promRuleGroup.rule.newAlert(
8+
'PrometheusDown', {
9+
expr: 'up{job="prometheus"} == 0',
10+
'for': '5m',
11+
labels: {
12+
namespace: 'prometheus',
13+
severity: 'critical',
14+
},
15+
annotations: {
16+
},
17+
}
18+
),
19+
20+
prometheusAlerts+:
21+
promRuleGroupSet.new()
22+
+ promRuleGroupSet.addGroup($.prometheus_metamon),
23+
}

promsonnet/patch.jsonnet

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
local example = import 'example.jsonnet';
2+
3+
example {
4+
prometheusAlerts+: {
5+
groups_map+:: {
6+
prometheus_metamon+:: {
7+
rules_map+:: {
8+
PrometheusDown+:: {
9+
'for': '10m',
10+
},
11+
},
12+
},
13+
},
14+
},
15+
}

promsonnet/prom.libsonnet

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
v1: {
3+
ruleGroupSet: {
4+
new():: {
5+
groups_map:: {},
6+
groups_order:: [],
7+
local groups_map = self.groups_map,
8+
local groups_order = self.groups_order,
9+
groups: [groups_map[group] for group in groups_order],
10+
},
11+
addGroup(group):: {
12+
groups_map+:: {
13+
[group.name]: group,
14+
},
15+
groups_order+:: [group.name],
16+
},
17+
},
18+
19+
ruleGroup: {
20+
new(name):: {
21+
name: name,
22+
rules_map:: {},
23+
rules_order:: [],
24+
local rules_map = self.rules_map,
25+
local rules_order = self.rules_order,
26+
rules: [rules_map[rule] for rule in rules_order],
27+
},
28+
29+
rule: {
30+
newAlert(name, rule):: {
31+
rules_map+:: {
32+
[name]: rule { alert: name },
33+
},
34+
rules_order+:: [name],
35+
},
36+
newRecording(name, rule):: {
37+
rules_map+:: {
38+
[name]: rule { record: name },
39+
},
40+
rules_order+:: [name],
41+
},
42+
},
43+
},
44+
},
45+
}

0 commit comments

Comments
 (0)