Skip to content

Commit 26cba93

Browse files
authored
Don't merge mixins in the global namespace anymore. (#234)
* Don't merge mixins in the global namespace anymore. Instead, put them in the $.mixins map. This allows for mixins to be places in specific Grafana directories, and also removes the horrible bug around playbook links. Still support merging into the global namespace for the time being, but this will be going away. Signed-off-by: Tom Wilkie <[email protected]> * make fmt Signed-off-by: Tom Wilkie <[email protected]> * Put mixins + overrides in separate file. Signed-off-by: Tom Wilkie <[email protected]> * Review feedback. Signed-off-by: Tom Wilkie <[email protected]> * make fmt Signed-off-by: Tom Wilkie <[email protected]> * Clarify comment. Signed-off-by: Tom Wilkie <[email protected]>
1 parent 07c0a29 commit 26cba93

File tree

5 files changed

+162
-96
lines changed

5 files changed

+162
-96
lines changed

prometheus-ksonnet/grafana/dashboards.libsonnet

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,38 @@
77
dashboard_config_maps: 8,
88
},
99

10-
// Extension point for you to add your own dashboards.
11-
dashboards+:: {},
12-
grafana_dashboards+:: {},
13-
grafanaDashboards+:: $.dashboards + $.grafana_dashboards,
14-
dashboardsByFolder+:: {},
10+
// New API: Mixins go in the mixins map.
11+
mixins+:: {},
12+
13+
// emptyMixin allows us to reliably do `mixin.grafanaDashboards` without
14+
// having to check the field exists first. Some mixins don't declare all
15+
// the fields, and thats fine.
16+
local emptyMixin = {
17+
grafanaDashboards+: {},
18+
},
19+
20+
// Legacy extension points for you to add your own dashboards.
21+
grafanaDashboards+:: std.foldr(
22+
function(mixinName, acc)
23+
local mixin = $.mixins[mixinName] + emptyMixin;
24+
if !std.objectHas(mixin, 'grafanaDashboardFolder')
25+
then acc + mixin.grafanaDashboards
26+
else acc,
27+
std.objectFields($.mixins),
28+
{}
29+
),
30+
31+
dashboardsByFolder+:: std.foldr(
32+
function(mixinName, acc)
33+
local mixin = $.mixins[mixinName] + emptyMixin;
34+
if std.objectHas(mixin, 'grafanaDashboardFolder')
35+
then acc {
36+
[mixin.grafanaDashboardFolder]: mixin.grafanaDashboards,
37+
}
38+
else acc,
39+
std.objectFields($.mixins),
40+
{}
41+
),
1542

1643
local materialise_config_map(config_map_name, dashboards) =
1744
configMap.new(config_map_name) +

prometheus-ksonnet/lib/config.libsonnet

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -81,25 +81,6 @@
8181
// Node exporter options.
8282
node_exporter_mount_root: true,
8383

84-
// Kubernetes mixin overrides.
85-
cadvisorSelector: 'job="kube-system/cadvisor"',
86-
kubeletSelector: 'job="kube-system/kubelet"',
87-
kubeStateMetricsSelector: 'job="%s/kube-state-metrics"' % $._config.namespace,
88-
nodeExporterSelector: 'job="%s/node-exporter"' % $._config.namespace, // Also used by node-mixin.
89-
notKubeDnsSelector: 'job!="kube-system/kube-dns"',
90-
kubeSchedulerSelector: 'job="kube-system/kube-scheduler"',
91-
kubeControllerManagerSelector: 'job="kube-system/kube-controller-manager"',
92-
kubeApiserverSelector: 'job="kube-system/kube-apiserver"',
93-
podLabel: 'instance',
94-
grafanaPrefix: '/grafana', // Also used by node-mixin.
95-
96-
// Prometheus mixin overrides.
97-
prometheusSelector: 'job="default/prometheus"',
98-
alertmanagerSelector: 'job="default/alertmanager"',
99-
100-
// Node mixin overrides.
101-
nodeCriticalSeverity: 'warning', // Do not page if nodes run out of disk space.
102-
10384
// oauth2-proxy
10485
oauth_enabled: false,
10586
},

prometheus-ksonnet/lib/prometheus-config.libsonnet

Lines changed: 84 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -363,75 +363,92 @@
363363
],
364364
},
365365

366-
// Extension points for adding alerts, recording rules and prometheus config.
367-
prometheus_alerts:: {
368-
groups+: [
369-
{
370-
name: 'prometheus-extra',
371-
rules: [
372-
{
373-
alert: 'PromScrapeFailed',
374-
expr: |||
375-
up != 1
376-
|||,
377-
'for': '15m',
378-
labels: {
379-
severity: 'warning',
380-
},
381-
annotations: {
382-
message: 'Prometheus failed to scrape a target {{ $labels.job }} / {{ $labels.instance }}',
383-
},
384-
},
385-
{
386-
alert: 'PromScrapeFlapping',
387-
expr: |||
388-
avg_over_time(up[5m]) < 1
389-
|||,
390-
'for': '15m',
391-
labels: {
392-
severity: 'warning',
366+
// Legacy Extension points for adding alerts, recording rules and prometheus config.
367+
local emptyMixin = {
368+
prometheusAlerts+:: {},
369+
prometheusRules+:: {},
370+
},
371+
372+
prometheusAlerts::
373+
{
374+
groups+: [
375+
{
376+
name: 'prometheus-extra',
377+
rules: [
378+
{
379+
alert: 'PromScrapeFailed',
380+
expr: |||
381+
up != 1
382+
|||,
383+
'for': '15m',
384+
labels: {
385+
severity: 'warning',
386+
},
387+
annotations: {
388+
message: 'Prometheus failed to scrape a target {{ $labels.job }} / {{ $labels.instance }}',
389+
},
393390
},
394-
annotations: {
395-
message: 'Prometheus target flapping {{ $labels.job }} / {{ $labels.instance }}',
391+
{
392+
alert: 'PromScrapeFlapping',
393+
expr: |||
394+
avg_over_time(up[5m]) < 1
395+
|||,
396+
'for': '15m',
397+
labels: {
398+
severity: 'warning',
399+
},
400+
annotations: {
401+
message: 'Prometheus target flapping {{ $labels.job }} / {{ $labels.instance }}',
402+
},
396403
},
397-
},
398-
{
399-
alert: 'PromScrapeTooLong',
400-
expr: |||
401-
scrape_duration_seconds > 60
402-
|||,
403-
'for': '15m',
404-
labels: {
405-
severity: 'warning',
404+
{
405+
alert: 'PromScrapeTooLong',
406+
expr: |||
407+
scrape_duration_seconds > 60
408+
|||,
409+
'for': '15m',
410+
labels: {
411+
severity: 'warning',
412+
},
413+
annotations: {
414+
message: '{{ $labels.job }} / {{ $labels.instance }} is taking too long to scrape ({{ printf "%.1f" $value }}s)',
415+
},
406416
},
407-
annotations: {
408-
message: '{{ $labels.job }} / {{ $labels.instance }} is taking too long to scrape ({{ printf "%.1f" $value }}s)',
417+
],
418+
},
419+
],
420+
} +
421+
std.foldr(
422+
function(mixinName, acc)
423+
local mixin = $.mixins[mixinName] + emptyMixin;
424+
acc + mixin.prometheusAlerts,
425+
std.objectFields($.mixins),
426+
{}
427+
),
428+
429+
prometheusRules::
430+
{
431+
groups+: [
432+
{
433+
// Add mapping from namespace, pod -> node with node name as pod, as
434+
// we use the node name as the node-exporter instance label.
435+
name: 'instance_override',
436+
rules: [
437+
{
438+
record: 'node_namespace_pod:kube_pod_info:',
439+
expr: |||
440+
max by(node, namespace, instance) (label_replace(kube_pod_info{job="default/kube-state-metrics"}, "instance", "$1", "node", "(.*)"))
441+
|||,
409442
},
410-
},
411-
],
412-
},
413-
],
414-
},
415-
416-
prometheus_rules:: {
417-
groups+: [
418-
{
419-
// Add mapping from namespace, pod -> node with node name as pod, as
420-
// we use the node name as the node-exporter instance label.
421-
name: 'instance_override',
422-
rules: [
423-
{
424-
record: 'node_namespace_pod:kube_pod_info:',
425-
expr: |||
426-
max by(node, namespace, instance) (label_replace(kube_pod_info{job="default/kube-state-metrics"}, "instance", "$1", "node", "(.*)"))
427-
|||,
428-
},
429-
],
430-
},
431-
],
432-
},
433-
434-
// We changes to using camelCase, but here we try and make it backwards compatible.
435-
prometheusAlerts+:: $.prometheus_alerts,
436-
prometheusRules+:: $.prometheus_rules,
443+
],
444+
},
445+
],
446+
} +
447+
std.foldr(
448+
function(mixinName, acc)
449+
local mixin = $.mixins[mixinName] + emptyMixin;
450+
acc + mixin.prometheusRules,
451+
std.objectFields($.mixins),
452+
{},
453+
),
437454
}

prometheus-ksonnet/mixins.libsonnet

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{
2+
// Add you mixins here.
3+
mixins+:: {
4+
kubernetes:
5+
(import 'kubernetes-mixin/mixin.libsonnet') {
6+
_config+:: {
7+
cadvisorSelector: 'job="kube-system/cadvisor"',
8+
kubeletSelector: 'job="kube-system/kubelet"',
9+
kubeStateMetricsSelector: 'job="%s/kube-state-metrics"' % $._config.namespace,
10+
nodeExporterSelector: 'job="%s/node-exporter"' % $._config.namespace, // Also used by node-mixin.
11+
notKubeDnsSelector: 'job!="kube-system/kube-dns"',
12+
kubeSchedulerSelector: 'job="kube-system/kube-scheduler"',
13+
kubeControllerManagerSelector: 'job="kube-system/kube-controller-manager"',
14+
kubeApiserverSelector: 'job="kube-system/kube-apiserver"',
15+
podLabel: 'instance',
16+
},
17+
},
18+
19+
prometheus:
20+
(import 'prometheus-mixin/mixin.libsonnet') {
21+
_config+:: {
22+
prometheusSelector: 'job="default/prometheus"',
23+
},
24+
},
25+
26+
alertmanager:
27+
(import 'alertmanager-mixin/mixin.libsonnet') {
28+
_config+:: {
29+
alertmanagerSelector: 'job="default/alertmanager"',
30+
},
31+
},
32+
33+
node_exporter:
34+
(import 'node-mixin/mixin.libsonnet') {
35+
_config+:: {
36+
nodeExporterSelector: 'job="%s/node-exporter"' % $._config.namespace, // Also used by node-mixin.
37+
38+
// Do not page if nodes run out of disk space.
39+
nodeCriticalSeverity: 'warning',
40+
grafanaPrefix: '/grafana',
41+
},
42+
},
43+
},
44+
}

prometheus-ksonnet/prometheus-ksonnet.libsonnet

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,5 @@
88
(import 'lib/prometheus.libsonnet') +
99
(import 'lib/prometheus-config.libsonnet') +
1010
(import 'lib/prometheus-configmap.libsonnet') +
11-
(import 'kubernetes-mixin/mixin.libsonnet') +
12-
(import 'prometheus-mixin/mixin.libsonnet') +
13-
(import 'alertmanager-mixin/mixin.libsonnet') +
14-
(import 'node-mixin/mixin.libsonnet') +
15-
(import 'lib/config.libsonnet')
11+
(import 'lib/config.libsonnet') +
12+
(import 'mixins.libsonnet')

0 commit comments

Comments
 (0)