/* * Copyright 2012-2017 the original author or authors. * * 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 org.glowroot.agent.ui.sandbox; import java.io.File; import java.util.concurrent.Executors; import com.google.common.base.Charsets; import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.io.Files; import org.glowroot.agent.it.harness.AppUnderTest; import org.glowroot.agent.it.harness.Container; import org.glowroot.agent.it.harness.impl.JavaagentContainer; import org.glowroot.agent.it.harness.impl.LocalContainer; import static java.util.concurrent.TimeUnit.SECONDS; public class UiSandboxMain { private static final boolean useJavaagent = Boolean.getBoolean("glowroot.sandbox.javaagent"); private static final boolean useGlowrootCentral = Boolean.getBoolean("glowroot.sandbox.central"); private UiSandboxMain() {} public static void main(String... args) throws Exception { Container container; File testDir = new File("target"); File configFile = new File(testDir, "config.json"); if (!configFile.exists()) { Files.write( "{\"transactions\":{\"profilingIntervalMillis\":100}," + "\"ui\":{\"defaultDisplayedTransactionType\":\"Sandbox\"}}", configFile, Charsets.UTF_8); } if (useJavaagent && useGlowrootCentral) { container = new JavaagentContainer(testDir, false, ImmutableList.of("-Dglowroot.agent.id=\"UI Sandbox\"", "-Dglowroot.collector.address=localhost:8181")); } else if (useJavaagent) { container = new JavaagentContainer(testDir, true, ImmutableList.<String>of()); } else if (useGlowrootCentral) { container = new LocalContainer(testDir, false, ImmutableMap.of("glowroot.agent.id", "UI Sandbox", "glowroot.collector.address", "localhost:8184,localhost:8185")); } else { container = new LocalContainer(testDir, true, ImmutableMap.<String, String>of()); } container.executeNoExpectedTrace(GenerateTraces.class); } public static class GenerateTraces implements AppUnderTest { @Override public void executeApp() throws Exception { startDeadlockingThreads(); startDeadlockingThreads(); while (true) { Stopwatch stopwatch = Stopwatch.createStarted(); while (stopwatch.elapsed(SECONDS) < 300) { // a very short trace that will have an empty profile new NestableCall(1, 10, 100).execute(); // a trace that will have profile tree with only a single leaf new NestableCall(1, 100, 100).execute(); new NestableCall(new NestableCall(10, 50, 5000), 20, 50, 5000).execute(); new NestableCall(new NestableCall(5, 50, 5000), 5, 50, 5000).execute(); new NestableCall(new NestableCall(10, 50, 5000), 10, 50, 5000).execute(); new NestableCall(new NestableCall(20, 50, 5000), 5, 50, 5000).execute(); } new NestableCall(new NestableCall(5000, 50, 5000), 100, 50, 5000).execute(); Thread.sleep(1000); } } private void startDeadlockingThreads() { final Object lock1 = new Object(); final Object lock2 = new Object(); Executors.newSingleThreadExecutor().execute(new Runnable() { @Override public void run() { synchronized (lock1) { try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } synchronized (lock2) { // should never gets here } } } }); Executors.newSingleThreadExecutor().execute(new Runnable() { @Override public void run() { synchronized (lock2) { try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } synchronized (lock1) { // should never gets here } } } }); } } }