X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_mon%2Fevaluator%2Fbackends%2Fprometheus.py;h=ad4919f5a544dd377d7e41d9c36fdef155b34902;hb=32f92ce2d3df9e66686cebe499a51c0964c23acb;hp=9ff50d6c76ada0476b50d3ef8ecacf5d8e36d111;hpb=a97bdb3eafa4f3d07d61d32635f7f36f5cc36c58;p=osm%2FMON.git diff --git a/osm_mon/evaluator/backends/prometheus.py b/osm_mon/evaluator/backends/prometheus.py index 9ff50d6..ad4919f 100644 --- a/osm_mon/evaluator/backends/prometheus.py +++ b/osm_mon/evaluator/backends/prometheus.py @@ -20,7 +20,9 @@ # For those usages not covered by the Apache License, Version 2.0 please # contact: bdiaz@whitestack.com or glavado@whitestack.com ## +import base64 import logging +from typing import Dict import requests @@ -29,33 +31,71 @@ from osm_mon.evaluator.backends.base import BaseBackend log = logging.getLogger(__name__) -OSM_METRIC_PREFIX = 'osm_' +OSM_METRIC_PREFIX = "osm_" class PrometheusBackend(BaseBackend): - def __init__(self, config: Config): 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) + request_headers = self._build_headers() + return self._query_metric(request_url, request_headers) + + def _query_metric(self, request_url: str, headers: Dict[str, str]): log.info("Querying Prometheus: %s", request_url) - r = requests.get(request_url, timeout=int(self.conf.get('global', 'request_timeout'))) + r = requests.get( + request_url, + timeout=int(self.conf.get("global", "request_timeout")), + headers=headers, + ) 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 + if json_response["status"] == "success": + return self._get_metric_value_from_response(json_response) else: - log.warning("Prometheus response is not success. Got status %s", json_response['status']) + 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) + 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 _build_headers(self) -> Dict[str, str]: + headers = {} + user = self.conf.get("prometheus", "user") + password = self.conf.get("prometheus", "password") + if user and password: + _phrase = f"{user}:{password}".encode("utf-8") + token = base64.b64encode(_phrase).decode("utf-8") + headers["Authorization"] = f"Basic {token}" + return headers + + 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