def validate_sli(config, data_source): if 'zmon_url' not in config: config = set_config_file() zmon = Zmon(config['zmon_url'], token=zign.api.get_token('uid', ['uid'])) check_id = int(data_source['definition']['check_id']) try: zmon.get_check_definition(check_id) except: raise SLRClientError( 'Check definition {} does not seem to exist!'.format(check_id)) alerts = zmon.get_alert_definitions() filtered = [ alert for alert in alerts if alert['check_definition_id'] == check_id ] if not filtered: raise SLRClientError( 'Check definition has no alerts. Please create an Alert for this check on ZMON.' ) keys = data_source['definition']['keys'] sli_exists = False sample_data = {} for alert in filtered: if sli_exists: break alert_data = zmon.get_alert_data(alert['id']) values = { v['entity']: v['results'][0]['value'] for v in alert_data if len(v['results']) } for entity, data in values.items(): if type(data) is dict: data_keys = data.keys() if data_keys: sample_data = data_keys if not (set(keys) - set(data_keys)): sli_exists = True break if not sli_exists: raise SLRClientError( 'Some SLI keys do not exist. Please check the data returned from the check and the corresponding keys ' 'in the data-source. Found the following keys returned from check {}: {}' .format(check_id, set(sample_data)))
def validate_sli_source(config, source, ignore_keys=False): if 'zmon_url' not in config: config = set_config_file() zmon = Zmon(config['zmon_url'], token=zign.api.get_token('uid', ['uid'])) check_id = int(source['check_id']) try: check = zmon.get_check_definition(check_id) except Exception: raise SLRClientError( 'Check definition {} does not seem to exist!'.format(check_id)) alerts = zmon.get_alert_definitions() filtered = [ alert for alert in alerts if alert['check_definition_id'] == check_id ] if not filtered: raise SLRClientError( 'Check definition has no alerts. Please create an Alert for this check on ZMON {}' .format(zmon.check_definition_url(check))) if ignore_keys: return keys = [k for k in source['keys'] if '.*' not in k] if not keys: # Do not validate keys if we have wildcards return sli_exists = False sample_data = set() for alert in filtered: if sli_exists: break alert_data = zmon.get_alert_data(alert['id']) values = { v['entity']: v['results'][0]['value'] for v in alert_data if len(v['results']) } for entity, data in values.items(): if type(data) is dict: flattened = flatten(data) data_keys = flattened.keys() sample_data.update(list(data_keys)) if not (set(keys) - set(data_keys)): sli_exists = True break if not sli_exists: raise SLRClientError( 'Some SLI keys do not exist. Please check the data returned from the check and the corresponding keys ' 'in the SLI source. Found the following keys returned from check {}: {}' .format(check_id, set(sample_data)))
def test_zmon_get_check_defintion(monkeypatch, text, result): get = MagicMock() get.return_value.text = text get.return_value.json.return_value = result if type(result) != dict: get.return_value.raise_for_status.side_effect = result monkeypatch.setattr('requests.Session.get', get) zmon = Zmon(URL, token=TOKEN) if type(result) == dict: res = zmon.get_check_definition(1) assert res == result else: with pytest.raises(result): zmon.get_check_definition(1) get.assert_called_with(zmon.endpoint(client.CHECK_DEF, 1))