Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-oslo.messaging for 
openSUSE:Factory checked in at 2026-09-08 16:55:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-oslo.messaging (Old)
 and      /work/SRC/openSUSE:Factory/.python-oslo.messaging.new.1265 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-oslo.messaging"

Tue Sep  8 16:55:41 2026 rev:39 rq:1376243 version:18.3.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-oslo.messaging/python-oslo.messaging.changes  
    2026-07-14 13:50:34.344306321 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-oslo.messaging.new.1265/python-oslo.messaging.changes
    2026-09-08 16:58:01.511759085 +0200
@@ -1,0 +2,6 @@
+Tue Sep  1 20:52:20 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 18.3.0:
+  * Add OpenTelemetry tracing support for RPC calls
+
+-------------------------------------------------------------------

Old:
----
  oslo_messaging-18.2.0.tar.gz

New:
----
  oslo_messaging-18.3.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-oslo.messaging.spec ++++++
--- /var/tmp/diff_new_pack.eKK6Vg/_old  2026-09-08 16:58:02.952819141 +0200
+++ /var/tmp/diff_new_pack.eKK6Vg/_new  2026-09-08 16:58:02.954819225 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           python-oslo.messaging
-Version:        18.2.0
+Version:        18.3.0
 Release:        0
 Summary:        OpenStack oslo.messaging library
 License:        Apache-2.0
@@ -45,7 +45,7 @@
 BuildRequires:  %{python_module oslo.service >= 1.24.0}
 BuildRequires:  %{python_module oslo.utils >= 3.37.0}
 BuildRequires:  %{python_module oslotest >= 3.2.0}
-BuildRequires:  %{python_module pbr >= 2.0.0}
+BuildRequires:  %{python_module pbr >= 6.1.1}
 BuildRequires:  %{python_module pip}
 BuildRequires:  %{python_module stestr >= 2.0.0}
 BuildRequires:  %{python_module stevedore >= 1.20.0}

++++++ oslo_messaging-18.2.0.tar.gz -> oslo_messaging-18.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_messaging-18.2.0/AUTHORS 
new/oslo_messaging-18.3.0/AUTHORS
--- old/oslo_messaging-18.2.0/AUTHORS   2026-07-10 15:50:00.000000000 +0200
+++ new/oslo_messaging-18.3.0/AUTHORS   2026-08-24 16:00:30.821021800 +0200
@@ -120,6 +120,7 @@
 Joshua Harlow <[email protected]>
 Joshua Harlow <[email protected]>
 Juan Antonio Osorio Robles <[email protected]>
+Juan Larriba <[email protected]>
 Julien Danjou <[email protected]>
 Kenneth Giusti <[email protected]>
 Kevin Benton <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_messaging-18.2.0/ChangeLog 
new/oslo_messaging-18.3.0/ChangeLog
--- old/oslo_messaging-18.2.0/ChangeLog 2026-07-10 15:50:00.000000000 +0200
+++ new/oslo_messaging-18.3.0/ChangeLog 2026-08-24 16:00:30.655008000 +0200
@@ -1,6 +1,11 @@
 CHANGES
 =======
 
+18.3.0
+------
+
+* Add OpenTelemetry tracing support for RPC calls
+
 18.2.0
 ------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_messaging-18.2.0/PKG-INFO 
new/oslo_messaging-18.3.0/PKG-INFO
--- old/oslo_messaging-18.2.0/PKG-INFO  2026-07-10 15:50:00.309638000 +0200
+++ new/oslo_messaging-18.3.0/PKG-INFO  2026-08-24 16:00:30.983034800 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: oslo.messaging
-Version: 18.2.0
+Version: 18.3.0
 Summary: Oslo Messaging API
 Author-email: OpenStack <[email protected]>
 Project-URL: Homepage, https://docs.openstack.org/oslo.messaging
@@ -40,6 +40,12 @@
 Requires-Dist: oslo.metrics>=0.2.1
 Provides-Extra: kafka
 Requires-Dist: confluent-kafka>=1.3.0; extra == "kafka"
+Provides-Extra: tracing-http
+Requires-Dist: opentelemetry-sdk>=1.0.0; extra == "tracing-http"
+Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.0.0; extra == 
"tracing-http"
+Provides-Extra: tracing-grpc
+Requires-Dist: opentelemetry-sdk>=1.0.0; extra == "tracing-grpc"
+Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.0.0; extra == 
"tracing-grpc"
 Dynamic: license-file
 Dynamic: requires-dist
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_messaging-18.2.0/oslo.messaging.egg-info/PKG-INFO 
new/oslo_messaging-18.3.0/oslo.messaging.egg-info/PKG-INFO
--- old/oslo_messaging-18.2.0/oslo.messaging.egg-info/PKG-INFO  2026-07-10 
15:50:00.000000000 +0200
+++ new/oslo_messaging-18.3.0/oslo.messaging.egg-info/PKG-INFO  2026-08-24 
16:00:30.827022000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: oslo.messaging
-Version: 18.2.0
+Version: 18.3.0
 Summary: Oslo Messaging API
 Author-email: OpenStack <[email protected]>
 Project-URL: Homepage, https://docs.openstack.org/oslo.messaging
@@ -40,6 +40,12 @@
 Requires-Dist: oslo.metrics>=0.2.1
 Provides-Extra: kafka
 Requires-Dist: confluent-kafka>=1.3.0; extra == "kafka"
+Provides-Extra: tracing-http
+Requires-Dist: opentelemetry-sdk>=1.0.0; extra == "tracing-http"
+Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.0.0; extra == 
"tracing-http"
+Provides-Extra: tracing-grpc
+Requires-Dist: opentelemetry-sdk>=1.0.0; extra == "tracing-grpc"
+Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.0.0; extra == 
"tracing-grpc"
 Dynamic: license-file
 Dynamic: requires-dist
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_messaging-18.2.0/oslo.messaging.egg-info/SOURCES.txt 
new/oslo_messaging-18.3.0/oslo.messaging.egg-info/SOURCES.txt
--- old/oslo_messaging-18.2.0/oslo.messaging.egg-info/SOURCES.txt       
2026-07-10 15:50:00.000000000 +0200
+++ new/oslo_messaging-18.3.0/oslo.messaging.egg-info/SOURCES.txt       
2026-08-24 16:00:30.905028600 +0200
@@ -77,6 +77,8 @@
 oslo_messaging/_drivers/kafka_driver/kafka_options.py
 oslo_messaging/_metrics/__init__.py
 oslo_messaging/_metrics/client.py
+oslo_messaging/_tracing/__init__.py
+oslo_messaging/_tracing/client.py
 oslo_messaging/hacking/__init__.py
 oslo_messaging/hacking/checks.py
 oslo_messaging/notify/__init__.py
@@ -131,6 +133,7 @@
 oslo_messaging/tests/rpc/test_server.py
 releasenotes/notes/RPC-call-monitoring-7977f047d069769a.yaml
 releasenotes/notes/add-enable_cancel_on_failover-22ac472b93dd3a23.yaml
+releasenotes/notes/add-opentelemetry-tracing-support.yaml
 releasenotes/notes/add-ping-endpoint.yaml
 releasenotes/notes/add-quorum-control-configurations-beed79811ff97ba2.yaml
 releasenotes/notes/add-ssl-support-for-kafka.yaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_messaging-18.2.0/oslo.messaging.egg-info/pbr.json 
new/oslo_messaging-18.3.0/oslo.messaging.egg-info/pbr.json
--- old/oslo_messaging-18.2.0/oslo.messaging.egg-info/pbr.json  2026-07-10 
15:50:00.000000000 +0200
+++ new/oslo_messaging-18.3.0/oslo.messaging.egg-info/pbr.json  2026-08-24 
16:00:30.844023500 +0200
@@ -1 +1 @@
-{"git_version": "8ca4a4bf", "is_release": true}
\ No newline at end of file
+{"git_version": "3b02f8ab", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_messaging-18.2.0/oslo.messaging.egg-info/requires.txt 
new/oslo_messaging-18.3.0/oslo.messaging.egg-info/requires.txt
--- old/oslo_messaging-18.2.0/oslo.messaging.egg-info/requires.txt      
2026-07-10 15:50:00.000000000 +0200
+++ new/oslo_messaging-18.3.0/oslo.messaging.egg-info/requires.txt      
2026-08-24 16:00:30.829022400 +0200
@@ -18,3 +18,11 @@
 
 [kafka]
 confluent-kafka>=1.3.0
+
+[tracing-grpc]
+opentelemetry-sdk>=1.0.0
+opentelemetry-exporter-otlp-proto-grpc>=1.0.0
+
+[tracing-http]
+opentelemetry-sdk>=1.0.0
+opentelemetry-exporter-otlp-proto-http>=1.0.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_messaging-18.2.0/oslo_messaging/_tracing/__init__.py 
new/oslo_messaging-18.3.0/oslo_messaging/_tracing/__init__.py
--- old/oslo_messaging-18.2.0/oslo_messaging/_tracing/__init__.py       
1970-01-01 01:00:00.000000000 +0100
+++ new/oslo_messaging-18.3.0/oslo_messaging/_tracing/__init__.py       
2026-08-24 15:59:42.974970300 +0200
@@ -0,0 +1,21 @@
+# Copyright 2026 Red Hat, Inc.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+__all__ = [
+    'trace_send',
+    'trace_receive',
+]
+
+from .client import trace_send
+from .client import trace_receive
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_messaging-18.2.0/oslo_messaging/_tracing/client.py 
new/oslo_messaging-18.3.0/oslo_messaging/_tracing/client.py
--- old/oslo_messaging-18.2.0/oslo_messaging/_tracing/client.py 1970-01-01 
01:00:00.000000000 +0100
+++ new/oslo_messaging-18.3.0/oslo_messaging/_tracing/client.py 2026-08-24 
15:59:42.974970300 +0200
@@ -0,0 +1,218 @@
+# Copyright 2026 Red Hat, Inc.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import contextlib
+
+from oslo_config import cfg
+from oslo_log import log as logging
+
+
+LOG = logging.getLogger(__name__)
+
+oslo_messaging_tracing = [
+    cfg.BoolOpt('tracing_enabled', default=False,
+                help='Enable OpenTelemetry tracing for RPC calls.'),
+    cfg.StrOpt('tracing_service_name', default='openstack',
+               help='Service name reported in trace spans.'),
+    cfg.StrOpt('otel_exporter_otlp_endpoint',
+               default='http://localhost:4318',
+               help='OTLP exporter endpoint URL. For HTTP/protobuf '
+                    'protocol, traces are sent to '
+                    '<endpoint>/v1/traces.'),
+    cfg.StrOpt('otlp_protocol',
+               default='http/protobuf',
+               choices=[('http/protobuf', 'OTLP over HTTP with '
+                         'Protocol Buffers'),
+                        ('grpc', 'OTLP over gRPC')],
+               help='OTLP transport protocol.'),
+    cfg.BoolOpt('insecure', default=False,
+                help='Disable TLS verification for the OTLP '
+                     'endpoint. Only relevant when using the '
+                     'gRPC protocol.'),
+]
+cfg.CONF.register_opts(oslo_messaging_tracing,
+                       group='oslo_messaging_tracing')
+
+
+_TRACER = None
+
+
+def _create_exporter(conf):
+    """Create the OTLP span exporter based on configuration.
+
+    The protocol-specific exporter package is imported here rather
+    than at module level so that tracing-http and tracing-grpc extras
+    are fully independent.
+    """
+    protocol = conf.oslo_messaging_tracing.otlp_protocol
+    endpoint = conf.oslo_messaging_tracing.otel_exporter_otlp_endpoint
+    insecure = conf.oslo_messaging_tracing.insecure
+
+    match protocol:
+        case 'http/protobuf':
+            try:
+                import opentelemetry.exporter.otlp.proto.http \
+                    as otel_http
+            except ImportError:
+                raise RuntimeError(
+                    'OTLP HTTP exporter is not installed. '
+                    'Install it with: '
+                    'pip install oslo.messaging[tracing-http]'
+                )
+
+            return otel_http.trace_exporter.OTLPSpanExporter(
+                endpoint=endpoint + '/v1/traces',
+            )
+        case 'grpc':
+            try:
+                import opentelemetry.exporter.otlp.proto.grpc \
+                    as otel_grpc
+            except ImportError:
+                raise RuntimeError(
+                    'OTLP gRPC exporter is not installed. '
+                    'Install it with: '
+                    'pip install oslo.messaging[tracing-grpc]'
+                )
+
+            return otel_grpc.trace_exporter.OTLPSpanExporter(
+                endpoint=endpoint,
+                insecure=insecure,
+            )
+        case _:
+            raise RuntimeError(
+                f'invalid protocol: {protocol}'
+            )
+
+
+def _get_tracer(conf):
+    global _TRACER
+    if _TRACER is not None:
+        return _TRACER
+
+    from opentelemetry import trace as otel_trace
+
+    provider = otel_trace.get_tracer_provider()
+
+    # If a TracerProvider was already configured (e.g. by
+    # oslo.middleware's WSGI tracing), reuse it. Otherwise
+    # set up our own provider with the configured exporter.
+    if isinstance(provider,
+                  otel_trace.ProxyTracerProvider):
+        from opentelemetry.sdk import resources as otel_resources
+        from opentelemetry.sdk import trace as otel_sdk_trace
+        from opentelemetry.sdk.trace import export as otel_export
+
+        resource = otel_resources.Resource.create({
+            "service.name":
+                conf.oslo_messaging_tracing.tracing_service_name,
+        })
+        provider = otel_sdk_trace.TracerProvider(
+            resource=resource)
+        exporter = _create_exporter(conf)
+        provider.add_span_processor(
+            otel_export.BatchSpanProcessor(exporter))
+        otel_trace.set_tracer_provider(provider)
+
+    _TRACER = otel_trace.get_tracer("oslo.messaging")
+    return _TRACER
+
+
[email protected]
+def trace_send(conf, target, method, call_type, msg_ctxt):
+    if not conf.oslo_messaging_tracing.tracing_enabled:
+        yield
+        return
+
+    try:
+        tracer = _get_tracer(conf)
+
+        from opentelemetry import propagate as otel_propagate
+        from opentelemetry import trace as otel_trace
+    except Exception:
+        LOG.warning("Failed to set up tracing for send, skipping",
+                    exc_info=True)
+        yield
+        return
+
+    with tracer.start_as_current_span(
+        f"{target.topic}.{method}",
+        kind=otel_trace.SpanKind.PRODUCER,
+    ) as span:
+        span.set_attribute("messaging.system", "rabbitmq")
+        span.set_attribute("messaging.operation", call_type)
+        span.set_attribute("messaging.destination.name",
+                           target.topic)
+        span.set_attribute("rpc.method", method)
+        if target.namespace:
+            span.set_attribute("rpc.service",
+                               target.namespace)
+        if msg_ctxt.get("request_id"):
+            span.set_attribute("openstack.request_id",
+                               msg_ctxt["request_id"])
+
+        otel_propagate.inject(msg_ctxt)
+
+        try:
+            yield
+        except Exception as ex:
+            span.set_status(otel_trace.StatusCode.ERROR,
+                            str(ex))
+            span.record_exception(ex)
+            raise
+
+
[email protected]
+def trace_receive(conf, message):
+    if not conf.oslo_messaging_tracing.tracing_enabled:
+        yield
+        return
+
+    try:
+        tracer = _get_tracer(conf)
+
+        from opentelemetry import propagate as otel_propagate
+        from opentelemetry import trace as otel_trace
+
+        ctxt = message.ctxt
+        method = message.message.get('method', 'unknown')
+
+        parent_ctx = otel_propagate.extract(ctxt)
+    except Exception:
+        LOG.warning("Failed to set up tracing for receive, skipping",
+                    exc_info=True)
+        yield
+        return
+
+    with tracer.start_as_current_span(
+        f"{method} receive",
+        context=parent_ctx,
+        kind=otel_trace.SpanKind.CONSUMER,
+    ) as span:
+        span.set_attribute("messaging.system", "rabbitmq")
+        span.set_attribute("messaging.operation", "receive")
+        span.set_attribute("rpc.method", method)
+        if message.msg_id:
+            span.set_attribute("messaging.message.id",
+                               message.msg_id)
+        if ctxt.get("request_id"):
+            span.set_attribute("openstack.request_id",
+                               ctxt["request_id"])
+
+        try:
+            yield
+        except Exception as ex:
+            span.set_status(otel_trace.StatusCode.ERROR,
+                            str(ex))
+            span.record_exception(ex)
+            raise
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_messaging-18.2.0/oslo_messaging/conffixture.py 
new/oslo_messaging-18.3.0/oslo_messaging/conffixture.py
--- old/oslo_messaging-18.2.0/oslo_messaging/conffixture.py     2026-07-10 
15:49:08.000000000 +0200
+++ new/oslo_messaging-18.3.0/oslo_messaging/conffixture.py     2026-08-24 
15:59:42.974970300 +0200
@@ -64,6 +64,10 @@
                      'oslo_messaging._metrics.client',
                      'oslo_messaging_metrics',
                      'oslo_messaging_metrics')
+        _import_opts(self.conf,
+                     'oslo_messaging._tracing.client',
+                     'oslo_messaging_tracing',
+                     'oslo_messaging_tracing')
 
         if transport_url is not None:
             self.transport_url = transport_url
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_messaging-18.2.0/oslo_messaging/rpc/client.py 
new/oslo_messaging-18.3.0/oslo_messaging/rpc/client.py
--- old/oslo_messaging-18.2.0/oslo_messaging/rpc/client.py      2026-07-10 
15:49:08.000000000 +0200
+++ new/oslo_messaging-18.3.0/oslo_messaging/rpc/client.py      2026-08-24 
15:59:42.983945600 +0200
@@ -22,6 +22,7 @@
 
 from oslo_messaging._drivers import base as driver_base
 from oslo_messaging import _metrics as metrics
+from oslo_messaging import _tracing as tracing
 from oslo_messaging import _utils as utils
 from oslo_messaging import exceptions
 from oslo_messaging import serializer as msg_serializer
@@ -148,12 +149,19 @@
 
         self._check_version_cap(msg.get('version'))
 
-        with metrics.measure_metrics(self.conf, target=self.target,
-                                     method=method, call_type="cast"):
+        with tracing.trace_send(
+            self.conf, target=self.target,
+            method=method, call_type="cast",
+            msg_ctxt=msg_ctxt,
+        ), metrics.measure_metrics(
+            self.conf, target=self.target,
+            method=method, call_type="cast",
+        ):
             try:
-                self.transport._send(self.target, msg_ctxt, msg,
-                                     retry=self.retry,
-                                     transport_options=self.transport_options)
+                self.transport._send(
+                    self.target, msg_ctxt, msg,
+                    retry=self.retry,
+                    transport_options=self.transport_options)
             except driver_base.TransportDriverError as ex:
                 raise ClientSendError(self.target, ex)
 
@@ -174,17 +182,27 @@
 
         self._check_version_cap(msg.get('version'))
 
-        with metrics.measure_metrics(self.conf, target=self.target,
-                                     method=method, call_type="call"):
+        with tracing.trace_send(
+            self.conf, target=self.target,
+            method=method, call_type="call",
+            msg_ctxt=msg_ctxt,
+        ), metrics.measure_metrics(
+            self.conf, target=self.target,
+            method=method, call_type="call",
+        ):
             try:
                 result = self.transport._send(
-                    self.target, msg_ctxt, msg, wait_for_reply=True,
-                    timeout=timeout, call_monitor_timeout=cm_timeout,
-                    retry=self.retry, transport_options=self.transport_options)
+                    self.target, msg_ctxt, msg,
+                    wait_for_reply=True,
+                    timeout=timeout,
+                    call_monitor_timeout=cm_timeout,
+                    retry=self.retry,
+                    transport_options=self.transport_options)
             except driver_base.TransportDriverError as ex:
                 raise ClientSendError(self.target, ex)
 
-            return self.serializer.deserialize_entity(ctxt, result)
+            return self.serializer.deserialize_entity(
+                ctxt, result)
 
     @abc.abstractmethod
     def prepare(self, exchange=_marker, topic=_marker, namespace=_marker,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_messaging-18.2.0/oslo_messaging/rpc/server.py 
new/oslo_messaging-18.3.0/oslo_messaging/rpc/server.py
--- old/oslo_messaging-18.2.0/oslo_messaging/rpc/server.py      2026-07-10 
15:49:08.000000000 +0200
+++ new/oslo_messaging-18.3.0/oslo_messaging/rpc/server.py      2026-08-24 
15:59:42.984942700 +0200
@@ -126,6 +126,7 @@
 import time
 
 import debtcollector
+from oslo_messaging import _tracing as tracing
 from oslo_messaging import exceptions
 from oslo_messaging.rpc import dispatcher as rpc_dispatcher
 from oslo_messaging import server as msg_server
@@ -169,54 +170,58 @@
             LOG.exception("Can not acknowledge message. Skip processing")
             return
 
-        failure = None
-        try:
-            res = self.dispatcher.dispatch(message)
-        except rpc_dispatcher.ExpectedException as e:
-            # current sys.exc_info() content can be overridden
-            # by another exception raised by a log handler during
-            # LOG.debug(). So keep a copy and delete it later.
-            failure = e.exc_info
-            LOG.debug('Expected exception during message handling (%s)', e)
-        except rpc_dispatcher.NoSuchMethod as e:
-            failure = sys.exc_info()
-            if e.method.endswith('_ignore_errors'):
-                LOG.debug('Method %s not found', e.method)
-            else:
+        with tracing.trace_receive(self.conf, message):
+            failure = None
+            try:
+                res = self.dispatcher.dispatch(message)
+            except rpc_dispatcher.ExpectedException as e:
+                # current sys.exc_info() content can be overridden
+                # by another exception raised by a log handler during
+                # LOG.debug(). So keep a copy and delete it later.
+                failure = e.exc_info
+                LOG.debug('Expected exception during message handling (%s)',
+                          e)
+            except rpc_dispatcher.NoSuchMethod as e:
+                failure = sys.exc_info()
+                if e.method.endswith('_ignore_errors'):
+                    LOG.debug('Method %s not found', e.method)
+                else:
+                    LOG.exception('Exception during message handling')
+            except Exception:
+                failure = sys.exc_info()
                 LOG.exception('Exception during message handling')
-        except Exception:
-            failure = sys.exc_info()
-            LOG.exception('Exception during message handling')
 
-        try:
-            if failure is None:
-                message.reply(res)
-                LOG.debug("Replied success message with id %(msg_id)s and "
-                          "method: %(method)s. Time elapsed: %(elapsed).3f",
-                          {"msg_id": message.msg_id,
-                           "method": rpc_method,
-                           "elapsed": (time.time() - start)})
-            else:
-                message.reply(failure=failure)
-                LOG.debug("Replied failure for incoming message with "
-                          "id %(msg_id)s and method: %(method)s. "
-                          "Time elapsed: %(elapsed).3f",
-                          {"msg_id": message.msg_id,
-                           "method": rpc_method,
-                           "elapsed": (time.time() - start)})
-        except exceptions.MessageUndeliverable as e:
-            LOG.exception(
-                "MessageUndeliverable error, "
-                "source exception: %s, routing_key: %s, exchange: %s: ",
-                e.exception, e.routing_key, e.exchange
-            )
-        except Exception:
-            LOG.exception("Can not send reply for message")
-        finally:
-            # NOTE(dhellmann): Remove circular object reference
-            # between the current stack frame and the traceback in
-            # exc_info.
-            del failure
+            try:
+                if failure is None:
+                    message.reply(res)
+                    LOG.debug(
+                        "Replied success message with id %(msg_id)s and "
+                        "method: %(method)s. Time elapsed: %(elapsed).3f",
+                        {"msg_id": message.msg_id,
+                         "method": rpc_method,
+                         "elapsed": (time.time() - start)})
+                else:
+                    message.reply(failure=failure)
+                    LOG.debug(
+                        "Replied failure for incoming message with "
+                        "id %(msg_id)s and method: %(method)s. "
+                        "Time elapsed: %(elapsed).3f",
+                        {"msg_id": message.msg_id,
+                         "method": rpc_method,
+                         "elapsed": (time.time() - start)})
+            except exceptions.MessageUndeliverable as e:
+                LOG.exception(
+                    "MessageUndeliverable error, "
+                    "source exception: %s, routing_key: %s, exchange: %s: ",
+                    e.exception, e.routing_key, e.exchange
+                )
+            except Exception:
+                LOG.exception("Can not send reply for message")
+            finally:
+                # NOTE(dhellmann): Remove circular object reference
+                # between the current stack frame and the traceback in
+                # exc_info.
+                del failure
 
 
 @debtcollector.removals.removed_kwarg(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/oslo_messaging-18.2.0/pyproject.toml 
new/oslo_messaging-18.3.0/pyproject.toml
--- old/oslo_messaging-18.2.0/pyproject.toml    2026-07-10 15:49:08.000000000 
+0200
+++ new/oslo_messaging-18.3.0/pyproject.toml    2026-08-24 15:59:43.014864700 
+0200
@@ -38,6 +38,14 @@
 kafka = [
     "confluent-kafka>=1.3.0", # Apache-2.0
 ]
+tracing-http = [
+    "opentelemetry-sdk>=1.0.0",
+    "opentelemetry-exporter-otlp-proto-http>=1.0.0",
+]
+tracing-grpc = [
+    "opentelemetry-sdk>=1.0.0",
+    "opentelemetry-exporter-otlp-proto-grpc>=1.0.0",
+]
 
 [project.scripts]
 oslo-messaging-send-notification = 
"oslo_messaging.notify.notifier:_send_notification"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/oslo_messaging-18.2.0/releasenotes/notes/add-opentelemetry-tracing-support.yaml
 
new/oslo_messaging-18.3.0/releasenotes/notes/add-opentelemetry-tracing-support.yaml
--- 
old/oslo_messaging-18.2.0/releasenotes/notes/add-opentelemetry-tracing-support.yaml
 1970-01-01 01:00:00.000000000 +0100
+++ 
new/oslo_messaging-18.3.0/releasenotes/notes/add-opentelemetry-tracing-support.yaml
 2026-08-24 15:59:43.014864700 +0200
@@ -0,0 +1,22 @@
+---
+features:
+  - |
+    Added OpenTelemetry distributed tracing support for RPC calls. When
+    enabled, producer spans are created for call() and cast() on the client
+    side, and consumer spans are created on the server side during message
+    dispatch. Trace context is propagated across services via the W3C
+    traceparent header carried inside the message context, allowing full
+    end-to-end trace correlation from HTTP request through RabbitMQ to the
+    RPC backend. The feature is disabled by default and can be enabled with::
+
+      [oslo_messaging_tracing]
+      tracing_enabled = true
+      tracing_service_name = nova
+      otel_exporter_otlp_endpoint = http://localhost:4318
+      otlp_protocol = http/protobuf
+
+    The OTLP transport protocol can be set to ``http/protobuf`` (default)
+    or ``grpc``. The corresponding exporter package must be installed::
+
+      pip install oslo.messaging[tracing-http]   # for HTTP/protobuf
+      pip install oslo.messaging[tracing-grpc]   # for gRPC

Reply via email to