determine instance id from instance ip in Prometheus datasource

Change-Id: Ib3149d00d63aa67e76dde6fd14ec3d07b87f75e5
This commit is contained in:
Muhamad Najjar 2018-08-02 10:11:16 +00:00
parent 4686377074
commit 454698ff54
4 changed files with 41 additions and 16 deletions

View File

@ -28,6 +28,7 @@ from vitrage.datasources.prometheus.properties import PrometheusLabels \
as PLabels as PLabels
from vitrage.datasources.prometheus.properties import PrometheusProperties \ from vitrage.datasources.prometheus.properties import PrometheusProperties \
as PProps as PProps
from vitrage import os_clients
LOG = log.getLogger(__name__) LOG = log.getLogger(__name__)
@ -41,6 +42,13 @@ class PrometheusDriver(AlarmDriverBase):
super(PrometheusDriver, self).__init__() super(PrometheusDriver, self).__init__()
self.conf = conf self.conf = conf
self._client = None self._client = None
self._nova_client = None
@property
def nova_client(self):
if not self._nova_client:
self._nova_client = os_clients.nova_client(self.conf)
return self._nova_client
def _vitrage_type(self): def _vitrage_type(self):
return PROMETHEUS_DATASOURCE return PROMETHEUS_DATASOURCE
@ -137,13 +145,24 @@ class PrometheusDriver(AlarmDriverBase):
for alarm in details.get(PProps.ALERTS, []): for alarm in details.get(PProps.ALERTS, []):
alarm[DSProps.EVENT_TYPE] = event_type alarm[DSProps.EVENT_TYPE] = event_type
alarm[PProps.STATUS] = details[PProps.STATUS] alarm[PProps.STATUS] = details[PProps.STATUS]
instance_id = get_label(alarm, PLabels.INSTANCE)
if ':' in instance_id:
instance_id = instance_id[:instance_id.index(':')]
# The 'instance' label can be instance ip or hostname.
# we try to fetch the instance id from nova by its ip,
# and if not found we leave it as it is.
nova_instance = self.nova_client.servers.list(
search_opts={'all_tenants': 1, 'ip': instance_id})
if nova_instance:
instance_id = nova_instance[0].id
alarm[PLabels.INSTANCE_ID] = instance_id
old_alarm = self._old_alarm(alarm) old_alarm = self._old_alarm(alarm)
alarm = \ alarm = self._filter_and_cache_alarm(
self._filter_and_cache_alarm(alarm, alarm, old_alarm,
old_alarm, self._filter_get_erroneous,
self._filter_get_erroneous, get_alarm_update_time(alarm))
get_alarm_update_time(alarm))
if alarm: if alarm:
alarms.append(alarm) alarms.append(alarm)

View File

@ -37,6 +37,7 @@ class PrometheusAnnotations(object):
class PrometheusLabels(object): class PrometheusLabels(object):
SEVERITY = 'severity' SEVERITY = 'severity'
INSTANCE = 'instance' INSTANCE = 'instance'
INSTANCE_ID = 'instance_id'
ALERT_NAME = 'alertname' # A (unique?) name of the alert ALERT_NAME = 'alertname' # A (unique?) name of the alert

View File

@ -86,8 +86,7 @@ class PrometheusTransformer(AlarmTransformerBase):
@staticmethod @staticmethod
def get_enrich_query(event): def get_enrich_query(event):
LOG.debug('event for enrich query: %s', str(event)) LOG.debug('event for enrich query: %s', str(event))
hostname = get_label(event, PLabels.INSTANCE) instance_id = event.get(PLabels.INSTANCE_ID)
if not hostname: if not instance_id:
return None return None
hostname = hostname[:hostname.index(':')] return {VProps.ID: instance_id}
return {VProps.ID: hostname}

View File

@ -12,6 +12,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from mock import mock
from oslo_config import cfg from oslo_config import cfg
from testtools import matchers from testtools import matchers
@ -34,15 +35,20 @@ class PrometheusDriverTest(base.BaseTest):
cls.conf.register_opts(cls.OPTS, group=PROMETHEUS_DATASOURCE) cls.conf.register_opts(cls.OPTS, group=PROMETHEUS_DATASOURCE)
def test_enrich_event(self): def test_enrich_event(self):
# Test setup with (mock.patch('vitrage.datasources.prometheus.driver.'
driver = PrometheusDriver(self.conf) 'PrometheusDriver.nova_client')) as mock_nova_client:
event = self._generate_event()
# Enrich event mock_nova_client.servers.list.return_value = None
created_events = driver.enrich_event(event, PROMETHEUS_EVENT_TYPE)
# Test assertions # Test setup
self._assert_event_equal(created_events, PROMETHEUS_EVENT_TYPE) driver = PrometheusDriver(self.conf)
event = self._generate_event()
# Enrich event
created_events = driver.enrich_event(event, PROMETHEUS_EVENT_TYPE)
# Test assertions
self._assert_event_equal(created_events, PROMETHEUS_EVENT_TYPE)
@staticmethod @staticmethod
def _generate_event(): def _generate_event():