Skip to content

Commit

Permalink
gnocchi: don't create metrics with resource
Browse files Browse the repository at this point in the history
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 10cd6ba)
original commit 826ba35c6eb9900bb0a557f6e4f06f7d1b9bd394
StoryBoard:
“Various backports to core openstack components to pick up fixes”
https://storyboard.openstack.org/#!/story/2003407
  • Loading branch information
sileht authored and dchavoll committed Aug 28, 2018
1 parent 674a4ff commit e9c65b1
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 41 deletions.
6 changes: 1 addition & 5 deletions ceilometer/publisher/gnocchi.py
Expand Up @@ -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))
Expand All @@ -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)
Expand Down
73 changes: 37 additions & 36 deletions ceilometer/tests/unit/publisher/test_gnocchi.py
Expand Up @@ -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",
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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')),
]

Expand Down Expand Up @@ -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))

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

0 comments on commit e9c65b1

Please sign in to comment.