You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2019/06/18 08:50:09 UTC
[sling-whiteboard] 01/03: Expose runtime information through JMX
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 <ro...@apache.org>
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