Skip to content

Commit 5f2634e

Browse files
committed
Add scheduled_job.run.exception event name to scheduling instrumentations
1 parent 09fbe2c commit 5f2634e

21 files changed

Lines changed: 148 additions & 25 deletions

File tree

instrumentation/apache-elasticjob-3.0/javaagent/build.gradle.kts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,13 @@ tasks {
3030
systemProperty("metadataConfig", "otel.instrumentation.apache-elasticjob.experimental-span-attributes=true")
3131
}
3232

33+
val testExceptionSignalLogs by registering(Test::class) {
34+
testClassesDirs = sourceSets.test.get().output.classesDirs
35+
classpath = sourceSets.test.get().runtimeClasspath
36+
jvmArgs("-Dotel.semconv.exception.signal.opt-in=logs")
37+
}
38+
3339
check {
34-
dependsOn(testExperimental)
40+
dependsOn(testExperimental, testExceptionSignalLogs)
3541
}
3642
}

instrumentation/apache-elasticjob-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apacheelasticjob/v3_0/ElasticJobSingletons.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55

66
package io.opentelemetry.javaagent.instrumentation.apacheelasticjob.v3_0;
77

8+
import static io.opentelemetry.api.logs.Severity.ERROR;
9+
810
import io.opentelemetry.api.GlobalOpenTelemetry;
911
import io.opentelemetry.api.common.AttributeKey;
1012
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
13+
import io.opentelemetry.instrumentation.api.incubator.instrumenter.ExceptionEventExtractor;
1114
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor;
1215
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor;
1316
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1417
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1518
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
19+
import io.opentelemetry.instrumentation.api.internal.Experimental;
1620

1721
public final class ElasticJobSingletons {
1822
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.apache-elasticjob-3.0";
@@ -38,6 +42,8 @@ private static Instrumenter<ElasticJobProcessRequest, Void> createInstrumenter()
3842
builder.addAttributesExtractor(new ElasticJobExperimentalAttributeExtractor());
3943
}
4044

45+
Experimental.setExceptionEventExtractor(
46+
builder, ExceptionEventExtractor.create("scheduled_job.run.exception", ERROR));
4147
return builder.buildInstrumenter();
4248
}
4349

instrumentation/apache-elasticjob-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apacheelasticjob/v3_0/ElasticJobTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static io.opentelemetry.api.common.AttributeKey.longKey;
99
import static io.opentelemetry.api.common.AttributeKey.stringKey;
10+
import static io.opentelemetry.instrumentation.api.internal.SemconvExceptionSignal.emitExceptionAsSpanEvents;
1011
import static io.opentelemetry.instrumentation.testing.util.TelemetryDataUtil.comparingRootSpanAttribute;
1112
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
1213
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
@@ -283,7 +284,10 @@ void testFailedJob() {
283284
span.hasKind(SpanKind.INTERNAL)
284285
.hasName("TestFailedJob.execute")
285286
.hasStatus(StatusData.error())
286-
.hasException(new RuntimeException("Simulated job failure for testing"))
287+
.hasException(
288+
emitExceptionAsSpanEvents()
289+
? new RuntimeException("Simulated job failure for testing")
290+
: null)
287291
.hasAttributesSatisfyingExactly(
288292
elasticJobAttributes(
289293
"failedElasticJob",

instrumentation/powerjob-4.0/javaagent/build.gradle.kts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,13 @@ tasks {
3333
systemProperty("metadataConfig", "otel.instrumentation.powerjob.experimental-span-attributes=true")
3434
}
3535

36+
val testExceptionSignalLogs by registering(Test::class) {
37+
testClassesDirs = sourceSets.test.get().output.classesDirs
38+
classpath = sourceSets.test.get().runtimeClasspath
39+
jvmArgs("-Dotel.semconv.exception.signal.opt-in=logs")
40+
}
41+
3642
check {
37-
dependsOn(testExperimental)
43+
dependsOn(testExperimental, testExceptionSignalLogs)
3844
}
3945
}

instrumentation/powerjob-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/powerjob/v4_0/PowerJobSingletons.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,21 @@
55

66
package io.opentelemetry.javaagent.instrumentation.powerjob.v4_0;
77

8+
import static io.opentelemetry.api.logs.Severity.ERROR;
9+
810
import io.opentelemetry.api.GlobalOpenTelemetry;
911
import io.opentelemetry.api.common.AttributeKey;
1012
import io.opentelemetry.api.trace.StatusCode;
1113
import io.opentelemetry.instrumentation.api.incubator.config.internal.DeclarativeConfigUtil;
14+
import io.opentelemetry.instrumentation.api.incubator.instrumenter.ExceptionEventExtractor;
1215
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor;
1316
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor;
1417
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1518
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1619
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
1720
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1821
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
22+
import io.opentelemetry.instrumentation.api.internal.Experimental;
1923
import tech.powerjob.worker.core.processor.ProcessResult;
2024

2125
public final class PowerJobSingletons {
@@ -55,6 +59,8 @@ private static Instrumenter<PowerJobProcessRequest, ProcessResult> create() {
5559
builder.addAttributesExtractor(new PowerJobExperimentalAttributeExtractor());
5660
}
5761

62+
Experimental.setExceptionEventExtractor(
63+
builder, ExceptionEventExtractor.create("scheduled_job.run.exception", ERROR));
5864
return builder.buildInstrumenter();
5965
}
6066

instrumentation/quartz-2.0/library/build.gradle.kts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,13 @@ tasks {
1717
jvmArgs("-Dotel.instrumentation.quartz.experimental-span-attributes=true")
1818
}
1919

20+
val testExceptionSignalLogs by registering(Test::class) {
21+
testClassesDirs = sourceSets.test.get().output.classesDirs
22+
classpath = sourceSets.test.get().runtimeClasspath
23+
jvmArgs("-Dotel.semconv.exception.signal.opt-in=logs")
24+
}
25+
2026
check {
21-
dependsOn(testExperimental)
27+
dependsOn(testExperimental, testExceptionSignalLogs)
2228
}
2329
}

instrumentation/quartz-2.0/library/src/main/java/io/opentelemetry/instrumentation/quartz/v2_0/QuartzTelemetryBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55

66
package io.opentelemetry.instrumentation.quartz.v2_0;
77

8+
import static io.opentelemetry.api.logs.Severity.ERROR;
9+
810
import com.google.errorprone.annotations.CanIgnoreReturnValue;
911
import io.opentelemetry.api.OpenTelemetry;
1012
import io.opentelemetry.api.common.AttributeKey;
13+
import io.opentelemetry.instrumentation.api.incubator.instrumenter.ExceptionEventExtractor;
1114
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor;
1215
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1316
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1417
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
1518
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
19+
import io.opentelemetry.instrumentation.api.internal.Experimental;
1620
import java.util.ArrayList;
1721
import java.util.List;
1822
import java.util.function.Function;
@@ -90,6 +94,8 @@ public QuartzTelemetry build() {
9094
instrumenter.addAttributesExtractor(
9195
CodeAttributesExtractor.create(new QuartzCodeAttributesGetter()));
9296
instrumenter.addAttributesExtractors(additionalExtractors);
97+
Experimental.setExceptionEventExtractor(
98+
instrumenter, ExceptionEventExtractor.create("scheduled_job.run.exception", ERROR));
9399

94100
return new QuartzTelemetry(new TracingJobListener(instrumenter.buildInstrumenter()));
95101
}

instrumentation/quartz-2.0/testing/src/main/java/io/opentelemetry/instrumentation/quartz/v2_0/AbstractQuartzTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.instrumentation.quartz.v2_0;
77

88
import static io.opentelemetry.api.common.AttributeKey.stringKey;
9+
import static io.opentelemetry.instrumentation.api.internal.SemconvExceptionSignal.emitExceptionAsSpanEvents;
910
import static io.opentelemetry.instrumentation.testing.junit.code.SemconvCodeStabilityUtil.codeFunctionAssertions;
1011
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
1112
import static org.quartz.JobBuilder.newJob;
@@ -107,7 +108,10 @@ void failingJob() throws Exception {
107108
.hasKind(SpanKind.INTERNAL)
108109
.hasNoParent()
109110
.hasStatus(StatusData.error())
110-
.hasException(new IllegalStateException("Bad job"))
111+
.hasException(
112+
emitExceptionAsSpanEvents()
113+
? new IllegalStateException("Bad job")
114+
: null)
111115
.hasAttributesSatisfyingExactly(assertions)));
112116
}
113117

instrumentation/spring/spring-batch-3.0/javaagent/build.gradle.kts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,19 @@ tasks {
5858
systemProperty("metadataConfig", "otel.instrumentation.spring-batch.experimental-span-attributes=true")
5959
}
6060

61+
val testExceptionSignalLogs by registering(Test::class) {
62+
testClassesDirs = sourceSets.test.get().output.classesDirs
63+
classpath = sourceSets.test.get().runtimeClasspath
64+
filter {
65+
excludeTestsMatching("*ChunkRootSpanTest")
66+
excludeTestsMatching("*ItemLevelSpanTest")
67+
excludeTestsMatching("*CustomSpanEventTest")
68+
}
69+
jvmArgs("-Dotel.semconv.exception.signal.opt-in=logs")
70+
}
71+
6172
check {
62-
dependsOn(testChunkRootSpan, testItemLevelSpan)
73+
dependsOn(testChunkRootSpan, testItemLevelSpan, testExceptionSignalLogs)
6374
}
6475

6576
withType<Test>().configureEach {

instrumentation/spring/spring-batch-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/batch/v3_0/chunk/ChunkSingletons.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
import io.opentelemetry.api.trace.Span;
1414
import io.opentelemetry.api.trace.SpanContext;
1515
import io.opentelemetry.context.Context;
16+
import io.opentelemetry.instrumentation.api.incubator.instrumenter.ExceptionEventExtractor;
1617
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1718
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
1819
import io.opentelemetry.instrumentation.api.instrumenter.SpanLinksBuilder;
20+
import io.opentelemetry.instrumentation.api.internal.Experimental;
1921
import org.springframework.batch.core.scope.context.ChunkContext;
2022
import org.springframework.batch.core.step.builder.SimpleStepBuilder;
2123

@@ -28,6 +30,9 @@ public class ChunkSingletons {
2830
Instrumenter.builder(
2931
GlobalOpenTelemetry.get(), instrumentationName(), ChunkSingletons::spanName);
3032

33+
Experimental.setExceptionEventExtractor(
34+
instrumenterBuilder, ExceptionEventExtractor.create("spring_batch.exception"));
35+
3136
if (shouldCreateRootSpanForChunk()) {
3237
instrumenterBuilder.addSpanLinksExtractor(ChunkSingletons::extractSpanLinks);
3338
}

0 commit comments

Comments
 (0)