001package io.prometheus.client.exporter;
002
003import io.prometheus.client.CollectorRegistry;
004import io.prometheus.client.exporter.common.TextFormat;
005
006import javax.servlet.ServletException;
007import javax.servlet.http.HttpServlet;
008import javax.servlet.http.HttpServletRequest;
009import javax.servlet.http.HttpServletResponse;
010import java.io.BufferedWriter;
011import java.io.IOException;
012import java.io.Writer;
013import java.util.Arrays;
014import java.util.Collections;
015import java.util.HashSet;
016import java.util.Set;
017
018/**
019 * The MetricsServlet class exists to provide a simple way of exposing the metrics values.
020 *
021 */
022public class MetricsServlet extends HttpServlet {
023
024  private CollectorRegistry registry;
025
026  /**
027   * Construct a MetricsServlet for the default registry.
028   */
029  public MetricsServlet() {
030    this(CollectorRegistry.defaultRegistry);
031  }
032
033  /**
034   * Construct a MetricsServlet for the given registry.
035   * @param registry collector registry
036   */
037  public MetricsServlet(CollectorRegistry registry) {
038    this.registry = registry;
039  }
040
041  @Override
042  protected void doGet(final HttpServletRequest req, final HttpServletResponse resp)
043          throws ServletException, IOException {
044    resp.setStatus(HttpServletResponse.SC_OK);
045    resp.setContentType(TextFormat.CONTENT_TYPE_004);
046
047    Writer writer = new BufferedWriter(resp.getWriter());
048    try {
049      TextFormat.write004(writer, registry.filteredMetricFamilySamples(parse(req)));
050      writer.flush();
051    } finally {
052      writer.close();
053    }
054  }
055
056  private Set<String> parse(HttpServletRequest req) {
057    String[] includedParam = req.getParameterValues("name[]");
058    if (includedParam == null) {
059      return Collections.emptySet();
060    } else {
061      return new HashSet<String>(Arrays.asList(includedParam));
062    }
063  }
064
065  @Override
066  protected void doPost(final HttpServletRequest req, final HttpServletResponse resp)
067          throws ServletException, IOException {
068    doGet(req, resp);
069  }
070
071}