diff --git a/config.yaml b/config.yaml index a486c4e..5cf2da3 100644 --- a/config.yaml +++ b/config.yaml @@ -255,3 +255,16 @@ options: description: | When set the content is written to /etc/ceilometer/pipeline.yaml, by default the package's file is used. + polling-interval: + type: int + default: 300 + description: | + Number of seconds between Ceilometer central agent pollster collections. + This setting only takes effect from Queens onwards. + enable-all-pollsters: + type: boolean + default: False + description: | + From Pike onwards, the default ceilometer pollster collection runs a + limited set of pollsters. Enable this to run all the available pollsters. + This setting only takes effect from Queens onwards. diff --git a/lib/ceilometer_contexts.py b/lib/ceilometer_contexts.py index 9023c92..01f73bd 100644 --- a/lib/ceilometer_contexts.py +++ b/lib/ceilometer_contexts.py @@ -106,6 +106,8 @@ class CeilometerContext(OSContextGenerator): 'metering_secret': get_shared_secret(), 'metering_time_to_live': int(config('metering-time-to-live')), 'event_time_to_live': int(config('event-time-to-live')), + 'polling_interval': int(config('polling-interval')), + 'enable_all_pollsters': config('enable-all-pollsters'), } return ctxt diff --git a/lib/ceilometer_utils.py b/lib/ceilometer_utils.py index e9a12f9..838ffe8 100644 --- a/lib/ceilometer_utils.py +++ b/lib/ceilometer_utils.py @@ -71,6 +71,7 @@ HAPROXY_CONF = '/etc/haproxy/haproxy.cfg' CEILOMETER_CONF_DIR = "/etc/ceilometer" CEILOMETER_CONF = "%s/ceilometer.conf" % CEILOMETER_CONF_DIR CEILOMETER_PIPELINE_YAML = "%s/pipeline.yaml" % CEILOMETER_CONF_DIR +POLLING_CONF = "%s/polling.yaml" % CEILOMETER_CONF_DIR CEILOMETER_API_SYSTEMD_CONF = ( '/etc/systemd/system/ceilometer-api.service.d/override.conf' ) @@ -160,6 +161,11 @@ QUEENS_CONFIG_FILES = OrderedDict([ AMQPListenersContext(ssl_dir=CEILOMETER_CONF_DIR)], 'services': QUEENS_SERVICES }), + (POLLING_CONF, { + 'hook_contexts': [ + CeilometerContext()], + 'services': QUEENS_SERVICES + }), ]) CONFIG_FILES = OrderedDict([ diff --git a/templates/polling.yaml b/templates/polling.yaml new file mode 100644 index 0000000..5fb8d73 --- /dev/null +++ b/templates/polling.yaml @@ -0,0 +1,31 @@ +--- +sources: + - name: juju_pollsters + interval: {{ polling_interval }} + meters: +{%- if enable_all_pollsters %} + - "*" +{%- else %} + - cpu + - cpu_l3_cache + - memory.usage + - network.incoming.bytes + - network.incoming.packets + - network.outgoing.bytes + - network.outgoing.packets + - disk.device.read.bytes + - disk.device.read.requests + - disk.device.write.bytes + - disk.device.write.requests + - hardware.cpu.util + - hardware.memory.used + - hardware.memory.total + - hardware.memory.buffer + - hardware.memory.cached + - hardware.memory.swap.avail + - hardware.memory.swap.total + - hardware.system_stats.io.outgoing.blocks + - hardware.system_stats.io.incoming.blocks + - hardware.network.ip.incoming.datagrams + - hardware.network.ip.outgoing.datagrams +{%- endif %} diff --git a/unit_tests/test_ceilometer_contexts.py b/unit_tests/test_ceilometer_contexts.py index d9c41ae..e70a65e 100644 --- a/unit_tests/test_ceilometer_contexts.py +++ b/unit_tests/test_ceilometer_contexts.py @@ -131,6 +131,8 @@ class CeilometerContextsTest(CharmTestCase): 'metering_secret': 'mysecret', 'metering_time_to_live': -1, 'event_time_to_live': -1, + 'polling_interval': 300, + 'enable_all_pollsters': False, }) @patch.object(utils, 'get_shared_secret') @@ -144,10 +146,40 @@ class CeilometerContextsTest(CharmTestCase): 'metering_secret': 'mysecret', 'metering_time_to_live': 7776000, 'event_time_to_live': 7776000, + 'polling_interval': 300, + 'enable_all_pollsters': False, }) self.assertTrue(type(context['metering_time_to_live']) is int) self.assertTrue(type(context['event_time_to_live']) is int) + @patch.object(utils, 'get_shared_secret') + def test_ceilometer_context_enable_all_pollsters(self, secret): + secret.return_value = 'mysecret' + self.test_config.set('enable-all-pollsters', True) + context = contexts.CeilometerContext()() + self.assertEqual(context, { + 'port': 8777, + 'metering_secret': 'mysecret', + 'metering_time_to_live': -1, + 'event_time_to_live': -1, + 'polling_interval': 300, + 'enable_all_pollsters': True, + }) + + @patch.object(utils, 'get_shared_secret') + def test_ceilometer_context_polling_interval(self, secret): + secret.return_value = 'mysecret' + self.test_config.set('polling-interval', 900) + context = contexts.CeilometerContext()() + self.assertEqual(context, { + 'port': 8777, + 'metering_secret': 'mysecret', + 'metering_time_to_live': -1, + 'event_time_to_live': -1, + 'polling_interval': 900, + 'enable_all_pollsters': False, + }) + def test_ceilometer_service_context(self): self.relation_ids.return_value = ['ceilometer-service:0'] self.related_units.return_value = ['ceilometer/0'] diff --git a/unit_tests/test_ceilometer_utils.py b/unit_tests/test_ceilometer_utils.py index 70b0922..26b6d49 100644 --- a/unit_tests/test_ceilometer_utils.py +++ b/unit_tests/test_ceilometer_utils.py @@ -176,6 +176,9 @@ class CeilometerUtilsTest(CharmTestCase): {'/etc/ceilometer/ceilometer.conf': [ 'ceilometer-agent-central', 'ceilometer-agent-notification'], + '/etc/ceilometer/polling.yaml': [ + 'ceilometer-agent-central', + 'ceilometer-agent-notification'], } )