determine instance id from instance ip in Prometheus datasource
Change-Id: Ib3149d00d63aa67e76dde6fd14ec3d07b87f75e5
This commit is contained in:
parent
4686377074
commit
454698ff54
@ -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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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}
|
|
||||||
|
@ -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():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user