From 7663a9fea92bda6e771673e938a25cdeb6048917 Mon Sep 17 00:00:00 2001 From: Patryk Gudalewicz Date: Sun, 4 Jun 2023 22:37:59 +0200 Subject: [PATCH] New version of DashboardAsCode including Traffic and Latency basing on current SLOs definitions --- createDash.py | 53 +++++++++++++++++++++++++++--------------------- requirements.txt | 3 ++- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/createDash.py b/createDash.py index d9acb72..f78e378 100644 --- a/createDash.py +++ b/createDash.py @@ -5,15 +5,20 @@ import argparse import requests from datetime import datetime from git import Repo +from KRParser import krparser import os import re +import warnings +warnings.filterwarnings("ignore") #set STAGING global dashboard name -DASHBOARD_NAME = "[STAGING]Global Offboard Reliability 2.0 - " +DASHBOARD_NAME = "[STAGING]Global Offboard Reliability 2.1 - " AUTHSTRING = config("BITBUCKET_USERNAME")+":"+config("BITBUCKET_TOKEN") CONFIG_REPO_URL = "https://"+AUTHSTRING+"@atc.bmwgroup.net/bitbucket/scm/opapm/shared_configuration.git" CONFIG_REPO_NAME = "shared_configuration" ARCHIVE_REPO_URL = "https://"+AUTHSTRING+"@atc.bmwgroup.net/bitbucket/scm/opapm/archive.git" ARCHIVE_REPO_NAME = "archive" +KEYREQ_REPO_URL = "https://"+AUTHSTRING+"@atc.bmwgroup.net/bitbucket/scm/opapm/keyrequestparser.git" +KEYREQ_REPO_NAME = "keyrequestparser" BUSINESS_LINES = {'DE-3':'My Journey','DE-7':'Connected Vehicle Platform','DE-4':'My Life','EC-DE':'China Services'} parser = argparse.ArgumentParser(description="Generate and deploy the Dynatrace Global Dashboard as Code. Auto deployment works only for STAGING dashboard", formatter_class=argparse.ArgumentDefaultsHelpFormatter) @@ -318,24 +323,20 @@ def create_default_tiles(): def getSloReqCountSelector(service_names): selector = "" if(service_names["selectortype"] == "KR"): - service_names = service_names["namestr"] + service_names = service_names["services"] print("Building Keyrequest count selector for: "+service_names) selector = "builtin:service.keyRequest.count.total:filter(and(or(in(\"dt.entity.service_method\",entitySelector(\"type(service_method), fromRelationship.isServiceMethodOfService( type(~\"SERVICE~\"),entityName.in("+service_names+"))\"))))):splitBy()" elif(service_names["selectortype"] == "SRV"): - service_names = service_names["namestr"] + service_names = service_names["services"] print("Building Service requests count selector for: "+service_names) selector = "builtin:service.requestCount.total:filter(and(or(in(\"dt.entity.service\",entitySelector(\"type(service),entityName.in("+service_names+")\"))))):splitBy()" return selector def getSloReqTimeSelector(service_names): selector = "" if(service_names["selectortype"] == "KR"): - service_names = service_names["namestr"] - print("Building Keyrequest time selector for: "+service_names) - selector = "builtin:service.keyRequest.response.server:filter(and(or(in(\"dt.entity.service_method\",entitySelector(\"type(service_method), fromRelationship.isServiceMethodOfService( type(~\"SERVICE~\"),entityName.in("+service_names+"))\"))))):splitBy()" + selector = "builtin:service.keyRequest.response.server:filter(and(or(in(\"dt.entity.service_method\",entitySelector(\"type(service_method), fromRelationship.isServiceMethodOfService( type(~\"SERVICE~\"),entityName.in("+service_names["services"]+"))\"))))):splitBy()" elif(service_names["selectortype"] == "SRV"): - service_names = service_names["namestr"] - print("Building Service requests time selector for: "+service_names) - selector = "builtin:service.response.server:filter(and(or(in(\"dt.entity.service\",entitySelector(\"type(service),entityName.in("+service_names+")\"))))):splitBy()" + selector = "builtin:service.response.server:filter(and(or(in(\"dt.entity.service\",entitySelector(\"type(service),entityName.in("+service_names["services"]+")\"))))):splitBy()" return selector def getSloSrvNames(hub_config, configuration, doc, env): hub = "" @@ -346,25 +347,31 @@ def getSloSrvNames(hub_config, configuration, doc, env): hub = "na" elif env=="cnprod": hub = "cn" - emeasloobj = getSLO(hub,hub_config[env]["remote_url"],configuration["ids"][hub],config(doc[env][2].get('env-token-name'))) - emeaslosrvnames = [] + krp = krparser.KRParser(name=env,options=krparser.KROption.RESOLVESERVICES, config={"threads":10, "serviceLookupParams":{"fields":"tags"}, "extendResultObjects":{"env":env}}, DTAPIURL=hub_config[env]["remote_url"], DTAPIToken=config(doc[env][2].get('env-token-name'))) + sloobj = getSLO(hub,hub_config[env]["remote_url"],configuration["ids"][hub],config(doc[env][2].get('env-token-name'))) + krs = krp.parse(sloobj) + slosrvnames = [] + outputslos = [] selectortype = "" - if("builtin:service.keyRequest" in emeasloobj["metricExpression"]): - selectortype = "KR" - rgx = re.search("type\((service|SERVICE|~\"SERVICE~\"|~SERVICE~)\),\s*entityName.(equals|in|contains)\s*\(\s*(.+?\s*\")\s*\)",emeasloobj["metricExpression"].replace("\r","").replace("\n",""),re.IGNORECASE) - if(rgx): - namestr = rgx.group(3) - elif("builtin:service.keyRequest" not in emeasloobj["metricExpression"]): - selectortype = "SRV" - rgx = re.search("type\((service|SERVICE|~\"SERVICE~\"|~SERVICE~)\),\s*entityName.(equals|in|contains)\s*\(\s*(.+?\s*\")\s*\)",emeasloobj["metricExpression"].replace("\r","").replace("\n",""),re.IGNORECASE) - if(rgx): - namestr = rgx.group(3) - return {"selectortype":selectortype, "namestr":' '.join(namestr.split())} + for krslo in krs: + if("builtin:service.keyRequest" in krslo.metadata["metricExpression"]): + selectortype = "KR" + elif("builtin:service.keyRequest" not in krslo.metadata["metricExpression"]): + selectortype = "SRV" + for kr in krslo.keyRequests: + for srv in kr["services"]: + slosrvnames.append(srv["displayName"]) + slosrvnames = list(dict.fromkeys(slosrvnames)) + for srv in slosrvnames: + outputslos.append("~\""+srv+"~\"") + return {"selectortype":selectortype, "services":",".join(outputslos)} def main(slo_path): configrepo = clone_repo_if_notexist(CONFIG_REPO_URL, CONFIG_REPO_NAME) pull_repo(configrepo) archiverepo = clone_repo_if_notexist(ARCHIVE_REPO_URL, ARCHIVE_REPO_NAME) pull_repo(archiverepo) + keyreqrepo = clone_repo_if_notexist(KEYREQ_REPO_URL, KEYREQ_REPO_NAME) + pull_repo(keyreqrepo) print("Generating dashboard tiles...") with open('./environment.yaml') as file: doc = yaml.safe_load(file) @@ -467,4 +474,4 @@ def main(slo_path): if __name__ == "__main__": - main('./shared_configuration/simplified_slo_parameter.yaml') + main('./shared_configuration/slo_parameter.yaml') diff --git a/requirements.txt b/requirements.txt index c8afe58..1849510 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ pyyaml requests datetime argparse -GitPython \ No newline at end of file +GitPython +keyrequestparser @ git+https://atc.bmwgroup.net/bitbucket/scm/opapm/keyrequestparser.git \ No newline at end of file