Skip to content

Commit 023ce5d

Browse files
committed
extended-observability-experiment
1 parent c968580 commit 023ce5d

File tree

10 files changed

+132
-16
lines changed

10 files changed

+132
-16
lines changed

build.gradle.kts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,18 @@ tasks {
249249
"org.digma.plugin.enable.devtools" to "true",
250250

251251
// "idea.ProcessCanceledException" to "disabled"
252+
253+
254+
//to use a local file for digma-agent or digma extension,
255+
// usually when developing and we want to test the plugin
256+
//see org.digma.intellij.plugin.idea.execution.OtelAgentPathProvider
257+
//don't forget to comment when done testing !
258+
//"digma.agent.override.path" to "/home/shalom/workspace/digma/digma-agent/build/libs/digma-agent-1.0.2.jar"
259+
//"digma.otel.extension.override.path" to "/home/shalom/workspace/digma/otel-java-instrumentation/agent-extension/build/libs/digma-otel-agent-extension-0.8.12.jar"
260+
//can also change the url from where the jar is downloaded when IDE starts
261+
//"org.digma.otel.extensionUrl" to "some url
262+
//"org.digma.otel.digmaAgentUrl" to "some url
263+
252264
)
253265

254266

ide-common/src/main/java/org/digma/intellij/plugin/settings/ProjectSettings.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ public boolean isModified() {
4646
isJaegerLinkModeChanged(settings) ||
4747
isSpringBootObservabilityModeChanged(settings) ||
4848
isRuntimeObservabilityBackendUrlChanged(settings) ||
49-
isExtendedObservabilityChanged(settings);
49+
isExtendedObservabilityChanged(settings) ||
50+
isExtendedObservabilityExcludeChanged(settings);
5051
}
5152

5253
private boolean isRefreshDelayChanged(SettingsState settings) {
@@ -85,6 +86,10 @@ private boolean isExtendedObservabilityChanged(SettingsState settings) {
8586
return !Objects.equals(settings.extendedObservability, mySettingsComponent.getExtendedObservability());
8687
}
8788

89+
private boolean isExtendedObservabilityExcludeChanged(SettingsState settings) {
90+
return !Objects.equals(settings.extendedObservabilityExcludes, mySettingsComponent.getExtendedObservabilityExclude());
91+
}
92+
8893
@Override
8994
public void apply() throws ConfigurationException {
9095
SettingsState settings = SettingsState.getInstance();
@@ -149,6 +154,7 @@ public void apply() throws ConfigurationException {
149154
settings.springBootObservabilityMode = mySettingsComponent.getSpringBootObservabilityMode();
150155
settings.runtimeObservabilityBackendUrl = mySettingsComponent.getRuntimeObservabilityBackendUrl();
151156
settings.extendedObservability = mySettingsComponent.getExtendedObservability();
157+
settings.extendedObservabilityExcludes = mySettingsComponent.getExtendedObservabilityExclude();
152158
settings.fireChanged();
153159
}
154160

@@ -164,6 +170,7 @@ public void reset() {
164170
mySettingsComponent.setSpringBootObservabilityMode(settings.springBootObservabilityMode);
165171
mySettingsComponent.setRuntimeObservabilityBackendUrl(settings.runtimeObservabilityBackendUrl);
166172
mySettingsComponent.setExtendedObservability(settings.extendedObservability);
173+
mySettingsComponent.setExtendedObservabilityExclude(settings.extendedObservabilityExcludes);
167174
}
168175

169176

ide-common/src/main/java/org/digma/intellij/plugin/settings/SettingsComponent.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,14 @@ public class SettingsComponent {
3030
private final JBLabel myRuntimeObservabilityBackendUrlLabel = new JBLabel("Runtime observability backend URL:");
3131
private final JBTextField myRuntimeObservabilityBackendUrlText = new JBTextField();
3232
private final JBTextField extendedObservabilityTextBox = new JBTextField();
33+
private final JBTextField extendedObservabilityExcludeTextBox = new JBTextField();
3334

3435
public SettingsComponent() {
3536

37+
extendedObservabilityTextBox.setToolTipText("packages names in format 'my.pkg1;my.pkg2");
38+
extendedObservabilityExcludeTextBox.setToolTipText("class/method names to exclude in format 'MyClass;MyOtherClass.myOtherMethod;*get");
39+
40+
3641
var defaultLabelForeground = JBColor.foreground();
3742

3843
var myUrlLabel = new JBLabel("Digma API URL: ");
@@ -156,6 +161,7 @@ public boolean verify(JComponent input) {
156161
.addLabeledComponent(mySpringBootObservabilityModeLabel, mySpringBootObservabilityModeComboBox, 1, false)
157162
.addLabeledComponent(myRuntimeObservabilityBackendUrlLabel, myRuntimeObservabilityBackendUrlText, 1, false)
158163
.addLabeledComponent("Extended Observability (beta)", extendedObservabilityTextBox, 1, false)
164+
.addLabeledComponent("Extended Observability Exclude (beta)", extendedObservabilityExcludeTextBox, 1, false)
159165
.addComponent(resetButton)
160166
.addComponentFillVertically(new JPanel(), 0)
161167
.getPanel();
@@ -278,6 +284,16 @@ public String getExtendedObservability() {
278284
return extendedObservabilityTextBox.getText();
279285
}
280286

287+
public void setExtendedObservabilityExclude(@Nullable String extendedObservabilityExclude) {
288+
extendedObservabilityExcludeTextBox.setText(extendedObservabilityExclude);
289+
}
290+
291+
@Nullable
292+
public String getExtendedObservabilityExclude() {
293+
return extendedObservabilityExcludeTextBox.getText();
294+
}
295+
296+
281297
private void resetToDefaults() {
282298
this.setApiUrlText(SettingsState.DEFAULT_API_URL);
283299
this.setApiToken(null);
@@ -289,5 +305,6 @@ private void resetToDefaults() {
289305
this.setSpringBootObservabilityMode(SettingsState.DEFAULT_SPRING_BOOT_OBSERVABILITY_MODE);
290306
this.setRuntimeObservabilityBackendUrl(SettingsState.DEFAULT_RUNTIME_OBSERVABILITY_BACKEND_URL);
291307
this.setExtendedObservability(null);
308+
this.setExtendedObservabilityExclude(null);
292309
}
293310
}

ide-common/src/main/java/org/digma/intellij/plugin/settings/SettingsState.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ public class SettingsState implements PersistentStateComponent<SettingsState>, D
5151
public String posthogToken;
5252
@Nullable
5353
public String extendedObservability;
54+
@Nullable
55+
public String extendedObservabilityExcludes;
5456

5557

5658
private final List<SettingsChangeListener> listeners = new ArrayList<>();

ide-common/src/main/kotlin/org/digma/intellij/plugin/posthog/SettingsChangeTracker.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class SettingsChangeTracker {
7777
myTrackedSettings["refreshDelay"] = SettingsState.getInstance().refreshDelay.toString()
7878
myTrackedSettings["springBootObservabilityMode"] = SettingsState.getInstance().springBootObservabilityMode.name
7979
myTrackedSettings["extendedObservability"] = SettingsState.getInstance().extendedObservability.toString()
80+
myTrackedSettings["extendedObservabilityExcludes"] = SettingsState.getInstance().extendedObservabilityExcludes.toString()
8081
}
8182

8283

jvm-common/build.gradle.kts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,29 @@ tasks {
3939
src(
4040
listOf(
4141
properties.getProperty("otel-agent"),
42-
properties.getProperty("digma-extension")
42+
properties.getProperty("digma-extension"),
43+
properties.getProperty("digma-agent")
4344
)
4445
)
4546

46-
logger.lifecycle("copying jars $properties")
47+
logger.lifecycle("jars to download $properties")
4748

4849
dest(File(project.sourceSets.main.get().output.resourcesDir, "otelJars"))
4950
overwrite(true)
51+
//if a jar is downloaded with version then its name needs to change. it may happen
52+
// in development if the url for some of the jars is changed to download from somewhere else.
53+
//usually latest jar is downloaded without version
54+
eachFile {
55+
name = if (name.startsWith("digma-otel-agent-extension", true)) {
56+
"digma-otel-agent-extension.jar"
57+
} else if (name.startsWith("digma-agent", true)) {
58+
"digma-agent.jar"
59+
} else if (name.startsWith("opentelemetry-javaagent", true)) {
60+
"opentelemetry-javaagent.jar"
61+
} else {
62+
name
63+
}
64+
}
5065
}
5166

5267
processResources {

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ open class JavaToolOptionsBuilder(
4646
throw JavaToolOptionsBuilderException("useAgent is true but can't find agent paths")
4747
}
4848
javaToolOptions
49+
.append("-javaagent:${otelAgentPathProvider.digmaAgentPath}")
50+
.append(" ")
4951
.append("-javaagent:${otelAgentPathProvider.otelAgentPath}")
5052
.append(" ")
5153
.append("-Dotel.javaagent.extensions=${otelAgentPathProvider.digmaExtensionPath}")
@@ -147,6 +149,12 @@ open class JavaToolOptionsBuilder(
147149
.append("-Ddigma.autoinstrument.packages=${SettingsState.getInstance().extendedObservability}")
148150
.append(" ")
149151
}
152+
153+
if (!SettingsState.getInstance().extendedObservabilityExcludes.isNullOrBlank()) {
154+
javaToolOptions
155+
.append("-Ddigma.autoinstrument.packages.exclude.names=${SettingsState.getInstance().extendedObservabilityExcludes}")
156+
.append(" ")
157+
}
150158
return this
151159
}
152160

@@ -254,9 +262,18 @@ open class JavaToolOptionsBuilder(
254262

255263

256264
open fun build(): String {
265+
disableExtendedObservabilityExtension()
257266
return javaToolOptions.toString()
258267
}
259268

269+
//todo: disabled in this branch because it uses Digma agent that injects @WithSpan instead of the
270+
// digma-methods instrumentation module.
271+
private fun disableExtendedObservabilityExtension() {
272+
javaToolOptions
273+
.append("-Dotel.instrumentation.digma-methods.enabled=false")
274+
.append(" ")
275+
}
276+
260277

261278
open fun getExporterUrl(): String {
262279
return SettingsState.getInstance().runtimeObservabilityBackendUrl

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

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,27 @@ private const val RESOURCE_LOCATION = "otelJars"
1717

1818
private const val OTEL_AGENT_JAR_PROP_NAME = "otel-agent"
1919
private const val DIGMA_EXTENSION_JAR_PROP_NAME = "digma-extension"
20+
private const val DIGMA_AGENT_JAR_PROP_NAME = "digma-agent"
2021
private const val OTEL_AGENT_JAR_NAME = "opentelemetry-javaagent.jar"
2122
private const val DIGMA_AGENT_EXTENSION_JAR_NAME = "digma-otel-agent-extension.jar"
22-
23+
private const val DIGMA_AGENT_JAR_NAME = "digma-agent.jar"
24+
25+
26+
/**
27+
* Downloads and provides the instrumentation jars.
28+
*
29+
* jars urls and path may be overridden for development to another download url or a local path,
30+
* for example when developing the digma-agent or otel extension.
31+
* system properties can be injected in runIde task or in idea custom properties.
32+
*
33+
* to override the download url see the method tryDownloadLatest, it will try to get the url from system
34+
* property if exists. this is useful for example for downloading a different version of some of the jars.
35+
*
36+
* to override the final path see org.digma.intellij.plugin.idea.execution.OtelAgentPathProvider, it will
37+
* first check if system property exists and use it instead of the default. this is useful when developing
38+
* the digma agent or otel extension and you want to use the local build jar.
39+
*
40+
*/
2341

2442
//Do not change to light service because it will always register.
2543
// we want it to register only in Idea.
@@ -63,9 +81,9 @@ class OTELJarProvider {
6381

6482
fun getDigmaAgentExtensionJarPath(): String? {
6583
ensureFilesExist()
66-
val digmaJar = getDigmaAgentExtensionJar()
67-
if (digmaJar.exists()) {
68-
return digmaJar.absolutePath
84+
val digmaExtensionJar = getDigmaAgentExtensionJar()
85+
if (digmaExtensionJar.exists()) {
86+
return digmaExtensionJar.absolutePath
6987
}
7088
return null
7189
}
@@ -74,6 +92,19 @@ class OTELJarProvider {
7492
return File(downloadDir, DIGMA_AGENT_EXTENSION_JAR_NAME)
7593
}
7694

95+
fun getDigmaAgentJarPath(): String? {
96+
ensureFilesExist()
97+
val digmaAgentJar = getDigmaAgentJar()
98+
if (digmaAgentJar.exists()) {
99+
return digmaAgentJar.absolutePath
100+
}
101+
return null
102+
}
103+
104+
private fun getDigmaAgentJar(): File {
105+
return File(downloadDir, DIGMA_AGENT_JAR_NAME)
106+
}
107+
77108

78109
private fun ensureFilesExist() {
79110

@@ -89,8 +120,9 @@ class OTELJarProvider {
89120

90121
private fun filesExist(): Boolean {
91122
val otelJar = getOtelAgentJar()
92-
val digmaJar = getDigmaAgentExtensionJar()
93-
return otelJar.exists() && digmaJar.exists()
123+
val digmaExtensionJar = getDigmaAgentExtensionJar()
124+
val digmaAgentJar = getDigmaAgentJar()
125+
return otelJar.exists() && digmaExtensionJar.exists() && digmaAgentJar.exists()
94126
}
95127

96128

@@ -109,6 +141,7 @@ class OTELJarProvider {
109141
if (downloadDir.exists()) {
110142
copyFileFromResource(OTEL_AGENT_JAR_NAME)
111143
copyFileFromResource(DIGMA_AGENT_EXTENSION_JAR_NAME)
144+
copyFileFromResource(DIGMA_AGENT_JAR_NAME)
112145
Log.log(logger::info, "otel agent jars unpacked to {}", downloadDir)
113146
}
114147
} catch (e: Exception) {
@@ -143,9 +176,11 @@ class OTELJarProvider {
143176
try {
144177
val otelUrl = System.getProperty("org.digma.otel.agentUrl", jarsUrls.getProperty(OTEL_AGENT_JAR_PROP_NAME))
145178
val extensionUrl = System.getProperty("org.digma.otel.extensionUrl", jarsUrls.getProperty(DIGMA_EXTENSION_JAR_PROP_NAME))
179+
val digmaAgentUrl = System.getProperty("org.digma.otel.digmaAgentUrl", jarsUrls.getProperty(DIGMA_AGENT_JAR_PROP_NAME))
146180

147181
downloadAndCopyJar(URL(otelUrl), getOtelAgentJar())
148182
downloadAndCopyJar(URL(extensionUrl), getDigmaAgentExtensionJar())
183+
downloadAndCopyJar(URL(digmaAgentUrl), getDigmaAgentJar())
149184
} catch (e: Exception) {
150185
Log.warnWithException(logger, e, "could not download latest otel jars")
151186
}

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,30 @@ class OtelAgentPathProvider(configuration: RunConfiguration) {
1313

1414
val otelAgentPath: String?
1515
val digmaExtensionPath: String?
16+
val digmaAgentPath: String?
1617

1718
init {
18-
val tmpAgentPath = service<OTELJarProvider>().getOtelAgentJarPath()
19-
val tmpDigmaExtensionPath = service<OTELJarProvider>().getDigmaAgentExtensionJarPath()
20-
if (tmpAgentPath != null && tmpDigmaExtensionPath != null) {
19+
20+
//paths can be overrider with system properties for development purposes
21+
val tmpOtelAgentPath = System.getProperty("digma.otel.agent.override.path", service<OTELJarProvider>().getOtelAgentJarPath())
22+
val tmpDigmaExtensionPath =
23+
System.getProperty("digma.otel.extension.override.path", service<OTELJarProvider>().getDigmaAgentExtensionJarPath())
24+
val tmpDigmaAgentPath = System.getProperty("digma.agent.override.path", service<OTELJarProvider>().getDigmaAgentJarPath())
25+
26+
if (tmpOtelAgentPath != null && tmpDigmaExtensionPath != null && tmpDigmaAgentPath != null) {
2127
if (isWsl(configuration)) {
22-
otelAgentPath = FileUtils.convertWinToWslPath(tmpAgentPath)
28+
otelAgentPath = FileUtils.convertWinToWslPath(tmpOtelAgentPath)
2329
digmaExtensionPath = FileUtils.convertWinToWslPath(tmpDigmaExtensionPath)
30+
digmaAgentPath = FileUtils.convertWinToWslPath(tmpDigmaAgentPath)
2431
} else {
25-
otelAgentPath = tmpAgentPath
32+
otelAgentPath = tmpOtelAgentPath
2633
digmaExtensionPath = tmpDigmaExtensionPath
34+
digmaAgentPath = tmpDigmaAgentPath
2735
}
2836
} else {
2937
otelAgentPath = null
3038
digmaExtensionPath = null
39+
digmaAgentPath = null
3140
}
3241

3342
}
@@ -67,7 +76,7 @@ class OtelAgentPathProvider(configuration: RunConfiguration) {
6776

6877

6978
fun hasAgentPath(): Boolean {
70-
return otelAgentPath != null && digmaExtensionPath != null
79+
return otelAgentPath != null && digmaExtensionPath != null && digmaAgentPath != null
7180
}
7281

7382
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
otel-agent=https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.1.0/opentelemetry-javaagent.jar
2-
digma-extension=https://github.com/digma-ai/otel-java-instrumentation/releases/latest/download/digma-otel-agent-extension.jar
2+
digma-extension=https://github.com/digma-ai/otel-java-instrumentation/releases/latest/download/digma-otel-agent-extension.jar
3+
digma-agent=https://github.com/digma-ai/digma-agent/releases/latest/download/digma-agent.jar

0 commit comments

Comments
 (0)