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