[telemetry][IJPL-163198] refactoring in TelemetryManagerImpl

GitOrigin-RevId: f45fd6d7c75a90b588a4903768d3686502da997a
This commit is contained in:
Alexander.Glukhov
2024-09-30 17:09:30 +02:00
committed by intellij-monorepo-bot
parent e9c0c56731
commit b7bd550d6a
2 changed files with 46 additions and 38 deletions

View File

@@ -2,9 +2,11 @@
package com.intellij.platform.diagnostic.telemetry.impl
import com.intellij.openapi.util.SystemInfoRt
import com.intellij.platform.diagnostic.telemetry.OtlpConfiguration.getTraceEndpoint
import io.opentelemetry.api.common.AttributeKey
import io.opentelemetry.api.common.Attributes
import io.opentelemetry.api.common.AttributesBuilder
import io.opentelemetry.sdk.OpenTelemetrySdk
import io.opentelemetry.sdk.OpenTelemetrySdkBuilder
import io.opentelemetry.sdk.resources.Resource
import org.jetbrains.annotations.ApiStatus
@@ -31,4 +33,25 @@ class OpenTelemetryConfigurator(@JvmField internal val sdkBuilder: OpenTelemetry
}
.build()
)
companion object {
fun create(
serviceName: String,
serviceVersion: String,
serviceNamespace: String,
): OpenTelemetryConfigurator {
return OpenTelemetryConfigurator(
sdkBuilder = OpenTelemetrySdk.builder(),
serviceName = serviceName,
serviceVersion = serviceVersion,
serviceNamespace = serviceNamespace,
customResourceBuilder = { attributes ->
// don't write username to file - it maybe private information
if (getTraceEndpoint() != null) {
attributes.put(AttributeKey.stringKey("process.owner"), System.getProperty("user.name") ?: "unknown")
}
},
)
}
}
}

View File

@@ -59,16 +59,7 @@ class TelemetryManagerImpl(coroutineScope: CoroutineScope, isUnitTestMode: Boole
init {
verboseMode = System.getProperty("idea.diagnostic.opentelemetry.verbose")?.toBooleanStrictOrNull() == true
val configurator: OpenTelemetryConfigurator = try {
val appInfo = ApplicationInfoImpl.getShadowInstance()
createOpenTelemetryConfigurator(serviceName = ApplicationNamesInfo.getInstance().fullProductName,
serviceVersion = appInfo.build.asStringWithoutProductCode(),
serviceNamespace = appInfo.build.productCode)
}
catch (e: Throwable) {
createOpenTelemetryConfigurator(serviceName = "", serviceVersion = "", serviceNamespace = "")
}
val configurator: OpenTelemetryConfigurator = createOpenTelemetryConfigurator()
aggregatedMetricExporter = AggregatedMetricExporter()
otlpService = OtlpService.getInstance()
@@ -91,15 +82,9 @@ class TelemetryManagerImpl(coroutineScope: CoroutineScope, isUnitTestMode: Boole
}
})
val batchSpanProcessor = BatchSpanProcessor(coroutineScope = coroutineScope, spanExporters = java.util.List.copyOf(spanExporters))
// make sure that otlpService job is canceled before BatchSpanProcessor job
otlpServiceCoroutineScope = coroutineScope.childScope(supervisor = false)
val tracerProvider = SdkTracerProvider.builder()
.addSpanProcessor(batchSpanProcessor)
.setResource(configurator.resource)
.build()
configurator.sdkBuilder.setTracerProvider(tracerProvider)
batchSpanProcessor
BatchSpanProcessor(coroutineScope = coroutineScope, spanExporters = java.util.List.copyOf(spanExporters))
}
else {
null
@@ -110,9 +95,17 @@ class TelemetryManagerImpl(coroutineScope: CoroutineScope, isUnitTestMode: Boole
opentelemetrySdkResource = configurator.resource)
sdk = configurator.sdkBuilder
// W3CTraceContextPropagator is needed to make backend/client spans properly synced, issue: RDCT-408
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
.setMeterProvider(IdeaOtlpMeterProvider.get(configurator.resource, aggregatedMetricExporter))
.apply {
setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
setMeterProvider(IdeaOtlpMeterProvider.get(configurator.resource, aggregatedMetricExporter))
if (batchSpanProcessor != null) {
val tracerProvider = SdkTracerProvider.builder()
.addSpanProcessor(batchSpanProcessor)
.setResource(configurator.resource)
.build()
setTracerProvider(tracerProvider)
}
}
.buildAndRegisterGlobal()
}
@@ -258,22 +251,14 @@ private fun createSpanExporters(resource: Resource, isUnitTestMode: Boolean = fa
return spanExporters
}
private fun createOpenTelemetryConfigurator(
serviceName: String,
serviceVersion: String,
serviceNamespace: String,
): OpenTelemetryConfigurator {
return OpenTelemetryConfigurator(
sdkBuilder = OpenTelemetrySdk.builder(),
serviceName = serviceName,
serviceVersion = serviceVersion,
serviceNamespace = serviceNamespace,
customResourceBuilder = {
// don't write username to file - it maybe private information
if (getTraceEndpoint() != null) {
it.put(AttributeKey.stringKey("process.owner"), System.getProperty("user.name") ?: "unknown")
}
},
)
private fun createOpenTelemetryConfigurator(): OpenTelemetryConfigurator {
return try {
val appInfo = ApplicationInfoImpl.getShadowInstance()
OpenTelemetryConfigurator.create(serviceName = ApplicationNamesInfo.getInstance().fullProductName,
serviceVersion = appInfo.build.asStringWithoutProductCode(),
serviceNamespace = appInfo.build.productCode)
}
catch (e: Throwable) {
OpenTelemetryConfigurator.create(serviceName = "", serviceVersion = "", serviceNamespace = "")
}
}