mirror of
https://github.com/jlengrand/quarkus.git
synced 2026-03-10 08:41:22 +00:00
Mix in CDI with JAXRS so that MP-Metrics will work.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -39,4 +39,4 @@
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
</project>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
7
pom.xml
7
pom.xml
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user