New version of DashboardAsCode including Traffic and Latency basing on current SLOs definitions

OPMAAS-4062
Patryk Gudalewicz 2023-06-04 22:37:59 +02:00
parent 11f3c024d6
commit 7663a9fea9
2 changed files with 32 additions and 24 deletions

View File

@ -5,15 +5,20 @@ import argparse
import requests import requests
from datetime import datetime from datetime import datetime
from git import Repo from git import Repo
from KRParser import krparser
import os import os
import re import re
import warnings
warnings.filterwarnings("ignore")
#set STAGING global dashboard name #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") AUTHSTRING = config("BITBUCKET_USERNAME")+":"+config("BITBUCKET_TOKEN")
CONFIG_REPO_URL = "https://"+AUTHSTRING+"@atc.bmwgroup.net/bitbucket/scm/opapm/shared_configuration.git" CONFIG_REPO_URL = "https://"+AUTHSTRING+"@atc.bmwgroup.net/bitbucket/scm/opapm/shared_configuration.git"
CONFIG_REPO_NAME = "shared_configuration" CONFIG_REPO_NAME = "shared_configuration"
ARCHIVE_REPO_URL = "https://"+AUTHSTRING+"@atc.bmwgroup.net/bitbucket/scm/opapm/archive.git" ARCHIVE_REPO_URL = "https://"+AUTHSTRING+"@atc.bmwgroup.net/bitbucket/scm/opapm/archive.git"
ARCHIVE_REPO_NAME = "archive" 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'} 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", parser = argparse.ArgumentParser(description="Generate and deploy the Dynatrace Global Dashboard as Code. Auto deployment works only for STAGING dashboard",
formatter_class=argparse.ArgumentDefaultsHelpFormatter) formatter_class=argparse.ArgumentDefaultsHelpFormatter)
@ -318,24 +323,20 @@ def create_default_tiles():
def getSloReqCountSelector(service_names): def getSloReqCountSelector(service_names):
selector = "" selector = ""
if(service_names["selectortype"] == "KR"): if(service_names["selectortype"] == "KR"):
service_names = service_names["namestr"] service_names = service_names["services"]
print("Building Keyrequest count selector for: "+service_names) 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()" 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"): elif(service_names["selectortype"] == "SRV"):
service_names = service_names["namestr"] service_names = service_names["services"]
print("Building Service requests count selector for: "+service_names) 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()" selector = "builtin:service.requestCount.total:filter(and(or(in(\"dt.entity.service\",entitySelector(\"type(service),entityName.in("+service_names+")\"))))):splitBy()"
return selector return selector
def getSloReqTimeSelector(service_names): def getSloReqTimeSelector(service_names):
selector = "" selector = ""
if(service_names["selectortype"] == "KR"): if(service_names["selectortype"] == "KR"):
service_names = service_names["namestr"] 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()"
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()"
elif(service_names["selectortype"] == "SRV"): elif(service_names["selectortype"] == "SRV"):
service_names = service_names["namestr"] selector = "builtin:service.response.server:filter(and(or(in(\"dt.entity.service\",entitySelector(\"type(service),entityName.in("+service_names["services"]+")\"))))):splitBy()"
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()"
return selector return selector
def getSloSrvNames(hub_config, configuration, doc, env): def getSloSrvNames(hub_config, configuration, doc, env):
hub = "" hub = ""
@ -346,25 +347,31 @@ def getSloSrvNames(hub_config, configuration, doc, env):
hub = "na" hub = "na"
elif env=="cnprod": elif env=="cnprod":
hub = "cn" hub = "cn"
emeasloobj = getSLO(hub,hub_config[env]["remote_url"],configuration["ids"][hub],config(doc[env][2].get('env-token-name'))) 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')))
emeaslosrvnames = [] 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 = "" selectortype = ""
if("builtin:service.keyRequest" in emeasloobj["metricExpression"]): for krslo in krs:
selectortype = "KR" if("builtin:service.keyRequest" in krslo.metadata["metricExpression"]):
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) selectortype = "KR"
if(rgx): elif("builtin:service.keyRequest" not in krslo.metadata["metricExpression"]):
namestr = rgx.group(3) selectortype = "SRV"
elif("builtin:service.keyRequest" not in emeasloobj["metricExpression"]): for kr in krslo.keyRequests:
selectortype = "SRV" for srv in kr["services"]:
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) slosrvnames.append(srv["displayName"])
if(rgx): slosrvnames = list(dict.fromkeys(slosrvnames))
namestr = rgx.group(3) for srv in slosrvnames:
return {"selectortype":selectortype, "namestr":' '.join(namestr.split())} outputslos.append("~\""+srv+"~\"")
return {"selectortype":selectortype, "services":",".join(outputslos)}
def main(slo_path): def main(slo_path):
configrepo = clone_repo_if_notexist(CONFIG_REPO_URL, CONFIG_REPO_NAME) configrepo = clone_repo_if_notexist(CONFIG_REPO_URL, CONFIG_REPO_NAME)
pull_repo(configrepo) pull_repo(configrepo)
archiverepo = clone_repo_if_notexist(ARCHIVE_REPO_URL, ARCHIVE_REPO_NAME) archiverepo = clone_repo_if_notexist(ARCHIVE_REPO_URL, ARCHIVE_REPO_NAME)
pull_repo(archiverepo) pull_repo(archiverepo)
keyreqrepo = clone_repo_if_notexist(KEYREQ_REPO_URL, KEYREQ_REPO_NAME)
pull_repo(keyreqrepo)
print("Generating dashboard tiles...") print("Generating dashboard tiles...")
with open('./environment.yaml') as file: with open('./environment.yaml') as file:
doc = yaml.safe_load(file) doc = yaml.safe_load(file)
@ -467,4 +474,4 @@ def main(slo_path):
if __name__ == "__main__": if __name__ == "__main__":
main('./shared_configuration/simplified_slo_parameter.yaml') main('./shared_configuration/slo_parameter.yaml')

View File

@ -3,4 +3,5 @@ pyyaml
requests requests
datetime datetime
argparse argparse
GitPython GitPython
keyrequestparser @ git+https://atc.bmwgroup.net/bitbucket/scm/opapm/keyrequestparser.git