Skip to content

Commit

Permalink
Allow to configure telemetry level in the user configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
WojciechMazur committed Dec 2, 2023
1 parent e2ff6bc commit 078e17c
Show file tree
Hide file tree
Showing 16 changed files with 408 additions and 313 deletions.
3 changes: 3 additions & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ def lintingOptions(scalaVersion: String) = {
"-Wconf:src=*.TreeViewProvider.scala&msg=parameter params in method (children|parent) is never used:silent",
// silence "The outer reference in this type test cannot be checked at run time."
"-Wconf:src=.*(CompletionProvider|ArgCompletions|Completions|Keywords|IndentOnPaste).scala&msg=The outer reference:silent",
"-Wconf:src=.*(SourceCodeSanitizer).scala&msg=Unused import:silent",
)
crossSetting(
scalaVersion,
Expand Down Expand Up @@ -397,6 +398,7 @@ lazy val mtags3 = project
Compile / unmanagedSourceDirectories += (ThisBuild / baseDirectory).value / "mtags-shared" / "src" / "main" / "scala-3",
moduleName := "mtags3",
scalaVersion := V.scala3,
crossScalaVersions := Seq(V.scala3),
target := (ThisBuild / baseDirectory).value / "mtags" / "target" / "target3",
publish / skip := true,
scalafixConfig := Some(
Expand Down Expand Up @@ -626,6 +628,7 @@ lazy val testSettings: Seq[Def.Setting[_]] = List(
publish / skip := true,
fork := true,
testFrameworks := List(TestFrameworks.MUnit),
Test / javaOptions += "-Dmetals.telemetryLevel=off",
Test / testOptions ++= {
if (isCI) {
// Enable verbose logging using sbt loggers in CI.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1142,6 +1142,7 @@ class Compilers(
.withWorkspace(workspace.toNIO)
.withScheduledExecutorService(sh)
.withReportsLoggerLevel(MetalsServerConfig.default.loglevel)
.withTelemetryLevel(userConfig().telemetryLevel.stringValue)
.withConfiguration {
val options =
InitializationOptions.from(initializeParams).compilerOptions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ import scala.meta.internal.metals.Messages.IncompatibleBloopVersion
import scala.meta.internal.metals.MetalsEnrichments._
import scala.meta.internal.metals.StdReportContext
import scala.meta.internal.metals.MirroredReportContext
import scala.meta.internal.metals.RemoteReportContext
import scala.meta.internal.metals.TelemetryReportContext
import scala.meta.internal.metals.LoggerAccess
import scala.meta.internal.metals.ammonite.Ammonite
import scala.meta.internal.metals.callHierarchy.CallHierarchyProvider
import scala.meta.internal.metals.clients.language.ConfiguredLanguageClient
Expand Down Expand Up @@ -191,16 +192,17 @@ class MetalsLspService(
},
ReportLevel.fromString(MetalsServerConfig.default.loglevel),
)
private val remoteTelemetryReports = new RemoteReportContext(
serverEndpoint = RemoteReportContext.DefaultEndpoint,
getReporterContext = makeTelemetryContext,
sanitizers = new RemoteReportContext.Sanitizers(
private val remoteTelemetryReports = new TelemetryReportContext(
telemetryLevel = () => userConfig.telemetryLevel,
reporterContext = createTelemetryReporterContext,
sanitizers = new TelemetryReportContext.Sanitizers(
workspace = Some(folder.toNIO),
sourceCodeTransformer = Some(ScalametaSourceCodeTransformer),
),
logger = {
val logger = logging.MetalsLogger.default
RemoteReportContext.LoggerAccess(
LoggerAccess(
debug = logger.debug(_),
info = logger.info(_),
warning = logger.warn(_),
error = logger.error(_),
Expand Down Expand Up @@ -982,7 +984,10 @@ class MetalsLspService(
}
}

if (userConfig.symbolPrefixes != old.symbolPrefixes) {
if (
userConfig.symbolPrefixes != old.symbolPrefixes ||
userConfig.telemetryLevel != old.telemetryLevel
) {
compilers.restartAll()
}

Expand Down Expand Up @@ -2804,7 +2809,7 @@ class MetalsLspService(

def runDoctorCheck(): Unit = doctor.check(headDoctor)

private def makeTelemetryContext(): telemetry.ReporterContext =
private def createTelemetryReporterContext(): telemetry.ReporterContext =
new telemetry.MetalsLspContext(
/* metalsVersion = */ BuildInfo.metalsVersion,
/* userConfig = */ telemetry.conversion.UserConfiguration(userConfig),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,6 @@ final case class MetalsServerConfig(
Option(System.getProperty("metals.build-server-ping-interval"))
.flatMap(opt => Try(Duration(opt)).toOption)
.getOrElse(Duration("1m")),
telemetryServer: String =
RemoteTelemetryReportContext.discoverTelemetryServer,
) {
override def toString: String =
List[String](
Expand All @@ -141,7 +139,6 @@ final case class MetalsServerConfig(
s"max-log-backup=${maxLogBackups}",
s"server-to-idle-time=${metalsToIdleTime}",
s"build-server-ping-interval=${pingInterval}",
s"telemetry-server=${telemetryServer}",
).mkString("MetalsServerConfig(\n ", ",\n ", "\n)")
}
object MetalsServerConfig {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import scala.util.Try

import scala.meta.internal.jdk.CollectionConverters._
import scala.meta.internal.mtags.Symbol
import scala.meta.internal.metals.TelemetryLevel
import scala.meta.io.AbsolutePath
import scala.meta.pc.PresentationCompilerConfig

Expand Down Expand Up @@ -55,6 +56,7 @@ case class UserConfiguration(
scalafixRulesDependencies: List[String] = Nil,
customProjectRoot: Option[String] = None,
scalaCliLauncher: Option[String] = None,
telemetryLevel: TelemetryLevel = TelemetryLevel.default,
) {

def currentBloopVersion: String =
Expand Down Expand Up @@ -329,6 +331,17 @@ object UserConfiguration {
"""Optional relative path to your project's root.
|If you want your project root to be the workspace/workspace root set it to "." .""".stripMargin,
),
UserConfigurationOption(
"telemetry-level",
TelemetryLevel.default.stringValue,
TelemetryLevel.default.stringValue,
"Scope of reported telemetry data",
s"""Control what kind of telemetry events can be send to maintainers of Metals.
|With `${TelemetryLevel.Off.stringValue}` no telemetry data would be send.
|Minimal recommended level is `${TelemetryLevel.Error.stringValue}` which would collect diagnostic information when Metals components would crash or fail unexpectedly, allowing to understand why the problem occoured.
|Defaults to `${TelemetryLevel.All.stringValue}` allowing to collect all information including how features are used to help us priortize future improvements."
|""".stripMargin,
),
)

def fromJson(
Expand Down Expand Up @@ -543,37 +556,42 @@ object UserConfiguration {

val customProjectRoot = getStringKey("custom-project-root")

val telemetryLevel = getStringKey("telemetry-level")
.flatMap(TelemetryLevel.fromString)
.getOrElse(TelemetryLevel.default)

if (errors.isEmpty) {
Right(
UserConfiguration(
javaHome,
sbtScript,
gradleScript,
mavenScript,
millScript,
scalafmtConfigPath,
scalafixConfigPath,
symbolPrefixes,
worksheetScreenWidth,
worksheetCancelTimeout,
bloopSbtAlreadyInstalled,
bloopVersion,
bloopJvmProperties,
ammoniteProperties,
superMethodLensesEnabled,
showInferredType,
showImplicitArguments,
showImplicitConversionsAndClasses,
remoteLanguageServer,
enableStripMarginOnTypeFormatting,
enableIndentOnPaste,
enableSemanticHighlighting,
excludedPackages,
defaultScalaVersion,
disableTestCodeLenses,
javaFormatConfig,
scalafixRulesDependencies,
customProjectRoot,
javaHome = javaHome,
sbtScript = sbtScript,
gradleScript = gradleScript,
mavenScript = mavenScript,
millScript = millScript,
scalafmtConfigPath = scalafmtConfigPath,
scalafixConfigPath = scalafixConfigPath,
symbolPrefixes = symbolPrefixes,
worksheetScreenWidth = worksheetScreenWidth,
worksheetCancelTimeout = worksheetCancelTimeout,
bloopSbtAlreadyInstalled = bloopSbtAlreadyInstalled,
bloopVersion = bloopVersion,
bloopJvmProperties = bloopJvmProperties,
ammoniteJvmProperties = ammoniteProperties,
superMethodLensesEnabled = superMethodLensesEnabled,
showInferredType = showInferredType,
showImplicitArguments = showImplicitArguments,
showImplicitConversionsAndClasses = showImplicitConversionsAndClasses,
remoteLanguageServer = remoteLanguageServer,
enableStripMarginOnTypeFormatting = enableStripMarginOnTypeFormatting,
enableIndentOnPaste = enableIndentOnPaste,
enableSemanticHighlighting = enableSemanticHighlighting,
excludedPackages = excludedPackages,
fallbackScalaVersion = defaultScalaVersion,
testUserInterface = disableTestCodeLenses,
javaFormatConfig = javaFormatConfig,
scalafixRulesDependencies = scalafixRulesDependencies,
customProjectRoot = customProjectRoot,
telemetryLevel = telemetryLevel,
)
)
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,13 @@ public PresentationCompiler withReportsLoggerLevel(String level) {
return this;
};

/**
* Set logger telemetry level for reports.
*/
public PresentationCompiler withTelemetryLevel(String level) {
return this;
};

/**
* Set build target name.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package scala.meta.internal.metals

// Proxy for different logging mechanism java.util.logging in PresentatilnCompiler and scribe in metals
case class LoggerAccess(
debug: String => Unit,
info: String => Unit,
warning: String => Unit,
error: String => Unit
)

object LoggerAccess {
object system
extends LoggerAccess(
debug = System.out.println(_),
info = System.out.println(_),
warning = System.err.println(_),
error = System.err.println(_)
)
}
Loading

0 comments on commit 078e17c

Please sign in to comment.