Merge ~jacekn/charm-prometheus-alertmanager:master into ~prometheus-charmers/charm-prometheus-alertmanager:master

Proposed by Jacek Nykis
Status: Merged
Approved by: David Lawson
Approved revision: d7f27d657f59206d87bc9d1f64a7eebe7ccc3526
Merged at revision: 20fc6ba3fc267b8ce1b6dc7d8ce112ccd6058c94
Proposed branch: ~jacekn/charm-prometheus-alertmanager:master
Merge into: ~prometheus-charmers/charm-prometheus-alertmanager:master
Diff against target: 234 lines (+101/-26)
8 files modified
hooks/alertmanager-cluster-relation-broken (+1/-0)
hooks/alertmanager-cluster-relation-changed (+1/-0)
hooks/alertmanager-cluster-relation-departed (+1/-0)
hooks/alertmanager-cluster-relation-joined (+1/-0)
hooks/defaulthook.py (+19/-0)
metadata.yaml (+3/-0)
reactive/alertmanager.py (+46/-11)
templates/daemon_arguments.j2 (+29/-15)
Reviewer Review Type Date Requested Status
Prometheus Charmers Pending
Review via email: mp+347141@code.launchpad.net

Commit message

Add support for clustering. Switch to long config option format now that snap supports it.

To post a comment you must log in.
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

This merge proposal is being monitored by mergebot. Change the status to Approved to merge.

Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote :

Change successfully merged at revision 20fc6ba3fc267b8ce1b6dc7d8ce112ccd6058c94

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/hooks/alertmanager-cluster-relation-broken b/hooks/alertmanager-cluster-relation-broken
2new file mode 120000
3index 0000000..560258f
4--- /dev/null
5+++ b/hooks/alertmanager-cluster-relation-broken
6@@ -0,0 +1 @@
7+defaulthook.py
8\ No newline at end of file
9diff --git a/hooks/alertmanager-cluster-relation-changed b/hooks/alertmanager-cluster-relation-changed
10new file mode 120000
11index 0000000..560258f
12--- /dev/null
13+++ b/hooks/alertmanager-cluster-relation-changed
14@@ -0,0 +1 @@
15+defaulthook.py
16\ No newline at end of file
17diff --git a/hooks/alertmanager-cluster-relation-departed b/hooks/alertmanager-cluster-relation-departed
18new file mode 120000
19index 0000000..560258f
20--- /dev/null
21+++ b/hooks/alertmanager-cluster-relation-departed
22@@ -0,0 +1 @@
23+defaulthook.py
24\ No newline at end of file
25diff --git a/hooks/alertmanager-cluster-relation-joined b/hooks/alertmanager-cluster-relation-joined
26new file mode 120000
27index 0000000..560258f
28--- /dev/null
29+++ b/hooks/alertmanager-cluster-relation-joined
30@@ -0,0 +1 @@
31+defaulthook.py
32\ No newline at end of file
33diff --git a/hooks/defaulthook.py b/hooks/defaulthook.py
34new file mode 100755
35index 0000000..64c8489
36--- /dev/null
37+++ b/hooks/defaulthook.py
38@@ -0,0 +1,19 @@
39+#!/usr/bin/env python3
40+
41+# Load modules from $JUJU_CHARM_DIR/lib
42+import sys
43+sys.path.append('lib')
44+
45+from charms.layer import basic
46+basic.bootstrap_charm_deps()
47+basic.init_config_states()
48+
49+
50+# This will load and run the appropriate @hook and other decorated
51+# handlers from $JUJU_CHARM_DIR/reactive, $JUJU_CHARM_DIR/hooks/reactive,
52+# and $JUJU_CHARM_DIR/hooks/relations.
53+#
54+# See https://jujucharms.com/docs/stable/authors-charm-building
55+# for more information on this pattern.
56+from charms.reactive import main
57+main()
58diff --git a/metadata.yaml b/metadata.yaml
59index 6223e99..384d6ab 100644
60--- a/metadata.yaml
61+++ b/metadata.yaml
62@@ -14,3 +14,6 @@ subordinate: false
63 provides:
64 alertmanager-service:
65 interface: http
66+peers:
67+ alertmanager-cluster:
68+ interface: alertmanger-cluster
69diff --git a/reactive/alertmanager.py b/reactive/alertmanager.py
70index 9ae82f5..6cc06c1 100644
71--- a/reactive/alertmanager.py
72+++ b/reactive/alertmanager.py
73@@ -2,6 +2,7 @@ import yaml
74
75 from charmhelpers.core import host, hookenv, unitdata
76 from charmhelpers.core.templating import render
77+from charmhelpers import context
78 from charms.reactive import (
79 when, when_not, when_any, set_state, remove_state
80 )
81@@ -21,6 +22,15 @@ def templates_changed(tmpl_list):
82 return any_file_changed(['templates/{}'.format(x) for x in tmpl_list])
83
84
85+def get_peers():
86+ peers = []
87+ if not context.Relations().peer:
88+ return False
89+ for _, data in context.Relations().peer.items():
90+ peers.append('{}:9094'.format(data.get('private-address')))
91+ return sorted(peers)
92+
93+
94 @when_not('alertmanager.installed')
95 def install_packages():
96 hookenv.status_set('maintenance', 'Installing software')
97@@ -31,13 +41,32 @@ def install_packages():
98 set_state('alertmanager.do-check-reconfig')
99
100
101-def runtime_args(key=None, value=None):
102+def runtime_args(key=None, value=None, update=True):
103 kv = unitdata.kv()
104 args = kv.get('runtime_args', {})
105 if key:
106- args.update({key: value})
107- kv.set('runtime_args', args)
108- args_list = ['{} {}'.format(k, v) for k, v in args.items() if v]
109+ if update:
110+ args.update({key: value})
111+ kv.set('runtime_args', args)
112+ else:
113+ if not args.get(key, []):
114+ cur = set([])
115+ else:
116+ cur = set(args.get(key))
117+ new = list(cur.union((value,)))
118+ args.update({key: sorted(new)})
119+ kv.set('runtime_args', args)
120+
121+ args_list = []
122+ for k, v in args.items():
123+ if not v:
124+ continue
125+ if isinstance(v, list):
126+ for i in v:
127+ args_list.append('{} {}'.format(k, i))
128+ else:
129+ args_list.append('{} {}'.format(k, v))
130+
131 # sorted list is needed to avoid data_changed() false-positives
132 return sorted(args_list)
133
134@@ -72,7 +101,7 @@ def write_alertmanager_config_def():
135 config = hookenv.config()
136 port = config.get('port', '9093')
137 check_ports(port)
138- runtime_args('-web.listen-address',
139+ runtime_args('--web.listen-address',
140 ':{}'.format(port))
141 if config.get('external_url', False):
142 vars = {
143@@ -81,8 +110,16 @@ def write_alertmanager_config_def():
144 # alertmanager default:
145 'port': port,
146 }
147- runtime_args('-web.external-url',
148+ runtime_args('--web.external-url',
149 config['external_url'].format(**vars))
150+ if get_peers():
151+ hookenv.log('Found cluster peers: {}'.format(get_peers()))
152+ runtime_args('--mesh.listen-address', '0.0.0.0:9094')
153+ for peer in get_peers():
154+ runtime_args('--mesh.peer', peer, False)
155+ else:
156+ runtime_args('--mesh.listen-address', False)
157+ runtime_args('--mesh.peer', False)
158 args = runtime_args()
159 hookenv.log('runtime_args: {}'.format(args))
160 if args:
161@@ -101,11 +138,6 @@ def setup_alertmanager():
162 set_state('alertmanager.do-check-reconfig')
163
164
165-@when('alertmanager.started')
166-def check_config():
167- set_state('alertmanager.do-check-reconfig')
168-
169-
170 @when('alertmanager.installed')
171 @when_any('alertmanager.started', 'alertmanager.do-check-reconfig')
172 def check_reconfig_alertmanager():
173@@ -119,6 +151,9 @@ def check_reconfig_alertmanager():
174 set_state('alertmanager.do-reconfig-yml')
175 set_state('alertmanager.do-reconfig-def')
176
177+ if data_changed('alertmanager.peers', get_peers()):
178+ set_state('alertmanager.do-reconfig-def')
179+
180 if templates_changed([ALERTMANAGER_YML_TMPL]):
181 set_state('alertmanager.do-reconfig-yml')
182
183diff --git a/templates/daemon_arguments.j2 b/templates/daemon_arguments.j2
184index 624290b..fcc5da1 100644
185--- a/templates/daemon_arguments.j2
186+++ b/templates/daemon_arguments.j2
187@@ -6,18 +6,32 @@ ARGS="
188 {%- for arg in args -%}
189 {{ arg }} {% endfor -%}
190 "
191-# Alertmanager supports the following options:
192-# -config.file string
193-# Alertmanager configuration file name. (default "/etc/prometheus/alertmanager.yml")
194-# -log.format value
195-# If set use a syslog logger or JSON logging. Example: logger:syslog?appname=bob&local=7 or logger:stdout?json=true. Defaults to stderr.
196-# -log.level value
197-# Only log messages with the given severity or above. Valid levels: [debug, info, warn, error, fatal]. (default info)
198-# -storage.path string
199-# Base path for data storage. (default "/var/lib/prometheus/alertmanager/")
200-# -version
201-# Print version information.
202-# -web.external-url string
203-# The URL under which Alertmanager is externally reachable (for example, if Alertmanager is served via a reverse proxy). Used for generating relative and absolute links back to Alertmanager itself. If the URL has a path portion, it will be used to prefix all HTTP endpoints served by Alertmanager. If omitted, relevant URL components will be derived automatically.
204-# -web.listen-address string
205-# Address to listen on for the web interface and API. (default ":9093")
206+##############################################################################
207+# WARNINIG: Due to snap confinement the following options should not be set: #
208+##############################################################################
209+# --config.file
210+# --storage.path
211+
212+# Alertmanager supports the following options
213+# --data.retention=120h How long to keep data for.
214+# --alerts.gc-interval=30m Interval between alert GC.
215+# --log.level=info Only log messages with the given severity or above.
216+# --web.external-url=WEB.EXTERNAL-URL
217+# The URL under which Alertmanager is externally reachable (for example, if
218+# Alertmanager is served via a reverse proxy). Used for generating relative and
219+# absolute links back to Alertmanager itself. If the URL has a path portion, it will
220+# be used to prefix all HTTP endpoints served by Alertmanager. If omitted, relevant
221+# URL components will be derived automatically.
222+# --web.route-prefix=WEB.ROUTE-PREFIX
223+# Prefix for the internal routes of web endpoints. Defaults to path of
224+# --web.external-url.
225+# --web.listen-address=":9093"
226+# Address to listen on for the web interface and API.
227+# --mesh.listen-address="0.0.0.0:6783"
228+# mesh listen address. Pass an empty string to disable.
229+# --mesh.peer-id="52:54:00:54:c1:12"
230+# mesh peer ID
231+# --mesh.nickname="myhost" mesh peer nickname
232+# --mesh.password="" password to join the peer network (empty password disables encryption)
233+# --mesh.peer=MESH.PEER ... initial peers (may be repeated)
234+# --version Show application version.

Subscribers

People subscribed via source and target branches