package ru.andreymarkelov.atlas.plugins.promjiraexporter.servlet; import io.prometheus.client.exporter.common.TextFormat; import org.apache.commons.lang3.StringUtils; import ru.andreymarkelov.atlas.plugins.promjiraexporter.service.MetricCollector; import ru.andreymarkelov.atlas.plugins.promjiraexporter.service.SecureTokenManager; 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.io.Writer; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; public class PrometheusExporter extends HttpServlet { private final MetricCollector metricCollector; private final SecureTokenManager secureTokenManager; public PrometheusExporter(MetricCollector metricCollector, SecureTokenManager secureTokenManager) { this.secureTokenManager = secureTokenManager; this.metricCollector = metricCollector; } @Override protected void doGet( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { String paramToken = httpServletRequest.getParameter("token"); String storedToken = secureTokenManager.getToken(); if (StringUtils.isNotBlank(storedToken) && !storedToken.equals(paramToken)) { httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } httpServletResponse.setStatus(HttpServletResponse.SC_OK); httpServletResponse.setContentType(TextFormat.CONTENT_TYPE_004); try (Writer writer = httpServletResponse.getWriter()) { TextFormat.write004(writer, metricCollector.getRegistry().filteredMetricFamilySamples(parse(httpServletRequest))); writer.flush(); } } @Override protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { doGet(httpServletRequest, httpServletResponse); } private Set<String> parse(HttpServletRequest httpServletRequest) { String[] includedParam = httpServletRequest.getParameterValues("name[]"); if (includedParam == null) { return Collections.emptySet(); } else { return new HashSet<>(Arrays.asList(includedParam)); } } }