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
This commit is contained in:
Mehdi Abaakouk 2018-06-28 07:27:08 +02:00
parent 3387eb2183
commit 826ba35c6e
3 changed files with 44 additions and 41 deletions

View File

@ -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)

View File

@ -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))

View File

@ -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.