@@ -68,6 +68,8 @@ public boolean delayStart() {
68
68
69
69
@ Override
70
70
public void start () {
71
+ installTransformers ();
72
+
71
73
EarlyInitAgentConfig earlyConfig = EarlyInitAgentConfig .create ();
72
74
extensionClassLoader = createExtensionClassLoader (getClass ().getClassLoader (), earlyConfig );
73
75
@@ -115,6 +117,14 @@ public void start() {
115
117
}
116
118
}
117
119
120
+ private void installTransformers () {
121
+ // prevents loading InetAddressResolverProvider SPI before agent has started
122
+ // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/7130
123
+ // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/10921
124
+ InetAddressClassFileTransformer transformer = new InetAddressClassFileTransformer ();
125
+ instrumentation .addTransformer (transformer , true );
126
+ }
127
+
118
128
@ SuppressWarnings ("SystemOut" )
119
129
private static void logUnrecognizedLoggerImplWarning (String loggerImplementationName ) {
120
130
System .err .println (
@@ -180,4 +190,60 @@ public void visitCode() {
180
190
return hookInserted ? cw .toByteArray () : null ;
181
191
}
182
192
}
193
+
194
+ private static class InetAddressClassFileTransformer implements ClassFileTransformer {
195
+ boolean hookInserted = false ;
196
+
197
+ @ Override
198
+ public byte [] transform (
199
+ ClassLoader loader ,
200
+ String className ,
201
+ Class <?> classBeingRedefined ,
202
+ ProtectionDomain protectionDomain ,
203
+ byte [] classfileBuffer ) {
204
+ if (!"java/net/InetAddress" .equals (className )) {
205
+ return null ;
206
+ }
207
+ ClassReader cr = new ClassReader (classfileBuffer );
208
+ ClassWriter cw = new ClassWriter (cr , 0 );
209
+ ClassVisitor cv =
210
+ new ClassVisitor (AsmApi .VERSION , cw ) {
211
+ @ Override
212
+ public MethodVisitor visitMethod (
213
+ int access , String name , String descriptor , String signature , String [] exceptions ) {
214
+ MethodVisitor mv = super .visitMethod (access , name , descriptor , signature , exceptions );
215
+ if (!"resolver" .equals (name )) {
216
+ return mv ;
217
+ }
218
+ return new MethodVisitor (api , mv ) {
219
+ @ Override
220
+ public void visitMethodInsn (
221
+ int opcode ,
222
+ String ownerClassName ,
223
+ String methodName ,
224
+ String descriptor ,
225
+ boolean isInterface ) {
226
+ super .visitMethodInsn (
227
+ opcode , ownerClassName , methodName , descriptor , isInterface );
228
+ // rewrite Vm.isBooted() to AgentInitializer.isAgentStarted(Vm.isBooted())
229
+ if ("jdk/internal/misc/VM" .equals (ownerClassName )
230
+ && "isBooted" .equals (methodName )) {
231
+ super .visitMethodInsn (
232
+ Opcodes .INVOKESTATIC ,
233
+ Type .getInternalName (AgentInitializer .class ),
234
+ "isAgentStarted" ,
235
+ "(Z)Z" ,
236
+ false );
237
+ hookInserted = true ;
238
+ }
239
+ }
240
+ };
241
+ }
242
+ };
243
+
244
+ cr .accept (cv , 0 );
245
+
246
+ return hookInserted ? cw .toByteArray () : null ;
247
+ }
248
+ }
183
249
}
0 commit comments