From 62fa823e3ef22062a9a155d4a89b807393550248 Mon Sep 17 00:00:00 2001
From: Frederic Branczyk <fbranczyk@gmail.com>
Date: Thu, 7 Jun 2018 11:08:12 +0200
Subject: [PATCH] kube-prometheus: Add docs on how to set Alertmanager
 configuration

---
 README.md                                     | 44 +++++++++++++++++++
 examples/alertmanager-config-external.jsonnet |  7 +++
 examples/alertmanager-config.jsonnet          | 22 ++++++++++
 examples/alertmanager-config.yaml             | 15 +++++++
 .../alertmanager/alertmanager.libsonnet       | 19 ++++++--
 manifests/alertmanager-secret.yaml            |  2 +-
 6 files changed, 105 insertions(+), 4 deletions(-)
 create mode 100644 examples/alertmanager-config-external.jsonnet
 create mode 100644 examples/alertmanager-config.jsonnet
 create mode 100644 examples/alertmanager-config.yaml

diff --git a/README.md b/README.md
index 0ff7e201..89686cf4 100644
--- a/README.md
+++ b/README.md
@@ -26,6 +26,7 @@ This stack is meant for cluster monitoring, so it is pre-configured to collect m
     * [Compiling](#compiling)
 * [Configuration](#configuration)
 * [Customization](#customization)
+    * [Alertmanager configuration](#alertmanager-configuration)
     * [Customizing Prometheus alerting/recording rules and Grafana dashboards](#customizing-prometheus-alertingrecording-rules-and-grafana-dashboards)
     * [Exposing Prometheus/Alermanager/Grafana via Ingress](#exposing-prometheusalermanagergrafana-via-ingress)
 * [Minikube Example](#minikube-example)
@@ -242,6 +243,49 @@ local daemonset = k.apps.v1beta2.daemonSet;
  }).nodeExporter.daemonset
 ```
 
+### Alertmanager configuration
+
+The Alertmanager configuration is located in the `_config.alertmanager.config` configuration field. In order to set a custom Alertmanager configuration simply set this field.
+
+[embedmd]:# (examples/alertmanager-config.jsonnet)
+```jsonnet
+((import 'kube-prometheus/kube-prometheus.libsonnet') + {
+   _config+:: {
+     alertmanager+: {
+       config: |||
+         global:
+           resolve_timeout: 10m
+         route:
+           group_by: ['job']
+           group_wait: 30s
+           group_interval: 5m
+           repeat_interval: 12h
+           receiver: 'null'
+           routes:
+           - match:
+               alertname: DeadMansSwitch
+             receiver: 'null'
+         receivers:
+         - name: 'null'
+       |||,
+     },
+   },
+ }).alertmanager.secret
+```
+
+In the above example the configuration has been inlined, but can just as well be an external file imported in jsonnet via the `importstr` function.
+
+[embedmd]:# (examples/alertmanager-config-external.jsonnet)
+```jsonnet
+((import 'kube-prometheus/kube-prometheus.libsonnet') + {
+   _config+:: {
+     alertmanager+: {
+       config: importstr 'alertmanager-config.yaml',
+     },
+   },
+ }).alertmanager.secret
+```
+
 ### Customizing Prometheus alerting/recording rules and Grafana dashboards
 
 See [developing Prometheus rules and Grafana dashboards](docs/developing-prometheus-rules-and-grafana-dashboards.md) guide.
diff --git a/examples/alertmanager-config-external.jsonnet b/examples/alertmanager-config-external.jsonnet
new file mode 100644
index 00000000..c2b34cca
--- /dev/null
+++ b/examples/alertmanager-config-external.jsonnet
@@ -0,0 +1,7 @@
+((import 'kube-prometheus/kube-prometheus.libsonnet') + {
+   _config+:: {
+     alertmanager+: {
+       config: importstr 'alertmanager-config.yaml',
+     },
+   },
+ }).alertmanager.secret
diff --git a/examples/alertmanager-config.jsonnet b/examples/alertmanager-config.jsonnet
new file mode 100644
index 00000000..162104d7
--- /dev/null
+++ b/examples/alertmanager-config.jsonnet
@@ -0,0 +1,22 @@
+((import 'kube-prometheus/kube-prometheus.libsonnet') + {
+   _config+:: {
+     alertmanager+: {
+       config: |||
+         global:
+           resolve_timeout: 10m
+         route:
+           group_by: ['job']
+           group_wait: 30s
+           group_interval: 5m
+           repeat_interval: 12h
+           receiver: 'null'
+           routes:
+           - match:
+               alertname: DeadMansSwitch
+             receiver: 'null'
+         receivers:
+         - name: 'null'
+       |||,
+     },
+   },
+ }).alertmanager.secret
diff --git a/examples/alertmanager-config.yaml b/examples/alertmanager-config.yaml
new file mode 100644
index 00000000..78c65b64
--- /dev/null
+++ b/examples/alertmanager-config.yaml
@@ -0,0 +1,15 @@
+# external alertmanager yaml
+global:
+  resolve_timeout: 10m
+route:
+  group_by: ['job']
+  group_wait: 30s
+  group_interval: 5m
+  repeat_interval: 12h
+  receiver: 'null'
+  routes:
+  - match:
+      alertname: DeadMansSwitch
+    receiver: 'null'
+receivers:
+- name: 'null'
diff --git a/jsonnet/kube-prometheus/alertmanager/alertmanager.libsonnet b/jsonnet/kube-prometheus/alertmanager/alertmanager.libsonnet
index 473f89d3..27bc2398 100644
--- a/jsonnet/kube-prometheus/alertmanager/alertmanager.libsonnet
+++ b/jsonnet/kube-prometheus/alertmanager/alertmanager.libsonnet
@@ -1,7 +1,5 @@
 local k = import 'ksonnet/ksonnet.beta.3/k.libsonnet';
 
-local alertmanagerConfig = "\nglobal:\n  resolve_timeout: 5m\nroute:\n  group_by: ['job']\n  group_wait: 30s\n  group_interval: 5m\n  repeat_interval: 12h\n  receiver: 'null'\n  routes:\n  - match:\n      alertname: DeadMansSwitch\n    receiver: 'null'\nreceivers:\n- name: 'null'\n";
-
 {
   _config+:: {
     namespace: 'default',
@@ -16,7 +14,22 @@ local alertmanagerConfig = "\nglobal:\n  resolve_timeout: 5m\nroute:\n  group_by
 
     alertmanager+:: {
       name: $._config.alertmanager.name,
-      config: alertmanagerConfig,
+      config: |||
+        global:
+          resolve_timeout: 5m
+        route:
+          group_by: ['job']
+          group_wait: 30s
+          group_interval: 5m
+          repeat_interval: 12h
+          receiver: 'null'
+          routes:
+          - match:
+              alertname: DeadMansSwitch
+            receiver: 'null'
+        receivers:
+        - name: 'null'
+      |||,
       replicas: 3,
     },
   },
diff --git a/manifests/alertmanager-secret.yaml b/manifests/alertmanager-secret.yaml
index 07155d97..4a143fbb 100644
--- a/manifests/alertmanager-secret.yaml
+++ b/manifests/alertmanager-secret.yaml
@@ -1,6 +1,6 @@
 apiVersion: v1
 data:
-  alertmanager.yaml: Cmdsb2JhbDoKICByZXNvbHZlX3RpbWVvdXQ6IDVtCnJvdXRlOgogIGdyb3VwX2J5OiBbJ2pvYiddCiAgZ3JvdXBfd2FpdDogMzBzCiAgZ3JvdXBfaW50ZXJ2YWw6IDVtCiAgcmVwZWF0X2ludGVydmFsOiAxMmgKICByZWNlaXZlcjogJ251bGwnCiAgcm91dGVzOgogIC0gbWF0Y2g6CiAgICAgIGFsZXJ0bmFtZTogRGVhZE1hbnNTd2l0Y2gKICAgIHJlY2VpdmVyOiAnbnVsbCcKcmVjZWl2ZXJzOgotIG5hbWU6ICdudWxsJwo=
+  alertmanager.yaml: Z2xvYmFsOgogIHJlc29sdmVfdGltZW91dDogNW0Kcm91dGU6CiAgZ3JvdXBfYnk6IFsnam9iJ10KICBncm91cF93YWl0OiAzMHMKICBncm91cF9pbnRlcnZhbDogNW0KICByZXBlYXRfaW50ZXJ2YWw6IDEyaAogIHJlY2VpdmVyOiAnbnVsbCcKICByb3V0ZXM6CiAgLSBtYXRjaDoKICAgICAgYWxlcnRuYW1lOiBEZWFkTWFuc1N3aXRjaAogICAgcmVjZWl2ZXI6ICdudWxsJwpyZWNlaXZlcnM6Ci0gbmFtZTogJ251bGwnCg==
 kind: Secret
 metadata:
   name: alertmanager-main
-- 
GitLab