diff --git a/createKeyRequestReport.py b/createKeyRequestReport.py index f8694fe..857c735 100644 --- a/createKeyRequestReport.py +++ b/createKeyRequestReport.py @@ -56,12 +56,13 @@ def getSLO(ENV, DTAPIToken, DTENV): return df -def write_to_excel(ignored, notExists): +def write_to_excel(ignored, notExists, noData1W): fileName = "./KeyRequest_Report_"+ str(datetime.date.today()) +".xlsx" writer = pd.ExcelWriter(fileName) notExists.to_excel(writer, sheet_name='notExists') + noData1W.to_excel(writer, sheet_name='noData1W') ignored.to_excel(writer, sheet_name='ignored') writer.save() @@ -79,12 +80,18 @@ def getStats(krs): for kr in [s for s in krs if s.hasNotExistingKeyRequests()==True]: for k in kr.getNotExistingKeyRequests(): keyReuqestsNotExists.append([kr.metadata["sloName"], kr.metadata["env"], k["displayName"], k["entityId"], kr.metadata["filter"], kr.metadata["metricExpression"]]) + + 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', 'env', 'displayName','entityId', 'filter', 'metricExpression'] ignored=pd.DataFrame(tmpIgnoredList, columns=columns, dtype = float) notExists=pd.DataFrame(keyReuqestsNotExists, columns = columns, dtype = float) + noData_1W=pd.DataFrame(noData1W, columns = columns, dtype = float) - return ignored, notExists + return ignored, notExists, noData_1W def main(slo_path): @@ -114,8 +121,8 @@ def main(slo_path): resultSlos.extend(krs) - ignoerd,notExists= getStats(resultSlos) - write_to_excel(ignoerd,notExists) + ignoerd,notExists, noData1W= getStats(resultSlos) + write_to_excel(ignoerd, notExists, noData1W) if __name__ == "__main__": main('./slo_parameter.yaml') \ No newline at end of file diff --git a/environment.yaml b/environment.yaml index 2394038..ba3f0e8 100644 --- a/environment.yaml +++ b/environment.yaml @@ -14,11 +14,11 @@ euprod: - env-url: "https://onb44935.live.dynatrace.com" - env-token-name: "NAPREPROD_TOKEN_VAR" - jenkins: "https://jaws.bmwgroup.net/opapm/" -# naprod: -# - name: "naprod" -# - env-url: "https://wgv50241.live.dynatrace.com" -# - env-token-name: "NAPROD_TOKEN_VAR" -# - jenkins: "https://jaws.bmwgroup.net/opapm/" + naprod: + - name: "naprod" + - env-url: "https://wgv50241.live.dynatrace.com" + - env-token-name: "NAPROD_TOKEN_VAR" + - jenkins: "https://jaws.bmwgroup.net/opapm/" # cnprod: # - name: "cnprod" # - env-url: "https://dyna-synth-cn.bmwgroup.com.cn/e/b921f1b9-c00e-4031-b9d1-f5a0d530757b" diff --git a/key_request_parser/keyrequests.py b/key_request_parser/keyrequests.py index 4f6eb7f..c6a1363 100644 --- a/key_request_parser/keyrequests.py +++ b/key_request_parser/keyrequests.py @@ -59,10 +59,13 @@ class KeyRequestGroup(MutableSequence): query+=",entityName.in(\""+'","'.join(val["methods"])+"\")" val["existsQuery"]= query + + def insert(self, ii, val): self.createExistsQuery(val) + self._list.insert(ii, val) @@ -91,6 +94,16 @@ class KR: return True return False + + def getNoData1WKeyRequests(self): + return [k for k in self.keyRequests if k['hasData_1W']==False and k['exists']==True] + + def hasNoData1WKeyRequests(self): + for k in self.keyRequests: + if k['hasData_1W']==False and k['exists'] == True: + return True + + return False def checkKeyRequestsHasData(self): diff --git a/key_request_parser/krparser.py b/key_request_parser/krparser.py index 35a39f4..d789d9d 100644 --- a/key_request_parser/krparser.py +++ b/key_request_parser/krparser.py @@ -106,6 +106,36 @@ class KRParser: method["entityId"]=found[0]["entityId"] else: method["exists"]=False + + def checkKeyRequetsHasData(self,kr, DTAPIURL, DTAPIToken): + + DTAPIURL = DTAPIURL + "/api/v2/metrics/query" + + headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Api-Token ' + DTAPIToken + } + + existingKRs=[k for k in kr.keyRequests if k["exists"]==True] + + result=[] + if len(existingKRs) > 0: + query='builtin:service.keyRequest.count.total:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),entityId(~"'+"~\",~\"".join([s["entityId"] for s in existingKRs])+'~")"))))):splitBy("dt.entity.service_method"):sort(value(auto,descending)):limit(20)' + params={"metricSelector": query, "resolution":"1d", "from":"now-1w"} + response = helper.get_request(DTAPIURL, headers, params) + result = (response.json())['result'][0]['data'] + + for k in kr.keyRequests: + if k["exists"]==False: + k['hasData_1W']=None + + if len(result)> 0: + if len([r for r in result if k["entityId"] in r['dimensions'] and len(r['values']) > 0]) > 0: + k['hasData_1W']=True + else: + k['hasData_1W']=False + + @@ -125,7 +155,7 @@ class KRParser: self.checkKeyRequetsExists(kr,self.DTAPIURL, self.DTAPIToken) if KROption.VALIDATE_HASDATA in self.options: - x=0 + self.checkKeyRequetsHasData(kr,self.DTAPIURL, self.DTAPIToken) return kr