1010import static io .opentelemetry .instrumentation .api .incubator .semconv .messaging .internal .MessagingExceptionEventExtractors .setMessagingProcessExceptionEventExtractor ;
1111import static io .opentelemetry .instrumentation .api .incubator .semconv .messaging .internal .MessagingExceptionEventExtractors .setMessagingReceiveExceptionEventExtractor ;
1212import static io .opentelemetry .instrumentation .api .incubator .semconv .messaging .internal .MessagingExceptionEventExtractors .setMessagingSendExceptionEventExtractor ;
13+ import static io .opentelemetry .instrumentation .api .internal .SemconvStability .emitStableMessagingSemconv ;
1314
1415import com .rabbitmq .client .GetResponse ;
1516import io .opentelemetry .api .GlobalOpenTelemetry ;
1617import io .opentelemetry .context .ContextKey ;
17- import io .opentelemetry .instrumentation .api .incubator .semconv .messaging .MessageOperation ;
1818import io .opentelemetry .instrumentation .api .incubator .semconv .messaging .MessagingAttributesExtractor ;
1919import io .opentelemetry .instrumentation .api .incubator .semconv .messaging .MessagingAttributesGetter ;
20+ import io .opentelemetry .instrumentation .api .incubator .semconv .messaging .MessagingOperationType ;
21+ import io .opentelemetry .instrumentation .api .incubator .semconv .messaging .MessagingSpanKindExtractor ;
22+ import io .opentelemetry .instrumentation .api .incubator .semconv .messaging .MessagingSpanNameExtractor ;
23+ import io .opentelemetry .instrumentation .api .incubator .semconv .messaging .internal .MessagingProcessInstrumenterFactory ;
2024import io .opentelemetry .instrumentation .api .instrumenter .AttributesExtractor ;
2125import io .opentelemetry .instrumentation .api .instrumenter .Instrumenter ;
2226import io .opentelemetry .instrumentation .api .instrumenter .InstrumenterBuilder ;
23- import io .opentelemetry .instrumentation .api .instrumenter .SpanKindExtractor ;
27+ import io .opentelemetry .instrumentation .api .instrumenter .SpanNameExtractor ;
2428import io .opentelemetry .instrumentation .api .internal .PropagatorBasedSpanLinksExtractor ;
2529import io .opentelemetry .instrumentation .api .semconv .network .NetworkAttributesExtractor ;
2630import io .opentelemetry .javaagent .bootstrap .internal .ExperimentalConfig ;
2731import java .util .ArrayList ;
2832import java .util .List ;
29- import javax .annotation .Nullable ;
3033
3134public class RabbitSingletons {
3235
@@ -62,8 +65,13 @@ private static Instrumenter<ChannelAndMethod, Void> createChannelInstrumenter(bo
6265 Instrumenter .<ChannelAndMethod , Void >builder (
6366 GlobalOpenTelemetry .get (), INSTRUMENTATION_NAME , ChannelAndMethod ::getMethod )
6467 .addAttributesExtractor (
65- buildMessagingAttributesExtractor (
66- new RabbitChannelAttributesGetter (), publish ? MessageOperation .PUBLISH : null ))
68+ publish
69+ ? buildMessagingAttributesExtractor (
70+ new RabbitChannelAttributesGetter (), MessagingOperationType .SEND )
71+ : MessagingAttributesExtractor .builder (
72+ new RabbitChannelAttributesGetter (), null )
73+ .setCapturedHeaders (ExperimentalConfig .get ().getMessagingHeaders ())
74+ .build ())
6775 .addAttributesExtractor (
6876 NetworkAttributesExtractor .create (new RabbitChannelNetAttributesGetter ()))
6977 .addContextCustomizer (
@@ -77,50 +85,61 @@ private static Instrumenter<ChannelAndMethod, Void> createChannelInstrumenter(bo
7785 }
7886
7987 private static Instrumenter <ReceiveRequest , GetResponse > createReceiveInstrumenter () {
88+ RabbitReceiveAttributesGetter getter = new RabbitReceiveAttributesGetter ();
8089 List <AttributesExtractor <ReceiveRequest , GetResponse >> extractors = new ArrayList <>();
81- extractors .add (
82- buildMessagingAttributesExtractor (
83- new RabbitReceiveAttributesGetter (), MessageOperation .RECEIVE ));
90+ extractors .add (buildMessagingAttributesExtractor (getter , MessagingOperationType .RECEIVE ));
8491 extractors .add (NetworkAttributesExtractor .create (new RabbitReceiveNetAttributesGetter ()));
8592 if (RabbitInstrumenterHelper .CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES ) {
8693 extractors .add (new RabbitReceiveExperimentalAttributesExtractor ());
8794 }
8895
96+ SpanNameExtractor <ReceiveRequest > spanNameExtractor =
97+ emitStableMessagingSemconv ()
98+ ? MessagingSpanNameExtractor .create (getter , MessagingOperationType .RECEIVE )
99+ : ReceiveRequest ::spanName ;
89100 InstrumenterBuilder <ReceiveRequest , GetResponse > builder =
90101 Instrumenter .<ReceiveRequest , GetResponse >builder (
91- GlobalOpenTelemetry .get (), INSTRUMENTATION_NAME , ReceiveRequest :: spanName )
102+ GlobalOpenTelemetry .get (), INSTRUMENTATION_NAME , spanNameExtractor )
92103 .addAttributesExtractors (extractors )
93104 .setEnabled (ExperimentalConfig .get ().messagingReceiveInstrumentationEnabled ())
94105 .addSpanLinksExtractor (
95106 new PropagatorBasedSpanLinksExtractor <>(
96107 GlobalOpenTelemetry .getPropagators ().getTextMapPropagator (),
97108 new ReceiveRequestTextMapGetter ()));
98109 setMessagingReceiveExceptionEventExtractor (builder );
99- return builder .buildInstrumenter (SpanKindExtractor .alwaysConsumer ());
110+ return builder .buildInstrumenter (
111+ MessagingSpanKindExtractor .create (MessagingOperationType .RECEIVE ));
100112 }
101113
102114 private static Instrumenter <DeliveryRequest , Void > createDeliverInstrumenter () {
115+ RabbitDeliveryAttributesGetter getter = new RabbitDeliveryAttributesGetter ();
103116 List <AttributesExtractor <DeliveryRequest , Void >> extractors = new ArrayList <>();
104- extractors .add (
105- buildMessagingAttributesExtractor (
106- new RabbitDeliveryAttributesGetter (), MessageOperation .PROCESS ));
117+ extractors .add (buildMessagingAttributesExtractor (getter , MessagingOperationType .PROCESS ));
107118 extractors .add (NetworkAttributesExtractor .create (new RabbitDeliveryNetAttributesGetter ()));
108119 extractors .add (new RabbitDeliveryExtraAttributesExtractor ());
109120 if (RabbitInstrumenterHelper .CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES ) {
110121 extractors .add (new RabbitDeliveryExperimentalAttributesExtractor ());
111122 }
112123
124+ SpanNameExtractor <DeliveryRequest > spanNameExtractor =
125+ emitStableMessagingSemconv ()
126+ ? MessagingSpanNameExtractor .create (getter , MessagingOperationType .PROCESS )
127+ : DeliveryRequest ::spanName ;
113128 InstrumenterBuilder <DeliveryRequest , Void > builder =
114129 Instrumenter .<DeliveryRequest , Void >builder (
115- GlobalOpenTelemetry .get (), INSTRUMENTATION_NAME , DeliveryRequest :: spanName )
130+ GlobalOpenTelemetry .get (), INSTRUMENTATION_NAME , spanNameExtractor )
116131 .addAttributesExtractors (extractors );
117132 setMessagingProcessExceptionEventExtractor (builder );
118- return builder .buildConsumerInstrumenter (new DeliveryRequestGetter ());
133+ return MessagingProcessInstrumenterFactory .create (
134+ builder ,
135+ GlobalOpenTelemetry .getPropagators ().getTextMapPropagator (),
136+ new DeliveryRequestGetter (),
137+ false );
119138 }
120139
121140 private static <T , V > AttributesExtractor <T , V > buildMessagingAttributesExtractor (
122- MessagingAttributesGetter <T , V > getter , @ Nullable MessageOperation operation ) {
123- return MessagingAttributesExtractor .builder (getter , operation )
141+ MessagingAttributesGetter <T , V > getter , MessagingOperationType operationType ) {
142+ return MessagingAttributesExtractor .builderForOperationType (getter , operationType )
124143 .setCapturedHeaders (ExperimentalConfig .get ().getMessagingHeaders ())
125144 .build ();
126145 }
0 commit comments