Merge ~barryprice/charm-telegraf:add_ip_range_support into charm-telegraf:master

Proposed by Barry Price
Status: Merged
Approved by: Barry Price
Approved revision: bb61dba965d4a4183c8fde2a390102bd722f80bf
Merged at revision: 562a3cc1aaeb05a0e28874ddbd6a597459c44f8f
Proposed branch: ~barryprice/charm-telegraf:add_ip_range_support
Merge into: charm-telegraf:master
Prerequisite: ~barryprice/charm-telegraf:prometheus-client-default-port-9103
Diff against target: 188 lines (+57/-9)
5 files modified
src/config.yaml (+6/-0)
src/reactive/telegraf.py (+27/-7)
src/templates/prometheus_client.tmpl (+1/-0)
src/tests/functional/tests/bundles/bionic-monitoring.yaml (+1/-0)
src/tests/unit/test_telegraf.py (+22/-2)
Reviewer Review Type Date Requested Status
Haw Loeung +1 Approve
Canonical IS Reviewers Pending
BootStack Reviewers Pending
Review via email: mp+398221@code.launchpad.net

This proposal supersedes a proposal from 2021-01-27.

Commit message

Add support for ip_range in the prometheus-client output plugin

To post a comment you must log in.
Revision history for this message
Laurent Sesquès (sajoupa) wrote : Posted in a previous version of this proposal
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote : Posted in a previous version of this proposal

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 : Posted in a previous version of this proposal

Unable to determine commit message from repository - please click "Set commit message" and enter the commit message manually.

Revision history for this message
Paul Goins (vultaire) wrote : Posted in a previous version of this proposal

Just a quick note in passing so far:

* Generally looks good
* I need to take a proper look at the tests for this later, unit and functional - it seems sane, but I likely need more context than I'm seeing here to properly review. I'll try to come back to this when I have more time.

Left one minor code comment re: code which could be done in less lines.

Revision history for this message
Laurent Sesquès (sajoupa) wrote : Posted in a previous version of this proposal

Thanks. Replied to the comment inline.

Revision history for this message
Haw Loeung (hloeung) wrote : Posted in a previous version of this proposal

LGTM, comment inline.

review: Approve (+1)
Revision history for this message
🤖 Canonical IS Merge Bot (canonical-is-mergebot) wrote : Posted in a previous version of this proposal

Failed to merge change (unable to merge source repository due to conflicts), setting status to needs review.

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
Haw Loeung (hloeung) wrote :

LGTM

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

Change successfully merged at revision 562a3cc1aaeb05a0e28874ddbd6a597459c44f8f

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/src/config.yaml b/src/config.yaml
index 66f6105..b94071b 100644
--- a/src/config.yaml
+++ b/src/config.yaml
@@ -206,3 +206,9 @@ options:
206 Note: The complete datasource inserted into dashboard will be206 Note: The complete datasource inserted into dashboard will be
207 "$prometheus_datasource - Juju generated source"207 "$prometheus_datasource - Juju generated source"
208 This matches how the Prometheus2/Grafana charms format the datasource.208 This matches how the Prometheus2/Grafana charms format the datasource.
209 prometheus_ip_range:
210 default: ""
211 type: string
212 description: >
213 If set, the list of IP Ranges which are allowed to access metrics.
214 ex: prometheus_ip_range = "[192.168.0.0/24, 192.168.1.0/30]"
diff --git a/src/reactive/telegraf.py b/src/reactive/telegraf.py
index 82cf10e..47819cd 100644
--- a/src/reactive/telegraf.py
+++ b/src/reactive/telegraf.py
@@ -362,6 +362,13 @@ def get_prometheus_port():
362 return int(config.get("prometheus_output_port"))362 return int(config.get("prometheus_output_port"))
363363
364364
365def get_prometheus_ip_range():
366 config = hookenv.config()
367 if config.get("prometheus_ip_range") == "":
368 return []
369 return config.get("prometheus_ip_range").split(",")
370
371
365def get_socket_listener_port():372def get_socket_listener_port():
366 config = hookenv.config()373 config = hookenv.config()
367 if not config.get("socket_listener_port", False):374 if not config.get("socket_listener_port", False):
@@ -699,7 +706,9 @@ def handle_config_changes():
699 clear_flag("plugins.prometheus-client.configured")706 clear_flag("plugins.prometheus-client.configured")
700 clear_flag("prometheus-client.relation.configured")707 clear_flag("prometheus-client.relation.configured")
701708
702 if config.changed("prometheus_output_port"):709 if config.changed("prometheus_output_port") or config.changed(
710 "prometheus_ip_range"
711 ):
703 clear_flag("plugins.prometheus-client.configured")712 clear_flag("plugins.prometheus-client.configured")
704 clear_flag("prometheus-client.relation.configured")713 clear_flag("prometheus-client.relation.configured")
705 clear_flag("telegraf.configured")714 clear_flag("telegraf.configured")
@@ -1220,7 +1229,7 @@ def influxdb_api_output(influxdb):
1220 set_flag("telegraf.needs_reload")1229 set_flag("telegraf.needs_reload")
12211230
12221231
1223def generate_prometheus_output_config(prometheus_output_port):1232def generate_prometheus_output_config(prometheus_output_port, prometheus_ip_range):
1224 # If extra_options are set for prometheus_client, let's integrate them1233 # If extra_options are set for prometheus_client, let's integrate them
1225 extra_options = get_extra_options()1234 extra_options = get_extra_options()
1226 options = extra_options["outputs"].get("prometheus_client", {})1235 options = extra_options["outputs"].get("prometheus_client", {})
@@ -1239,21 +1248,27 @@ def generate_prometheus_output_config(prometheus_output_port):
1239 )1248 )
1240 listen = "{}:{}".format(listen.split(":", 1)[0], prometheus_output_port)1249 listen = "{}:{}".format(listen.split(":", 1)[0], prometheus_output_port)
12411250
1251 options_ip_range = options.pop("ip_range", [])
1252 ip_range = options_ip_range + prometheus_ip_range
1253
1242 return {1254 return {
1243 "listen": listen,1255 "listen": listen,
1256 "ip_range": ip_range,
1244 "extra_options": render_extra_options(1257 "extra_options": render_extra_options(
1245 "outputs", "prometheus_client", extra_options=extra_options1258 "outputs", "prometheus_client", extra_options=extra_options
1246 ),1259 ),
1247 }1260 }
12481261
12491262
1250def render_prometheus_client_config(port):1263def render_prometheus_client_config(port, ip_range):
1251 config_path = "{}/{}.conf".format(get_configs_dir(), "prometheus_client")1264 config_path = "{}/{}.conf".format(get_configs_dir(), "prometheus_client")
1252 hookenv.log(1265 hookenv.log(
1253 "Updating {} plugin config file. Port is {}".format("prometheus_client", port),1266 "Updating {} plugin config file. Port is {} and ip_range is {}".format(
1267 "prometheus_client", port, ip_range
1268 ),
1254 level=hookenv.INFO,1269 level=hookenv.INFO,
1255 )1270 )
1256 context = generate_prometheus_output_config(port)1271 context = generate_prometheus_output_config(port, ip_range)
1257 render(1272 render(
1258 source="prometheus_client.tmpl",1273 source="prometheus_client.tmpl",
1259 templates_dir=get_templates_dir(),1274 templates_dir=get_templates_dir(),
@@ -1301,7 +1316,11 @@ def configure_prometheus_client_with_relation(prometheus):
1301 ip_addr = None1316 ip_addr = None
1302 prometheus.configure(port, hostname=ip_addr, private_address=ip_addr)1317 prometheus.configure(port, hostname=ip_addr, private_address=ip_addr)
1303 check_prometheus_port("prometheus_output", port)1318 check_prometheus_port("prometheus_output", port)
1304 render_prometheus_client_config(port)1319 # If prometheus_ip_range is empty, all remote IPs are allowed
1320 ip_range = get_prometheus_ip_range()
1321 if ip_range != []:
1322 ip_range = ip_range + remote_egress_subnets
1323 render_prometheus_client_config(port, ip_range)
1305 set_flag("plugins.prometheus-client.configured")1324 set_flag("plugins.prometheus-client.configured")
1306 set_flag("prometheus-client.relation.configured")1325 set_flag("prometheus-client.relation.configured")
1307 set_flag("telegraf.needs_reload")1326 set_flag("telegraf.needs_reload")
@@ -1318,7 +1337,8 @@ def configure_prometheus_client():
1318 set_flag("plugins.prometheus-client.configured")1337 set_flag("plugins.prometheus-client.configured")
1319 return1338 return
1320 check_prometheus_port("prometheus_output", port)1339 check_prometheus_port("prometheus_output", port)
1321 render_prometheus_client_config(port)1340 ip_range = get_prometheus_ip_range()
1341 render_prometheus_client_config(port, ip_range)
1322 set_flag("plugins.prometheus-client.configured")1342 set_flag("plugins.prometheus-client.configured")
1323 set_flag("telegraf.needs_reload")1343 set_flag("telegraf.needs_reload")
1324 clear_flag("prometheus-client.relation.configured")1344 clear_flag("prometheus-client.relation.configured")
diff --git a/src/templates/prometheus_client.tmpl b/src/templates/prometheus_client.tmpl
index add2099..a6e3c06 100644
--- a/src/templates/prometheus_client.tmpl
+++ b/src/templates/prometheus_client.tmpl
@@ -1,3 +1,4 @@
1[[outputs.prometheus_client]]1[[outputs.prometheus_client]]
2 listen = "{{ listen }}"2 listen = "{{ listen }}"
3 ip_range = {{ ip_range }}
3{%- if extra_options %}{{ extra_options }}{%- endif %}4{%- if extra_options %}{{ extra_options }}{%- endif %}
diff --git a/src/tests/functional/tests/bundles/bionic-monitoring.yaml b/src/tests/functional/tests/bundles/bionic-monitoring.yaml
index 120eab8..c7a487b 100644
--- a/src/tests/functional/tests/bundles/bionic-monitoring.yaml
+++ b/src/tests/functional/tests/bundles/bionic-monitoring.yaml
@@ -8,6 +8,7 @@ applications:
8 num_units: 08 num_units: 0
9 options:9 options:
10 prometheus_datasource: prometheus210 prometheus_datasource: prometheus2
11 prometheus_ip_range: '0.0.0.0/0'
11 grafana:12 grafana:
12 charm: cs:grafana13 charm: cs:grafana
13 num_units: 114 num_units: 1
diff --git a/src/tests/unit/test_telegraf.py b/src/tests/unit/test_telegraf.py
index 88603c8..8146f3f 100644
--- a/src/tests/unit/test_telegraf.py
+++ b/src/tests/unit/test_telegraf.py
@@ -810,8 +810,9 @@ def test_prometheus_global(monkeypatch, config):
810 monkeypatch.setattr(telegraf.hookenv, "close_port", lambda p: open_ports.remove(p))810 monkeypatch.setattr(telegraf.hookenv, "close_port", lambda p: open_ports.remove(p))
811 config["prometheus_output_port"] = "default"811 config["prometheus_output_port"] = "default"
812 telegraf.configure_prometheus_client()812 telegraf.configure_prometheus_client()
813 expected = '''[[outputs.prometheus_client]]813 expected = """[[outputs.prometheus_client]]
814 listen = ":9103"'''814 listen = ":9103"
815 ip_range = []"""
815 config_file = base_dir().join("telegraf.d", "prometheus_client.conf")816 config_file = base_dir().join("telegraf.d", "prometheus_client.conf")
816 assert expected in config_file.read()817 assert expected in config_file.read()
817818
@@ -834,6 +835,7 @@ outputs:
834 telegraf.configure_prometheus_client()835 telegraf.configure_prometheus_client()
835 expected = """[[outputs.prometheus_client]]836 expected = """[[outputs.prometheus_client]]
836 listen = ":9103"837 listen = ":9103"
838 ip_range = []
837 namedrop = ["aerospike*"]839 namedrop = ["aerospike*"]
838 [outputs.prometheus_client.tagpass]840 [outputs.prometheus_client.tagpass]
839 cpu = ["cpu0"]"""841 cpu = ["cpu0"]"""
@@ -1147,18 +1149,36 @@ def test_prometheus_client_output(mocker, monkeypatch, config):
11471149
1148 interface = mocker.Mock(spec=RelationBase)1150 interface = mocker.Mock(spec=RelationBase)
1149 interface.configure = mocker.Mock()1151 interface.configure = mocker.Mock()
1152
1153 # Test that telegraf will allow scraping from related prometheus, and from ranges in
1154 # prometheus_ip_range
1155 config["prometheus_ip_range"] = "127.0.0.1/32,10.0.0.0/8"
1150 telegraf.configure_prometheus_client_with_relation(interface)1156 telegraf.configure_prometheus_client_with_relation(interface)
1151 expected = """1157 expected = """
1152 [[outputs.prometheus_client]]1158 [[outputs.prometheus_client]]
1153 listen = ":9103"1159 listen = ":9103"
1160 ip_range = ['127.0.0.1/32', '10.0.0.0/8', '5.6.7.8/32']
1154"""1161"""
1155 assert (1162 assert (
1156 configs_dir().join("prometheus_client.conf").read().strip() == expected.strip()1163 configs_dir().join("prometheus_client.conf").read().strip() == expected.strip()
1157 )1164 )
1165 # prometheus_ip_range is empty, test that all IPs are allowed, not just the related
1166 # prometheus
1167 # prometheus_output_port is also empty, we should get 9103 by default
1158 network_get_primary_address.assert_called_once_with("prometheus-client")1168 network_get_primary_address.assert_called_once_with("prometheus-client")
1159 interface.configure.assert_called_once_with(1169 interface.configure.assert_called_once_with(
1160 "9103", hostname="foo", private_address="foo"1170 "9103", hostname="foo", private_address="foo"
1161 )1171 )
1172 config["prometheus_ip_range"] = ""
1173 telegraf.configure_prometheus_client_with_relation(interface)
1174 expected = """
1175 [[outputs.prometheus_client]]
1176 listen = ":9103"
1177 ip_range = []
1178"""
1179 assert (
1180 configs_dir().join("prometheus_client.conf").read().strip() == expected.strip()
1181 )
11621182
11631183
1164def test_prometheus_client_output_departed(mocker, monkeypatch, config):1184def test_prometheus_client_output_departed(mocker, monkeypatch, config):

Subscribers

People subscribed via source and target branches

to all changes: