Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package
python-opentelemetry-exporter-otlp-proto-http for openSUSE:Factory checked in
at 2026-03-30 18:30:47
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing
/work/SRC/openSUSE:Factory/python-opentelemetry-exporter-otlp-proto-http (Old)
and
/work/SRC/openSUSE:Factory/.python-opentelemetry-exporter-otlp-proto-http.new.1999
(New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-opentelemetry-exporter-otlp-proto-http"
Mon Mar 30 18:30:47 2026 rev:12 rq:1343484 version:1.40.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-opentelemetry-exporter-otlp-proto-http/python-opentelemetry-exporter-otlp-proto-http.changes
2026-01-06 17:43:52.903901380 +0100
+++
/work/SRC/openSUSE:Factory/.python-opentelemetry-exporter-otlp-proto-http.new.1999/python-opentelemetry-exporter-otlp-proto-http.changes
2026-03-30 18:33:48.721361219 +0200
@@ -1,0 +2,11 @@
+Mon Mar 23 22:00:05 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 1.40.0:
+ * Add support for Python 3.14.
+ * Improve error handling and retry logic for connection errors in
+ OTLP/HTTP exporters (logs, metrics, and traces).
+ * Catch RequestException during export and handle ConnectionError
+ as a retryable transient failure.
+ * Update internal OpenTelemetry dependencies to 1.40.0.
+
+-------------------------------------------------------------------
Old:
----
opentelemetry_exporter_otlp_proto_http-1.39.1.tar.gz
New:
----
opentelemetry_exporter_otlp_proto_http-1.40.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-opentelemetry-exporter-otlp-proto-http.spec ++++++
--- /var/tmp/diff_new_pack.NvPjHP/_old 2026-03-30 18:33:49.437391154 +0200
+++ /var/tmp/diff_new_pack.NvPjHP/_new 2026-03-30 18:33:49.445391489 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-opentelemetry-exporter-otlp-proto-http
#
-# Copyright (c) 2025 SUSE LLC and contributors
+# Copyright (c) 2026 SUSE LLC and contributors
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
Name: python-opentelemetry-exporter-otlp-proto-http
-Version: 1.39.1
+Version: 1.40.0
Release: 0
Summary: OpenTelemetry Collector Protobuf over HTTP Exporter
License: Apache-2.0
@@ -33,7 +33,7 @@
BuildRequires: %{python_module opentelemetry-exporter-otlp-proto-common =
%{version}}
BuildRequires: %{python_module opentelemetry-proto = %{version}}
BuildRequires: %{python_module opentelemetry-sdk >= 1.23.0}
-BuildRequires: %{python_module opentelemetry-test-utils = 0.60b0}
+BuildRequires: %{python_module opentelemetry-test-utils = 0.61b0}
BuildRequires: %{python_module pytest}
BuildRequires: %{python_module requests >= 2.7}
BuildRequires: %{python_module responses >= 0.22.0}
++++++ opentelemetry_exporter_otlp_proto_http-1.39.1.tar.gz ->
opentelemetry_exporter_otlp_proto_http-1.40.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_exporter_otlp_proto_http-1.39.1/PKG-INFO
new/opentelemetry_exporter_otlp_proto_http-1.40.0/PKG-INFO
--- old/opentelemetry_exporter_otlp_proto_http-1.39.1/PKG-INFO 2020-02-02
01:00:00.000000000 +0100
+++ new/opentelemetry_exporter_otlp_proto_http-1.40.0/PKG-INFO 2020-02-02
01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: opentelemetry-exporter-otlp-proto-http
-Version: 1.39.1
+Version: 1.40.0
Summary: OpenTelemetry Collector Protobuf over HTTP Exporter
Project-URL: Homepage,
https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-http
Project-URL: Repository, https://github.com/open-telemetry/opentelemetry-python
@@ -18,12 +18,13 @@
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.9
Requires-Dist: googleapis-common-protos~=1.52
Requires-Dist: opentelemetry-api~=1.15
-Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.39.1
-Requires-Dist: opentelemetry-proto==1.39.1
-Requires-Dist: opentelemetry-sdk~=1.39.1
+Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.40.0
+Requires-Dist: opentelemetry-proto==1.40.0
+Requires-Dist: opentelemetry-sdk~=1.40.0
Requires-Dist: requests~=2.7
Requires-Dist: typing-extensions>=4.5.0
Provides-Extra: gcp-auth
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_exporter_otlp_proto_http-1.39.1/pyproject.toml
new/opentelemetry_exporter_otlp_proto_http-1.40.0/pyproject.toml
--- old/opentelemetry_exporter_otlp_proto_http-1.39.1/pyproject.toml
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_exporter_otlp_proto_http-1.40.0/pyproject.toml
2020-02-02 01:00:00.000000000 +0100
@@ -24,13 +24,14 @@
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
]
dependencies = [
"googleapis-common-protos ~= 1.52",
"opentelemetry-api ~= 1.15",
- "opentelemetry-proto == 1.39.1",
- "opentelemetry-sdk ~= 1.39.1",
- "opentelemetry-exporter-otlp-proto-common == 1.39.1",
+ "opentelemetry-proto == 1.40.0",
+ "opentelemetry-sdk ~= 1.40.0",
+ "opentelemetry-exporter-otlp-proto-common == 1.40.0",
"requests ~= 2.7",
"typing-extensions >= 4.5.0",
]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_exporter_otlp_proto_http-1.39.1/src/opentelemetry/exporter/otlp/proto/http/__init__.py
new/opentelemetry_exporter_otlp_proto_http-1.40.0/src/opentelemetry/exporter/otlp/proto/http/__init__.py
---
old/opentelemetry_exporter_otlp_proto_http-1.39.1/src/opentelemetry/exporter/otlp/proto/http/__init__.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_exporter_otlp_proto_http-1.40.0/src/opentelemetry/exporter/otlp/proto/http/__init__.py
2020-02-02 01:00:00.000000000 +0100
@@ -50,7 +50,7 @@
# Resource can be required for some backends, e.g. Jaeger
# If resource wouldn't be set - traces wouldn't appears in Jaeger
- resource = Resource(attributes={
+ resource = Resource.create({
"service.name": "service"
})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_exporter_otlp_proto_http-1.39.1/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py
new/opentelemetry_exporter_otlp_proto_http-1.40.0/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py
---
old/opentelemetry_exporter_otlp_proto_http-1.39.1/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_exporter_otlp_proto_http-1.40.0/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py
2020-02-02 01:00:00.000000000 +0100
@@ -186,26 +186,42 @@
serialized_data = encode_logs(batch).SerializeToString()
deadline_sec = time() + self._timeout
for retry_num in range(_MAX_RETRYS):
- resp = self._export(serialized_data, deadline_sec - time())
- if resp.ok:
- return LogRecordExportResult.SUCCESS
# multiplying by a random number between .8 and 1.2 introduces a
+/20% jitter to each backoff.
backoff_seconds = 2**retry_num * random.uniform(0.8, 1.2)
+ try:
+ resp = self._export(serialized_data, deadline_sec - time())
+ if resp.ok:
+ return LogRecordExportResult.SUCCESS
+ except requests.exceptions.RequestException as error:
+ reason = error
+ retryable = isinstance(error, ConnectionError)
+ status_code = None
+ else:
+ reason = resp.reason
+ retryable = _is_retryable(resp)
+ status_code = resp.status_code
+
+ if not retryable:
+ _logger.error(
+ "Failed to export logs batch code: %s, reason: %s",
+ status_code,
+ reason,
+ )
+ return LogRecordExportResult.FAILURE
+
if (
- not _is_retryable(resp)
- or retry_num + 1 == _MAX_RETRYS
+ retry_num + 1 == _MAX_RETRYS
or backoff_seconds > (deadline_sec - time())
or self._shutdown
):
_logger.error(
- "Failed to export logs batch code: %s, reason: %s",
- resp.status_code,
- resp.text,
+ "Failed to export logs batch due to timeout, "
+ "max retries or shutdown."
)
return LogRecordExportResult.FAILURE
_logger.warning(
"Transient error %s encountered while exporting logs batch,
retrying in %.2fs.",
- resp.reason,
+ reason,
backoff_seconds,
)
shutdown = self._shutdown_is_occuring.wait(backoff_seconds)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_exporter_otlp_proto_http-1.39.1/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py
new/opentelemetry_exporter_otlp_proto_http-1.40.0/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py
---
old/opentelemetry_exporter_otlp_proto_http-1.39.1/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_exporter_otlp_proto_http-1.40.0/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py
2020-02-02 01:00:00.000000000 +0100
@@ -231,26 +231,41 @@
serialized_data = encode_metrics(metrics_data).SerializeToString()
deadline_sec = time() + self._timeout
for retry_num in range(_MAX_RETRYS):
- resp = self._export(serialized_data, deadline_sec - time())
- if resp.ok:
- return MetricExportResult.SUCCESS
# multiplying by a random number between .8 and 1.2 introduces a
+/20% jitter to each backoff.
backoff_seconds = 2**retry_num * random.uniform(0.8, 1.2)
+ try:
+ resp = self._export(serialized_data, deadline_sec - time())
+ if resp.ok:
+ return MetricExportResult.SUCCESS
+ except requests.exceptions.RequestException as error:
+ reason = error
+ retryable = isinstance(error, ConnectionError)
+ status_code = None
+ else:
+ reason = resp.reason
+ retryable = _is_retryable(resp)
+ status_code = resp.status_code
+
+ if not retryable:
+ _logger.error(
+ "Failed to export metrics batch code: %s, reason: %s",
+ status_code,
+ reason,
+ )
+ return MetricExportResult.FAILURE
if (
- not _is_retryable(resp)
- or retry_num + 1 == _MAX_RETRYS
+ retry_num + 1 == _MAX_RETRYS
or backoff_seconds > (deadline_sec - time())
or self._shutdown
):
_logger.error(
- "Failed to export metrics batch code: %s, reason: %s",
- resp.status_code,
- resp.text,
+ "Failed to export metrics batch due to timeout, "
+ "max retries or shutdown."
)
return MetricExportResult.FAILURE
_logger.warning(
"Transient error %s encountered while exporting metrics batch,
retrying in %.2fs.",
- resp.reason,
+ reason,
backoff_seconds,
)
shutdown = self._shutdown_in_progress.wait(backoff_seconds)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_exporter_otlp_proto_http-1.39.1/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py
new/opentelemetry_exporter_otlp_proto_http-1.40.0/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py
---
old/opentelemetry_exporter_otlp_proto_http-1.39.1/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_exporter_otlp_proto_http-1.40.0/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py
2020-02-02 01:00:00.000000000 +0100
@@ -179,26 +179,42 @@
serialized_data = encode_spans(spans).SerializePartialToString()
deadline_sec = time() + self._timeout
for retry_num in range(_MAX_RETRYS):
- resp = self._export(serialized_data, deadline_sec - time())
- if resp.ok:
- return SpanExportResult.SUCCESS
# multiplying by a random number between .8 and 1.2 introduces a
+/20% jitter to each backoff.
backoff_seconds = 2**retry_num * random.uniform(0.8, 1.2)
+ try:
+ resp = self._export(serialized_data, deadline_sec - time())
+ if resp.ok:
+ return SpanExportResult.SUCCESS
+ except requests.exceptions.RequestException as error:
+ reason = error
+ retryable = isinstance(error, ConnectionError)
+ status_code = None
+ else:
+ reason = resp.reason
+ retryable = _is_retryable(resp)
+ status_code = resp.status_code
+
+ if not retryable:
+ _logger.error(
+ "Failed to export span batch code: %s, reason: %s",
+ status_code,
+ reason,
+ )
+ return SpanExportResult.FAILURE
+
if (
- not _is_retryable(resp)
- or retry_num + 1 == _MAX_RETRYS
+ retry_num + 1 == _MAX_RETRYS
or backoff_seconds > (deadline_sec - time())
or self._shutdown
):
_logger.error(
- "Failed to export span batch code: %s, reason: %s",
- resp.status_code,
- resp.text,
+ "Failed to export span batch due to timeout, "
+ "max retries or shutdown."
)
return SpanExportResult.FAILURE
_logger.warning(
"Transient error %s encountered while exporting span batch,
retrying in %.2fs.",
- resp.reason,
+ reason,
backoff_seconds,
)
shutdown = self._shutdown_in_progress.wait(backoff_seconds)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_exporter_otlp_proto_http-1.39.1/src/opentelemetry/exporter/otlp/proto/http/version/__init__.py
new/opentelemetry_exporter_otlp_proto_http-1.40.0/src/opentelemetry/exporter/otlp/proto/http/version/__init__.py
---
old/opentelemetry_exporter_otlp_proto_http-1.39.1/src/opentelemetry/exporter/otlp/proto/http/version/__init__.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_exporter_otlp_proto_http-1.40.0/src/opentelemetry/exporter/otlp/proto/http/version/__init__.py
2020-02-02 01:00:00.000000000 +0100
@@ -12,4 +12,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-__version__ = "1.39.1"
+__version__ = "1.40.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_exporter_otlp_proto_http-1.39.1/tests/metrics/test_otlp_metrics_exporter.py
new/opentelemetry_exporter_otlp_proto_http-1.40.0/tests/metrics/test_otlp_metrics_exporter.py
---
old/opentelemetry_exporter_otlp_proto_http-1.39.1/tests/metrics/test_otlp_metrics_exporter.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_exporter_otlp_proto_http-1.40.0/tests/metrics/test_otlp_metrics_exporter.py
2020-02-02 01:00:00.000000000 +0100
@@ -19,7 +19,9 @@
from unittest import TestCase
from unittest.mock import ANY, MagicMock, Mock, patch
+import requests
from requests import Session
+from requests.exceptions import ConnectionError
from requests.models import Response
from opentelemetry.exporter.otlp.proto.common.metrics_encoder import (
@@ -555,6 +557,40 @@
warning.records[0].message,
)
+ @patch.object(Session, "post")
+ def test_export_no_collector_available_retryable(self, mock_post):
+ exporter = OTLPMetricExporter(timeout=1.5)
+ msg = "Server not available."
+ mock_post.side_effect = ConnectionError(msg)
+ with self.assertLogs(level=WARNING) as warning:
+ self.assertEqual(
+ exporter.export(self.metrics["sum_int"]),
+ MetricExportResult.FAILURE,
+ )
+ # Check for greater 2 because the request is on each retry
+ # done twice at the moment.
+ self.assertGreater(mock_post.call_count, 2)
+ self.assertIn(
+ f"Transient error {msg} encountered while exporting metrics
batch, retrying in",
+ warning.records[0].message,
+ )
+
+ @patch.object(Session, "post")
+ def test_export_no_collector_available(self, mock_post):
+ exporter = OTLPMetricExporter(timeout=1.5)
+
+ mock_post.side_effect = requests.exceptions.RequestException()
+ with self.assertLogs(level=WARNING) as warning:
+ self.assertEqual(
+ exporter.export(self.metrics["sum_int"]),
+ MetricExportResult.FAILURE,
+ )
+ self.assertEqual(mock_post.call_count, 1)
+ self.assertIn(
+ "Failed to export metrics batch code",
+ warning.records[0].message,
+ )
+
@patch.object(Session, "post")
def test_timeout_set_correctly(self, mock_post):
resp = Response()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_exporter_otlp_proto_http-1.39.1/tests/test_proto_log_exporter.py
new/opentelemetry_exporter_otlp_proto_http-1.40.0/tests/test_proto_log_exporter.py
---
old/opentelemetry_exporter_otlp_proto_http-1.39.1/tests/test_proto_log_exporter.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_exporter_otlp_proto_http-1.40.0/tests/test_proto_log_exporter.py
2020-02-02 01:00:00.000000000 +0100
@@ -24,6 +24,7 @@
import requests
from google.protobuf.json_format import MessageToDict
from requests import Session
+from requests.exceptions import ConnectionError
from requests.models import Response
from opentelemetry._logs import LogRecord, SeverityNumber
@@ -483,6 +484,40 @@
warning.records[0].message,
)
+ @patch.object(Session, "post")
+ def test_export_no_collector_available_retryable(self, mock_post):
+ exporter = OTLPLogExporter(timeout=1.5)
+ msg = "Server not available."
+ mock_post.side_effect = ConnectionError(msg)
+ with self.assertLogs(level=WARNING) as warning:
+ self.assertEqual(
+ exporter.export(self._get_sdk_log_data()),
+ LogRecordExportResult.FAILURE,
+ )
+ # Check for greater 2 because the request is on each retry
+ # done twice at the moment.
+ self.assertGreater(mock_post.call_count, 2)
+ self.assertIn(
+ f"Transient error {msg} encountered while exporting logs
batch, retrying in",
+ warning.records[0].message,
+ )
+
+ @patch.object(Session, "post")
+ def test_export_no_collector_available(self, mock_post):
+ exporter = OTLPLogExporter(timeout=1.5)
+
+ mock_post.side_effect = requests.exceptions.RequestException()
+ with self.assertLogs(level=WARNING) as warning:
+ self.assertEqual(
+ exporter.export(self._get_sdk_log_data()),
+ LogRecordExportResult.FAILURE,
+ )
+ self.assertEqual(mock_post.call_count, 1)
+ self.assertIn(
+ "Failed to export logs batch code",
+ warning.records[0].message,
+ )
+
@patch.object(Session, "post")
def test_timeout_set_correctly(self, mock_post):
resp = Response()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_exporter_otlp_proto_http-1.39.1/tests/test_proto_span_exporter.py
new/opentelemetry_exporter_otlp_proto_http-1.40.0/tests/test_proto_span_exporter.py
---
old/opentelemetry_exporter_otlp_proto_http-1.39.1/tests/test_proto_span_exporter.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_exporter_otlp_proto_http-1.40.0/tests/test_proto_span_exporter.py
2020-02-02 01:00:00.000000000 +0100
@@ -20,6 +20,7 @@
import requests
from requests import Session
+from requests.exceptions import ConnectionError
from requests.models import Response
from opentelemetry.exporter.otlp.proto.http import Compression
@@ -303,6 +304,40 @@
warning.records[0].message,
)
+ @patch.object(Session, "post")
+ def test_export_no_collector_available_retryable(self, mock_post):
+ exporter = OTLPSpanExporter(timeout=1.5)
+ msg = "Server not available."
+ mock_post.side_effect = ConnectionError(msg)
+ with self.assertLogs(level=WARNING) as warning:
+ self.assertEqual(
+ exporter.export([BASIC_SPAN]),
+ SpanExportResult.FAILURE,
+ )
+ # Check for greater 2 because the request is on each retry
+ # done twice at the moment.
+ self.assertGreater(mock_post.call_count, 2)
+ self.assertIn(
+ f"Transient error {msg} encountered while exporting span
batch, retrying in",
+ warning.records[0].message,
+ )
+
+ @patch.object(Session, "post")
+ def test_export_no_collector_available(self, mock_post):
+ exporter = OTLPSpanExporter(timeout=1.5)
+
+ mock_post.side_effect = requests.exceptions.RequestException()
+ with self.assertLogs(level=WARNING) as warning:
+ self.assertEqual(
+ exporter.export([BASIC_SPAN]),
+ SpanExportResult.FAILURE,
+ )
+ self.assertEqual(mock_post.call_count, 1)
+ self.assertIn(
+ "Failed to export span batch code",
+ warning.records[0].message,
+ )
+
@patch.object(Session, "post")
def test_timeout_set_correctly(self, mock_post):
resp = Response()