Mix in CDI with JAXRS so that MP-Metrics will work.

This commit is contained in:
Bob McWhirter
2018-07-31 12:03:52 -04:00
parent 7d064a28e7
commit dc74edee7e
11 changed files with 175 additions and 23 deletions

View File

@@ -9,9 +9,9 @@ public class RuntimePriority {
public static final int UNDERTOW_CREATE_DEPLOYMENT = 100;
public static final int UNDERTOW_REGISTER_SERVLET = 200;
public static final int JAXRS_DEPLOYMENT = 250;
public static final int HEALTH_DEPLOYMENT = 260;
public static final int WELD_DEPLOYMENT = 300;
public static final int JAXRS_DEPLOYMENT = 350;
public static final int UNDERTOW_DEPLOY = 400;
public static final int UNDERTOW_START = 500;

View File

@@ -9,12 +9,13 @@ import org.eclipse.microprofile.metrics.annotation.Counted;
import org.eclipse.microprofile.metrics.annotation.Metric;
@Path("/test")
@Counted
public class TestResource {
@Counted
@GET
@Counted(monotonic = true)
public String getTest() {
System.err.println( "called");
new Exception().printStackTrace();;
return "TEST";
}

View File

@@ -51,6 +51,8 @@ import org.jboss.shamrock.deployment.ProcessorContext;
import org.jboss.shamrock.deployment.ResourceProcessor;
import org.jboss.shamrock.deployment.RuntimePriority;
import org.jboss.shamrock.deployment.codegen.BytecodeRecorder;
import org.jboss.shamrock.jaxrs.runtime.graal.JaxrsTemplate;
import org.jboss.shamrock.jaxrs.runtime.graal.ShamrockInjectorFactory;
import org.jboss.shamrock.runtime.InjectionInstance;
import org.jboss.shamrock.undertow.runtime.UndertowDeploymentTemplate;
@@ -66,7 +68,9 @@ public class JaxrsScanningProcessor implements ResourceProcessor {
private static final String JAX_RS_SERVLET_NAME = "javax.ws.rs.core.Application";
private static final DotName APPLICATION_PATH = DotName.createSimple("javax.ws.rs.ApplicationPath");
private static final DotName PATH = DotName.createSimple("javax.ws.rs.Path");
private static final DotName XML_ROOT = DotName.createSimple("javax.xml.bind.annotation.XmlRootElement");
private static final DotName[] METHOD_ANNOTATIONS = {
@@ -125,6 +129,7 @@ public class JaxrsScanningProcessor implements ResourceProcessor {
undertow.addServletContextParameter(null, ResteasyContextParameters.RESTEASY_SCANNED_RESOURCES, sb.toString());
undertow.addServletContextParameter(null, "resteasy.servlet.mapping.prefix", path);
undertow.addServletContextParameter(null, "resteasy.injector.factory", ShamrockInjectorFactory.class.getName());
processorContext.addReflectiveClass(HttpServlet30Dispatcher.class.getName());
for (String i : loadProviders()) {
processorContext.addReflectiveClass(i);
@@ -144,6 +149,10 @@ public class JaxrsScanningProcessor implements ResourceProcessor {
}
}
try (BytecodeRecorder recorder = processorContext.addStaticInitTask(RuntimePriority.JAXRS_DEPLOYMENT)) {
JaxrsTemplate jaxrs = recorder.getRecordingProxy(JaxrsTemplate.class);
jaxrs.setupIntegration(null);
}
}
@Override

View File

@@ -39,4 +39,4 @@
</plugin>
</plugins>
</build>
</project>
</project>

View File

@@ -0,0 +1,16 @@
package org.jboss.shamrock.jaxrs.runtime.graal;
import javax.enterprise.inject.se.SeContainer;
import org.jboss.shamrock.runtime.ContextObject;
/**
* Created by bob on 7/31/18.
*/
public class JaxrsTemplate {
public void setupIntegration(@ContextObject("weld.container")SeContainer container) {
ShamrockInjectorFactory.CONTAINER = container;
}
}

View File

@@ -0,0 +1,53 @@
package org.jboss.shamrock.jaxrs.runtime.graal;
import java.lang.reflect.Constructor;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.CDI;
import javax.ws.rs.WebApplicationException;
import org.jboss.resteasy.spi.ApplicationException;
import org.jboss.resteasy.spi.ConstructorInjector;
import org.jboss.resteasy.spi.Failure;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.HttpResponse;
import sun.security.provider.SHA;
/**
* Created by bob on 7/31/18.
*/
public class ShamrockConstructorInjector implements ConstructorInjector {
public ShamrockConstructorInjector(Constructor ctor, ConstructorInjector delegate) {
this.ctor = ctor;
this.delegate = delegate;
}
@Override
public Object construct() {
System.err.println( "construct() " + this.ctor );
return this.delegate.construct();
}
@Override
public Object construct(HttpRequest request, HttpResponse response) throws Failure, WebApplicationException, ApplicationException {
System.err.println( "construct(req,resp) " + this.ctor );
System.err.println( "CAN WE CDI? " + ShamrockInjectorFactory.CONTAINER);
Instance object = ShamrockInjectorFactory.CONTAINER.select(this.ctor.getDeclaringClass());
//return this.delegate.construct(request, response);
return object.get();
}
@Override
public Object[] injectableArguments() {
return this.delegate.injectableArguments();
}
@Override
public Object[] injectableArguments(HttpRequest request, HttpResponse response) throws Failure {
return this.delegate.injectableArguments(request, response);
}
private final ConstructorInjector delegate;
private final Constructor ctor;
}

View File

@@ -0,0 +1,30 @@
package org.jboss.shamrock.jaxrs.runtime.graal;
import java.lang.reflect.Constructor;
import javax.enterprise.inject.se.SeContainer;
import org.jboss.resteasy.core.InjectorFactoryImpl;
import org.jboss.resteasy.spi.ConstructorInjector;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.jboss.resteasy.spi.metadata.ResourceConstructor;
/**
* Created by bob on 7/31/18.
*/
public class ShamrockInjectorFactory extends InjectorFactoryImpl {
public static SeContainer CONTAINER = null;
@Override
public ConstructorInjector createConstructor(Constructor constructor, ResteasyProviderFactory providerFactory) {
System.err.println( "create constructor: " + constructor );
return super.createConstructor(constructor, providerFactory);
}
@Override
public ConstructorInjector createConstructor(ResourceConstructor constructor, ResteasyProviderFactory providerFactory) {
System.err.println( "create resource constructor: " + constructor.getConstructor() );
return new ShamrockConstructorInjector(constructor.getConstructor(), super.createConstructor(constructor, providerFactory));
}
}

View File

@@ -70,6 +70,7 @@ public class NativeImageMojo extends AbstractMojo {
if (debugSymbols) {
command.add("-g");
}
command.add("-O0");
System.out.println(command);
Process process = Runtime.getRuntime().exec(command.toArray(new String[0]), null, outputDirectory);
new Thread(new ProcessReader(process.getInputStream())).start();

View File

@@ -1,23 +1,28 @@
package org.jboss.shamrock.metrics;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.inject.Inject;
import io.smallrye.metrics.MetricProducer;
import io.smallrye.metrics.MetricRegistries;
import io.smallrye.metrics.MetricsRequestHandler;
import io.smallrye.metrics.app.CounterImpl;
import io.smallrye.metrics.interceptors.CountedInterceptor;
import io.smallrye.metrics.interceptors.MeteredInterceptor;
import io.smallrye.metrics.interceptors.MetricNameFactory;
import io.smallrye.metrics.interceptors.MetricsBinding;
import io.smallrye.metrics.interceptors.MetricsInterceptor;
import io.smallrye.metrics.interceptors.TimedInterceptor;
import org.eclipse.microprofile.metrics.Metric;
import org.eclipse.microprofile.metrics.annotation.Counted;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.AnnotationTarget;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
import org.jboss.jandex.Index;
import org.jboss.jandex.MethodInfo;
import org.jboss.shamrock.deployment.ArchiveContext;
import org.jboss.shamrock.deployment.ProcessorContext;
import org.jboss.shamrock.deployment.ResourceProcessor;
@@ -46,7 +51,7 @@ public class MetricsProcessor implements ResourceProcessor {
@Override
public void process(ArchiveContext archiveContext, ProcessorContext processorContext) throws Exception {
System.err.println( "PROCESSING METRICS");
System.err.println("PROCESSING METRICS");
ServletData servletData = new ServletData("metrics", MetricsServlet.class.getName());
servletData.getMapings().add(config.getConfig("metrics.path", "/metrics"));
servletDeployment.addServlet(servletData);
@@ -60,28 +65,38 @@ public class MetricsProcessor implements ResourceProcessor {
weldDeployment.addAdditionalBean(CountedInterceptor.class);
weldDeployment.addAdditionalBean(TimedInterceptor.class);
weldDeployment.addInterceptor(MetricsInterceptor.class);
weldDeployment.addInterceptor(MeteredInterceptor.class);
weldDeployment.addInterceptor(CountedInterceptor.class);
weldDeployment.addInterceptor(TimedInterceptor.class);
//weldDeployment.addInterceptor(MetricsInterceptor.class);
//weldDeployment.addInterceptor(MeteredInterceptor.class);
//weldDeployment.addInterceptor(CountedInterceptor.class);
//weldDeployment.addInterceptor(TimedInterceptor.class);
processorContext.addReflectiveClass(Counted.class.getName());
processorContext.addReflectiveClass(MetricsBinding.class.getName());
weldDeployment.addAdditionalBean(MetricsRequestHandler.class);
weldDeployment.addAdditionalBean(MetricsServlet.class);
try (BytecodeRecorder recorder = processorContext.addStaticInitTask(RuntimePriority.WELD_DEPLOYMENT + 30 ) ) {
try (BytecodeRecorder recorder = processorContext.addStaticInitTask(RuntimePriority.WELD_DEPLOYMENT + 30)) {
MetricsDeploymentTemplate metrics = recorder.getRecordingProxy(MetricsDeploymentTemplate.class);
metrics.createRegistries();
}
try (BytecodeRecorder recorder = processorContext.addDeploymentTask(RuntimePriority.WELD_DEPLOYMENT + 30 ) ) {
MetricsDeploymentTemplate metrics = recorder.getRecordingProxy(MetricsDeploymentTemplate.class);
Index index = archiveContext.getIndex();
List<AnnotationInstance> annos = index.getAnnotations(DotName.createSimple(Counted.class.getName()));
for (AnnotationInstance anno : annos) {
metrics.registerCounted(anno.target().toString());
System.err.println("anno: " + anno);
AnnotationTarget target = anno.target();
MethodInfo methodInfo = target.asMethod();
ClassInfo classInfo = methodInfo.declaringClass();
metrics.registerCounted(classInfo.name().toString(),
methodInfo.name().toString());
processorContext.addReflectiveClass(classInfo.name().toString());
}
}
}

View File

@@ -1,22 +1,44 @@
package org.jboss.shamrock.metrics.runtime;
import javax.enterprise.inject.spi.CDI;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import io.smallrye.metrics.MetricRegistries;
import io.smallrye.metrics.app.CounterImpl;
import org.eclipse.microprofile.metrics.Metric;
import io.smallrye.metrics.interceptors.MetricResolver;
import org.eclipse.microprofile.metrics.Metadata;
import org.eclipse.microprofile.metrics.MetricRegistry;
import org.eclipse.microprofile.metrics.MetricType;
import org.eclipse.microprofile.metrics.annotation.Counted;
/**
* Created by bob on 7/30/18.
*/
public class MetricsDeploymentTemplate {
public void registerCounted(String name) {
System.err.println("register: " + name);
/*
public <E extends Member & AnnotatedElement> void registerCounted(Class<?> topClass, E element) {
MetricRegistry registry = MetricRegistries.get(MetricRegistry.Type.APPLICATION);
registry.register(name, new CounterImpl());
//registry.register(name, new CounterImpl());
MetricResolver resolver = new MetricResolver();
MetricResolver.Of<Counted> of = resolver.counted(topClass, element);
Metadata meta = new Metadata(of.metricName(), MetricType.COUNTER);
//registry.register(meta, new CounterImpl());
}
*/
public void registerCounted(String topClassName, String elementName) {
MetricRegistry registry = MetricRegistries.get(MetricRegistry.Type.APPLICATION);
MetricResolver resolver = new MetricResolver();
String name = MetricRegistry.name(topClassName, elementName);
Metadata meta = new Metadata(name, MetricType.COUNTER);
System.err.println( "register: " + name);
registry.register(meta, new CounterImpl());
}
public void createRegistries() {
System.err.println("creating registries");

View File

@@ -23,7 +23,7 @@
<jboss-servlet-api_4.0_spec.version>1.0.0.Final</jboss-servlet-api_4.0_spec.version>
<smallrye-config.version>1.3.1</smallrye-config.version>
<smallrye-health.version>1.0.1</smallrye-health.version>
<smallrye-metrics.version>1.1.0</smallrye-metrics.version>
<smallrye-metrics.version>1.1.1-SNAPSHOT</smallrye-metrics.version>
<javax.inject.version>1</javax.inject.version>
<jboss-classfilewriter.version>1.2.1.Final</jboss-classfilewriter.version>
<jboss-invocation.version>1.5.1.Final</jboss-invocation.version>
@@ -201,6 +201,11 @@
<artifactId>jboss-invocation</artifactId>
<version>${jboss-invocation.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-cdi</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>