import yaml from decouple import config import dynatraceAPI import pandas as pd from pagination import Pagionation from key_request_parser import krparser from datetime import datetime, timedelta import datetime import json import typing from decorators import timer def get_slo(ENV, DTAPIToken, DTENV) -> pd.DataFrame: # 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 previous_week_range(date: datetime): start_date = date + timedelta(-date.weekday(), weeks=-1) end_date = date + timedelta(-date.weekday() - 1) return start_date, end_date @timer def main() -> None: # Get All SLOs reportItem = {} with open("./environment.yaml") as file: env_doc = yaml.safe_load(file) 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") # krp = krparser.KRParser(krparser.KROption.VALIDATE_EXISTS | krparser.KROption.VALIDATE_HASDATA ,DTURL, DTTOKEN) slosF = get_slo(env, DTTOKEN, DTURL) slosF = slosF[slosF["name"].str.startswith("TP_")] # parse the metric Expression to get Services and Requests krs = [] krp = krparser.KRParser( krparser.KROption.VALIDATE_EXISTS # | krparser.KROption.VALIDATE_HASDATA | krparser.KROption.RESOLVESERVICES, DTURL, DTTOKEN, ) for index, row in slosF.iterrows(): krs.append(krp.parseBySLO(row)) # x = 0 # SLO Name | SERVICE | PROCESS GRUPPE | TAGS # {"sloname": { # "sloname":$sloname$, # "services":[{ # "serviceName": "$servicename$" # }] # }, # "sloname": { # "sloname":$sloname$, # "services":[{ # "serviceName": "$servicename$" # }] reportItem[str(env)] = {} for kr in krs: reportItem[str(env)][kr.metadata["sloName"]] = {} reportItem[str(env)][kr.metadata["sloName"]]["sloname"] = kr.metadata[ "sloName" ] reportItem[str(env)][kr.metadata["sloName"]]["services"] = [] reportItem[str(env)][kr.metadata["sloName"]]["requests"] = [] for key_request in kr.keyRequests: reportItem[str(env)][kr.metadata["sloName"]]["requests"].append( { "displayName": key_request["displayName"], "entityId": key_request["entityId"], } ) for service in key_request["services"]: reportItem[str(env)][kr.metadata["sloName"]]["services"].append( { "type": service["type"], "displayName": service["displayName"], "entityId": service["entityId"], } ) if __name__ == "__main__": main()