package ru.yandex.market.graphouse.data; import com.google.common.base.Stopwatch; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Arrays; import java.util.List; /** * @author Vlad Vinogradov <a href="mailto:vladvin@yandex-team.ru"></a> * @date 31.10.16 */ public class MetricDataServiceServlet extends HttpServlet { private static final Logger log = LogManager.getLogger(); private final MetricDataService metricDataService; public MetricDataServiceServlet(MetricDataService metricDataService) { this.metricDataService = metricDataService; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { getData(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { getData(req, resp); } private void getData(HttpServletRequest req, HttpServletResponse resp) throws IOException { Stopwatch stopwatch = Stopwatch.createStarted(); final String metricsString = req.getParameter("metrics"); if (metricsString == null || metricsString.isEmpty()) { log.warn("Metrics list is empty"); writeBadRequest(resp); return; } final List<String> metrics = Arrays.asList(metricsString.split(",")); final int startTimeSeconds; final int endTimeSeconds; try { startTimeSeconds = Integer.parseInt(req.getParameter("start")); endTimeSeconds = Integer.parseInt(req.getParameter("end")); } catch (NumberFormatException e) { log.warn("Failed to parse timestamp", e); writeBadRequest(resp); return; } final String reqKey = req.getParameter("reqKey"); try { metricDataService.getData(metrics, startTimeSeconds, endTimeSeconds, resp.getWriter()); } catch (Exception e) { log.error("Problems with request (" + reqKey + " ): " + req.getRequestURI(), e); resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); e.printStackTrace(resp.getWriter()); return; } stopwatch.stop(); if (log.isDebugEnabled()) { log.debug( "Metric data request processed in " + stopwatch.toString() + ". Start=" + startTimeSeconds + ", end=" + endTimeSeconds + ", metrics (" + metrics.size() + "): " + metrics.toString() ); } resp.setStatus(HttpServletResponse.SC_OK); } private void writeBadRequest(HttpServletResponse resp) throws IOException { resp.setStatus(HttpServletResponse.SC_BAD_REQUEST); resp.getOutputStream().println("Usage:"); resp.getOutputStream().println("/metricData?"); resp.getOutputStream().println("\t metrics=<metric1,metric2...>"); resp.getOutputStream().println("\t &start=<startTimeSeconds>"); resp.getOutputStream().println("\t &end=<endTimeSeconds>"); resp.getOutputStream().println("\t [&reqKey=<reqKey>]"); } }