1212import io .opentelemetry .instrumentation .api .instrumenter .Instrumenter ;
1313import io .opentelemetry .instrumentation .api .instrumenter .InstrumenterBuilder ;
1414import io .opentelemetry .instrumentation .api .semconv .http .HttpClientAttributesGetter ;
15- import java .util .Optional ;
16- import java .lang .reflect .Field ;
1715import java .util .function .Consumer ;
1816
1917/**
@@ -40,8 +38,7 @@ public static <REQUEST, RESPONSE> Instrumenter<REQUEST, RESPONSE> create(
4038 // this is where an HttpClientTelemetryBuilder interface would be nice
4139 // instead of having to pass Object and using reflection to unwrap the underlying builder
4240 public static <REQUEST , RESPONSE > Instrumenter <REQUEST , RESPONSE > create (Object builder ) {
43- DefaultHttpClientInstrumenterBuilder <REQUEST , RESPONSE > defaultBuilder = unwrapBuilder (builder );
44- return create (defaultBuilder , customizer -> {});
41+ return create (builder , customizer -> {});
4542 }
4643
4744 public static <REQUEST , RESPONSE > Instrumenter <REQUEST , RESPONSE > create (
@@ -59,46 +56,7 @@ public static <REQUEST, RESPONSE> Instrumenter<REQUEST, RESPONSE> create(
5956 }
6057
6158 private static <REQUEST , RESPONSE > Instrumenter <REQUEST , RESPONSE > create (
62- DefaultHttpClientInstrumenterBuilder <REQUEST , RESPONSE > builder ,
63- Consumer <InstrumenterBuilder <REQUEST , RESPONSE >> builderCustomizer ) {
64- CommonConfig config = CommonConfig .get ();
65- set (config ::getKnownHttpRequestMethods , builder ::setKnownMethods );
66- set (config ::getClientRequestHeaders , builder ::setCapturedRequestHeaders );
67- set (config ::getClientResponseHeaders , builder ::setCapturedResponseHeaders );
68- // is not exposed in the public API
69- set (config ::getPeerServiceResolver , builder ::setPeerServiceResolver );
70- set (
71- config ::shouldEmitExperimentalHttpClientTelemetry ,
72- builder ::setEmitExperimentalHttpClientMetrics );
73- // is not exposed in the public API
74- builder .setBuilderCustomizer (builderCustomizer );
75- return builder .build ();
76- }
77-
78- /**
79- * This method is used to access the builder field of the builder object.
80- *
81- * <p>This approach allows us to re-use the existing builder classes from the library modules
82- */
83- @ SuppressWarnings ("unchecked" )
84- private static <REQUEST , RESPONSE >
85- DefaultHttpClientInstrumenterBuilder <REQUEST , RESPONSE > unwrapBuilder (Object builder ) {
86- if (builder instanceof DefaultHttpClientInstrumenterBuilder <?, ?>) {
87- return (DefaultHttpClientInstrumenterBuilder <REQUEST , RESPONSE >) builder ;
88- }
89- try {
90- Field field = builder .getClass ().getDeclaredField ("builder" );
91- field .setAccessible (true );
92- return (DefaultHttpClientInstrumenterBuilder <REQUEST , RESPONSE >) field .get (builder );
93- } catch (Exception e ) {
94- throw new IllegalStateException ("Could not access builder field" , e );
95- }
96- }
97-
98- private static <T > void set (Supplier <T > supplier , Consumer <T > consumer ) {
99- T t = supplier .get ();
100- if (t != null ) {
101- consumer .accept (t );
102- }
59+ Object builder , Consumer <InstrumenterBuilder <REQUEST , RESPONSE >> builderCustomizer ) {
60+ return HttpClientInstrumenterBuilder .configure (CommonConfig .get (), builder , builderCustomizer );
10361 }
10462}
0 commit comments