From a226b47216e76ec209818b900253d3c1f1ffc3aa 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 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 (cherry picked from commit 10cd6ba713be5c15d4de29f24a0c7d0120f95ee2) original commit 826ba35c6eb9900bb0a557f6e4f06f7d1b9bd394 StoryBoard: “Various backports to core openstack components to pick up fixes” https://storyboard.openstack.org/#!/story/2003407 --- 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.