64 lines
3.9 KiB
Python
64 lines
3.9 KiB
Python
#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)}
|