From e8442877feff063c2765b1017f9823ee1a8f48d9 Mon Sep 17 00:00:00 2001 From: rforstner Date: Thu, 20 Jan 2022 18:50:13 +0100 Subject: [PATCH] adding new script --- .gitignore | 135 ++++++++++++++++++++++++++++++++ environment.yaml | 10 +-- euprod.xlsx | Bin 0 -> 10186 bytes utils.py | 199 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 339 insertions(+), 5 deletions(-) create mode 100644 .gitignore create mode 100644 euprod.xlsx create mode 100644 utils.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1216e03 --- /dev/null +++ b/.gitignore @@ -0,0 +1,135 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +### Terraform stuff +**/.terraform/* +crash.log +*.tfvars + diff --git a/environment.yaml b/environment.yaml index 572b277..bdb214e 100644 --- a/environment.yaml +++ b/environment.yaml @@ -3,27 +3,27 @@ euprod: - env-url: "https://xxu26128.live.dynatrace.com" - env-token-name: "EUPROD_TOKEN_VAR" - jenkins: "https://jaws.bmwgroup.net/opapm/" -eupreprod: +#eupreprod: - name: "eupreprod" - env-url: "https://qqk70169.live.dynatrace.com" - env-token-name: "EUPREPROD_TOKEN_VAR" - jenkins: "https://jaws.bmwgroup.net/opapm/" -napreprod: +#napreprod: - name: "napreprod" - env-url: "https://onb44935.live.dynatrace.com" - env-token-name: "NAPREPROD_TOKEN_VAR" - jenkins: "https://jaws.bmwgroup.net/opapm/" -naprod: +#naprod: - name: "naprod" - env-url: "https://wgv50241.live.dynatrace.com" - env-token-name: "NAPROD_TOKEN_VAR" - jenkins: "https://jaws.bmwgroup.net/opapm/" -cnprod: +#cnprod: - name: "cnprod" - env-url: "https://dynatracemgd-tsp.bmwgroup.net/e/b921f1b9-c00e-4031-b9d1-f5a0d530757b" - env-token-name: "CNPROD_TOKEN_VAR" - jenkins: "https://jaws-china.bmwgroup.net/opmaas/" -cnpreprod: +#cnpreprod: - name: "cnpreprod" - env-url: "https://dynatracemgd-tsp.bmwgroup.net/e/ab88c03b-b7fc-45f0-9115-9e9ecc0ced35" - env-token-name: "CNPREPROD_TOKEN_VAR" diff --git a/euprod.xlsx b/euprod.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e2262883b69996c6c96e9e6c04ccc18e92254c89 GIT binary patch literal 10186 zcmZ{K1ymf{vNjOh-Q6{~ySv-q5(bCC-GjSBaCdhL8YB#^2_(1%3-0i9?)mS#@8rEV zGu^#xqtVcW=1atyXd&4o5zxy&kl;uP!k1Y`v|`+< zL}dxrO4z1MMuWh?i*8dfDt9E#urB@J4I#LnG!;87CvRH4Kw5!N`e{%31vOqK-vyPl z)=OpYSECbzTnU=)adQ>=WUUDl2Pj2fvN^=sL;Ie=Z|-d zwJidOB$y(l=y(%YOQ+NDP|hJG@Gg5x{P@gKJ>CaTJDX+*?Rf= zdF5rW)=Zc5$j}-ThpAN1Q}Y{Pt4b~pwwwFrJ!^|K6Vky8NdIV1yqL2;^SD*Ih`ubU zLNY%2WzgsdZPKS)NA|2+h%|C~A{vVqY`?kO_f_?uf%#;ZLxm0t0g*!o0fF@v7%zKP zH*25+@b5GGU!ghCH*j6y!wxvBpYgJ~aX=d332tk_a<%bTZTS>>qCysi0f@8rwnz#M z?33j|2dAT)BrA7i3qdmIGK zVl!Im`XCeXmR&N=I~=f99IzM?OIMt>GqUC4-hTLLWlaP)eJDV}5$woD1RxKb0+sKm z=tpj94SwmjwG!2_8=ak#3kvz_p9<3@e^We<1J8jXD3A-7^6k1%`D@#l{ z^)MrxKT;W(MbJ44Vz~$qTS@p$-`pgX(r`?l-6I~U2w9Qoq&FB%Pw(W#x=?lhyaD*% zsLDE0Em!t8Q!b~Fr4)ed4XNr;#e@DRGR;s&=lSB9GE zV~)&vsm!%tJn7YNr-+!29Zx2?Pc0>(Vk8^$zCAk?lZeqr8qTMXbyDOEfPT(19+Dq8 z2mxC@cLanla@sS;-^woFDeR!pmWv*8aKRO4=^=a$)v?X5ir^BdAmu=WIqxJD+4b>4 z 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 literal 0 HcmV?d00001 diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..dfb0407 --- /dev/null +++ b/utils.py @@ -0,0 +1,199 @@ +from tracemalloc import start +from decouple import config +import sys +import yaml +import datetime +import time +import pandas as pd +import requests +import openpyxl +import argparse + +def init_argparse() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + usage="%(prog)s [--fromDate] [toDate] or [preSelect]", + description="gather SLO in daily slices for given Timeframe" + ) + parser.add_argument( + "-f","--fromDate", + help = "YYYY-mm-dd e.g. 2022-01-01" + ) + parser.add_argument( + "-t","--toDate", + help = "YYYY-mm-dd e.g. 2022-01-31" + ) + parser.add_argument( + "-p","--preSelect", + help = "week | month - gathers the data for the last full week or month" + ) + + return parser + +def make_request(url, headers,verify,parameters): + try: + response = requests.get(url, headers=headers,verify=verify,params=parameters) + response.raise_for_status() + except requests.exceptions.HTTPError as errh: + return "An Http Error occurred:" + repr(errh) + except requests.exceptions.ConnectionError as errc: + return "An Error Connecting to the API occurred:" + repr(errc) + except requests.exceptions.Timeout as errt: + return "A Timeout Error occurred:" + repr(errt) + except requests.exceptions.RequestException as err: + return "An Unknown Error occurred" + repr(err) + + return response + +def previous_week_range(date): + start_date = date + datetime.timedelta(-date.weekday(), weeks=-1) + end_date = date + datetime.timedelta(-date.weekday() - 1) + return start_date, end_date + +def previous_month_range(date): + end_date = date.replace(day=1) - datetime.timedelta(days=1) + start_date = end_date.replace(day=1) + return start_date, end_date + +def getSLO(DTAPIToken, DTENV, fromDate, toDate): + + env = DTENV + DTAPIToken = DTAPIToken + + if (DTENV.find('dynatracemgd') != -1): + verify=False + else: + verify=True + + DTAPIURL= env + "/api/v2/slo" + headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Api-Token ' + DTAPIToken + } + + parameters = { + "pageSize": 25, + "from": int(fromDate), + "to": int(toDate), + "timeFrame": "GTF", + "evaluate": True, + "sloSelector": "text(\"CoCo-QM-Report\")" + } + r = make_request(DTAPIURL,headers=headers,parameters=parameters,verify=verify) + + df = pd.json_normalize(r.json()['slo']) + + return df + +def get_daily_slice(start_date, end_date): + tempstart = start_date + days = pd.DataFrame() + + #Add the first day + tempend = tempstart + datetime.timedelta(hours=24) + startms = time.mktime(tempstart.timetuple()) * 1000 + endms = time.mktime(tempend.timetuple()) * 1000 + + row = {'Date':tempstart,'startTime':startms, 'endTime':endms} + days = days.append(row,ignore_index=True) + + while tempstart < end_date: + tempstart = tempstart + datetime.timedelta(hours=24) + tempend = tempstart + datetime.timedelta(hours=24) + startms = time.mktime(tempstart.timetuple()) * 1000 + endms = time.mktime(tempend.timetuple()) * 1000 + + row = {'Date':tempstart,'startTime':startms, 'endTime':endms} + days = days.append(row,ignore_index=True) + + return days + +def main() -> None: + + parser = init_argparse() + args = parser.parse_args() + + if args.preSelect and (args.fromDate or args.toDate): + print("--preSelect must not be used in conjuntion with --fromDate and/or --toDate") + sys.exit() + + elif args.fromDate and not args.toDate: + print("--fromDate only in conjunction with --toDate") + sys.exit() + + elif args.toDate and not args.fromDate: + print("--toDate only in conjunction with --fromDate") + sys.exit() + + elif args.toDate and args.fromDate and not args.preSelect: + try: + fromDate = datetime.date.fromisoformat(args.fromDate) + toDate = datetime.date.fromisoformat(args.toDate) + except Exception as e: + print("Progam closed: " + str(e)) + sys.exit() + + if toDate < fromDate: + print("--toDate can't be older than --fromDate") + sys.exit() + + if toDate > datetime.date.today() or fromDate > datetime.date.today(): + print("--toDate or --fromDate can't be in the future") + sys.exit() + + elif args.preSelect and not args.fromDate and not args.toDate: + + date = datetime.date.today() + + if args.preSelect == "week": + fromDate, toDate = previous_week_range(date) + elif args.preSelect == "month": + fromDate, toDate = previous_month_range(date) + else: + print("--preSelect must be week or month") + sys.exit() + + else: + print("Invalid arguments, please use --help") + sys.exit() + print("fromDate: " + str(fromDate)) + print("toDate: " + str(toDate)) + + days = get_daily_slice(fromDate,toDate) + with open('./environment.yaml') as file: + doc = yaml.safe_load(file) + + for item, doc in doc.items(): + token = dict(doc[2]) + url = dict(doc[1]) + print("Crawling through: " + item) + print("Check if token exists in environment...") + 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') + + + + df = pd.DataFrame() + for index, row in days.iterrows(): + temp_df = getSLO(DTTOKEN,DTURL,row['startTime'],row['endTime']) + temp_df['Date'] = row['Date'] + df = pd.concat([df,temp_df],ignore_index=True) + + #sort columns in a try block - if API is returning columns which are non exist, this will not fail the script + + try: + df = df[['Date', 'id', 'enabled', 'name', 'description', 'evaluatedPercentage', 'errorBudget', 'status', 'error', 'target','warning', 'evaluationType', 'timeframe', 'metricExpression', 'filter']] + except Exception as e: + print("Could not rearrange columns: " + e) + + + writer = pd.ExcelWriter("./"+ item +'.xlsx') + df.to_excel(writer, sheet_name=str(item).split(" ")[0]) + writer.save() + + else: + print("token not found, skipping " + item) + +if __name__ == "__main__": + main() \ No newline at end of file