package org.apereo.cas.web.report;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.servlets.MetricsServlet;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.context.WebApplicationContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
import java.util.Properties;
/**
* This is {@link MetricsController}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
public class MetricsController extends BaseCasMvcEndpoint {
private Properties initParameters = new Properties();
@Autowired
private ApplicationContext applicationContext;
@Autowired
@Qualifier("metrics")
private MetricRegistry metrics;
public MetricsController(final CasConfigurationProperties casProperties) {
super("casmetrics", "/metrics", casProperties.getMonitor().getEndpoints().getMetrics(), casProperties);
}
/**
* Handle.
*
* @param request the request
* @param response the response
* @throws Exception the exception
*/
@GetMapping
public void handle(final HttpServletRequest request, final HttpServletResponse response) throws Exception {
ensureEndpointAccessIsAuthorized(request, response);
final MetricsServlet servlet = new MetricsServlet(this.metrics);
servlet.init(new DelegatingServletConfig());
servlet.service(request, response);
}
private ServletContext getServletContext() {
if (applicationContext instanceof WebApplicationContext) {
final WebApplicationContext webCtx = (WebApplicationContext) applicationContext;
return webCtx.getServletContext();
}
throw new IllegalArgumentException("Cant determine the web application context");
}
private class DelegatingServletConfig implements ServletConfig {
protected DelegatingServletConfig() {
}
@Override
public String getServletName() {
return MetricsController.this.getClass().getSimpleName();
}
@Override
public ServletContext getServletContext() {
return MetricsController.this.getServletContext();
}
@Override
public String getInitParameter(final String paramName) {
return MetricsController.this.initParameters.getProperty(paramName);
}
@Override
public Enumeration getInitParameterNames() {
return MetricsController.this.initParameters.keys();
}
}
}