Coder Social home page Coder Social logo

janbarari / gradle-analytics-plugin Goto Github PK

View Code? Open in Web Editor NEW
129.0 4.0 3.0 15.65 MB

A free Gradle plugin to analyze your project builds. It provides unique visual and text metrics in HTML format.

License: MIT License

Kotlin 69.11% HTML 4.18% CSS 0.40% JavaScript 26.23% Shell 0.09%
analysis analytics gradle gradle-plugin gradle-plugins kotlin plugin build metrics performance

gradle-analytics-plugin's Introduction

Hey 👋, I'm Mehdi

I am an experienced Android Engineer with over 9 years of experience specializing in Android SDK, Gradle, modularization, Kotlin, Jetpack Compose, concurrency management, dependency injection, performance optimization, and service integration. As an active contributor to the open-source community, I have developed an analytics plugin for the Gradle build system that is widely adopted by leading tech companies. Throughout my career, I have successfully worked in diverse organizations with varying team sizes, delivering outstanding results. My portfolio includes the development of notable applications, such as a parental control app, map area calculator app, video streaming app, and shopping app. Collaboration and teamwork are integral to my work style, and I thoroughly enjoy engaging with colleagues to foster a productive and innovative environment.

📫 Reach me via [email protected]



Favorite Repositories

Gradle Analytics Plugin - A free Gradle plugin to analyze your project builds. It provides unique visual and text metrics in HTML format.

Android Cloud OCR - A Lightweight tool for getting the image text content

KEvent - A brand new communication library in Android & Kotlin (similar to Eventbus)

Articles

Introducing decoupled MVI approach for Android in 2023

Github Visitor Count

Stats

gradle-analytics-plugin's People

Contributors

janbarari avatar mjdeliveryh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

gradle-analytics-plugin's Issues

There is no data to process

I've read these issues:
#127
#113
but are not helpful with my case.
My config:

gradleAnalyticsPlugin {
    enabled = true // Optional: By default it's True.

    database {
        local = sqlite {
            path = "${rootProject.rootDir}/build/analytics"
            name = "gradleAnalytics" // Don't add `.db` in the database name.
        }
    }

    trackingTasks = setOf(
        // Add your requested tasks to be analyzed, Example:
        "clean assembleDebug"
    )

    trackingBranches = setOf(
        // requested tasks only analyzed in the branches you add here, Example:
        "master"
    )

    // Optional: Exclude modules that are not necessary like test or demo modules
    excludeModules = setOf()

    trackAllBranchesEnabled = false // Optional: Default is False.

//    outputPath = "OUTPUT_REPORT_PATH" // Optional: Default is project /build/ dir.
}

my commands I tried:

./gradlew reportAnalytics --task="clean assembleDebug" --branch="master" --period="today"
./gradlew reportAnalytics --task="clean :app:assembleDebug" --branch="master" --period="today"
./gradlew reportAnalytics --task=":app:assembleDebug" --branch="master" --period="today" 

but all returns:

There is no data to process. Please check the plugin configuration │
 │ and wait until the first desired task information is saved.

Feedback: There is no data to process

Gradle answered "There is no data to process". And it can't get me the report, after finished reportAnalytics task.

> Task :reportAnalytics

┌─────────────────────┐
 │ Gradle Analytics Plugin                                            │
 │-------------------------------------------------------------------│
 │ There is no data to process. Please check the plugin configuration │
 │ and wait until the first desired task information is saved.        │
 └───────────────────────────┘

The details:

  1. Configured the plugin:
gradleAnalyticsPlugin {
    database {
        local = sqlite {
            path = "/Users/egorkatkov/.gradle/daemon/7.5.1/"
            name = "myProject_gap_db"
        }
    }

    trackingTasks = [
            ":app:myTask"
    ]

    trackingBranches = [
            "develop"
    ]
}
  1. Started task:
    gradle reportAnalytics --task=":app:myTask" --branch=«develop» --period="today"
    (also tried with "1y", etc.)

  2. Saw that result:
    There is no data to process. (full text look above)

  3. But, let's check the received data.

DATA FROM DB FILE (myProject_gap_db.db) :
{"branch":"develop","requested_tasks":[":app:myTask"],"created_at":1688739569384,"git_head_commit_hash":"2ba...... etc.

lets get the UTC time and convert it to usual data format:
"created_at":1688739569384
GMT: Friday, 7 July 2023 г., 14:19:29.384

Lets check the TASK DATA from generated report-log.txt file in my project:
i: 2023/07/07 14:29:32 PM UTC, DatabaseRepositoryImp, getMetrics() period from 1688688000000 to 1688774400000
FROM:
1688688000000
Converted: GMT: Friday, 7 July 2023 г., 0:00:00

TO:
1688774400000
Converted: GMT: Saturday, 8 July 2023 г., 0:00:00

So we see that THE DATA IS CORRECT.

  1. The name of the task ":app:myTask" from task is also like in generated report-log.txt file.
  2. The branch "develop" from task is also like in generated report-log.txt file.

So, really didn't understand whats wrong. Please help to resolve this problem.
Also texted in discord community: https://discord.com/channels/1044959883558141952/1044959883558141955

RF: Track all branches

Hello!

Is it possible to track everything by default? We have a lot of branches and a lot of CI tasks on them.
We would like to track everything and then get detailed statistics about specific tasks executed on all branches.

Is it a good idea? If not, could you suggest another way of analyzing tasks on different branches?

Hard to adopt - example usage?

Hi there,

A real project serving as more realistic example usage for the plugin might be helpful; I've spent a few hours trying to get some data out of the plugin and so far getting nothing written into either MySQL or sqlite, and nothing out of the report task. Is there another task or something I should be running perhaps that's not covered in docs? 🤔

I've been running on a mixture of popular open source projects all using gradle 7.x so I wouldn't think the upcoming gradle changes that seem to break all of these plugins has impacted this one in my case, but perhaps the project's I'm working on aren't supported somehow?

I've tested this with DuckDuckGo and PocketCasts Android so far and in both cases nothing is written to the database. In the case of pocketcasts I even went to the lengths of running a gradle tasks --all and adding all the tasks into the trackingTasks list (which should a wildcard like * or have a trackAllTasks=true property all probably?) to ensure I wasn't just missing tasks, but still no data is generated.

What might I be doing wrong here? is it something that might have been avoided with more examples, or are these projects really just not supported?

TY!

Feature: provide memory usage statistics for processes spawned by Gradle

It would be insanely helpful to understand how to optimize the build — how many workers to use, how much memory to assign to e.g. Test tasks, and to understand why Gradle daemon disappears (which is usually a sign of OOM).

One tricky thing would be attaching to processes like Kotlin compile daemon (or Gradle daemon itself) which aren't necessarily created by Gradle, but which are part of the build anyway

[Security] Repository is vulnerable to MavenGate

https://blog.oversecured.com/Introducing-MavenGate-a-supply-chain-attack-method-for-Java-and-Android-applications/

Gradle task

./gradlew --write-verification-metadata pgp,sha256 --export-keys

did not find a pgp public key in a remote repository or the artifact is not signed.

 <component group="io.github.janbarari" name="gradle-analytics-plugin" version="1.0.1">
         <artifact name="gradle-analytics-plugin-1.0.1.jar">
            <sha256 value="575a4e9840a37b2f1e28f5521a22ab0ab49bc065812581fbb58782927d58f0d5" origin="Generated by Gradle" reason="Artifact is not signed"/>
         </artifact>
         <artifact name="gradle-analytics-plugin-1.0.1.module">
            <sha256 value="9e34907bdab80dcd1f0f4b749ae1212b809ad3d51cdd68d835d065966d9e552e" origin="Generated by Gradle" reason="Artifact is not signed"/>
         </artifact>
      </component>
      <component group="io.github.janbarari.gradle-analytics-plugin" name="io.github.janbarari.gradle-analytics-plugin.gradle.plugin" version="1.0.1">
         <artifact name="io.github.janbarari.gradle-analytics-plugin.gradle.plugin-1.0.1.pom">
            <sha256 value="9ba3b269269a230037096ba0244fe299d1e579bcf7124282c76d8f1e4d88dc75" origin="Generated by Gradle" reason="Artifact is not signed"/>
         </artifact>
      </component>

A fix is to:

  1. Start signing all artifacts, if not signed yet
  2. Upload a public pgp key used for signing artifacts to multiple public pgp repositories: https://keys.openpgp.org | https://pgp.mit.edu | https://keyserver.ubuntu.com/

RB: Can't load library

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:reportAnalytics'.
> Can't load library: .../Library/Caches/JNA/temp/jna17058702365227086644.tmp

I opened the file in text editor and a part of it:

JNA: Can't attach native thread to VM for callback thread initialization
�JNA: could not detach thread after callback init
�Can't convert type to native, native size %d
�JNA: extract_value: %s�java/lang/IllegalStateException�Return structure type info not initialized�java/lang/UnsatisfiedLinkError�Can't allocate byte array�Invalid sizeof type %d�com/sun/jna/Pointer�Can't obtain class com.sun.jna.Pointer�<init>�(J)V�Can't obtain constructor for class com.sun.jna.Pointer�peer�J�Can't obtain peer field ID for class com.sun.jna.Pointer�Can't obtain global reference for class com.sun.jna.Native�dispose�()V�Can't obtain static method dispose from class com.sun.jna.Native�fromNative�(Ljava/lang/Class;Ljava/lang/Object;)Lcom/sun/jna/NativeMapped;�Can't obtain static method fromNative(Class, Object) from class com.sun.jna.Native�(Ljava/lang/reflect/Method;Ljava/lang/Object;)Lcom/sun/jna/NativeMapped;�Can't obtain static method fromNative(Method, Object) from class com.sun.jna.Native�nativeType�(Ljava/lang/Class;)Ljava/lang/Class;�Can't obtain static method nativeType from class com.sun.jna.Native�toNative�(Lcom/sun/jna/ToNativeConverter;Ljava/lang/Object;)Ljava/lang/Object;�Can't obtain static method toNative from class com.sun.jna.Native�(Lcom/sun/jna/FromNativeConverter;Ljava/lang/Object;Ljava/lang/reflect/Method;)Ljava/lang/Object;�Can't obtain static method fromNative(FromNativeConverter, Object, Method) from class com.sun.jna.Native�com/sun/jna/Structure�Can't obtain class com.sun.jna.Structure�getTypeInfo�()Lcom/sun/jna/Pointer;�Can't obtain getTypeInfo method for class com.sun.jna.Structure�newInstance�(Ljava/lang/Class;J)Lcom/sun/jna/Structure;�Can't obtain static newInstance method for class com.sun.jna.Structure�autoRead�Can't obtain read method for class com.sun.jna.Structure�autoWrite�Can't obtain write method for class com.sun.jna.Structure�memory�Lcom/sun/jna/Pointer;�Can't obtain memory field ID for class com.sun.jna.Structure�typeInfo�Can't obtain typeInfo field ID for class com.sun.jna.Structure�com/sun/jna/Structure$ByValue�Can't obtain class com.sun.jna.Structure.ByValue�com/sun/jna/Callback�Can't obtain class com.sun.jna.Callback�com/sun/jna/CallbackReference$AttachOptions�Can't obtain class com.sun.jna.CallbackReference.AttachOptions�com/sun/jna/CallbackReference�Can't obtain class com.sun.jna.CallbackReference�getCallback�(Ljava/lang/Class;Lcom/sun/jna/Pointer;Z)Lcom/sun/jna/Callback;�Can't obtain static method getCallback from class com.sun.jna.CallbackReference�getFunctionPointer�(Lcom/sun/jna/Callback;Z)Lcom/sun/jna/Pointer;�Can't obtain static method getFunctionPointer from class com.sun.jna.CallbackReference�getNativeString�(Ljava/lang/Object;Z)Lcom/sun/jna/Pointer;�Can't obtain static method getNativeString from class com.sun.jna.CallbackReference�initializeThread�(Lcom/sun/jna/Callback;Lcom/sun/jna/CallbackReference$AttachOptions;)Ljava/lang/ThreadGroup;�Can't obtain static method initializeThread from class com.sun.jna.CallbackReference�com/sun/jna/WString�Can't obtain class com.sun.jna.WString�com/sun/jna/NativeMapped�Can't obtain class com.sun.jna.NativeMapped�()Ljava/lang/Object;�Can't obtain toNative method for class com.sun.jna.NativeMapped�com/sun/jna/IntegerType�Can't obtain class com.sun.jna.IntegerType�value�Can't obtain value field ID for class com.sun.jna.IntegerType�com/sun/jna/PointerType�Can't obtain class com.sun.jna.PointerType�pointer�(Ljava/lang/String;)V�Can't obtain constructor for class com.sun.jna.WString�com/sun/jna/JNIEnv�Can't obtain class com.sun.jna.JNIEnv�com/sun/jna/Native$ffi_callback�Can't obtain class com.sun.jna.Native$ffi_callback�invoke�(JJJ)V�Can't obtain invoke method from class com.sun.jna.Native$ffi_callback�com/sun/jna/FromNativeConverter�Can't obtain class com.sun.jna.FromNativeConverter�()Ljava/lang/Class;�Can't obtain method nativeType for class com.sun.jna.FromNativeConverter�com/sun/jna/Structure$FFIType$FFITypes�void�float�double�longdouble�uint8�sint8�uint16�sint16�uint32�sint32�uint64�sint64�Structure$FFIType missing�ffi_type_%s�Non-direct Buffer is not supported�6.1.0�147a998f0cbc89681a1ae6c0dd121629�JNA: Can't attach native thread to VM on load
�JNA: Problems loading core IDs: %s
�JNA: Problems loading callback IDs: %s
�JNA: could not detach thread on initial load
�JNA: Can't attach native thread to VM on unload
�JNA: could not detach thread on unload
�Invalid calling convention %d�Native method mapping�Native method setup�Native method linkage failed�ffi_prep_cif�Can't get Java VM�Can't allocate C string�Can't allocate wide C string�Too many arguments (max %ld)�java/lang/UnsupportedOperationException�Structure type info not initialized at argument %d�Buffer arguments must be direct or have a primitive backing array�Could not obtain memory for primitive buffer�Unrecognized calling convention: %d�Native call setup�[%d] %s�com/sun/jna/LastErrorException�Unrecognized NIO buffer type�STR_ERROR�dispatch.c�err == 0 && "strerror_r() conversion has failed"�%s�LOAD_ERROR�count <= len && "snprintf() output has been truncated"�java/lang/Object�java.lang.Object�java/lang/Class�java.lang.Class�java/lang/reflect/Method�java.lang.reflect.Method�java/lang/String�java.lang.String�java/nio/Buffer�java.nio.Buffer�java/nio/ByteBuffer�java.nio.ByteBuffer�java/nio/CharBuffer�java.nio.CharBuffer�java/nio/ShortBuffer�java.nio.ShortBuffer�java/nio/IntBuffer�java.nio.IntBuffer�java/nio/LongBuffer�java.nio.LongBuffer�java/nio/FloatBuffer�java.nio.FloatBuffer�java/nio/DoubleBuffer�java.nio.DoubleBuffer�java/lang/Void�TYPE�Ljava/lang/Class;�java.lang.Void�java/lang/Boolean�java.lang.Boolean�java/lang/Byte�java.lang.Byte�java/lang/Character�java.lang.Character�java/lang/Short�java.lang.Short�java/lang/Integer�java.lang.Integer�java/lang/Long�java.lang.Long�java/lang/Float�java.lang.Float�java/lang/Double�java.lang.Double�java.lang.Long<init>(J)V�(I)V�java.lang.Integer<init>(I)V�(S)V�java.lang.Short<init>(S)V�(C)V�java.lang.Character<init>(C)V�(B)V�java.lang.Byte<init>(B)V�(Z)V�java.lang.Boolean<init>(Z)V�(F)V�java.lang.Float<init>(F)V�(D)V�java.lang.Double<init>(D)V�getComponentType�Class.getComponentType()�toString�()Ljava/lang/String;�Object.toString()�getBytes�()[B�String.getBytes()�(Ljava/lang/String;)[B�String.getBytes(String)�toCharArray�()[C�String.toCharArray()�([B)V�String<init>([B)V�([BLjava/lang/String;)V�getParameterTypes�()[Ljava/lang/Class;�Method.getParameterTypes()�getReturnType�Method.getReturnType()�position�()I�Buffer.position�array�ByteBuffer.array�arrayOffset�ByteBuffer.arrayOffset�CharBuffer.array�CharBuffer.arrayOffset�()[S�ShortBuffer.array�ShortBuffer.arrayOffset�()[I�IntBuffer.array�IntBuffer.arrayOffset�()[J�LongBuffer.array�LongBuffer.arrayOffset�()[F�FloatBuffer.array�FloatBuffer.arrayOffset�()[D�DoubleBuffer.array�DoubleBuffer.arrayOffset�Z�Boolean.value�B�Byte.value�S�Short.value�C�Character.value�I�Integer.value�Long.value�F�Float.value�D�Double.value�file.encoding�java/lang/System�getProperty�(Ljava/lang/String;)Ljava/lang/String;�JNA: Can't attach native thread to VM for closure handler
�JNA: Out of memory: Can't allocate local frame�JNA: callback object has been garbage collected
�JNA: could not detach thread after callback handling
��Couldn't obtain Java VM reference when creating native callback�Unsupported callback argument at index %d�Unsupported NativeMapped callback argument native type at argument %d�Unsupported callback return type�Error in callback return type�callback setup�callback setup (2)�Can not detach from a JVM thread�JNA: Can't allocate thread storage�<uninitialized thread name>�JNA: Could not get JavaVM�JNA: Internal TLS error�JNA: Can't attach native thread to VM for callback: %d (check stacksize for callbacks)
�<unconfigured native thread>�JNA: couldn't obtain thread-local storage
�JNA: Out of memory: Can't allocate local frame
�JNA: could not detach thread
�JNA: Unhandled arg conversion type %d
�JNA: error handling callback exception, continuing
�JNA: Likely memory leak here
�JNA: Unhandled result conversion: %d
�JNA: error while handling callback exception, continuing
�com/sun/jna/Callback$UncaughtExceptionHandler�com/sun/jna/Native�callbackExceptionHandler�Lcom/sun/jna/Callback$UncaughtExceptionHandler;�uncaughtException�(Lcom/sun/jna/Callback;Ljava/lang/Throwable;)V�JNA: could not detach native thread (automatic)
�TMPDIR�/tmp�/var/tmp�/dev/shm�HOME������F���D���*���*���B���C���S���Z���I���*���J�������������������������������������������������������������������������������������������������	�����������

RB: Stats do not collected on Gitlab CI

Hello. Super useful plugin, thanks!

However, I can't figure out why it isn't recording stats on the Gitlab CI. When script calls ./gradlew reportAnalytics after a successful build, it outputs empty result. Locally it is totally working. I've checked .db file on CI - it was empty.

Here is build.gradle section:

gradleAnalyticsPlugin {
    enabled = true

    database {
        local = sqlite {
            path = "$rootDir/plugins/gradleAnalytics/"
            name = 'gradleAnalyticsPlugin' // Don't add `.db` in the database name.
        }
        ci = sqlite {
            path = System.getenv("GRADLE_ANALYTICS_DB_PATH")
            name = 'gradleAnalyticsPlugin' // Don't add `.db` in the database name.
        }
    }

    trackingTasks = [
            // Add your requested tasks to be analyzed, Example:
            ':app:assembleDebug'
    ]

    trackingBranches = [
            'dev',
            "ANDR-4827_dependency_graph_analysis"
    ]

//    outputPath = "OUTPUT_REPORT_PATH"
}

RB: ConcurrentModificationException when trying to use the plugin

I get this when trying to use the plugin on a large project with gradle 7.4.2 (groovy DSL)

  • Exception is:
    java.util.ConcurrentModificationException
    at org.gradle.api.internal.DefaultDomainObjectCollection$IteratorImpl.next(DefaultDomainObjectCollection.java:485)
    at org.gradle.api.internal.tasks.DefaultTaskContainer$5.next(DefaultTaskContainer.java:629)
    at org.gradle.api.internal.tasks.DefaultTaskContainer$5.next(DefaultTaskContainer.java:621)
    at io.github.janbarari.gradle.extension.GradleExtensionsKt.getNonCacheableTasks(GradleExtensions.kt:104)
    at io.github.janbarari.gradle.analytics.scanner.ScannerUtils.setupExecutionService$lambda-5(ScannerUtils.kt:60)
    at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123)
    at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:171)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
    at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:168)
    at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:95)
    at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:83)
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:43)
    at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:245)
    at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:157)
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:61)
    at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:346)
    at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:249)
    at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)
    at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
    at com.sun.proxy.$Proxy28.projectsEvaluated(Unknown Source)
    at org.gradle.initialization.ProjectsEvaluatedNotifier$NotifyProjectsEvaluatedListeners.run(ProjectsEvaluatedNotifier.java:47)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
    at org.gradle.initialization.ProjectsEvaluatedNotifier.notify(ProjectsEvaluatedNotifier.java:35)
    at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:51)
    at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:64)
    at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
    at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
    at org.gradle.initialization.VintageBuildModelController.lambda$prepareProjects$3(VintageBuildModelController.java:89)
    at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:227)
    at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:238)
    at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:226)
    at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$10(StateTransitionController.java:201)
    at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
    at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:197)
    at org.gradle.initialization.VintageBuildModelController.prepareProjects(VintageBuildModelController.java:89)
    at org.gradle.initialization.VintageBuildModelController.prepareToScheduleTasks(VintageBuildModelController.java:71)
    at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$prepareToScheduleTasks$2(DefaultBuildLifecycleController.java:134)
    at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:227)
    at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:238)
    at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:226)
    at org.gradle.internal.model.StateTransitionController.lambda$maybeTransition$9(StateTransitionController.java:187)
    at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
    at org.gradle.internal.model.StateTransitionController.maybeTransition(StateTransitionController.java:183)
    at org.gradle.internal.build.DefaultBuildLifecycleController.prepareToScheduleTasks(DefaultBuildLifecycleController.java:132)
    at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.scheduleRequestedTasks(DefaultBuildTreeWorkPreparer.java:33)
    at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$doScheduleAndRunTasks$2(DefaultBuildTreeLifecycleController.java:89)
    at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph.withNewWorkGraph(DefaultIncludedBuildTaskGraph.java:75)
    at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.doScheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:88)
    at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:106)
    at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:166)
    at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:238)
    at org.gradle.internal.model.StateTransitionController.lambda$transition$7(StateTransitionController.java:166)
    at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
    at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:166)
    at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:103)
    at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:69)
    at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49)
    at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:69)
    at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:119)
    at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
    at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)
    at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:128)
    at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)
    at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)
    at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:65)
    at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
    at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:65)
    at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)
    at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
    at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
    at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)
    at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36)
    at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:270)
    at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:119)
    at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:103)
    at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)
    at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46)
    at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:100)
    at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:88)
    at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)
    at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:62)
    at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:41)
    at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)
    at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
    at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:58)
    at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:42)
    at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
    at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
    at org.gradle.util.internal.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)

RB: Statistics do not have an upgrade path through versions

Hi! I have a database with 400+ build logs, built with alpha02. It's also built on a relatively big project wit 200+ modules, so I'd gain lots from some of the recent fixes (like the mermaid graph straight up not existing for our project in earlier releases). Unfortunately, starting from alpha04, BuildMetric has a new field called modules, which causes every report & build later on to simply fail with Required value 'modules' missing at $ (called from DatabaseRepositoryImp).

Is that new field absolutely critical for further operations and requires a database cleanup, or could the plugin add a migration for it ?

Starting an external process `git rev-parse` is not suported during configuration time on Gradle 8.1

After upgrading to gradle 8.1 build started failing with

Configuration cache problems found in this build.

1 problem was found storing the configuration cache.
- Plugin 'io.github.janbarari.gradle-analytics-plugin': external process started 'git rev-parse --abbrev-ref HEAD'
  See https://docs.gradle.org/8.1/userguide/configuration_cache.html#config_cache:requirements:external_processes

See the complete report at file://configuration-cache-report.html
> Starting an external process 'git rev-parse --abbrev-ref HEAD' during configuration time is unsupported.

Configuration:

gradleAnalyticsPlugin {

    database {
        local = sqlite {
            path = "${rootProject.rootDir}/scripts/analytics"
            name = "analytics"
        }
    }

    trackingTasks = setOf(
        "assembleRelease",
    )

    trackingBranches = setOf(
        "master",
    )

    // outputPath = "${rootProject.rootDir}/scripts/analytics"
}

Analytics Plugin:
1.0.0-beta9

Feedback: Aggregate Reporting

In a multi-module project, the plugin reports for each subproject. An option for only the aggregate reports seem reasonable give we would be interested in the overall build rather than each submodule build.

RB: CI variables doesn't set

Hello! When I am using this plugin locally everything is fine but when I try to set it on CI I noticed a bug - the some variables of the ci config didn't set.

ci = mysql {
            host = "MYSQL_DATABASE_HOST"
            name = "MYSQL_DATABASE_NAME"
            user = "MYSQL_DATABASE_USER"
            password = "MYSQL_DATABASE_PASSWORD"
            port = MYSQL_DATABASE_PORT // Default is 3306
        }

I fixed it like

ci = mysql {
            host = "MYSQL_DATABASE_HOST"
            name = "MYSQL_DATABASE_NAME"
            user = "MYSQL_DATABASE_USER"
            password = "MYSQL_DATABASE_PASSWORD"
            port = MYSQL_DATABASE_PORT // Default is 3306
        }.apply{
            user = "MYSQL_DATABASE_USER"
            password = "MYSQL_DATABASE_PASSWORD"
        }

And now it works

Feedback: "Modules Execution Process" - Average Duration is always 0s for every module

We've been recording stats for a week or so now, and the report is generally very useful!

However, the "Average Duration" and "Average Parallel Duration" stats seem to always be 0s for every module, despite other stats in this section being calculated (see image)

image

In our root build.gradle.kts file, our config looks like:

gradleAnalyticsPlugin {
    database {
        ci = mysql {
            host = System.getenv("GRADLE_ANALYTICS_DB_HOST").orEmpty()
            name = System.getenv("GRADLE_ANALYTICS_DB_NAME").orEmpty()
            user = System.getenv("GRADLE_ANALYTICS_DB_USER").orEmpty()
            password = System.getenv("GRADLE_ANALYTICS_DB_PASS").orEmpty()
        }
    }

    trackAllBranchesEnabled = true

    trackingTasks = setOf(
        "koverXmlReport",
        "assembleDebug",
        "assembleRelease",
        "bundleRelease",
    )
}

Is there something missing in our config that we need to add in order to get these numbers to populate please?

Thanks!

RB: modules dependency graph render issue

1- Graph height is getting too much when the graph is getting large.
2- Mermaid won't render when the text size reaches 50,000 lengths.
3- Feature: Graph should render on another page if the modules get more with the zoom option.

Plugin imposes dependency resolution during configuration phase

Hey! Thanks for this plugin, looks quite amazing 🚀

I gave it a try in one of my pet projects today and I've found the following issue

Configuration 'releaseUnitTestRuntimeClasspath' was resolved during configuration time.
This is a build performance and scalability issue.
See https://github.com/gradle/gradle/issues/2298
Run with --info for a stacktrace.
java.lang.RuntimeException: Configuration 'releaseUnitTestRuntimeClasspath' was resolved during configuration time.
This is a build performance and scalability issue.
See https://github.com/gradle/gradle/issues/2298
        at com.android.build.gradle.internal.DependencyResolutionChecks$registerDependencyCheck$4$1.execute(DependencyResolutionChecks.kt:84)
        at com.android.build.gradle.internal.DependencyResolutionChecks$registerDependencyCheck$4$1.execute(DependencyResolutionChecks.kt:62)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123)
        at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:95)
        at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:83)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:43)
        at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:245)
        at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:157)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:61)
        at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:346)
        at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:249)
        at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)
        at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
        at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
        at com.sun.proxy.$Proxy42.beforeResolve(Unknown Source)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.performPreResolveActions(DefaultConfiguration.java:811)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$400(DefaultConfiguration.java:159)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:654)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:647)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:647)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.lambda$resolveExclusively$4(DefaultConfiguration.java:627)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$CalculatedModelValueImpl.update(DefaultProjectStateRegistry.java:444)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveExclusively(DefaultConfiguration.java:624)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:611)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1900(DefaultConfiguration.java:159)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies$LenientResolutionResult.resolve(DefaultConfiguration.java:1903)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies$LenientResolutionResult.allDependencies(DefaultConfiguration.java:1933)
        at com.android.build.gradle.internal.dependency.ConstraintHandler$alignWith$1.execute(ConstraintHandler.kt:48)
        at com.android.build.gradle.internal.dependency.ConstraintHandler$alignWith$1.execute(ConstraintHandler.kt:42)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123)
        at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:95)
        at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:83)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:43)
        at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:245)
        at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:157)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:61)
        at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:346)
        at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:249)
        at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)
        at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
        at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
        at com.sun.proxy.$Proxy42.beforeResolve(Unknown Source)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.performPreResolveActions(DefaultConfiguration.java:811)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$400(DefaultConfiguration.java:159)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:654)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$1.call(DefaultConfiguration.java:647)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:647)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.lambda$resolveExclusively$4(DefaultConfiguration.java:627)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$CalculatedModelValueImpl.update(DefaultProjectStateRegistry.java:444)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveExclusively(DefaultConfiguration.java:624)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.lambda$resolveToStateOrLater$3(DefaultConfiguration.java:608)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$fromMutableState$1(DefaultProjectStateRegistry.java:374)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withReplacedLocks(DefaultWorkerLeaseService.java:345)
        at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:374)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:608)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getResolvedConfiguration(DefaultConfiguration.java:586)
        at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getResolvedConfiguration(Unknown Source)
        at io.github.janbarari.gradle.analytics.domain.model.Dependency$Companion.getThirdPartyDependencies(Dependency.kt:52)
        at io.github.janbarari.gradle.analytics.scanner.ScannerUtils.setupExecutionService$lambda-5$lambda-4(ScannerUtils.kt:80)
        at org.gradle.api.services.internal.DefaultBuildServicesRegistry.lambda$registerIfAbsent$2(DefaultBuildServicesRegistry.java:140)
        at org.gradle.api.services.internal.DefaultBuildServicesRegistry.withRegistrations(DefaultBuildServicesRegistry.java:90)
        at org.gradle.api.services.internal.DefaultBuildServicesRegistry.registerIfAbsent(DefaultBuildServicesRegistry.java:126)
        at io.github.janbarari.gradle.analytics.scanner.ScannerUtils.setupExecutionService$lambda-5(ScannerUtils.kt:68)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication$1.execute(DefaultUserCodeApplicationContext.java:123)
        at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:171)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:168)
        at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:95)
        at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:83)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:43)
        at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:245)
        at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:157)
        at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:61)
        at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:346)
        at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:249)
        at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:141)
        at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
        at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
        at com.sun.proxy.$Proxy27.projectsEvaluated(Unknown Source)
        at org.gradle.initialization.ProjectsEvaluatedNotifier$NotifyProjectsEvaluatedListeners.run(ProjectsEvaluatedNotifier.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.initialization.ProjectsEvaluatedNotifier.notify(ProjectsEvaluatedNotifier.java:35)
        at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:51)
        at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:64)
        at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
        at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40)
        at org.gradle.initialization.VintageBuildModelController.lambda$prepareProjects$3(VintageBuildModelController.java:89)
        at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:236)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:235)
        at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$10(StateTransitionController.java:210)
        at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
        at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:206)
        at org.gradle.initialization.VintageBuildModelController.prepareProjects(VintageBuildModelController.java:89)
        at org.gradle.initialization.VintageBuildModelController.prepareToScheduleTasks(VintageBuildModelController.java:71)
        at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$prepareToScheduleTasks$2(DefaultBuildLifecycleController.java:127)
        at org.gradle.internal.model.StateTransitionController.lambda$doTransition$12(StateTransitionController.java:236)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:235)
        at org.gradle.internal.model.StateTransitionController.lambda$maybeTransition$8(StateTransitionController.java:187)
        at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:34)
        at org.gradle.internal.model.StateTransitionController.maybeTransition(StateTransitionController.java:183)
        at org.gradle.internal.build.DefaultBuildLifecycleController.prepareToScheduleTasks(DefaultBuildLifecycleController.java:125)
        at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.scheduleRequestedTasks(DefaultBuildTreeWorkPreparer.java:33)
        at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$doScheduleAndRunTasks$2(DefaultBuildTreeLifecycleController.java:89)
        at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph.withNewWorkGraph(DefaultIncludedBuildTaskGraph.java:101)
        at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.doScheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:88)
        at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:106)
        at org.gradle.internal.model.StateTransitionController.lambda$transition$5(StateTransitionController.java:166)
        at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:247)
        at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:166)
        at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
        at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:166)
        at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:103)
        at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.scheduleAndRunTasks(DefaultBuildTreeLifecycleController.java:69)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49)
        at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:65)
        at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:136)
        at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
        at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)
        at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:122)
        at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)
        at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)
        at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:65)
        at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
        at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:65)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
        at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)
        at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:249)
        at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:109)
        at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36)
        at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:110)
        at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)
        at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46)
        at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:100)
        at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:88)
        at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)
        at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:62)
        at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:41)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)
        at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:52)
        at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:40)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
        at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
        at org.gradle.util.internal.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:829)

since I have

android.dependencyResolutionAtConfigurationTime.disallow=true

in-place. The aforementioned stack-trace was retrieved by running

$> ./gradlew reportAnalytics <paratemers> --info

Is there any way to work around this issue?

Note that dependency resolution during configuration phase eventually will eventually be forbidden in the future

[Feature] Exclude configurations when generating module dependency graph

The graph is completely unusable on large multiplatform projects.

I can't see much details because it exceeds the mermaid max zoom level too quickly, but it seems that all configurations are included in the mermaid chart
image

And this is how the project dependency graph looks like for our project :D
image

We surely don't have this many dependencies and the graph height of the project is just 6, but this looks way off.

Is there any way to simplify the generated mermaid chart?

Feedback: How should I open report file?

Hey, great idea and solution. Thank you for that plugin! Can you explain to me how I should open the report .db file to see all diagrams, etc.? I don't get it actually :( Or maybe I misunderstood something.

RF: Support PostgreSQL database

Currently gradle analytics supports mysql or sqlite only.
A lot of companies & developers are using porgresql already, so support for it should be provided

RB: modules execution process render issue

1- The modules execution process chart height is too small when module counts increase by more than 50 modules.
2- The modules execution process shows wrong data which causes the plugin used current input from Gradle instead of using data from database.

Feature: Enable/Disable

Plugin is great, so thanks for putting this out.

I'm thinking that I want to have this run for me locally (configured by a gradle.properties value) but not for the rest of my team at this point. Be nice to have a way to enable / disable the plugin so it doesn't do anything such as the summary unless its enabled (i.e. it can be configured, but won't run)

Feature Request: Add support for analysing all non-main branches

It would be awesome if we could analyse tasks that are run in pull request pipelines, i.e. any task that is run in CI but isn't run on the main branch

This would allow us to track performance that relates to the speed at which PRs can be merged

Perhaps this could be supported by adding a negation modifier to the --branch flag when generating a report, e.g. !main

./gradlew reportAnalytics --branch="!main" --task="test" --period="1y"

This would match every branch that is not named main

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.