List of usage examples for io.netty.handler.codec.http HttpResponseStatus MULTI_STATUS
HttpResponseStatus MULTI_STATUS
To view the source code for io.netty.handler.codec.http HttpResponseStatus MULTI_STATUS.
Click Source Link
From source file:com.rackspacecloud.blueflood.inputs.handlers.HttpAggregatedMultiIngestionHandler.java
License:Apache License
@Override public void handle(ChannelHandlerContext ctx, FullHttpRequest request) { Tracker.getInstance().track(request); requestCount.inc();//from ww w.j a va 2s. c om final Timer.Context timerContext = handlerTimer.time(); long ingestTime = clock.now().getMillis(); // this is all JSON. String body = null; try { body = request.content().toString(Constants.DEFAULT_CHARSET); List<AggregatedPayload> bundleList = createBundleList(body); if (bundleList.size() > 0) { // has aggregated metric bundle in body // convert and add metric bundle to MetricsCollection if valid MetricsCollection collection = new MetricsCollection(); List<ErrorResponse.ErrorData> errors = new ArrayList<ErrorResponse.ErrorData>(); // for each metric bundle for (AggregatedPayload bundle : bundleList) { // validate, convert, and add to collection List<ErrorResponse.ErrorData> bundleValidationErrors = bundle.getValidationErrors(); if (bundleValidationErrors.isEmpty()) { // no validation error, add to collection collection.add(PreaggregateConversions.buildMetricsCollection(bundle)); } else { // failed validation, add to error errors.addAll(bundleValidationErrors); } if (bundle.hasDelayedMetrics(ingestTime)) { Tracker.getInstance().trackDelayedAggregatedMetricsTenant(bundle.getTenantId(), bundle.getTimestamp(), bundle.getDelayTime(ingestTime), bundle.getAllMetricNames()); bundle.markDelayMetricsReceived(ingestTime); } } // if has validation errors and no valid metrics if (!errors.isEmpty() && collection.size() == 0) { // return BAD_REQUEST and error DefaultHandler.sendErrorResponse(ctx, request, errors, HttpResponseStatus.BAD_REQUEST); return; } // process valid metrics in collection ListenableFuture<List<Boolean>> futures = processor.apply(collection); List<Boolean> persisteds = futures.get(timeout.getValue(), timeout.getUnit()); for (Boolean persisted : persisteds) { if (!persisted) { DefaultHandler.sendErrorResponse(ctx, request, "Internal error persisting data", HttpResponseStatus.INTERNAL_SERVER_ERROR); return; } } // return OK or MULTI_STATUS response depending if there were validation errors if (errors.isEmpty()) { // no validation error, response OK DefaultHandler.sendResponse(ctx, request, null, HttpResponseStatus.OK); return; } else { // has some validation errors, response MULTI_STATUS DefaultHandler.sendErrorResponse(ctx, request, errors, HttpResponseStatus.MULTI_STATUS); return; } } else { // no aggregated metric bundles in body, response OK DefaultHandler.sendResponse(ctx, request, "No valid metrics", HttpResponseStatus.BAD_REQUEST); return; } } catch (JsonParseException ex) { log.debug(String.format("BAD JSON: %s", body)); log.error(ex.getMessage(), ex); DefaultHandler.sendErrorResponse(ctx, request, ex.getMessage(), HttpResponseStatus.BAD_REQUEST); } catch (InvalidDataException ex) { log.debug(String.format("Invalid request body: %s", body)); log.error(ex.getMessage(), ex); DefaultHandler.sendErrorResponse(ctx, request, ex.getMessage(), HttpResponseStatus.BAD_REQUEST); } catch (TimeoutException ex) { DefaultHandler.sendErrorResponse(ctx, request, "Timed out persisting metrics", HttpResponseStatus.ACCEPTED); } catch (Exception ex) { log.debug(String.format("BAD JSON: %s", body)); log.error("Other exception while trying to parse content", ex); DefaultHandler.sendErrorResponse(ctx, request, "Internal error saving data", HttpResponseStatus.INTERNAL_SERVER_ERROR); } finally { timerContext.stop(); requestCount.dec(); } }
From source file:com.rackspacecloud.blueflood.inputs.handlers.HttpMetricsIngestionHandler.java
License:Apache License
@Override public void handle(ChannelHandlerContext ctx, FullHttpRequest request) { try {//ww w . ja v a2 s . c o m Tracker.getInstance().track(request); requestCount.inc(); final String tenantId = request.headers().get("tenantId"); JSONMetricsContainer jsonMetricsContainer; List<Metric> validMetrics; final Timer.Context jsonTimerContext = jsonTimer.time(); final String body = request.content().toString(Constants.DEFAULT_CHARSET); try { jsonMetricsContainer = createContainer(body, tenantId); if (jsonMetricsContainer.areDelayedMetricsPresent()) { Tracker.getInstance().trackDelayedMetricsTenant(tenantId, jsonMetricsContainer.getDelayedMetrics()); } validMetrics = jsonMetricsContainer.getValidMetrics(); forceTTLsIfConfigured(validMetrics); } catch (JsonParseException e) { log.warn("Exception parsing content", e); DefaultHandler.sendErrorResponse(ctx, request, "Cannot parse content", HttpResponseStatus.BAD_REQUEST); return; } catch (JsonMappingException e) { log.warn("Exception parsing content", e); DefaultHandler.sendErrorResponse(ctx, request, "Cannot parse content", HttpResponseStatus.BAD_REQUEST); return; } catch (InvalidDataException ex) { // todo: we should measure these. if they spike, we track down the bad client. // this is strictly a client problem. Something wasn't right (data out of range, etc.) log.warn(ctx.channel().remoteAddress() + " " + ex.getMessage()); DefaultHandler.sendErrorResponse(ctx, request, "Invalid data " + ex.getMessage(), HttpResponseStatus.BAD_REQUEST); return; } catch (IOException e) { log.warn("IO Exception parsing content", e); DefaultHandler.sendErrorResponse(ctx, request, "Cannot parse content", HttpResponseStatus.BAD_REQUEST); return; } catch (Exception e) { log.warn("Other exception while trying to parse content", e); DefaultHandler.sendErrorResponse(ctx, request, "Failed parsing content", HttpResponseStatus.INTERNAL_SERVER_ERROR); return; } finally { jsonTimerContext.stop(); } List<ErrorResponse.ErrorData> validationErrors = jsonMetricsContainer.getValidationErrors(); // If no valid metrics are present, return error response if (validMetrics.isEmpty()) { log.warn(ctx.channel().remoteAddress() + " No valid metrics"); if (validationErrors.isEmpty()) { DefaultHandler.sendErrorResponse(ctx, request, "No valid metrics", HttpResponseStatus.BAD_REQUEST); } else { DefaultHandler.sendErrorResponse(ctx, request, validationErrors, HttpResponseStatus.BAD_REQUEST); } return; } final MetricsCollection collection = new MetricsCollection(); collection.add(new ArrayList<IMetric>(validMetrics)); final Timer.Context persistingTimerContext = persistingTimer.time(); try { ListenableFuture<List<Boolean>> futures = processor.apply(collection); List<Boolean> persisteds = futures.get(timeout.getValue(), timeout.getUnit()); for (Boolean persisted : persisteds) { if (!persisted) { log.warn("Trouble persisting metrics:"); log.warn(String.format("%s", Arrays.toString(validMetrics.toArray()))); DefaultHandler.sendErrorResponse(ctx, request, "Persisted failed for metrics", HttpResponseStatus.INTERNAL_SERVER_ERROR); return; } } // after processing metrics, return either OK or MULTI_STATUS depending on number of valid metrics if (!validationErrors.isEmpty()) { // has some validation errors, return MULTI_STATUS DefaultHandler.sendErrorResponse(ctx, request, validationErrors, HttpResponseStatus.MULTI_STATUS); } else { // no validation error, return OK DefaultHandler.sendResponse(ctx, request, null, HttpResponseStatus.OK); } } catch (TimeoutException e) { DefaultHandler.sendErrorResponse(ctx, request, "Timed out persisting metrics", HttpResponseStatus.ACCEPTED); } catch (Exception e) { log.error("Exception persisting metrics", e); DefaultHandler.sendErrorResponse(ctx, request, "Error persisting metrics", HttpResponseStatus.INTERNAL_SERVER_ERROR); } finally { persistingTimerContext.stop(); } } finally { requestCount.dec(); } }