#Library includes functions for interacting with SLOs import yaml from remoteDashboard import make_request from KRParser import krparser from decouple import config #Loads SLOs definitions from yaml file def load_slo_parameter(path): with open(path) as file: slo_doc = yaml.safe_load(file) return slo_doc #Downloads SLO definition from Dynatrace API def getSLO(env, envurl,sloid, DTAPIToken): url = envurl+"/api/v2/slo/"+sloid+"?timeFrame=CURRENT" response = make_request(url, DTAPIToken,True, "get", "") responseobj = response.json() responseobj["env"] = env return responseobj #Generates Request Count selector for given service names def getSloReqCountSelector(service_names): selector = "" if(service_names["selectortype"] == "KR"): 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["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 #Generates Response Time selector for given service names def getSloReqTimeSelector(service_names): selector = "" if(service_names["selectortype"] == "KR"): 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"): selector = "builtin:service.response.server:filter(and(or(in(\"dt.entity.service\",entitySelector(\"type(service),entityName.in("+service_names["services"]+")\"))))):splitBy()" return selector #Parses SLO definition with KRParses and returns service name array def getSloSrvNames(sloconfig, doc): if(sloconfig.hubtype == "gcdm"): krp = krparser.KRParser(name=sloconfig.hub,options=krparser.KROption.RESOLVESERVICES, config={"threads":10, "serviceLookupParams":{"fields":"tags"}, "extendResultObjects":{"env":sloconfig.hub}}, DTAPIURL=sloconfig.remoteurl, DTAPIToken=config(doc[sloconfig.hub][3].get('gcdm-token-name'))) sloobj = getSLO(sloconfig.hub,sloconfig.remoteurl,sloconfig.sloid,config(doc[sloconfig.hub][3].get('gcdm-token-name'))) else: krp = krparser.KRParser(name=sloconfig.hub,options=krparser.KROption.RESOLVESERVICES, config={"threads":10, "serviceLookupParams":{"fields":"tags"}, "extendResultObjects":{"env":sloconfig.hub}}, DTAPIURL=sloconfig.remoteurl, DTAPIToken=config(doc[sloconfig.hub][2].get('env-token-name'))) sloobj = getSLO(sloconfig.hub,sloconfig.remoteurl,sloconfig.sloid,config(doc[sloconfig.hub][2].get('env-token-name'))) krs = krp.parse(sloobj) slosrvnames = [] outputslos = [] selectortype = "" 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 group in krslo.matchedGroups._list: for srv in group["services"]: slosrvnames.append(srv) slosrvnames = list(dict.fromkeys(slosrvnames)) if(sloobj["name"] == "TP_Vehicle_Teleservices"): print(sloobj["name"]) for srv in slosrvnames: outputslos.append("~\""+srv+"~\"") return {"selectortype":selectortype, "services":",".join(outputslos)}