New version of DashboardAsCode including Traffic and Latency basing on current SLOs definitions
parent
11f3c024d6
commit
7663a9fea9
|
|
@ -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')
|
||||||
|
|
|
||||||
|
|
@ -3,4 +3,5 @@ pyyaml
|
||||||
requests
|
requests
|
||||||
datetime
|
datetime
|
||||||
argparse
|
argparse
|
||||||
GitPython
|
GitPython
|
||||||
|
keyrequestparser @ git+https://atc.bmwgroup.net/bitbucket/scm/opapm/keyrequestparser.git
|
||||||
Loading…
Reference in New Issue