From 826ba35c6eb9900bb0a557f6e4f06f7d1b9bd394 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 496c34d57e..1673ee693e 100644 --- a/ceilometer/publisher/gnocchi.py +++ b/ceilometer/publisher/gnocchi.py @@ -356,8 +356,7 @@ class GnocchiPublisher(publisher.ConfigPublisherBase): '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)) @@ -371,9 +370,6 @@ class GnocchiPublisher(publisher.ConfigPublisherBase): {'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 a2cd1f6b61..821e8705af 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 @@ class PublisherWorkflowTest(base.BaseTestCase, 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 0000000000..2178f2172a --- /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.