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
  • Loading branch information
sileht authored and dchavoll committed Aug 15, 2018
1 parent 27064b6 commit 10cd6ba
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 10cd6ba

Please sign in to comment.