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,62 @@ 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 ));
91+ extractors .add (new RabbitReceiveExtraAttributesExtractor ());
8492 extractors .add (NetworkAttributesExtractor .create (new RabbitReceiveNetAttributesGetter ()));
8593 if (RabbitInstrumenterHelper .CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES ) {
8694 extractors .add (new RabbitReceiveExperimentalAttributesExtractor ());
8795 }
8896
97+ SpanNameExtractor <ReceiveRequest > spanNameExtractor =
98+ emitStableMessagingSemconv ()
99+ ? MessagingSpanNameExtractor .create (getter , MessagingOperationType .RECEIVE )
100+ : ReceiveRequest ::spanName ;
89101 InstrumenterBuilder <ReceiveRequest , GetResponse > builder =
90102 Instrumenter .<ReceiveRequest , GetResponse >builder (
91- GlobalOpenTelemetry .get (), INSTRUMENTATION_NAME , ReceiveRequest :: spanName )
103+ GlobalOpenTelemetry .get (), INSTRUMENTATION_NAME , spanNameExtractor )
92104 .addAttributesExtractors (extractors )
93105 .setEnabled (ExperimentalConfig .get ().messagingReceiveInstrumentationEnabled ())
94106 .addSpanLinksExtractor (
95107 new PropagatorBasedSpanLinksExtractor <>(
96108 GlobalOpenTelemetry .getPropagators ().getTextMapPropagator (),
97109 new ReceiveRequestTextMapGetter ()));
98110 setMessagingReceiveExceptionEventExtractor (builder );
99- return builder .buildInstrumenter (SpanKindExtractor .alwaysConsumer ());
111+ return builder .buildInstrumenter (
112+ MessagingSpanKindExtractor .create (MessagingOperationType .RECEIVE ));
100113 }
101114
102115 private static Instrumenter <DeliveryRequest , Void > createDeliverInstrumenter () {
116+ RabbitDeliveryAttributesGetter getter = new RabbitDeliveryAttributesGetter ();
103117 List <AttributesExtractor <DeliveryRequest , Void >> extractors = new ArrayList <>();
104- extractors .add (
105- buildMessagingAttributesExtractor (
106- new RabbitDeliveryAttributesGetter (), MessageOperation .PROCESS ));
118+ extractors .add (buildMessagingAttributesExtractor (getter , MessagingOperationType .PROCESS ));
107119 extractors .add (NetworkAttributesExtractor .create (new RabbitDeliveryNetAttributesGetter ()));
108120 extractors .add (new RabbitDeliveryExtraAttributesExtractor ());
109121 if (RabbitInstrumenterHelper .CAPTURE_EXPERIMENTAL_SPAN_ATTRIBUTES ) {
110122 extractors .add (new RabbitDeliveryExperimentalAttributesExtractor ());
111123 }
112124
125+ SpanNameExtractor <DeliveryRequest > spanNameExtractor =
126+ emitStableMessagingSemconv ()
127+ ? MessagingSpanNameExtractor .create (getter , MessagingOperationType .PROCESS )
128+ : DeliveryRequest ::spanName ;
113129 InstrumenterBuilder <DeliveryRequest , Void > builder =
114130 Instrumenter .<DeliveryRequest , Void >builder (
115- GlobalOpenTelemetry .get (), INSTRUMENTATION_NAME , DeliveryRequest :: spanName )
131+ GlobalOpenTelemetry .get (), INSTRUMENTATION_NAME , spanNameExtractor )
116132 .addAttributesExtractors (extractors );
117133 setMessagingProcessExceptionEventExtractor (builder );
118- return builder .buildConsumerInstrumenter (new DeliveryRequestGetter ());
134+ return MessagingProcessInstrumenterFactory .create (
135+ builder ,
136+ GlobalOpenTelemetry .getPropagators ().getTextMapPropagator (),
137+ new DeliveryRequestGetter (),
138+ false );
119139 }
120140
121141 private static <T , V > AttributesExtractor <T , V > buildMessagingAttributesExtractor (
122- MessagingAttributesGetter <T , V > getter , @ Nullable MessageOperation operation ) {
123- return MessagingAttributesExtractor .builder (getter , operation )
142+ MessagingAttributesGetter <T , V > getter , MessagingOperationType operationType ) {
143+ return MessagingAttributesExtractor .builderForOperationType (getter , operationType )
124144 .setCapturedHeaders (ExperimentalConfig .get ().getMessagingHeaders ())
125145 .build ();
126146 }
0 commit comments