001package io.prometheus.client.examples.guice.servlet;
002
003import com.google.inject.Inject;
004import com.google.inject.Singleton;
005import com.google.inject.name.Named;
006import io.prometheus.client.metrics.Counter;
007import io.prometheus.client.metrics.Summary;
008
009import javax.servlet.ServletException;
010import javax.servlet.http.HttpServlet;
011import javax.servlet.http.HttpServletRequest;
012import javax.servlet.http.HttpServletResponse;
013import java.io.IOException;
014
015@Singleton
016public class BarServlet extends HttpServlet {
017  private final Counter.Partial requestPartial;
018  private final Summary.Partial latencyPartial;
019
020  @Inject
021  public BarServlet(final @Named("handler") Counter requests,
022      final @Named("handler") Summary latencies) {
023
024    requestPartial = requests.newPartial().labelPair("handler", "bar");
025    latencyPartial = latencies.newPartial().labelPair("handler", "bar");
026  }
027
028  @Override
029  protected void doGet(final HttpServletRequest req, final HttpServletResponse resp)
030      throws ServletException, IOException {
031    final long start = System.currentTimeMillis();
032
033    final Counter.Partial count = requestPartial.clone();
034    final Summary.Partial latency = latencyPartial.clone();
035    try {
036      // Fictitiously take up to 100ms to provision a response.
037      Thread.sleep((long)(Math.random() * 100));
038
039      resp.setStatus(HttpServletResponse.SC_OK);
040      resp.getWriter().write("Here's one bar for you!");
041
042      count.labelPair("result", "success");
043      latency.labelPair("result", "success");
044    } catch (final IOException e) {
045      count.labelPair("result", "failure");
046      latency.labelPair("result", "failure");
047      throw e;
048    } catch (final RuntimeException e) {
049      count.labelPair("result", "failure");
050      latency.labelPair("result", "failure");
051      throw e;
052    } catch (final InterruptedException e) {
053      count.labelPair("result", "failure");
054      latency.labelPair("result", "failure");
055    } finally {
056      final long dur = System.currentTimeMillis() - start;
057      count.apply().increment();
058      latency.apply().observe((double)dur);
059    }
060  }
061}