[ https://issues.apache.org/jira/browse/KNOX-940?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16008836#comment-16008836 ]
Mohammad Kamrul Islam commented on KNOX-940: -------------------------------------------- I need recommendations for the implementation. Knox currently utilizes dropwizard to support metrics collection and reporting. Dropwizard also supports framework to publish the metrics through REST , in addition of other important endpoints. Key part is to add [AdminServlet|http://metrics.dropwizard.io/3.1.0/manual/servlets/#adminservlet] into gateway service. In addition, we need to add couple of ServletListeners. My question is : What is the recommended way of adding new servlet in Knox? Any example or details will make things easier for me. I did a POC by creating the following diff and I accessed through these cURL commands. This can show what we have to do ultimately. But I'm not sure : where this code fits the best. {quote} curl -i -k https://localhost:8443/gateway/sandbox//metrics/metrics curl -i -k https://localhost:8443/gateway/sandbox//metrics/ping curl -i -k https://localhost:8443/gateway/sandbox//metrics/healthcheck?pretty=true {quote} {quote} diff --git a/gateway-server/pom.xml b/gateway-server/pom.xml index 652e5f3b..755e3a0e 100644 --- a/gateway-server/pom.xml +++ b/gateway-server/pom.xml @@ -328,6 +328,11 @@ <artifactId>xmltool</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>io.dropwizard.metrics</groupId> + <artifactId>metrics-servlets</artifactId> + <version>3.1.2</version> + </dependency> </dependencies> diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/deploy/DeploymentFactory.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/deploy/DeploymentFactory.java index d834e740..07eaed69 100644 --- a/gateway-server/src/main/java/org/apache/hadoop/gateway/deploy/DeploymentFactory.java +++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/deploy/DeploymentFactory.java @@ -37,6 +37,7 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; +import com.codahale.metrics.servlets.AdminServlet; import org.apache.hadoop.gateway.GatewayMessages; import org.apache.hadoop.gateway.GatewayServlet; import org.apache.hadoop.gateway.config.GatewayConfig; @@ -356,6 +357,10 @@ public abstract class DeploymentFactory { wad.createFilter().filterName( filterName ).filterClass( GatewayServlet.class.getName() ); wad.createFilterMapping().filterName( filterName ).urlPattern( "/*" ); } + String servletName = "metrics-admin"; + System.out.println("registering AdminServlet"); + wad.createServlet().servletName( servletName ).servletClass( AdminServlet.class.getName() ); + wad.createServletMapping().servletName( servletName ).urlPattern( "/metrics/*" ); if (gatewayServices != null) { gatewayServices.initializeContribution(context); } else { diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/services/DefaultGatewayServices.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/services/DefaultGatewayServices.java index 2cf043eb..8cd672e5 100644 --- a/gateway-server/src/main/java/org/apache/hadoop/gateway/services/DefaultGatewayServices.java +++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/services/DefaultGatewayServices.java @@ -218,6 +218,8 @@ public class DefaultGatewayServices implements GatewayServices { @Override public void finalizeContribution(DeploymentContext context) { // Tell the provider the location of the descriptor. - context.getWebAppDescriptor().createListener().listenerClass( GatewayServicesContextListener.class.getName() ); + context.getWebAppDescriptor().createListener().listenerClass(GatewayServicesContextListener.class.getName()); + context.getWebAppDescriptor().createListener().listenerClass(GatewayMetricsServletContextListener.class.getName()); + context.getWebAppDescriptor().createListener().listenerClass(GatewayHealthCheckServletContextListener.class.getName()); } } diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/services/GatewayHealthCheckServletContextListener.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/services/GatewayHealthCheckServletContextListener.java new file mode 100644 index 00000000..1b0f3ef5 --- /dev/null +++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/services/GatewayHealthCheckServletContextListener.java @@ -0,0 +1,19 @@ +package org.apache.hadoop.gateway.services; + +import com.codahale.metrics.health.HealthCheckRegistry; +import com.codahale.metrics.servlets.HealthCheckServlet; + +/** + * Created by mislam on 5/9/17. + */ +public class GatewayHealthCheckServletContextListener extends HealthCheckServlet.ContextListener { + + public static final HealthCheckRegistry HEALTH_CHECK_REGISTRY = new HealthCheckRegistry(); + + @Override + protected HealthCheckRegistry getHealthCheckRegistry() { + System.out.println("GatewayHealthCheckServletContextListener CAlled"); + return HEALTH_CHECK_REGISTRY; + } + +} \ No newline at end of file diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/services/GatewayMetricsServletContextListener.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/services/GatewayMetricsServletContextListener.java new file mode 100644 index 00000000..334b0c4a --- /dev/null +++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/services/GatewayMetricsServletContextListener.java @@ -0,0 +1,15 @@ +package org.apache.hadoop.gateway.services; + +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.servlets.MetricsServlet; +import org.apache.hadoop.gateway.services.metrics.impl.DefaultMetricsService; + +public class GatewayMetricsServletContextListener extends MetricsServlet.ContextListener { + + @Override + protected MetricRegistry getMetricRegistry() { + System.out.println("GatewayMetricsServletContextListener CAlled"); + return DefaultMetricsService.metrics; + } + +} diff --git a/gateway-server/src/main/java/org/apache/hadoop/gateway/services/metrics/impl/DefaultMetricsService.java b/gateway-server/src/main/java/org/apache/hadoop/gateway/services/metrics/impl/DefaultMetricsService.java index 0fa8a44f..af08c209 100644 --- a/gateway-server/src/main/java/org/apache/hadoop/gateway/services/metrics/impl/DefaultMetricsService.java +++ b/gateway-server/src/main/java/org/apache/hadoop/gateway/services/metrics/impl/DefaultMetricsService.java @@ -38,7 +38,7 @@ import java.util.ServiceLoader; public class DefaultMetricsService implements MetricsService { private static GatewayMessages LOG = MessagesFactory.get( GatewayMessages.class ); - private final MetricRegistry metrics = new MetricRegistry(); + public static final MetricRegistry metrics = new MetricRegistry(); public static final String METRICS_REGISTRY = "metrics-registry"; {quote} > Support REST access exposing metrics > ------------------------------------ > > Key: KNOX-940 > URL: https://issues.apache.org/jira/browse/KNOX-940 > Project: Apache Knox > Issue Type: Task > Reporter: Mohammad Kamrul Islam > Assignee: Mohammad Kamrul Islam > > KNOX-643 added the support to publish metrics. However, the metrics are not > accessible through REST. This JIRA is to add REST support. -- This message was sent by Atlassian JIRA (v6.3.15#6346)