def calculate_alert_properties(self, alert_summary, series_signature): prev_range = series_signature.max_back_window if not prev_range: prev_range = settings.PERFHERDER_ALERTS_MAX_BACK_WINDOW new_range = series_signature.fore_window if not new_range: new_range = settings.PERFHERDER_ALERTS_FORE_WINDOW prev_data = PerformanceDatum.objects.filter( signature=series_signature, push_timestamp__lte=alert_summary.prev_push.time).order_by( '-push_timestamp') prev_values = prev_data.values_list('value', flat=True)[:prev_range] new_data = PerformanceDatum.objects.filter( signature=series_signature, push_timestamp__gt=alert_summary.prev_push.time).order_by( 'push_timestamp') new_values = new_data.values_list('value', flat=True)[:new_range] if not prev_data or not new_data: raise InsufficientAlertCreationData prev_value = sum(prev_values) / len(prev_values) new_value = sum(new_values) / len(new_values) return get_alert_properties(prev_value, new_value, series_signature.lower_is_better)
def create(self, request, *args, **kwargs): data = request.data if 'summary_id' not in data or 'signature_id' not in data: return Response( { "message": "Summary and signature ids necessary " "to create alert" }, status=HTTP_400_BAD_REQUEST) summary = PerformanceAlertSummary.objects.get(id=data['summary_id']) signature = PerformanceSignature.objects.get(id=data['signature_id']) prev_range = signature.max_back_window if not prev_range: prev_range = settings.PERFHERDER_ALERTS_MAX_BACK_WINDOW new_range = signature.fore_window if not new_range: new_range = settings.PERFHERDER_ALERTS_FORE_WINDOW prev_data = PerformanceDatum.objects.filter( signature=signature, result_set_id__lte=summary.prev_result_set_id).order_by( '-push_timestamp').values_list('value', flat=True)[:prev_range] new_data = PerformanceDatum.objects.filter( signature=signature, result_set_id__gt=summary.prev_result_set_id).order_by( 'push_timestamp').values_list('value', flat=True)[:new_range] if not prev_data or not new_data: return Response( {"message": "Insufficient data to create an " "alert"}, status=HTTP_400_BAD_REQUEST) prev_value = sum(prev_data) / len(prev_data) new_value = sum(new_data) / len(new_data) alert_properties = get_alert_properties(prev_value, new_value, signature.lower_is_better) alert, _ = PerformanceAlert.objects.get_or_create( summary=summary, series_signature=signature, defaults={ 'is_regression': alert_properties.is_regression, 'manually_created': True, 'amount_pct': alert_properties.pct_change, 'amount_abs': alert_properties.delta, 'prev_value': prev_value, 'new_value': new_value, 't_value': 1000 }) return Response({"alert_id": alert.id})
def create(self, request, *args, **kwargs): data = request.data if 'summary_id' not in data or 'signature_id' not in data: return Response({"message": "Summary and signature ids necessary " "to create alert"}, status=HTTP_400_BAD_REQUEST) summary = PerformanceAlertSummary.objects.get( id=data['summary_id']) signature = PerformanceSignature.objects.get( id=data['signature_id']) prev_range = signature.max_back_window if not prev_range: prev_range = settings.PERFHERDER_ALERTS_MAX_BACK_WINDOW new_range = signature.fore_window if not new_range: new_range = settings.PERFHERDER_ALERTS_FORE_WINDOW prev_data = PerformanceDatum.objects.filter( signature=signature, push_timestamp__lte=summary.prev_push.time).order_by( '-push_timestamp').values_list('value', flat=True)[:prev_range] new_data = PerformanceDatum.objects.filter( signature=signature, push_timestamp__gt=summary.prev_push.time).order_by( 'push_timestamp').values_list('value', flat=True)[:new_range] if not prev_data or not new_data: return Response({"message": "Insufficient data to create an " "alert"}, status=HTTP_400_BAD_REQUEST) prev_value = sum(prev_data)/len(prev_data) new_value = sum(new_data)/len(new_data) alert_properties = get_alert_properties(prev_value, new_value, signature.lower_is_better) alert, _ = PerformanceAlert.objects.get_or_create( summary=summary, series_signature=signature, defaults={ 'is_regression': alert_properties.is_regression, 'manually_created': True, 'amount_pct': alert_properties.pct_change, 'amount_abs': alert_properties.delta, 'prev_value': prev_value, 'new_value': new_value, 't_value': 1000 }) return Response({"alert_id": alert.id})