diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/statistics/KotlinGradleFUSLogger.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/statistics/KotlinGradleFUSLogger.kt index 2b3617ae439..53d2ab64265 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/statistics/KotlinGradleFUSLogger.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/statistics/KotlinGradleFUSLogger.kt @@ -5,12 +5,17 @@ package org.jetbrains.kotlin.idea.statistics +import com.intellij.ide.highlighter.ProjectFileType import com.intellij.ide.util.PropertiesComponent +import com.intellij.internal.statistic.eventLog.EventLogConfiguration import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.DumbAware import com.intellij.openapi.project.Project import com.intellij.openapi.startup.StartupActivity +import com.intellij.openapi.util.io.FileUtil +import com.intellij.util.PathUtilRt import com.intellij.util.concurrency.AppExecutorUtil +import com.intellij.util.text.trimMiddle import org.jetbrains.kotlin.statistics.BuildSessionLogger import java.io.File import java.util.concurrent.TimeUnit @@ -20,6 +25,9 @@ import org.jetbrains.kotlin.statistics.fileloggers.MetricsContainer import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics import org.jetbrains.kotlin.statistics.metrics.NumericalMetrics import org.jetbrains.kotlin.statistics.metrics.StringMetrics +import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.HashMap class KotlinGradleFUSLogger : StartupActivity, DumbAware, Runnable { @@ -34,6 +42,27 @@ class KotlinGradleFUSLogger : StartupActivity, DumbAware, Runnable { companion object { + private val IDE_STRING_ANONYMIZERS = lazy { + mapOf( + StringMetrics.PROJECT_PATH to { path: String -> + // This code duplicated logics of StatisticsUtil.getProjectId, which could not be directly reused: + // 1. the path of gradle project may not have corresponding project + // 2. the projectId should be stable and independent on IDE version + val presentableUrl = FileUtil.toSystemIndependentName(path) + val name = + PathUtilRt.getFileName(presentableUrl).toLowerCase(Locale.US).removeSuffix(ProjectFileType.DOT_DEFAULT_EXTENSION) + val locationHash = Integer.toHexString((presentableUrl).hashCode()) + val projectHash = + "${name.trimMiddle(name.length.coerceAtMost(254 - locationHash.length), useEllipsisSymbol = false)}.$locationHash" + EventLogConfiguration.anonymize(projectHash) + }) + } + + private fun String.anonymizeIdeString(metric: StringMetrics) = if (metric.anonymization.anonymizeOnIdeSize()) + IDE_STRING_ANONYMIZERS.value[metric]?.invoke(this) + else + this + /** * Maximum amount of directories which were reported as gradle user dirs * These directories should be monitored for reported gradle statistics. @@ -63,7 +92,10 @@ class KotlinGradleFUSLogger : StartupActivity, DumbAware, Runnable { for (metric in metrics) { when (metric) { is BooleanMetrics -> putIfNotNull(metric.name, this.getMetric(metric)?.toStringRepresentation()) - is StringMetrics -> putIfNotNull(metric.name, this.getMetric(metric)?.toStringRepresentation()) + is StringMetrics -> putIfNotNull( + metric.name, + this.getMetric(metric)?.toStringRepresentation()?.anonymizeIdeString(metric) + ) is NumericalMetrics -> putIfNotNull(metric.name, this.getMetric(metric)?.toStringRepresentation()) is Pair<*, *> -> putIfNotNull(metric.first.toString(), metric.second?.toString()) } @@ -80,7 +112,8 @@ class KotlinGradleFUSLogger : StartupActivity, DumbAware, Runnable { StringMetrics.GRADLE_VERSION, NumericalMetrics.ARTIFACTS_DOWNLOAD_SPEED, StringMetrics.IDES_INSTALLED, - BooleanMetrics.EXECUTED_FROM_IDEA + BooleanMetrics.EXECUTED_FROM_IDEA, + StringMetrics.PROJECT_PATH ) container.log( GradleStatisticsEvents.Kapt, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatHandler.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatHandler.kt index abace0dbfaa..a92777d168f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatHandler.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/statistics/KotlinBuildStatHandler.kt @@ -69,6 +69,7 @@ class KotlinBuildStatHandler { } internal fun reportGlobalMetrics(gradle: Gradle, sessionLogger: BuildSessionLogger) { + sessionLogger.report(StringMetrics.PROJECT_PATH, gradle.rootProject.projectDir.absolutePath) System.getProperty("os.name")?.also { sessionLogger.report(StringMetrics.OS_TYPE, System.getProperty("os.name")) } diff --git a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/AnonymizerUtils.kt b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/AnonymizerUtils.kt index ed5485ede98..7d6c04ec731 100644 --- a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/AnonymizerUtils.kt +++ b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/AnonymizerUtils.kt @@ -11,6 +11,8 @@ internal interface ValueAnonymizer { fun anonymize(t: T): T + fun anonymizeOnIdeSize(): Boolean = false + } internal val salt: String by lazy { diff --git a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/MetricPolicies.kt b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/MetricPolicies.kt index 26c1b88dc37..81e0edd3ab1 100644 --- a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/MetricPolicies.kt +++ b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/MetricPolicies.kt @@ -88,6 +88,10 @@ enum class StringAnonymizationPolicy : ValueAnonymizer { SAFE { override fun anonymize(t: String) = t }, + ANONYMIZE_IN_IDE { + override fun anonymize(t: String) = t + override fun anonymizeOnIdeSize() = true + }, SHA_256 { override fun anonymize(t: String) = sha256(t) }, diff --git a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/StringMetrics.kt b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/StringMetrics.kt index 4817d9bbed9..9457360e63e 100644 --- a/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/StringMetrics.kt +++ b/libraries/tools/kotlin-gradle-statistics/src/org/jetbrains/kotlin/statistics/metrics/StringMetrics.kt @@ -13,6 +13,7 @@ enum class StringMetrics(val type: StringOverridePolicy, val anonymization: Stri // User environment GRADLE_VERSION(OVERRIDE, COMPONENT_VERSION), + PROJECT_PATH(OVERRIDE, ANONYMIZE_IN_IDE), OS_TYPE(OVERRIDE, SAFE),