Skip to content

Commit

Permalink
Build time analytics
Browse files Browse the repository at this point in the history
  • Loading branch information
brunobat committed May 23, 2023
1 parent 5ad2f1c commit 385a377
Show file tree
Hide file tree
Showing 60 changed files with 3,555 additions and 11 deletions.
5 changes: 5 additions & 0 deletions bom/application/pom.xml
Expand Up @@ -6524,6 +6524,11 @@
<artifactId>quarkus-devtools-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-analytics-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-apache-httpclient</artifactId>
Expand Down
24 changes: 24 additions & 0 deletions build-parent/pom.xml
Expand Up @@ -179,6 +179,10 @@
<gcf-invoker.version>1.1.1</gcf-invoker.version>
<!-- Jakarta JMS API -->
<jakarta.jms-api.version>3.1.0</jakarta.jms-api.version>

<!-- Quarkus Analytics -->
<properties-maven-plugin.version>1.1.0</properties-maven-plugin.version>
<quarkus.analytics.disabled>true</quarkus.analytics.disabled>
</properties>

<dependencyManagement>
Expand Down Expand Up @@ -431,6 +435,26 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>${properties-maven-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>set-system-properties</goal>
</goals>
<configuration>
<properties>
<property>
<name>quarkus.analytics.disabled</name>
<value>${quarkus.analytics.disabled}</value>
</property>
</properties>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${version.surefire.plugin}</version>
Expand Down
@@ -1,6 +1,8 @@
package io.quarkus.deployment.pkg.builditem;

import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;

import io.quarkus.builder.item.SimpleBuildItem;

Expand Down Expand Up @@ -54,5 +56,14 @@ public String getDistribution() {
public static GraalVMVersion unknown() {
return new GraalVMVersion("unknown", "unknown", -1, "unknown");
}

public Map<String, String> toMap() {
final Map<String, String> graalVMVersion = new HashMap<>();
graalVMVersion.put("graalvm.version.full", fullVersion);
graalVMVersion.put("graalvm.version.version", version);
graalVMVersion.put("graalvm.version.java", String.valueOf(javaVersion));
graalVMVersion.put("graalvm.version.distribution", distribution);
return graalVMVersion;
}
}
}
Expand Up @@ -35,6 +35,7 @@
import io.quarkus.bootstrap.classloading.QuarkusClassLoader;
import io.quarkus.builder.BuildChainBuilder;
import io.quarkus.builder.BuildResult;
import io.quarkus.builder.diag.Diagnostic;
import io.quarkus.builder.item.BuildItem;
import io.quarkus.deployment.QuarkusAugmentor;
import io.quarkus.deployment.builditem.ApplicationClassNameBuildItem;
Expand Down Expand Up @@ -191,7 +192,11 @@ public AugmentResult createProductionApplication() {
.map(a -> new ArtifactResult(a.getPath(), a.getType(), a.getMetadata()))
.collect(Collectors.toList()),
jarBuildItem != null ? jarBuildItem.toJarResult() : null,
nativeImageBuildItem != null ? nativeImageBuildItem.getPath() : null);
nativeImageBuildItem != null ? nativeImageBuildItem.getPath() : null,
result.getDiagnostics().stream()
.map(Diagnostic::toString)
.collect(Collectors.toList()),
nativeImageBuildItem != null ? nativeImageBuildItem.getGraalVMInfo().toMap() : Collections.emptyMap());
}

private void writeDebugSourceFile(BuildResult result) {
Expand Down
1 change: 1 addition & 0 deletions devtools/gradle/gradle-application-plugin/build.gradle.kts
Expand Up @@ -4,6 +4,7 @@ plugins {

dependencies {
implementation(libs.smallrye.config.yaml)
implementation("io.quarkus:quarkus-analytics-common")

testImplementation(libs.quarkus.project.core.extension.codestarts)
}
Expand Down
4 changes: 4 additions & 0 deletions devtools/gradle/gradle-application-plugin/pom.xml
Expand Up @@ -36,6 +36,10 @@
<groupId>io.quarkus</groupId>
<artifactId>quarkus-devtools-common</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-analytics-common</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-project-core-extension-codestarts</artifactId>
Expand Down
@@ -0,0 +1,85 @@
package io.quarkus.gradle;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;

import org.aesh.readline.Readline;
import org.aesh.readline.ReadlineBuilder;
import org.aesh.readline.tty.terminal.TerminalConnection;
import org.aesh.terminal.tty.Signal;

/**
* Prompt implementation.
*
* @author <a href="http://escoffier.me">Clement Escoffier</a>
*/
public class Prompter {

private static class Prompt {
private final String prompt;
private final String defaultValue;
private final Consumer<String> inputConsumer;

public Prompt(String prompt, String defaultValue, Consumer<String> inputConsumer) {
this.prompt = prompt;
this.defaultValue = defaultValue;
this.inputConsumer = inputConsumer;
}
}

private final List<Prompt> prompts = new ArrayList<>();

public Prompter() throws IOException {
}

public Prompter addPrompt(String prompt, Consumer<String> inputConsumer) {
prompts.add(new Prompt(prompt, null, inputConsumer));
return this;
}

public Prompter addPrompt(String prompt, String defaultValue, Consumer<String> inputConsumer) {
prompts.add(new Prompt(prompt, defaultValue, inputConsumer));
return this;
}

public void collectInput() throws IOException {
if (prompts.isEmpty()) {
return;
}
final TerminalConnection connection = new TerminalConnection();
connection.setSignalHandler(interruptionSignalHandler());
try {
read(connection, ReadlineBuilder.builder().enableHistory(false).build(), prompts.iterator());
connection.openBlocking();
} finally {
connection.close();
}
}

private static void read(TerminalConnection connection, Readline readline, Iterator<Prompt> prompts) {
final Prompt prompt = prompts.next();
readline.readline(connection, prompt.prompt, input -> {
prompt.inputConsumer.accept(
(input == null || input.isBlank()) && prompt.defaultValue != null ? prompt.defaultValue : input);
if (!prompts.hasNext()) {
connection.close();
} else {
read(connection, readline, prompts);
}
});
}

private Consumer<Signal> interruptionSignalHandler() {
return new Consumer<Signal>() {
@Override
public void accept(Signal signal) {
if (signal == Signal.INT) {
throw new RuntimeException("Process interrupted");
}
}
};
}
}
@@ -1,5 +1,8 @@
package io.quarkus.gradle;

import static io.quarkus.gradle.extension.AnalyticsExtension.ANALYTICS_EXTENSION_NAME;
import static java.util.Collections.emptyMap;

import java.io.File;
import java.nio.file.Path;
import java.util.HashSet;
Expand Down Expand Up @@ -34,12 +37,16 @@
import org.gradle.util.GradleVersion;

import io.quarkus.gradle.dependency.ApplicationDeploymentClasspathBuilder;
import io.quarkus.gradle.extension.AnalyticsExtension;
import io.quarkus.gradle.extension.QuarkusPluginExtension;
import io.quarkus.gradle.extension.SourceSetExtension;
import io.quarkus.gradle.tasks.Deploy;
import io.quarkus.gradle.tasks.ImageBuild;
import io.quarkus.gradle.tasks.ImagePush;
import io.quarkus.gradle.tasks.QuarkusAddExtension;
import io.quarkus.gradle.tasks.QuarkusAnalyticsClose;
import io.quarkus.gradle.tasks.QuarkusAnalyticsDev;
import io.quarkus.gradle.tasks.QuarkusAnalyticsProd;
import io.quarkus.gradle.tasks.QuarkusBuild;
import io.quarkus.gradle.tasks.QuarkusBuildCacheableAppParts;
import io.quarkus.gradle.tasks.QuarkusBuildDependencies;
Expand Down Expand Up @@ -88,6 +95,9 @@ public class QuarkusPlugin implements Plugin<Project> {
public static final String IMAGE_BUILD_TASK_NAME = "imageBuild";
public static final String IMAGE_PUSH_TASK_NAME = "imagePush";
public static final String DEPLOY_TASK_NAME = "deploy";
public static final String QUARKUS_ANALYTICS_PROD_TASK_NAME = "quarkusAnalyticsProd";
public static final String QUARKUS_ANALYTICS_DEV_TASK_NAME = "quarkusAnalyticsDev";
public static final String QUARKUS_ANALYTICS_CLOSE = "quarkusAnalyticsClose";

@Deprecated
public static final String BUILD_NATIVE_TASK_NAME = "buildNative";
Expand Down Expand Up @@ -129,6 +139,8 @@ public void apply(Project project) {
final QuarkusPluginExtension quarkusExt = project.getExtensions().create(EXTENSION_NAME, QuarkusPluginExtension.class,
project);

project.getExtensions().create(ANALYTICS_EXTENSION_NAME, AnalyticsExtension.class);

createConfigurations(project);
registerTasks(project, quarkusExt);
}
Expand Down Expand Up @@ -203,8 +215,18 @@ public boolean isSatisfiedBy(Task t) {
});
});

final AnalyticsExtension analyticsData = project.getExtensions().getByType(AnalyticsExtension.class);
final TaskProvider<QuarkusAnalyticsProd> quarkusAnalyticsProd = tasks.register(
QUARKUS_ANALYTICS_PROD_TASK_NAME, QuarkusAnalyticsProd.class);

TaskProvider<QuarkusBuild> quarkusBuild = tasks.register(QUARKUS_BUILD_TASK_NAME, QuarkusBuild.class, build -> {
build.dependsOn(quarkusBuildDependencies, quarkusBuildCacheableAppParts);
build.doLast(task -> {
quarkusAnalyticsProd.configure(analyticsDataTask -> {
analyticsDataTask.setGraalVMInfo(analyticsData.getGraalVMInfo());
});
});
build.finalizedBy(quarkusAnalyticsProd);
build.getOutputs().doNotCacheIf(
"Only collects and combines the outputs of " + QUARKUS_BUILD_APP_PARTS_TASK_NAME + " and "
+ QUARKUS_BUILD_DEP_TASK_NAME + ", see 'cacheLargeArtifacts' in the 'quarkus' Gradle extension " +
Expand All @@ -223,8 +245,16 @@ public boolean isSatisfiedBy(Task t) {

tasks.register(DEPLOY_TASK_NAME, Deploy.class, task -> task.finalizedBy(quarkusBuild));

TaskProvider<QuarkusDev> quarkusDev = tasks.register(QUARKUS_DEV_TASK_NAME, QuarkusDev.class, devRuntimeDependencies,
final TaskProvider<QuarkusAnalyticsDev> quarkusAnalyticsDev = tasks.register(
QUARKUS_ANALYTICS_DEV_TASK_NAME, QuarkusAnalyticsDev.class);
quarkusAnalyticsDev.configure(task -> {
task.setGraalVMInfo(emptyMap());
});

TaskProvider<QuarkusDev> quarkusDev = tasks.register(QUARKUS_DEV_TASK_NAME, QuarkusDev.class,
devRuntimeDependencies,
quarkusExt);

TaskProvider<QuarkusRemoteDev> quarkusRemoteDev = tasks.register(QUARKUS_REMOTE_DEV_TASK_NAME, QuarkusRemoteDev.class,
devRuntimeDependencies, quarkusExt);
TaskProvider<QuarkusTest> quarkusTest = tasks.register(QUARKUS_TEST_TASK_NAME, QuarkusTest.class,
Expand Down Expand Up @@ -289,7 +319,8 @@ public boolean isSatisfiedBy(Task t) {
quarkusDev.configure(task -> {
task.dependsOn(classesTask, resourcesTask, testClassesTask, testResourcesTask,
quarkusGenerateCodeDev,
quarkusGenerateCodeTests);
quarkusGenerateCodeTests,
quarkusAnalyticsDev);
});
quarkusRemoteDev.configure(task -> {
task.dependsOn(classesTask, resourcesTask);
Expand Down Expand Up @@ -402,6 +433,11 @@ public void execute(Task task) {
});
tasks.named("compileTestKotlin", task -> task.dependsOn(quarkusGenerateCodeTests));
});

TaskProvider<QuarkusAnalyticsClose> analyticsClose = tasks.register(QUARKUS_ANALYTICS_CLOSE,
QuarkusAnalyticsClose.class);
project.getTasks().getByName("build").finalizedBy(analyticsClose.get());

}

private static void configureGenerateCodeTask(QuarkusGenerateCode task, String generateSourcesDir) {
Expand Down
@@ -0,0 +1,17 @@
package io.quarkus.gradle.extension;

import java.util.Map;

public class AnalyticsExtension {
public static final String ANALYTICS_EXTENSION_NAME = AnalyticsExtension.class.getName();

private Map<String, String> graalVMInfo;

public Map<String, String> getGraalVMInfo() {
return graalVMInfo;
}

public void setGraalVMInfo(Map<String, String> graalVMInfo) {
this.graalVMInfo = graalVMInfo;
}
}

0 comments on commit 385a377

Please sign in to comment.