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