From 10cd6ba713be5c15d4de29f24a0c7d0120f95ee2 Mon Sep 17 00:00:00 2001 From: Mehdi Abaakouk Date: Thu, 28 Jun 2018 07:27:08 +0200 Subject: [PATCH] gnocchi: don't create metrics with resource Ceilometer creates metrics that will never get measures (service not polled, notification not configured). This is because we create all metrics during resource creation. That was done sometimes ago because Gnocchi was not provide metrics creating during batching process. But since a while now, we also create metrics (if missing) during the batch processing. This change removes the creation of metrics during resource creation. All metrics with measures got created during the batch call. This stops to have metric without measures in Gnocchi. Change-Id: I3f3b805722b11029aefdb76bae93413cb32ecff6 --- ceilometer/publisher/gnocchi.py | 6 +- .../tests/unit/publisher/test_gnocchi.py | 73 ++++++++++--------- ...no-metric-by-default-b643e09f5ffef2c4.yaml | 6 ++ 3 files changed, 44 insertions(+), 41 deletions(-) create mode 100644 releasenotes/notes/gnocchi-no-metric-by-default-b643e09f5ffef2c4.yaml diff --git a/ceilometer/publisher/gnocchi.py b/ceilometer/publisher/gnocchi.py index 0153c0ba..e6653f5c 100644 --- a/ceilometer/publisher/gnocchi.py +++ b/ceilometer/publisher/gnocchi.py @@ -358,8 +358,7 @@ def publish_samples(self, data): 'resource_type': rd.cfg['resource_type'], 'resource': {"id": resource_id, "user_id": sample.user_id, - "project_id": sample.project_id, - "metrics": rd.metrics}} + "project_id": sample.project_id}} gnocchi_data[resource_id].setdefault( "resource_extra", {}).update(rd.sample_attributes(sample)) @@ -373,9 +372,6 @@ def publish_samples(self, data): {'timestamp': sample.timestamp, 'value': sample.volume} ) - # TODO(gordc): unit should really be part of metric definition - gnocchi_data[resource_id]['resource']['metrics'][ - metric_name]['unit'] = sample.unit try: self.batch_measures(measures, gnocchi_data) diff --git a/ceilometer/tests/unit/publisher/test_gnocchi.py b/ceilometer/tests/unit/publisher/test_gnocchi.py index d6ca8eae..ff94245d 100644 --- a/ceilometer/tests/unit/publisher/test_gnocchi.py +++ b/ceilometer/tests/unit/publisher/test_gnocchi.py @@ -316,6 +316,43 @@ class PublisherWorkflowTest(base.BaseTestCase, testscenarios.TestWithScenarios): sample_scenarios = [ + ('cpu', dict( + sample=sample.Sample( + resource_id=str(uuid.uuid4()) + "_foobar", + name='cpu', + unit='ns', + type=sample.TYPE_CUMULATIVE, + volume=500, + user_id='test_user', + project_id='test_project', + source='openstack', + timestamp='2012-05-08 20:23:48.028195', + resource_metadata={ + 'host': 'foo', + 'image_ref': 'imageref!', + 'instance_flavor_id': 1234, + 'display_name': 'myinstance', + }, + ), + metric_attributes={ + "archive_policy_name": "ceilometer-low-rate", + "unit": "ns", + "measures": [{ + 'timestamp': '2012-05-08 20:23:48.028195', + 'value': 500 + }] + }, + postable_attributes={ + 'user_id': 'test_user', + 'project_id': 'test_project', + }, + patchable_attributes={ + 'host': 'foo', + 'image_ref': 'imageref!', + 'flavor_id': 1234, + 'display_name': 'myinstance', + }, + resource_type='instance')), ('disk.root.size', dict( sample=sample.Sample( resource_id=str(uuid.uuid4()) + "_foobar", @@ -352,20 +389,6 @@ class PublisherWorkflowTest(base.BaseTestCase, 'flavor_id': 1234, 'display_name': 'myinstance', }, - metric_names=[ - 'disk.root.size', 'disk.ephemeral.size', - 'memory', 'vcpus', 'memory.usage', 'memory.resident', - 'memory.swap.in', 'memory.swap.out', - 'memory.bandwidth.total', 'memory.bandwidth.local', - 'cpu', 'cpu.delta', 'cpu_util', 'vcpus', 'disk.read.requests', - 'cpu_l3_cache', 'perf.cpu.cycles', 'perf.instructions', - 'perf.cache.references', 'perf.cache.misses', - 'disk.read.requests.rate', 'disk.write.requests', - 'disk.write.requests.rate', 'disk.read.bytes', - 'disk.read.bytes.rate', 'disk.write.bytes', - 'disk.write.bytes.rate', 'disk.latency', 'disk.iops', - 'disk.capacity', 'disk.allocation', 'disk.usage', - 'compute.instance.booting.time'], resource_type='instance')), ('hardware.ipmi.node.power', dict( sample=sample.Sample( @@ -396,15 +419,6 @@ class PublisherWorkflowTest(base.BaseTestCase, }, patchable_attributes={ }, - metric_names=[ - 'hardware.ipmi.node.power', 'hardware.ipmi.node.temperature', - 'hardware.ipmi.node.inlet_temperature', - 'hardware.ipmi.node.outlet_temperature', - 'hardware.ipmi.node.fan', 'hardware.ipmi.node.current', - 'hardware.ipmi.node.voltage', 'hardware.ipmi.node.airflow', - 'hardware.ipmi.node.cups', 'hardware.ipmi.node.cpu_util', - 'hardware.ipmi.node.mem_util', 'hardware.ipmi.node.io_util' - ], resource_type='ipmi')), ] @@ -544,19 +558,6 @@ def test_workflow(self, fakeclient_cls, logger): attributes = self.postable_attributes.copy() attributes.update(self.patchable_attributes) attributes['id'] = self.sample.resource_id - attributes['metrics'] = dict((metric_name, {}) - for metric_name in self.metric_names) - for k, v in six.iteritems(attributes['metrics']): - if k in ["cpu", "disk.read.requests", "disk.write.requests", - "disk.read.bytes", "disk.write.bytes"]: - v["archive_policy_name"] = "ceilometer-low-rate" - else: - v["archive_policy_name"] = "ceilometer-low" - - if k == 'disk.root.size': - v['unit'] = 'GB' - elif k == 'hardware.ipmi.node.power': - v['unit'] = 'W' expected_calls.append(mock.call.resource.create( self.resource_type, attributes)) diff --git a/releasenotes/notes/gnocchi-no-metric-by-default-b643e09f5ffef2c4.yaml b/releasenotes/notes/gnocchi-no-metric-by-default-b643e09f5ffef2c4.yaml new file mode 100644 index 00000000..2178f217 --- /dev/null +++ b/releasenotes/notes/gnocchi-no-metric-by-default-b643e09f5ffef2c4.yaml @@ -0,0 +1,6 @@ +--- +issues: + - | + Ceilometer created metrics that could never get measures depending on the + polling configuration. Metrics are now created only if Ceilometer gets at + least a measure for them.