X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;ds=inline;f=osm_mon%2Fevaluator%2Fbackends%2Fprometheus.py;h=070cf691e0ddd1449efb3597d4f67f2b448ecc6c;hb=refs%2Fchanges%2F63%2F7963%2F2;hp=9ff50d6c76ada0476b50d3ef8ecacf5d8e36d111;hpb=4cd39554442ed6384a35f6542e08c25a7a3aa2cf;p=osm%2FMON.git diff --git a/osm_mon/evaluator/backends/prometheus.py b/osm_mon/evaluator/backends/prometheus.py index 9ff50d6..070cf69 100644 --- a/osm_mon/evaluator/backends/prometheus.py +++ b/osm_mon/evaluator/backends/prometheus.py @@ -38,24 +38,36 @@ class PrometheusBackend(BaseBackend): super().__init__(config) self.conf = config - def get_metric_value(self, metric_name, nsr_id, vdur_name, vnf_member_index): - query_section = "query={0}{{ns_id=\"{1}\",vdu_name=\"{2}\",vnf_member_index=\"{3}\"}}".format( - OSM_METRIC_PREFIX + metric_name, nsr_id, vdur_name, vnf_member_index) - request_url = self.conf.get('prometheus', 'url') + "/api/v1/query?" + query_section + def get_metric_value(self, metric_name: str, tags: dict): + query = self._build_query(metric_name, tags) + request_url = self._build_url(query) log.info("Querying Prometheus: %s", request_url) r = requests.get(request_url, timeout=int(self.conf.get('global', 'request_timeout'))) if r.status_code == 200: json_response = r.json() if json_response['status'] == 'success': - result = json_response['data']['result'] - if len(result): - metric_value = float(result[0]['value'][1]) - log.info("Metric value: %s", metric_value) - return metric_value - else: - return None + return self._get_metric_value_from_response(json_response) else: log.warning("Prometheus response is not success. Got status %s", json_response['status']) else: log.warning("Error contacting Prometheus. Got status code %s: %s", r.status_code, r.text) return None + + def _build_query(self, metric_name: str, tags: dict) -> str: + query_section_tags = [] + for k, v in tags.items(): + query_section_tags.append(k + '=\"' + v + '\"') + query_section = "query={0}{{{1}}}".format(OSM_METRIC_PREFIX + metric_name, ','.join(query_section_tags)) + return query_section + + def _build_url(self, query: str): + return self.conf.get('prometheus', 'url') + "/api/v1/query?" + query + + def _get_metric_value_from_response(self, json_response): + result = json_response['data']['result'] + if len(result): + metric_value = float(result[0]['value'][1]) + log.info("Metric value: %s", metric_value) + return metric_value + else: + return None