nova/nova/compute/monitors/base.py

78 lines
2.9 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import abc
import six
from nova.objects import fields
@six.add_metaclass(abc.ABCMeta)
class MonitorBase(object):
"""Base class for all resource monitor plugins.
A monitor is responsible for adding a set of related metrics to
a `nova.objects.MonitorMetricList` object after the monitor has
performed some sampling or monitoring action.
"""
def __init__(self, compute_manager):
self.compute_manager = compute_manager
self.source = None
@abc.abstractmethod
def get_metric_names(self):
"""Get available metric names.
Get available metric names, which are represented by a set of keys
that can be used to check conflicts and duplications
:returns: set containing one or more values from
:py:attr: nova.objects.fields.MonitorMetricType.ALL
"""
raise NotImplementedError('get_metric_names')
@abc.abstractmethod
def populate_metrics(self, metric_list):
"""Monitors are responsible for populating this metric_list object
with nova.objects.MonitorMetric objects with values collected via
the respective compute drivers.
Note that if the monitor class is responsible for tracking a *related*
set of metrics -- e.g. a set of percentages of CPU time allocated to
user, kernel, and idle -- it is the responsibility of the monitor
implementation to do a single sampling call to the underlying monitor
to ensure that related metric values make logical sense.
:param metric_list: A mutable reference of the metric list object
"""
raise NotImplementedError('populate_metrics')
class CPUMonitorBase(MonitorBase):
"""Base class for all monitors that return CPU-related metrics."""
def get_metric_names(self):
return set([
fields.MonitorMetricType.CPU_FREQUENCY,
fields.MonitorMetricType.CPU_USER_TIME,
fields.MonitorMetricType.CPU_KERNEL_TIME,
fields.MonitorMetricType.CPU_IDLE_TIME,
fields.MonitorMetricType.CPU_IOWAIT_TIME,
fields.MonitorMetricType.CPU_USER_PERCENT,
fields.MonitorMetricType.CPU_KERNEL_PERCENT,
fields.MonitorMetricType.CPU_IDLE_PERCENT,
fields.MonitorMetricType.CPU_IOWAIT_PERCENT,
fields.MonitorMetricType.CPU_PERCENT,
])