X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_mon%2Fevaluator%2Fbackends%2Fprometheus.py;h=c5b935ee3dd2cf99034bb7ba2b2cef0569cae9b0;hb=HEAD;hp=94024d7b7bdba906c18bc372735704a51f379441;hpb=8e4179facf22c8096992f0a83caeec9f2f4996c7;p=osm%2FMON.git diff --git a/osm_mon/evaluator/backends/prometheus.py b/osm_mon/evaluator/backends/prometheus.py index 94024d7..c5b935e 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, List import requests @@ -31,23 +33,31 @@ log = logging.getLogger(__name__) OSM_METRIC_PREFIX = "osm_" +DEFAULT_QUERY_METRICS = ["ns_id", "vnf_member_index", "vdu_name"] + class PrometheusBackend(BaseBackend): def __init__(self, config: Config): super().__init__(config) self.conf = config - def get_metric_value(self, metric_name: str, tags: dict): + def get_metric_data(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")) + 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": - return self._get_metric_value_from_response(json_response) + return self._get_metric_data_from_response(json_response) else: log.warning( "Prometheus response is not success. Got status %s", @@ -73,11 +83,25 @@ class PrometheusBackend(BaseBackend): 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): + 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_data_from_response(self, json_response) -> List[Dict[str, str]]: result = json_response["data"]["result"] + metrics_data = [] if len(result): - metric_value = float(result[0]["value"][1]) - log.info("Metric value: %s", metric_value) - return metric_value + for metric in result: + metrics_labels = metric["metric"] + metric_value = float(metric["value"][1]) + log.info("Metric value: %s", metric_value) + metrics_data.append({"labels": metrics_labels, "value": metric_value}) + return metrics_data else: return None