@@ -17,41 +17,153 @@ dependencies {
1717
1818base.archivesBaseName =  " hypertrace-agent" 
1919
20- tasks {
21-     processResources {
22-         val  customizationShadowTask =  project(" :instrumentation" Jar >(" shadowJar" 
23-         val  providerArchive =  customizationShadowTask.get().archiveFile
24-         from(zipTree(providerArchive)) {
25-             into(" inst" 
26-             rename(" (^.*)\\ .class$" " $1.classdata" 
20+ //  Step 1: Extract instrumentation project's shadowJar into inst/ folder
21+ tasks.register<Copy >(" extractCustomInstrumentationToInst" 
22+     description =  " Extracts instrumentation project's shadowJar into inst/ folder" 
23+ 
24+     val  customizationShadowTask =  project(" :instrumentation" Jar >(" shadowJar" 
25+     val  providerArchive =  customizationShadowTask.get().archiveFile
26+ 
27+     from(zipTree(providerArchive)) {
28+         into(" inst" 
29+         rename(" (^.*)\\ .class$" " $1.classdata" 
30+     }
31+ 
32+     into(" $buildDir /resources/main" 
33+ 
34+     exclude(" **/META-INF/LICENSE" 
35+     dependsOn(customizationShadowTask)
36+ }
37+ 
38+ //  Step 2: Extract OpenTelemetry Java Agent's inst/ files and rename .classdata to .class
39+ tasks.register<Copy >(" extractOtelAgentJarInstClassdata" 
40+     description =  " Extracts OpenTelemetry Java Agent's .classdata files and renames them to .class" 
41+ 
42+     val  otelJavaAgentJar =  configurations.compileClasspath.get()
43+         .filter { it.name.contains(" opentelemetry-javaagent" 
44+         .singleOrNull() ? :  throw  GradleException (" OpenTelemetry Java Agent JAR not found" 
45+ 
46+     doFirst {
47+         println (" OpenTelemetry Java Agent JAR: $otelJavaAgentJar " 
48+     }
49+ 
50+     from(zipTree(otelJavaAgentJar)) {
51+         include(" inst/**" 
52+         rename(" (^.*)\\ .classdata$" " $1.class" 
53+     }
54+ 
55+     //  Output to a temporary directory
56+     into(" $buildDir /tmp/otel-classdata-for-relocation" 
57+ }
58+ 
59+ //  Step 3: Move contents to inst/ folder with relocated paths
60+ tasks.register< com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar > (" relocateOtelClassesToInst" 
61+     description =  " Relocates OpenTelemetry classes to inst/ folder with org.hypertrace prefix" 
62+ 
63+     dependsOn(" extractOtelAgentJarInstClassdata" 
64+ 
65+     from(" $buildDir /tmp/otel-classdata-for-relocation/inst" 
66+ 
67+     destinationDirectory.set(file(" $buildDir /tmp/relocated-otel-classdata" 
68+     archiveFileName.set(" relocated-otel-classdata.jar" 
69+ 
70+     relocate(" io.opentelemetry" " org.hypertrace.io.opentelemetry" 
71+ 
72+     eachFile {
73+         path =  " inst/org/hypertrace/$path " 
74+     }
75+ }
76+ 
77+ //  Step 3b: Extract the relocated JAR
78+ tasks.register<Copy >(" extractRelocatedOtelClasses" 
79+     description =  " Extracts relocated OpenTelemetry classes" 
80+ 
81+     dependsOn(" relocateOtelClassesToInst" 
82+ 
83+     from(zipTree(" $buildDir /tmp/relocated-otel-classdata/relocated-otel-classdata.jar" 
84+     into(" $buildDir /tmp/relocated-otel-classes" 
85+ }
86+ 
87+ tasks.register(" extractOtelInstrumentationToInst" 
88+     description =  " Removes empty directories from the relocated classes directory" 
89+ 
90+     dependsOn(" extractRelocatedOtelClasses" 
91+ 
92+     doLast {
93+         //  Find and delete empty directories
94+         val  instDir =  file(" $buildDir /tmp/relocated-otel-classes" 
95+         if  (instDir.exists()) {
96+             deleteEmptyDirs(instDir)
2797        }
28-         exclude(" **/META-INF/LICENSE" 
29-         dependsOn(customizationShadowTask)
3098    }
99+ }
100+ 
101+ //  Helper function to recursively delete empty directories
102+ fun  deleteEmptyDirs (dir :  File ) {
103+     if  (! dir.isDirectory) return 
104+ 
105+     val  children =  dir.listFiles() ? :  return 
106+ 
107+     //  Recursively process subdirectories
108+     children.filter { it.isDirectory }.forEach { deleteEmptyDirs(it) }
109+ 
110+     //  Check if directory is empty after processing subdirectories
111+     if  (dir.listFiles()?.isEmpty() ==  true ) {
112+         dir.delete()
113+     }
114+ }
115+ 
116+ //  Step 4: Convert all .class files to .classdata and combine with instrumentation files
117+ tasks.register<Copy >(" combineAndConvertToClassdata" 
118+     description =  " Combines all classes and converts to .classdata" 
119+ 
120+     dependsOn(" extractCustomInstrumentationToInst" " extractOtelInstrumentationToInst" 
121+ 
122+     //  include the relocated OpenTelemetry classes
123+     from(" $buildDir /tmp/relocated-otel-classes" 
124+         rename(" (^.*)\\ .class$" " $1.classdata" 
125+     }
126+ 
127+     //  Output to the resources directory for inclusion in the final JAR
128+     into(" $buildDir /resources/main" 
129+ 
130+     //  If there are conflicts, our instrumentation project files win
131+     duplicatesStrategy =  DuplicatesStrategy .EXCLUDE 
132+ }
133+ 
134+ //  Modify the existing processResources task to depend on our new task
135+ tasks.named<ProcessResources >(" processResources" 
136+     dependsOn(" combineAndConvertToClassdata" 
137+     exclude(" **/META-INF/LICENSE" 
138+ }
139+ 
140+ tasks {
31141
32142    shadowJar {
33-         relocate(" com.blogspot.mydailyjava.weaklockfree" " io.opentelemetry.instrumentation.api.internal.shaded.weaklockfree" 
143+         relocate(" com.blogspot.mydailyjava.weaklockfree" " org.hypertrace. io.opentelemetry.instrumentation.api.internal.shaded.weaklockfree" 
34144
35145        dependencies {
36146            exclude(dependency(" org.codehaus.mojo:animal-sniffer-annotations" 
37147            exclude(dependency(" javax.annotation:javax.annotation-api" 
38148        }
39149
40-         relocate(" org.slf4j" " io.opentelemetry.javaagent.slf4j" 
41-         relocate(" java.util.logging.Logger" " io.opentelemetry.javaagent.bootstrap.PatchLogger" 
42-         relocate(" com.fasterxml.jackson" " io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.fasterxml.jackson" 
43-         relocate(" org.yaml" " io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.org.yaml" 
150+         relocate(" org.slf4j" " org.hypertrace. io.opentelemetry.javaagent.slf4j" 
151+         relocate(" java.util.logging.Logger" " org.hypertrace. io.opentelemetry.javaagent.bootstrap.PatchLogger" 
152+         relocate(" com.fasterxml.jackson" " org.hypertrace. io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.com.fasterxml.jackson" 
153+         relocate(" org.yaml" " org.hypertrace. io.opentelemetry.javaagent.shaded.org.hypertrace.shaded.org.yaml" 
44154
45155        //  prevents conflict with library instrumentation
46-         relocate(" io.opentelemetry.instrumentation.api" " io.opentelemetry.javaagent.shaded.instrumentation.api" 
156+         relocate(" io.opentelemetry.instrumentation.api" " org.hypertrace. io.opentelemetry.javaagent.shaded.instrumentation.api" 
47157
48158        //  relocate OpenTelemetry API
49-         relocate(" io.opentelemetry.api" " io.opentelemetry.javaagent.shaded.io.opentelemetry.api" 
50-         relocate(" io.opentelemetry.semconv" " io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv" 
51-         relocate(" io.opentelemetry.spi" " io.opentelemetry.javaagent.shaded.io.opentelemetry.spi" 
52-         relocate(" io.opentelemetry.context" " io.opentelemetry.javaagent.shaded.io.opentelemetry.context" 
53-         relocate(" io.opentelemetry.extension.kotlin" " io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin" 
54-         relocate(" io.opentelemetry.extension.aws" " io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws" 
159+         relocate(" io.opentelemetry.api" " org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.api" 
160+         relocate(" io.opentelemetry.semconv" " org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv" 
161+         relocate(" io.opentelemetry.spi" " org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.spi" 
162+         relocate(" io.opentelemetry.context" " org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.context" 
163+         relocate(" io.opentelemetry.extension.kotlin" " org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.kotlin" 
164+         relocate(" io.opentelemetry.extension.aws" " org.hypertrace.io.opentelemetry.javaagent.shaded.io.opentelemetry.extension.aws" 
165+         //  Shade everything else of io.opentelemetry into org.hypertrace.io.opentelemetry
166+         relocate(" io.opentelemetry" " org.hypertrace.io.opentelemetry" 
55167
56168        mergeServiceFiles {
57169            include(" inst/META-INF/services/*" 
@@ -61,15 +173,15 @@ tasks {
61173        //  Fix CVE-2024-7254, opentelemetry-javaagent brings in io.prometheus.metrics which uses deps of high vulnerability protobuf-java version
62174        //  This was fixed in 2.x.x versions of opentelemetry-javaagent(which needs us to upgrade from 1.33.0)
63175        //  TODO: Remove this exclusion after otel-javaagent upgrade which has CVE-2024-7254 fix
64-         exclude(" inst/io/prometheus/metrics/shaded/com_google_protobuf_3_21_7/**" 
176+         exclude(" inst/org/hypertrace/ io/prometheus/metrics/shaded/com_google_protobuf_3_21_7/**" 
65177        exclude(" **/module-info.class" 
66178        manifest {
67179            attributes.put(" Implementation-Title" " javaagent" 
68180            attributes.put(" Implementation-Version" 
69181            attributes.put(" OpenTelemetry-Instrumentation-Version" " ${versions[" opentelemetry_java_agent"  " 
70182            attributes.put(" Implementation-Vendor" " Hypertrace.org" 
71183            attributes.put(" Implementation-Url" " https://github.com/hypertrace/javaagent" 
72-             attributes.put(" Main-Class" " io.opentelemetry.javaagent.OpenTelemetryAgent" 
184+             attributes.put(" Main-Class" " org.hypertrace. io.opentelemetry.javaagent.OpenTelemetryAgent" 
73185            attributes.put(" Agent-Class" " org.hypertrace.agent.instrument.HypertraceAgent" 
74186            attributes.put(" Premain-Class" " org.hypertrace.agent.instrument.HypertraceAgent" 
75187            attributes.put(" Can-Redefine-Classes" true )
0 commit comments