Skip to content

Commit b156312

Browse files
authored
Generate opt-in instrumentation version class (#19006)
1 parent 8f759ee commit b156312

6 files changed

Lines changed: 109 additions & 3 deletions

File tree

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.gradle
7+
8+
import org.gradle.api.DefaultTask
9+
import org.gradle.api.file.DirectoryProperty
10+
import org.gradle.api.provider.Property
11+
import org.gradle.api.tasks.Input
12+
import org.gradle.api.tasks.OutputDirectory
13+
import org.gradle.api.tasks.TaskAction
14+
15+
abstract class GenerateInstrumentationVersionClassTask : DefaultTask() {
16+
@get:Input
17+
abstract val className: Property<String>
18+
19+
@get:Input
20+
abstract val instrumentationVersion: Property<String>
21+
22+
@get:OutputDirectory
23+
abstract val outputDirectory: DirectoryProperty
24+
25+
@TaskAction
26+
fun generate() {
27+
val configuredClassName = className.get()
28+
val lastDotIndex = configuredClassName.lastIndexOf('.')
29+
require(lastDotIndex > 0 && lastDotIndex < configuredClassName.length - 1) {
30+
"instrumentationVersionClass.className must be a fully qualified class name"
31+
}
32+
33+
val packageName = configuredClassName.substring(0, lastDotIndex)
34+
val simpleClassName = configuredClassName.substring(lastDotIndex + 1)
35+
val outputRoot = outputDirectory.get().asFile
36+
outputRoot.deleteRecursively()
37+
val outputDir = outputRoot.resolve(packageName.replace('.', '/'))
38+
outputDir.mkdirs()
39+
outputDir.resolve("$simpleClassName.java").writeText(
40+
"""
41+
package $packageName;
42+
43+
/** Autogenerated class. Do not edit. */
44+
public final class $simpleClassName {
45+
public static final String VERSION = "${instrumentationVersion.get()}";
46+
47+
private $simpleClassName() {}
48+
}
49+
""".trimIndent()
50+
)
51+
}
52+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.gradle
7+
8+
import org.gradle.api.provider.Property
9+
10+
abstract class InstrumentationVersionClassExtension {
11+
abstract val className: Property<String>
12+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import io.opentelemetry.instrumentation.gradle.GenerateInstrumentationVersionClassTask
2+
import io.opentelemetry.instrumentation.gradle.InstrumentationVersionClassExtension
3+
4+
plugins {
5+
`java-library`
6+
}
7+
8+
val instrumentationVersionClass = extensions.create<InstrumentationVersionClassExtension>("instrumentationVersionClass")
9+
val generatedInstrumentationVersionClassDir = layout.buildDirectory.dir("generated/sources/instrumentationVersionClass/java/main")
10+
11+
val generateInstrumentationVersionClass by tasks.registering(GenerateInstrumentationVersionClassTask::class) {
12+
className.set(instrumentationVersionClass.className)
13+
instrumentationVersion.set(project.version.toString())
14+
outputDirectory.set(generatedInstrumentationVersionClassDir)
15+
}
16+
17+
sourceSets {
18+
main {
19+
java {
20+
srcDir(generatedInstrumentationVersionClassDir)
21+
}
22+
}
23+
}
24+
25+
tasks.matching {
26+
it.name == "compileJava" || it.name == "sourcesJar" || it.name == "compileKotlin" || it.name == "kotlinSourcesJar"
27+
}.configureEach {
28+
dependsOn(generateInstrumentationVersionClass)
29+
}
30+
31+
tasks.withType<Checkstyle>().matching { it.name == "checkstyleMain" }.configureEach {
32+
exclude("build/generated/sources/instrumentationVersionClass/java/main/**")
33+
}

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterBuilder.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ public final class InstrumenterBuilder<REQUEST, RESPONSE> {
9696
this.openTelemetry = openTelemetry;
9797
this.instrumentationName = instrumentationName;
9898
this.spanNameExtractor = spanNameExtractor;
99-
this.instrumentationVersion =
100-
EmbeddedInstrumentationProperties.findVersion(instrumentationName);
10199
}
102100

103101
/**
@@ -304,6 +302,10 @@ private Instrumenter<REQUEST, RESPONSE> buildInstrumenter(
304302

305303
applyCustomizers(this);
306304

305+
if (instrumentationVersion == null) {
306+
instrumentationVersion = EmbeddedInstrumentationProperties.findVersion(instrumentationName);
307+
}
308+
307309
this.spanKindExtractor = spanKindExtractor;
308310
return constructor.create(this);
309311
}

instrumentation/okhttp/okhttp-3.0/library/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
plugins {
22
id("otel.library-instrumentation")
3+
id("otel.instrumentation-version-class")
34
id("otel.nullaway-conventions")
45
id("otel.animalsniffer-conventions")
56
}
67

8+
instrumentationVersionClass {
9+
className.set("io.opentelemetry.instrumentation.okhttp.v3_0.internal.InstrumentationVersion")
10+
}
11+
712
dependencies {
813
compileOnly(project(":muzzle"))
914
compileOnly("com.squareup.okhttp3:okhttp:3.11.0")

instrumentation/okhttp/okhttp-3.0/library/src/main/java/io/opentelemetry/instrumentation/okhttp/v3_0/internal/OkHttpClientInstrumenterBuilderFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ public class OkHttpClientInstrumenterBuilderFactory {
2020
public static DefaultHttpClientInstrumenterBuilder<Interceptor.Chain, Response> create(
2121
OpenTelemetry openTelemetry) {
2222
return DefaultHttpClientInstrumenterBuilder.create(
23-
INSTRUMENTATION_NAME, openTelemetry, new OkHttpAttributesGetter());
23+
INSTRUMENTATION_NAME, openTelemetry, new OkHttpAttributesGetter())
24+
.setBuilderCustomizer(
25+
builder -> builder.setInstrumentationVersion(InstrumentationVersion.VERSION));
2426
}
2527

2628
private OkHttpClientInstrumenterBuilderFactory() {}

0 commit comments

Comments
 (0)