Skip to content

Commit e7556b9

Browse files
authored
better understanding of instrumentation flavor Closes #2013 (#2016)
* better understanding of instrumentation flavor * better understanding of instrumentation flavor
1 parent 0c48466 commit e7556b9

13 files changed

+373
-116
lines changed

jvm-common/src/main/kotlin/org/digma/intellij/plugin/idea/deps/ModulesDepsService.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,9 @@ class ModulesDepsService(private val project: Project) : Disposable {
250250
}
251251

252252
// delay for first check for update since startup
253-
private val DelayMilliseconds = TimeUnit.SECONDS.toMillis(5)
253+
private val delayMilliseconds = TimeUnit.SECONDS.toMillis(5)
254254

255-
private val PeriodMilliseconds =
255+
private val periodMilliseconds =
256256
TimeUnit.MINUTES.toMillis(1) // production value is 1 minutes
257257
// TimeUnit.SECONDS.toMillis(12) // use short period (few seconds) when debugging
258258

@@ -262,6 +262,7 @@ class ModulesDepsService(private val project: Project) : Disposable {
262262
private var mapName2Module: ConcurrentMap<String, ModuleExt> = ConcurrentHashMap<String, ModuleExt>()
263263

264264
init {
265+
//todo: change to coroutines
265266
val fetchTask = object : TimerTask() {
266267
override fun run() {
267268
try {
@@ -273,7 +274,7 @@ class ModulesDepsService(private val project: Project) : Disposable {
273274
}
274275

275276
timer.schedule(
276-
fetchTask, DelayMilliseconds, PeriodMilliseconds
277+
fetchTask, delayMilliseconds, periodMilliseconds
277278
)
278279
}
279280

@@ -410,8 +411,8 @@ class ModulesDepsService(private val project: Project) : Disposable {
410411

411412
class ModuleDepsStarter : StartupActivity {
412413
override fun runActivity(project: Project) {
413-
// its enough just to have reference to the service, and it will get initialized
414-
val service = ModulesDepsService.getInstance(project)
414+
// its enough just call getInstance and it will be initialized
415+
ModulesDepsService.getInstance(project)
415416
}
416417
}
417418

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.digma.intellij.plugin.idea.execution
2+
3+
import com.intellij.execution.configurations.RunConfigurationBase
4+
import com.intellij.openapi.module.Module
5+
6+
7+
const val INSTRUMENTATION_FLAVOR_ENV_NAME = "INSTRUMENTATION_FLAVOR"
8+
9+
open class InstrumentationFlavor(
10+
private val configuration: RunConfigurationBase<*>,
11+
private val projectHeuristics: ProjectHeuristics,
12+
private val moduleResolver: ModuleResolver,
13+
private val parametersExtractor: ParametersExtractor
14+
) {
15+
16+
//todo: this class can have a getFlavor method to use all over. can init the flavor when the object is initialized.
17+
// but needs first to research a bit and decide on the possible flavors.
18+
// it can be changed without changing the API.
19+
// currently the API of isXXX is fine and maybe even clearer then getFlavor
20+
21+
22+
private enum class Flavors { Default, Micronaut, Quarkus, SpringBootMicrometer }
23+
24+
private val resolvedModule: Module? = moduleResolver.resolveModule()
25+
26+
private val flavorInEnv: Flavors = try {
27+
val flavorValueInEnv = parametersExtractor.extractEnvValue(INSTRUMENTATION_FLAVOR_ENV_NAME)
28+
flavorValueInEnv?.let {
29+
Flavors.valueOf(it)
30+
} ?: Flavors.Default
31+
32+
} catch (e: IllegalArgumentException) {
33+
Flavors.Default
34+
}
35+
36+
open fun shouldUseOtelAgent(): Boolean {
37+
return listOf(isMicronautTracing(), isSpringBootMicrometerTracing()).none { it }
38+
}
39+
40+
open fun isSpringBootMicrometerTracing(): Boolean {
41+
return isUserConfiguredSpringBootMicrometerInEnv() ||
42+
isSpringBootMicrometerTracing(resolvedModule, projectHeuristics)
43+
}
44+
45+
open fun isMicronautTracing(): Boolean {
46+
return isUserConfiguredMicronautInEnv() ||
47+
isMicronautTracing(resolvedModule, projectHeuristics)
48+
}
49+
50+
private fun isSpringBootMicrometerTracing(module: Module?, projectHeuristics: ProjectHeuristics): Boolean {
51+
val isMicrometerTracingInSettings = isMicrometerTracingInSettings()
52+
val isSpringBootModule = isSpringBootModule(module)
53+
return isMicrometerTracingInSettings &&
54+
(isSpringBootModule || projectHeuristics.hasOnlySpringBootModules())
55+
56+
}
57+
58+
private fun isSpringBootModule(module: Module?): Boolean {
59+
val moduleMetadata = getModuleMetadata(module)
60+
return moduleMetadata?.hasSpringBoot() ?: false
61+
}
62+
63+
private fun isMicronautTracing(module: Module?, projectHeuristics: ProjectHeuristics): Boolean {
64+
return isMicronautModule(module) || projectHeuristics.hasOnlyMicronautModules()
65+
}
66+
67+
private fun isMicronautModule(module: Module?): Boolean {
68+
val moduleMetadata = getModuleMetadata(module)
69+
return moduleMetadata?.hasMicronaut() ?: false
70+
}
71+
72+
73+
fun isUserConfiguredSpringBootMicrometerInEnv(): Boolean {
74+
return flavorInEnv == Flavors.SpringBootMicrometer
75+
}
76+
77+
fun isUserConfiguredMicronautInEnv(): Boolean {
78+
return flavorInEnv == Flavors.Micronaut
79+
}
80+
81+
fun isUserConfiguredQuarkusInEnv(): Boolean {
82+
return flavorInEnv == Flavors.Quarkus
83+
}
84+
85+
}

jvm-common/src/main/kotlin/org/digma/intellij/plugin/idea/execution/JavaToolOptionsBuilder.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package org.digma.intellij.plugin.idea.execution
22

33
import com.intellij.execution.configurations.RunConfigurationBase
44
import com.intellij.execution.configurations.SimpleProgramParameters
5-
import com.intellij.openapi.module.Module
65
import org.digma.intellij.plugin.env.Env
76
import org.digma.intellij.plugin.settings.SettingsState
87

@@ -131,10 +130,10 @@ open class JavaToolOptionsBuilder(
131130
}
132131

133132

134-
open fun withServiceName(resolvedModule: Module?): JavaToolOptionsBuilder {
133+
open fun withServiceName(moduleResolver: ModuleResolver): JavaToolOptionsBuilder {
135134
if (!parametersExtractor.isOtelServiceNameAlreadyDefined()) {
136135
javaToolOptions
137-
.append("-Dotel.service.name=${serviceNameProvider.provideServiceName(resolvedModule)}")
136+
.append("-Dotel.service.name=${serviceNameProvider.provideServiceName(moduleResolver)}")
138137
.append(" ")
139138
}
140139
return this

jvm-common/src/main/kotlin/org/digma/intellij/plugin/idea/execution/ModuleResolver.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,21 @@ open class ModuleResolver(
5050
}
5151
}
5252

53-
val moduleByClassName = findByClassName(configuration, params)
54-
if (moduleByClassName != null) {
55-
return moduleByClassName
53+
run {
54+
val moduleByClassName = findByClassName(configuration, params)
55+
if (moduleByClassName != null) {
56+
return moduleByClassName
57+
}
5658
}
5759

58-
val moduleByWorkingDirectory = findByWorkingDirectory(configuration, params)
59-
if (moduleByWorkingDirectory != null) {
60-
return moduleByWorkingDirectory
60+
run {
61+
val moduleByWorkingDirectory = findByWorkingDirectory(configuration, params)
62+
if (moduleByWorkingDirectory != null) {
63+
return moduleByWorkingDirectory
64+
}
6165
}
6266

67+
6368
return null
6469

6570
}

jvm-common/src/main/kotlin/org/digma/intellij/plugin/idea/execution/ParametersExtractor.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,21 @@ open class ParametersExtractor(protected val configuration: RunConfigurationBase
5656
return params.env[OTEL_RESOURCE_ATTRIBUTES]?.contains("$DIGMA_ENVIRONMENT_RESOURCE_ATTRIBUTE=") ?: false
5757
}
5858

59+
fun extractEnvValue(envKeyName: String): String? {
60+
61+
if (configuration is ExternalSystemRunConfiguration &&
62+
configuration.settings.env[envKeyName] != null
63+
) {
64+
return configuration.settings.env[envKeyName]
65+
}
66+
67+
if (params.env[envKeyName] != null) {
68+
return params.env[envKeyName]
69+
}
70+
71+
return null
72+
73+
}
74+
5975

6076
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package org.digma.intellij.plugin.idea.execution
2+
3+
import com.intellij.openapi.module.ModuleManager
4+
import com.intellij.openapi.project.Project
5+
import org.digma.intellij.plugin.idea.deps.ModuleExt
6+
import org.digma.intellij.plugin.idea.deps.ModulesDepsService
7+
8+
open class ProjectHeuristics(private val project: Project) {
9+
10+
11+
//todo: taking ModulesDepsService.getModuleExt()
12+
// which is updated every minute and in rare cases we'll get an outdated ModuleExt.
13+
// instead we can use ModulesDepsService.buildMetadata so it will always be up to date but will impact performance a bit
14+
private fun getModulesMetadata(): List<ModuleExt> {
15+
return ModuleManager.getInstance(project).modules.mapNotNull {
16+
ModulesDepsService.getInstance(project).getModuleExt(it.name)
17+
}
18+
}
19+
20+
21+
/**
22+
* check if the project has only micronaut modules and not other known frameworks like spring boot or quarkus
23+
*/
24+
fun hasOnlyMicronautModules(): Boolean {
25+
26+
val modulesMetaData = getModulesMetadata()
27+
28+
return hasMicronaut(modulesMetaData) &&
29+
!hasSpringBoot(modulesMetaData) &&
30+
!hasQuarkus(modulesMetaData)
31+
}
32+
33+
34+
/**
35+
* check if the project has only spring boot modules and not other known frameworks like micronaut or quarkus
36+
*/
37+
fun hasOnlySpringBootModules(): Boolean {
38+
val modulesMetaData = getModulesMetadata()
39+
40+
return hasSpringBoot(modulesMetaData) &&
41+
!hasMicronaut(modulesMetaData) &&
42+
!hasQuarkus(modulesMetaData)
43+
44+
}
45+
46+
/**
47+
* check if the project has only quarkus modules and not other known frameworks like micronaut or spring boot
48+
*/
49+
fun hasOnlyQuarkusModules(): Boolean {
50+
51+
val modulesMetaData = getModulesMetadata()
52+
53+
return hasQuarkus(modulesMetaData) &&
54+
!hasSpringBoot(modulesMetaData) &&
55+
!hasMicronaut(modulesMetaData)
56+
57+
}
58+
59+
60+
private fun hasSpringBoot(modulesMetaData: List<ModuleExt>): Boolean {
61+
return modulesMetaData.any { it.metadata.hasSpringBoot() }
62+
}
63+
64+
private fun hasMicronaut(modulesMetaData: List<ModuleExt>): Boolean {
65+
return modulesMetaData.any { it.metadata.hasMicronaut() }
66+
}
67+
68+
private fun hasQuarkus(modulesMetaData: List<ModuleExt>): Boolean {
69+
return modulesMetaData.any { it.metadata.hasQuarkus() }
70+
}
71+
72+
73+
}

jvm-common/src/main/kotlin/org/digma/intellij/plugin/idea/execution/ServiceNameProvider.kt

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,23 @@
11
package org.digma.intellij.plugin.idea.execution
22

3-
import com.intellij.execution.configurations.ModuleBasedConfiguration
43
import com.intellij.execution.configurations.ModuleRunConfiguration
54
import com.intellij.execution.configurations.RunConfigurationBase
6-
import com.intellij.execution.configurations.SimpleJavaParameters
75
import com.intellij.execution.configurations.SimpleProgramParameters
8-
import com.intellij.openapi.module.Module
96

107
open class ServiceNameProvider(
118
protected val configuration: RunConfigurationBase<*>,
129
protected val params: SimpleProgramParameters
1310
) {
1411

1512

16-
open fun provideServiceName(resolvedModule: Module?): String {
13+
open fun provideServiceName(moduleResolver: ModuleResolver): String {
14+
15+
val resolvedModule = moduleResolver.resolveModule()
1716

1817
if (resolvedModule != null) {
1918
return trimName(resolvedModule.name)
2019
}
2120

22-
if (configuration is ModuleBasedConfiguration<*, *> &&
23-
configuration.configurationModule != null &&
24-
configuration.configurationModule.module != null
25-
) {
26-
//another null check to satisfy kotlin
27-
val moduleName = configuration.configurationModule.module?.name
28-
if (moduleName != null) {
29-
return trimName(moduleName)
30-
}
31-
}
32-
33-
34-
if (params is SimpleJavaParameters && params.moduleName != null) {
35-
return trimName(params.moduleName)
36-
}
37-
3821

3922
if (configuration is ModuleRunConfiguration && configuration.modules.isNotEmpty()) {
4023
val moduleName = configuration.modules.firstOrNull()?.name

0 commit comments

Comments
 (0)