Skip to content

Commit

Permalink
fix(metric-errors): fixing labeling bugs
Browse files Browse the repository at this point in the history
* Added test showing the metrics problem with different access privs

Signed-off-by: Martin Kremers <[email protected]>

* fix(wrong labels): restricted access user resultet in wrong labeling

Signed-off-by: Martin Kremers <[email protected]>

Precommit-Verified: 2c286246f4ed6f28b351d7ee9e2966f72d21bfe407f3b7f5a303e1271633fb71
  • Loading branch information
kremers authored and pryorda committed Jun 4, 2019
1 parent 68db001 commit a1bb45a
Show file tree
Hide file tree
Showing 2 changed files with 141 additions and 10 deletions.
122 changes: 122 additions & 0 deletions tests/unit/test_vmware_exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,128 @@ def test_collect_vms():
assert metrics['vmware_vm_memory_max'].samples[0][2] == 1024


@pytest_twisted.inlineCallbacks
# @pytest.mark.skip
def test_metrics_without_hostaccess():
boot_time = EPOCH + datetime.timedelta(seconds=60)
disk = mock.Mock()
disk.diskPath = '/boot'
disk.capacity = 100
disk.freeSpace = 50

collect_only = {
'vms': True,
'vmguests': True,
'datastores': False,
'hosts': False,
'snapshots': False,
}

collector = VmwareCollector(
'127.0.0.1',
'root',
'password',
collect_only,
)
metrics = collector._create_metric_containers()
collector.content = _succeed(mock.Mock())
collector.__dict__['host_labels'] = _succeed({'': []})

with mock.patch.object(collector, 'batch_fetch_properties') as batch_fetch_properties:
batch_fetch_properties.return_value = _succeed({
'vm-1': {
'name': 'vm-x',
'runtime.host': vim.ManagedObject('notfound:1'),
'runtime.powerState': 'poweredOn',
'summary.config.numCpu': 1,
'summary.config.memorySizeMB': 1024,
'runtime.bootTime': boot_time,
'guest.disk': [disk],
'guest.toolsStatus': 'toolsOk',
'guest.toolsVersion': '10336',
'guest.toolsVersionStatus2': 'guestToolsUnmanaged',
}
})
assert collector.vm_labels.result == {'vm-1': ['vm-x']}
yield collector._vmware_get_vms(metrics)

# 113 AssertionError {'partition': '/boot'} vs {'host_name': '/boot'}
assert metrics['vmware_vm_guest_disk_capacity'].samples[0][1] == {
'vm_name': 'vm-x',
'partition': '/boot',
'host_name': 'n/a',
'cluster_name': 'n/a',
'dc_name': 'n/a',
}

# Fail due to expected labels ['vm-1', 'host-1', 'dc', 'cluster-1']
# but found ['vm-1']
assert metrics['vmware_vm_power_state'].samples[0][1] == {
'vm_name': 'vm-x',
'host_name': 'n/a',
'cluster_name': 'n/a',
'dc_name': 'n/a',
}


@pytest_twisted.inlineCallbacks
def test_no_error_onempty_vms():
collect_only = {
'vms': True,
'vmguests': True,
'datastores': False,
'hosts': False,
'snapshots': False,
}
collector = VmwareCollector(
'127.0.0.1',
'root',
'password',
collect_only,
ignore_ssl=True,
)

metrics = collector._create_metric_containers()

metric_1 = mock.Mock()
metric_1.id.counterId = 9
metric_1.value = [9]

metric_2 = mock.Mock()
metric_2.id.counterId = 1
metric_2.value = [1]

ent_1 = mock.Mock()
ent_1.value = [metric_1, metric_2]
ent_1.entity = vim.ManagedObject('vm:1')

content = mock.Mock()
content.perfManager.QueryStats.return_value = [ent_1]
collector.content = _succeed(content)

collector.__dict__['counter_ids'] = _succeed({
'cpu.ready.summation': 1,
'cpu.usage.average': 2,
'cpu.usagemhz.average': 3,
'disk.usage.average': 4,
'disk.read.average': 5,
'disk.write.average': 6,
'mem.usage.average': 7,
'net.received.average': 8,
'net.transmitted.average': 9,
})

collector.__dict__['vm_labels'] = _succeed({'': []})
collector.__dict__['vm_inventory'] = _succeed({'': {}})

# Try to test for querySpec=[]
# threads.deferToThread(content.perfManager.QueryStats, querySpec=specs),
# TypeError Required field "querySpec" not provided (not @optional)
yield collector._vmware_get_vm_perf_manager_metrics(metrics)

assert metrics['vmware_vm_power_state'].samples == []


@pytest_twisted.inlineCallbacks
def test_collect_vm_perf():
collect_only = {
Expand Down
29 changes: 19 additions & 10 deletions vmware_exporter/vmware_exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -597,17 +597,19 @@ def _vmware_get_vm_perf_manager_metrics(self, vm_metrics):

content = yield self.content

results, labels = yield parallelize(
threads.deferToThread(content.perfManager.QueryStats, querySpec=specs),
self.vm_labels,
)
if len(specs) > 0:
results, labels = yield parallelize(
threads.deferToThread(content.perfManager.QueryStats, querySpec=specs),
self.vm_labels,
)

for ent in results:
for metric in ent.value:
vm_metrics[metric_names[metric.id.counterId]].add_metric(
labels[ent.entity._moId],
float(sum(metric.value)),
)

for ent in results:
for metric in ent.value:
vm_metrics[metric_names[metric.id.counterId]].add_metric(
labels[ent.entity._moId],
float(sum(metric.value)),
)
logging.info('FIN: _vmware_get_vm_perf_manager_metrics')

@defer.inlineCallbacks
Expand All @@ -626,6 +628,13 @@ def _vmware_get_vms(self, metrics):
continue

labels = vm_labels[moid]
labels_cnt = len(labels)

if labels_cnt < 4:
logging.info("Only ${cnt}/4 labels (vm, host, dc, cluster) found, filling n/a".format(cnt=labels_cnt))

for i in range(labels_cnt, 4):
labels.append('n/a')

if 'runtime.powerState' in row:
power_state = 1 if row['runtime.powerState'] == 'poweredOn' else 0
Expand Down

0 comments on commit a1bb45a

Please sign in to comment.