package org.stagemonitor.web.monitor.widget;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.stagemonitor.configuration.ConfigurationRegistry;
import org.stagemonitor.core.Stagemonitor;
import org.stagemonitor.core.util.JsonUtils;
import org.stagemonitor.core.util.Pair;
import org.stagemonitor.tracing.TracingPlugin;
import org.stagemonitor.tracing.reporter.ReadbackSpan;
import org.stagemonitor.tracing.utils.SpanUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SpanServlet extends HttpServlet {
private static final long DEFAULT_REQUEST_TIMEOUT = TimeUnit.SECONDS.toMillis(25);
private final Logger logger = LoggerFactory.getLogger(getClass());
private final long requestTimeout;
private WidgetAjaxSpanReporter widgetAjaxSpanReporter;
public SpanServlet() {
this(Stagemonitor.getConfiguration(), new WidgetAjaxSpanReporter(), DEFAULT_REQUEST_TIMEOUT);
}
public SpanServlet(ConfigurationRegistry configuration, WidgetAjaxSpanReporter reporter, long requestTimeout) {
this.widgetAjaxSpanReporter = reporter;
this.requestTimeout = requestTimeout;
final TracingPlugin tracingPlugin = configuration.getConfig(TracingPlugin.class);
tracingPlugin.onInit(new Runnable() {
@Override
public void run() {
tracingPlugin.addReporter(widgetAjaxSpanReporter);
}
});
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
final String connectionId = req.getParameter("connectionId");
if (connectionId != null && !connectionId.trim().isEmpty()) {
writeSpansToResponse(resp, widgetAjaxSpanReporter.getSpans(connectionId, requestTimeout));
} else {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
}
}
private void writeSpansToResponse(HttpServletResponse response, Collection<Pair<Long, ReadbackSpan>> spans)
throws IOException {
if (spans == null) {
spans = Collections.emptyList();
}
response.setContentType("application/json");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "max-age=0, no-cache, no-store, must-revalidate");
response.setHeader("Expires", "0");
response.setCharacterEncoding("UTF-8");
final ArrayList<String> jsonResponse = new ArrayList<String>(spans.size());
for (Pair<Long, ReadbackSpan> spanPair : spans) {
logger.debug("writeSpansToResponse {}", spanPair);
jsonResponse.add(JsonUtils.toJson(spanPair.getB(), SpanUtils.CALL_TREE_ASCII));
}
response.getWriter().print(jsonResponse.toString());
response.getWriter().close();
}
@Override
public void destroy() {
widgetAjaxSpanReporter.close();
}
}