This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch feature/jmx in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git
commit 6cf61fd03cb8d1eb09aadf09f6846fb680a4cd32 Author: Robert Munteanu <[email protected]> AuthorDate: Tue Jun 18 10:26:43 2019 +0200 Expose runtime information through JMX --- .../main/java/org/apache/sling/uca/impl/Agent.java | 28 ++++++-- .../java/org/apache/sling/uca/impl/AgentInfo.java | 77 ++++++++++++++++++++++ ...TimeoutTransformer.java => AgentInfoMBean.java} | 42 ++++++++---- .../uca/impl/HttpClient3TimeoutTransformer.java | 7 +- .../uca/impl/HttpClient4TimeoutTransformer.java | 4 +- .../sling/uca/impl/JavaNetTimeoutTransformer.java | 7 +- .../sling/uca/impl/OkHttpTimeoutTransformer.java | 4 +- ...pdateFieldsInConstructorTimeoutTransformer.java | 6 +- .../uca/impl/JaveNetTimeoutTransformerTest.java | 2 +- 9 files changed, 151 insertions(+), 26 deletions(-) diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/Agent.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/Agent.java index 3842268..d46c56c 100644 --- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/Agent.java +++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/Agent.java @@ -18,8 +18,15 @@ package org.apache.sling.uca.impl; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; +import java.lang.management.ManagementFactory; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; +import javax.management.InstanceAlreadyExistsException; +import javax.management.MBeanRegistrationException; +import javax.management.NotCompliantMBeanException; + public class Agent { public static void premain(String args, Instrumentation inst) { @@ -39,15 +46,26 @@ public class Agent { Log.get().log("Preparing to install URL transformers. Configured timeouts - connectTimeout : %d, readTimeout: %d", connectTimeout, readTimeout); + AgentInfo agentInfoMBean = new AgentInfo(connectTimeout, readTimeout); + ClassFileTransformer[] transformers = new ClassFileTransformer[] { - new JavaNetTimeoutTransformer(connectTimeout, readTimeout), - new HttpClient3TimeoutTransformer(connectTimeout, readTimeout), - new HttpClient4TimeoutTransformer(connectTimeout, readTimeout), - new OkHttpTimeoutTransformer(connectTimeout, readTimeout) + new JavaNetTimeoutTransformer(connectTimeout, readTimeout, agentInfoMBean), + new HttpClient3TimeoutTransformer(connectTimeout, readTimeout, agentInfoMBean), + new HttpClient4TimeoutTransformer(connectTimeout, readTimeout, agentInfoMBean), + new OkHttpTimeoutTransformer(connectTimeout, readTimeout, agentInfoMBean) }; - for ( ClassFileTransformer transformer : transformers ) + List<String> transformerNames = new ArrayList<>(); + for ( ClassFileTransformer transformer : transformers ) { inst.addTransformer(transformer, true); + transformerNames.add(transformer.getClass().getName()); + } + + try { + ManagementFactory.getPlatformMBeanServer().registerMBean(agentInfoMBean, AgentInfo.NAME); + } catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) { + Log.get().log("Failed registering MBean: %s", e.getMessage()); + } Log.get().log("All transformers installed"); } diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfo.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfo.java new file mode 100644 index 0000000..1a4f641 --- /dev/null +++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfo.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sling.uca.impl; + +import java.lang.instrument.ClassFileTransformer; +import java.util.ArrayList; +import java.util.List; + +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; + +public class AgentInfo implements AgentInfoMBean { + + static final ObjectName NAME; + + static { + try { + NAME = new ObjectName(AgentInfo.class.getPackage().getName()+":type=Agent"); + } catch (MalformedObjectNameException e) { + throw new ExceptionInInitializerError(e); + } + } + + private final long connectTimeoutMillis; + + private final long readTimeoutMillis; + + private List<String> transformers = new ArrayList<>(); + + private List<String> transformedClasses = new ArrayList<>(); + + + public AgentInfo(long connectTimeoutMillis, long readTimeoutMillis) { + this.connectTimeoutMillis = connectTimeoutMillis; + this.readTimeoutMillis = readTimeoutMillis; + } + + @Override + public long getConnectTimeoutMillis() { + return connectTimeoutMillis; + } + + @Override + public long getReadTimeoutMillis() { + return readTimeoutMillis; + } + + public String[] getTransformers() { + return transformers.toArray(new String[0]); + } + + public String[] getTransformedClasses() { + return transformedClasses.toArray(new String[0]); + } + + public void registerTransformedClass(String transformedClassName) { + transformedClasses.add(transformedClassName); + } + + public void registerTransformer(Class<? extends ClassFileTransformer> transformerClass) { + transformers.add(transformerClass.getName()); + } +} diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfoMBean.java similarity index 53% copy from url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java copy to url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfoMBean.java index bcfae7c..d0b9eb9 100644 --- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java +++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/AgentInfoMBean.java @@ -16,21 +16,37 @@ */ package org.apache.sling.uca.impl; -import javassist.bytecode.Descriptor; - /** - * Sets timeouts for HTTP calls done using <em>OkHttp 3.x</em> - * - * <p>It inserts two calls to <tt>okhttp3.OkHttpClient$Builder</tt> that set default - * values for <tt>connectTimeout</tt> and <tt>readTimeout</tt>.</p> + * Exposes runtime information about the agent using <tt>JMX</tt>. + * */ -public class OkHttpTimeoutTransformer extends UpdateFieldsInConstructorTimeoutTransformer { +public interface AgentInfoMBean { - private static final String REQUEST_CONFIG_BUILDER_CLASS_NAME = Descriptor.toJvmName("okhttp3.OkHttpClient$Builder"); + /** + * Returns the connect timeout + * + * @return the connect timeout as configured, in milliseconds + */ + long getConnectTimeoutMillis(); + + /** + * Returns the read timeout + * + * @return the read timeout as configured, in milliseconds + */ + long getReadTimeoutMillis(); + + /** + * Returns the active transformers + * + * @return the active transformers + */ + String[] getTransformers(); - public OkHttpTimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis) { - - super(REQUEST_CONFIG_BUILDER_CLASS_NAME, "connectTimeout", "readTimeout", - connectTimeoutMillis, readTimeoutMillis); - } + /** + * Returns the classes that were transformed to enforce global timeout defaults + * + * @return the classes that were transformed + */ + String[] getTransformedClasses(); } diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient3TimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient3TimeoutTransformer.java index 9bf5d92..05e2891 100644 --- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient3TimeoutTransformer.java +++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient3TimeoutTransformer.java @@ -37,10 +37,13 @@ public class HttpClient3TimeoutTransformer implements ClassFileTransformer { private final long connectTimeoutMillis; private final long readTimeoutMillis; + private final AgentInfo agentInfoMbean; - public HttpClient3TimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis) { + public HttpClient3TimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis, AgentInfo agentInfoMBean) { this.connectTimeoutMillis = connectTimeoutMillis; this.readTimeoutMillis = readTimeoutMillis; + this.agentInfoMbean = agentInfoMBean; + this.agentInfoMbean.registerTransformer(getClass()); } @Override @@ -64,6 +67,8 @@ public class HttpClient3TimeoutTransformer implements ClassFileTransformer { classfileBuffer = cc.toBytecode(); cc.detach(); Log.get().log("Transformation complete."); + + agentInfoMbean.registerTransformedClass(className); } return classfileBuffer; } catch (Exception e) { diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java index 5b5b317..6a3990a 100644 --- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java +++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/HttpClient4TimeoutTransformer.java @@ -30,8 +30,8 @@ public class HttpClient4TimeoutTransformer extends UpdateFieldsInConstructorTime private static final String REQUEST_CONFIG_BUILDER_CLASS_NAME = Descriptor.toJvmName("org.apache.http.client.config.RequestConfig$Builder"); - public HttpClient4TimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis) { + public HttpClient4TimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis, AgentInfo agentInfoMBean) { super(REQUEST_CONFIG_BUILDER_CLASS_NAME, "connectTimeout", "socketTimeout", - connectTimeoutMillis, readTimeoutMillis); + connectTimeoutMillis, readTimeoutMillis, agentInfoMBean); } } diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/JavaNetTimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/JavaNetTimeoutTransformer.java index 121417c..02e07f3 100644 --- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/JavaNetTimeoutTransformer.java +++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/JavaNetTimeoutTransformer.java @@ -49,10 +49,13 @@ class JavaNetTimeoutTransformer implements ClassFileTransformer { private final long readTimeoutMillis; private final long connectTimeoutMillis; + private final AgentInfo agentInfoMBean; - public JavaNetTimeoutTransformer(long connectTimeout, long readTimeout) { + public JavaNetTimeoutTransformer(long connectTimeout, long readTimeout, AgentInfo agentInfoMBean) { this.connectTimeoutMillis = connectTimeout; this.readTimeoutMillis = readTimeout; + this.agentInfoMBean = agentInfoMBean; + this.agentInfoMBean.registerTransformer(getClass()); } @Override @@ -67,6 +70,8 @@ class JavaNetTimeoutTransformer implements ClassFileTransformer { classfileBuffer = connectMethod.getDeclaringClass().toBytecode(); connectMethod.getDeclaringClass().detach(); Log.get().log("Transformation complete."); + + this.agentInfoMBean.registerTransformedClass(className); } return classfileBuffer; } catch (Exception e) { diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java index bcfae7c..458996e 100644 --- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java +++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/OkHttpTimeoutTransformer.java @@ -28,9 +28,9 @@ public class OkHttpTimeoutTransformer extends UpdateFieldsInConstructorTimeoutTr private static final String REQUEST_CONFIG_BUILDER_CLASS_NAME = Descriptor.toJvmName("okhttp3.OkHttpClient$Builder"); - public OkHttpTimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis) { + public OkHttpTimeoutTransformer(long connectTimeoutMillis, long readTimeoutMillis, AgentInfo agentInfoMBean) { super(REQUEST_CONFIG_BUILDER_CLASS_NAME, "connectTimeout", "readTimeout", - connectTimeoutMillis, readTimeoutMillis); + connectTimeoutMillis, readTimeoutMillis, agentInfoMBean); } } diff --git a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/UpdateFieldsInConstructorTimeoutTransformer.java b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/UpdateFieldsInConstructorTimeoutTransformer.java index 274bcd4..1ed23e9 100644 --- a/url-connection-agent/src/main/java/org/apache/sling/uca/impl/UpdateFieldsInConstructorTimeoutTransformer.java +++ b/url-connection-agent/src/main/java/org/apache/sling/uca/impl/UpdateFieldsInConstructorTimeoutTransformer.java @@ -36,15 +36,18 @@ public abstract class UpdateFieldsInConstructorTimeoutTransformer implements Cla private final String readTimeoutFieldName; private final long connectTimeoutMillis; private final long readTimeoutMillis; + private final AgentInfo agentInfoMBean; public UpdateFieldsInConstructorTimeoutTransformer(String className, String connectTimeoutFieldName, - String readTimeoutFieldName, long connectTimeoutMillis, long readTimeoutMillis) { + String readTimeoutFieldName, long connectTimeoutMillis, long readTimeoutMillis, AgentInfo agentInfoMBean) { this.className = className; this.connectTimeoutFieldName = connectTimeoutFieldName; this.readTimeoutFieldName = readTimeoutFieldName; this.connectTimeoutMillis = connectTimeoutMillis; this.readTimeoutMillis = readTimeoutMillis; + this.agentInfoMBean = agentInfoMBean; + this.agentInfoMBean.registerTransformer(getClass()); } @Override @@ -66,6 +69,7 @@ public abstract class UpdateFieldsInConstructorTimeoutTransformer implements Cla classfileBuffer = cc.toBytecode(); cc.detach(); Log.get().log("Transformation complete."); + this.agentInfoMBean.registerTransformedClass(className); } return classfileBuffer; } catch (Exception e) { diff --git a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/JaveNetTimeoutTransformerTest.java b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/JaveNetTimeoutTransformerTest.java index c0abffc..9ddffde 100644 --- a/url-connection-agent/src/test/java/org/apache/sling/uca/impl/JaveNetTimeoutTransformerTest.java +++ b/url-connection-agent/src/test/java/org/apache/sling/uca/impl/JaveNetTimeoutTransformerTest.java @@ -31,7 +31,7 @@ public class JaveNetTimeoutTransformerTest { @BeforeEach public void initFields() { - transformer = new JavaNetTimeoutTransformer(1, 1); + transformer = new JavaNetTimeoutTransformer(1, 1, new AgentInfo(1, 1)); } @Test
