from decouple import config # import sys import yaml import datetime # import time import pandas as pd # import argparse import warnings # import os import dynatraceAPI # from pagination import Pagionation # import types from KRParser import krparser #from key_request_parser import krparser import time #from datetime import datetime warnings.filterwarnings("ignore") def getSLO(ENV, DTAPIToken, DTENV): # DTENV = base url # DTAPIToken = sec token dtclient = dynatraceAPI.Dynatrace(DTENV, DTAPIToken) my_params_report = {'pageSize': 25} # gets all slos and filter later api_url_report = "/api/v2/slo" pages = dtclient.returnPageination(api_url_report, my_params_report, "slo") df = pd.DataFrame(pages.elements) df["env"]=ENV return df def write_to_excel(ignored, noData1M, noData1W, all_TP_slos): fileName = "./KeyRequest_Report_"+ str(datetime.date.today()) +".xlsx" writer = pd.ExcelWriter(fileName) if noData1M["slo"].count() > 0: noData1M.to_excel(writer, sheet_name='noData1M') if noData1W["slo"].count() > 0: noData1W.to_excel(writer, sheet_name='noData1W') if ignored["slo"].count() > 0: ignored.to_excel(writer, sheet_name='ignored') if all_TP_slos["slo"].count() > 0: all_TP_slos.to_excel(writer, sheet_name='TP_') writer.save() writer.close() def getStats(krs): ts = time.time() epoch = datetime.datetime.now().timestamp() tmpIgnoredList=[] for kr in [a for a in krs if len(a.keyRequests) == 0]: tmpIgnoredList.append([kr.metadata["sloName"], kr.metadata["sloId"], kr.metadata["env"],"","","","","",kr.metadata["filter"], kr.metadata["metricExpression"], "", epoch]) noData1M=[] for kr in [s for s in krs if s.hasNoData("1M")==True]: for k in kr.getKeyRequestByHasData("1M"): noData1M.append([kr.metadata["sloName"], kr.metadata["sloId"], kr.metadata["env"], k["displayName"], k["entityId"],k["services"][0]["displayName"] if len(k["services"]) > 0 else "", [x for x in k["services"][0]["tags"] if x['key']=="compass-id"][0]["value"] if len(k["services"]) > 0 and len(k["services"][0]["tags"]) > 0 and len([x for x in k["services"][0]["tags"] if x['key']=="compass-id"]) > 0 else "", k["_mInSloDef"], kr.metadata["filter"], kr.metadata["metricExpression"], kr.matchedGroups._list[0]['pattern'], epoch]) noData1W=[] for kr in [s for s in krs if s.hasNoData("1W")==True]: for k in kr.getKeyRequestByHasData("1W"): noData1W.append([kr.metadata["sloName"], kr.metadata["sloId"], kr.metadata["env"], k["displayName"], k["entityId"], k["services"][0]["displayName"] if len(k["services"]) > 0 else "", [x for x in k["services"][0]["tags"] if x['key']=="compass-id"][0]["value"] if len(k["services"]) > 0 and len(k["services"][0]["tags"]) > 0 and len([x for x in k["services"][0]["tags"] if x['key']=="compass-id"]) > 0 else "", k["_mInSloDef"], kr.metadata["filter"], kr.metadata["metricExpression"], kr.matchedGroups._list[0]['pattern'], epoch]) # noData1W=[] # for kr in [s for s in krs if s.hasNoData1WKeyRequests()==True]: # for k in kr.getNoData1WKeyRequests(): # noData1W.append([kr.metadata["sloName"], kr.metadata["env"], k["displayName"], k["entityId"], kr.metadata["filter"], kr.metadata["metricExpression"]]) columns =['slo', 'sloID', 'env', 'displayName','entityId','service','compass-id','InSloDef','filter', 'metricExpression','pattern', 'timestamp'] ignored=pd.DataFrame(tmpIgnoredList, columns=columns) noData_1M=pd.DataFrame(noData1M, columns = columns) noData_1W=pd.DataFrame(noData1W, columns = columns) allTPSlos=[] for kr in [a for a in krs if len(a.keyRequests) != 0 and a.metadata["sloName"].startswith("TP_")]: for k in kr.keyRequests: allTPSlos.append([kr.metadata["sloName"], kr.metadata["sloId"], kr.metadata["env"], k["displayName"], k["entityId"], k["count"]["1W"], k["count"]["1M"], k["services"][0]["displayName"] if len(k["services"]) > 0 else "", [x for x in k["services"][0]["tags"] if x['key']=="compass-id"][0]["value"] if len(k["services"]) > 0 and len(k["services"][0]["tags"]) > 0 and len([x for x in k["services"][0]["tags"] if x['key']=="compass-id"]) > 0 else "", k["_mInSloDef"], kr.metadata["filter"], kr.metadata["metricExpression"], kr.matchedGroups._list[0]['pattern'], epoch]) columns_ext =['slo', 'sloID', 'env', 'displayName','entityId','Count_1W', 'Count_1M','service','compass-id','InSloDef', 'filter', 'metricExpression', 'pattern', 'timestamp'] all_TP_slos=pd.DataFrame(allTPSlos, columns = columns_ext) return ignored, noData_1M, noData_1W, all_TP_slos def main(): resultSlos=[] with open('./environment.yaml') as file: env_doc = yaml.safe_load(file) #iterate through all environments for env, doc in env_doc.items(): token = dict(doc[2]) url = dict(doc[1]) if(config(token.get('env-token-name')) != ""): print("Gather data, hold on a minute") DTTOKEN = config(token.get('env-token-name')) DTURL = url.get('env-url') krs=[] #krp = krparser.KRParser(krparser.KROption.VALIDATE_EXISTS | krparser.KROption.VALIDATE_HASDATA | krparser.KROption.RESOLVESERVICES ,DTURL, DTTOKEN) krp = krparser.KRParser(name=env,options=krparser.KROption.VALIDATE_HASDATA | krparser.KROption.RESOLVESERVICES, config={"threads":10, "serviceLookupParams":{"fields":"tags"}, "extendResultObjects":{"env":env}}, DTAPIURL=DTURL, DTAPIToken=DTTOKEN) slosF=getSLO(env, DTTOKEN, DTURL) #slosF=slosF.loc[slosF['id'] == "a96a4031-e201-3e98-b739-27be7dc85a09"] #slosF=slosF.loc[slosF['id'] == "0f23cb75-4c94-3204-944d-cdc751ea625d"] krs=krp.parse(slosF) # for index, row in slosF.iterrows(): # #if row['id'] == "1ec65bfa-8d66-3215-a094-c289da440f32": #"1de2685e-0f06-370c-8b25-2326426e89c3": #or row['id'] == "ab1bf34a-10fc-3446-9cc7-79d257498a52": # #if row['id'] == "a01cc45e-8369-3623-a156-1b261e6f4c98": # #if str.startswith(row["name"],"TP_"): # krs.append(krp.parseBySLO(row)) resultSlos.extend(krs) # for slo in resultSlos: # if slo.key ignoerd, noData1M, noData1W, all_TP_slos= getStats(resultSlos) write_to_excel(ignoerd, noData1M, noData1W, all_TP_slos) if __name__ == "__main__": main()