From 9156b9edfe43a075354030c02cece12ea770fb81 Mon Sep 17 00:00:00 2001 From: Jan Waller <jwa@informatik.uni-kiel.de> Date: Wed, 4 Jun 2014 17:52:17 +0200 Subject: [PATCH] Meta Monitoring Challenges --- frameworks/Kieker/Benchmark (Kicker).launch | 4 +- frameworks/Kieker/bin/meta-monitoring.sh | 7 +- frameworks/Kieker/lib/kicker-1.10_aspectj.jar | Bin 2854953 -> 2854986 bytes .../MonitoredClassManualInstrumentation.java | 100 ++++++++++++++++++ 4 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 frameworks/Kieker/src/mooBench/monitoredApplication/MonitoredClassManualInstrumentation.java diff --git a/frameworks/Kieker/Benchmark (Kicker).launch b/frameworks/Kieker/Benchmark (Kicker).launch index 8cc8070..53456d0 100644 --- a/frameworks/Kieker/Benchmark (Kicker).launch +++ b/frameworks/Kieker/Benchmark (Kicker).launch @@ -8,7 +8,7 @@ </listAttribute> <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/> <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="mooBench.benchmark.Benchmark"/> -<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-d 10 -h 1 -m 0 -t 1000 -o tmp/test.txt -q"/> +<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-d 10 -h 1 -m 0 -t 10 -o tmp/test.txt -q -a mooBench.monitoredApplication.MonitoredClassManualInstrumentation"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="MooBench"/> -<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-javaagent:frameworks/Kieker/lib/kicker-1.10_aspectj.jar"/> +<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-javaagent:frameworks/Kieker/lib/kicker-1.10_aspectj.jar -Dkicker.monitoring.debug=true -Dkicker.monitoring.skipDefaultAOPConfiguration=true"/> </launchConfiguration> diff --git a/frameworks/Kieker/bin/meta-monitoring.sh b/frameworks/Kieker/bin/meta-monitoring.sh index 9b97957..479096b 100644 --- a/frameworks/Kieker/bin/meta-monitoring.sh +++ b/frameworks/Kieker/bin/meta-monitoring.sh @@ -7,11 +7,11 @@ RESULTSDIR="${BASEDIR}results/" THREADS=1 ## 1 RECURSIONDEPTH=10 ## 10 -TOTALCALLS=10000 ## 10000 +TOTALCALLS=1000 ## 2000000 METHODTIME=500000 ## 500000 #MOREPARAMS="--quickstart" -MOREPARAMS="${MOREPARAMS} -r kieker.Logger" +MOREPARAMS="${MOREPARAMS} -r kieker.Logger -a mooBench.monitoredApplication.MonitoredClassManualInstrumentation" echo "Removing and recreating '$RESULTSDIR'" (rm -rf ${RESULTSDIR}) && mkdir ${RESULTSDIR} @@ -28,6 +28,7 @@ JAVAAGENT="-javaagent:lib/kicker-1.10_aspectj.jar" JAVAARGS="${JAVAARGS} -Dkieker.monitoring.writer.filesystem.AsyncFsWriter.customStoragePath=${RESULTSDIR}" JAVAARGS="${JAVAARGS} -Dkicker.monitoring.writer.filesystem.AsyncBinaryFsWriter.customStoragePath=${RESULTSDIR}" +JAVAARGS="${JAVAARGS} -Dkicker.monitoring.debug=true -Dkicker.monitoring.skipDefaultAOPConfiguration=true" ## Write configuration uname -a >${RESULTSDIR}configuration.txt @@ -51,5 +52,5 @@ sync mv ${BASEDIR}kieker.log ${RESULTSDIR}kieker.log [ -f ${BASEDIR}nohup.out ] && cp ${BASEDIR}nohup.out ${RESULTSDIR} -zip -jqr ${BASEDIR}results.zip ${RESULTSDIR}* +zip -qr ${BASEDIR}results.zip ${RESULTSDIR}* [ -f ${BASEDIR}nohup.out ] && > ${BASEDIR}nohup.out diff --git a/frameworks/Kieker/lib/kicker-1.10_aspectj.jar b/frameworks/Kieker/lib/kicker-1.10_aspectj.jar index 3f5391c91089e8aa680a3a95e75e3878e9b6e2f3..9b85c0009a8b4d13b90a49fbe602ba67bb9e790a 100644 GIT binary patch delta 18807 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 delta 19131 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 U`n8=HZ-E4Y*+jmnGcYg!0C=l(!T<mO diff --git a/frameworks/Kieker/src/mooBench/monitoredApplication/MonitoredClassManualInstrumentation.java b/frameworks/Kieker/src/mooBench/monitoredApplication/MonitoredClassManualInstrumentation.java new file mode 100644 index 0000000..bf02cb6 --- /dev/null +++ b/frameworks/Kieker/src/mooBench/monitoredApplication/MonitoredClassManualInstrumentation.java @@ -0,0 +1,100 @@ +/*************************************************************************** + * Copyright 2014 Kieker Project (http://kieker-monitoring.net) + * + * Licensed 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 mooBench.monitoredApplication; + +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadMXBean; + +import kieker.common.record.flow.trace.TraceMetadata; +import kieker.common.record.flow.trace.operation.AfterOperationEvent; +import kieker.common.record.flow.trace.operation.AfterOperationFailedEvent; +import kieker.common.record.flow.trace.operation.BeforeOperationEvent; +import kieker.monitoring.core.controller.IMonitoringController; +import kieker.monitoring.core.controller.MonitoringController; +import kieker.monitoring.core.registry.TraceRegistry; +import kieker.monitoring.timer.ITimeSource; + +/** + * @author Jan Waller + */ +public final class MonitoredClassManualInstrumentation implements MonitoredClass { + + private static final IMonitoringController CTRLINST = MonitoringController.getInstance(); + private static final ITimeSource TIME = CTRLINST.getTimeSource(); + private static final TraceRegistry TRACEREGISTRY = TraceRegistry.INSTANCE; + + final ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); + + /** + * Default constructor. + */ + public MonitoredClassManualInstrumentation() { + // empty default constructor + } + + public final long monitoredMethod(final long methodTime, final int recDepth) { + if (!CTRLINST.isMonitoringEnabled()) { + return this.monitoredMethod_actual(methodTime, recDepth); + } + final String signature = "public final long mooBench.monitoredApplication.MonitoredClassThreaded.monitoredMethod(long, int)"; + if (!CTRLINST.isProbeActivated(signature)) { + return this.monitoredMethod_actual(methodTime, recDepth); + } + // common fields + TraceMetadata trace = TRACEREGISTRY.getTrace(); + final boolean newTrace = trace == null; + if (newTrace) { + trace = TRACEREGISTRY.registerTrace(); + CTRLINST.newMonitoringRecord(trace); + } + final long traceId = trace.getTraceId(); + final String clazz = this.getClass().getName(); + // measure before execution + CTRLINST.newMonitoringRecord(new BeforeOperationEvent(TIME.getTime(), traceId, trace.getNextOrderId(), signature, clazz)); + // execution of the called method + final Object retval; + try { + retval = this.monitoredMethod_actual(methodTime, recDepth); + } catch (final Throwable th) { // NOPMD NOCS (catch throw might ok here) + // measure after failed execution + CTRLINST.newMonitoringRecord(new AfterOperationFailedEvent(TIME.getTime(), traceId, trace.getNextOrderId(), signature, clazz, + th.toString())); + throw new RuntimeException(th); + } finally { + if (newTrace) { // close the trace + TRACEREGISTRY.unregisterTrace(); + } + } + // measure after successful execution + CTRLINST.newMonitoringRecord(new AfterOperationEvent(TIME.getTime(), traceId, trace.getNextOrderId(), signature, clazz)); + return (Long) retval; + } + + public final long monitoredMethod_actual(final long methodTime, final int recDepth) { + if (recDepth > 1) { + return this.monitoredMethod(methodTime, recDepth - 1); + } else { + final long exitTime = this.threadMXBean.getCurrentThreadUserTime() + methodTime; + long currentTime; + do { + currentTime = this.threadMXBean.getCurrentThreadUserTime(); + } while (currentTime < exitTime); + return currentTime; + } + } + +} -- GitLab