from decouple import config import yaml import requests import json import pandas as pd from datetime import datetime def make_request(url, headers,verify): try: response = requests.get(url, headers=headers,verify=verify) 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 GatherReportingInfo(DTAPIToken, DTENV,friendlyName): env = DTENV DTAPIToken = DTAPIToken if (DTENV.find('dynatracemgd') != -1): verify=False else: verify=True DTAPIURL= env + "/api/v2/entities?entitySelector=type(\"SERVICE\"),fromRelationships.runsOn(type(\"PROCESS_GROUP\"),tag(\"compass-id\"))&fields=tags&pageSize=499" headers = { 'Content-Type': 'application/json', 'Authorization': 'Api-Token ' + DTAPIToken } #r = requests.get(DTAPIURL,headers=headers) r = make_request(DTAPIURL,headers,verify) mgmt = pd.DataFrame() entityResponse = r.json() entityList = entityResponse["entities"] print("Got {} results from API: ".format(len(entityList))) while "nextPageKey" in entityResponse: print("Getting next page: " + entityResponse["nextPageKey"]) nextKey = entityResponse["nextPageKey"] DTAPIURL= env + "/api/v2/entities?nextPageKey={}".format(nextKey) print("Got {} results from API: ".format(len(entityList))) r = make_request(DTAPIURL,headers,verify) entityResponse = r.json() entityList.extend(entityResponse["entities"]) now=datetime.now() strnow = now.strftime("%Y%m%d_%H%M") for entity in entityList: if any(tag["stringRepresentation"].startswith('[Kubernetes]app.bmwgroup.com/') for tag in entity["tags"]): appidtagval = next((tag for tag in entity["tags"] if tag["stringRepresentation"].startswith('[Kubernetes]app-id')), None) appnametagval = next((tag for tag in entity["tags"] if tag["stringRepresentation"].startswith('app-name')), None) compassidtagval = next((tag for tag in entity["tags"] if tag["stringRepresentation"].startswith('compass-id')), None) msidtagval = next((tag for tag in entity["tags"] if tag["stringRepresentation"].startswith('[Kubernetes]ms-id')), None) row={'ServiceName':entity['displayName'],'ServiceId':entity['entityId']} if appidtagval: row.update({'AppId':appidtagval["value"]}) else: row.update({'AppId':''}) if appnametagval: row.update({'AppName':appnametagval["value"]}) else: row.update({'AppName':''}) if compassidtagval: row.update({'CompassId':compassidtagval["value"]}) else: row.update({'CompassId':''}) if msidtagval: row.update({'MsId':msidtagval["value"]}) else: row.update({'MsId':''}) for kubetag in entity["tags"]: if(kubetag["key"].startswith("app.bmwgroup.com/")): row.update({kubetag["key"]:kubetag["value"]}) mgmt = mgmt.append(row,ignore_index=True) mgmt.to_csv(friendlyName + '_TaggedEntities_' + strnow +'.csv',encoding='utf-8') 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') GatherReportingInfo(DTTOKEN,DTURL,item) else: print("token not found, skipping " + item)