001package nl.nlighten.prometheus.wildfly;
002
003import io.undertow.servlet.ServletExtension;
004import io.undertow.servlet.api.DeploymentInfo;
005import io.undertow.servlet.api.FilterInfo;
006
007import javax.servlet.DispatcherType;
008import javax.servlet.ServletContext;
009
010import org.slf4j.Logger;
011import org.slf4j.LoggerFactory;
012
013import java.util.Arrays;
014import java.util.List;
015
016/**
017 * An undertow servlet extension that adds the {@link ServletMetricsFilter}  to a deployment unless the context is blacklisted through
018 * the prometheus.wildfly.filter.blacklist system property.
019 */
020
021public class MetricFilterExtension implements ServletExtension {
022    private static final Logger LOG = LoggerFactory.getLogger(MetricFilterExtension.class);
023    private static List<String> contextBlacklist = Arrays.asList(System.getProperty("prometheus.wildfly.filter.blacklist", "/metrics").split(","));
024
025
026    @Override
027    public void handleDeployment(DeploymentInfo deploymentInfo, ServletContext servletContext) {
028
029        if (!contextBlacklist.contains(deploymentInfo.getContextPath())) {
030            LOG.info("Adding metrics filter to  deployment for context " + deploymentInfo.getContextPath());
031            FilterInfo metricsFilterInfo = new FilterInfo("metricsfilter", ServletMetricsFilter.class);
032            metricsFilterInfo.setAsyncSupported(true);
033            metricsFilterInfo.addInitParam(ServletMetricsFilter.BUCKET_CONFIG_PARAM,System.getProperty("prometheus.wildfly.filter.buckets",""));
034            deploymentInfo.addFilter(metricsFilterInfo);
035            deploymentInfo.addFilterUrlMapping("metricsfilter", "/*", DispatcherType.REQUEST);
036        } else {
037            LOG.info("Metrics filter not added to black listed context " + deploymentInfo.getContextPath());
038            LOG.info(contextBlacklist.toString());
039        }
040    }
041}