Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package
python-opentelemetry-instrumentation-asgi for openSUSE:Factory checked in at
2026-01-06 17:43:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-opentelemetry-instrumentation-asgi
(Old)
and
/work/SRC/openSUSE:Factory/.python-opentelemetry-instrumentation-asgi.new.1928
(New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-opentelemetry-instrumentation-asgi"
Tue Jan 6 17:43:01 2026 rev:7 rq:1325571 version:0.60b0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-opentelemetry-instrumentation-asgi/python-opentelemetry-instrumentation-asgi.changes
2025-11-21 16:56:47.530648091 +0100
+++
/work/SRC/openSUSE:Factory/.python-opentelemetry-instrumentation-asgi.new.1928/python-opentelemetry-instrumentation-asgi.changes
2026-01-06 17:43:58.896142421 +0100
@@ -1,0 +2,17 @@
+Sun Dec 28 15:17:28 UTC 2025 - Dirk Müller <[email protected]>
+
+- update to 0.60b0:
+ * Silence events API warnings for internal users
+ * `opentelemetry-api`: Convert objects of any type other than
+ AnyValue in attributes to string to be exportable
+ * docs: Added sqlcommenter example
+ * build: bump ruff to 0.14.1
+ * Add `opentelemetry-exporter-credential-provider-gcp` as an
+ optional dependency to `opentelemetry-exporter-otlp-proto-
+ grpc` and `opentelemetry-exporter-otlp-proto-http`
+ * semantic-conventions: Bump to 1.38.0
+ * [BREAKING] Remove LogData and extend SDK LogRecord to have
+ instrumentation scope
+ * [BREAKING] Rename several classes from Log to LogRecord
+
+-------------------------------------------------------------------
Old:
----
opentelemetry_instrumentation_asgi-0.59b0.tar.gz
New:
----
opentelemetry_instrumentation_asgi-0.60b0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-opentelemetry-instrumentation-asgi.spec ++++++
--- /var/tmp/diff_new_pack.qIGA1r/_old 2026-01-06 17:43:59.412163178 +0100
+++ /var/tmp/diff_new_pack.qIGA1r/_new 2026-01-06 17:43:59.416163338 +0100
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-opentelemetry-instrumentation-asgi%{?psuffix}
-Version: 0.59b0
+Version: 0.60b0
Release: 0
Summary: ASGI instrumentation for OpenTelemetry
License: Apache-2.0
++++++ opentelemetry_instrumentation_asgi-0.59b0.tar.gz ->
opentelemetry_instrumentation_asgi-0.60b0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/opentelemetry_instrumentation_asgi-0.59b0/PKG-INFO
new/opentelemetry_instrumentation_asgi-0.60b0/PKG-INFO
--- old/opentelemetry_instrumentation_asgi-0.59b0/PKG-INFO 2020-02-02
01:00:00.000000000 +0100
+++ new/opentelemetry_instrumentation_asgi-0.60b0/PKG-INFO 2020-02-02
01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: opentelemetry-instrumentation-asgi
-Version: 0.59b0
+Version: 0.60b0
Summary: ASGI instrumentation for OpenTelemetry
Project-URL: Homepage,
https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-asgi
Project-URL: Repository,
https://github.com/open-telemetry/opentelemetry-python-contrib
@@ -20,9 +20,9 @@
Requires-Python: >=3.9
Requires-Dist: asgiref~=3.0
Requires-Dist: opentelemetry-api~=1.12
-Requires-Dist: opentelemetry-instrumentation==0.59b0
-Requires-Dist: opentelemetry-semantic-conventions==0.59b0
-Requires-Dist: opentelemetry-util-http==0.59b0
+Requires-Dist: opentelemetry-instrumentation==0.60b0
+Requires-Dist: opentelemetry-semantic-conventions==0.60b0
+Requires-Dist: opentelemetry-util-http==0.60b0
Provides-Extra: instruments
Requires-Dist: asgiref~=3.0; extra == 'instruments'
Description-Content-Type: text/x-rst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_instrumentation_asgi-0.59b0/pyproject.toml
new/opentelemetry_instrumentation_asgi-0.60b0/pyproject.toml
--- old/opentelemetry_instrumentation_asgi-0.59b0/pyproject.toml
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_instrumentation_asgi-0.60b0/pyproject.toml
2020-02-02 01:00:00.000000000 +0100
@@ -27,9 +27,9 @@
dependencies = [
"asgiref ~= 3.0",
"opentelemetry-api ~= 1.12",
- "opentelemetry-instrumentation == 0.59b0",
- "opentelemetry-semantic-conventions == 0.59b0",
- "opentelemetry-util-http == 0.59b0",
+ "opentelemetry-instrumentation == 0.60b0",
+ "opentelemetry-semantic-conventions == 0.60b0",
+ "opentelemetry-util-http == 0.60b0",
]
[project.optional-dependencies]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_instrumentation_asgi-0.59b0/src/opentelemetry/instrumentation/asgi/__init__.py
new/opentelemetry_instrumentation_asgi-0.60b0/src/opentelemetry/instrumentation/asgi/__init__.py
---
old/opentelemetry_instrumentation_asgi-0.59b0/src/opentelemetry/instrumentation/asgi/__init__.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_instrumentation_asgi-0.60b0/src/opentelemetry/instrumentation/asgi/__init__.py
2020-02-02 01:00:00.000000000 +0100
@@ -117,7 +117,7 @@
Capture HTTP request and response headers
*****************************************
You can configure the agent to capture specified HTTP headers as span
attributes, according to the
-`semantic convention
<https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md#http-request-and-response-headers>`_.
+`semantic conventions
<https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#http-server-span>`_.
Request headers
***************
@@ -258,6 +258,9 @@
from opentelemetry.instrumentation.utils import _start_internal_or_server_span
from opentelemetry.metrics import get_meter
from opentelemetry.propagators.textmap import Getter, Setter
+from opentelemetry.semconv._incubating.attributes.user_agent_attributes import
(
+ USER_AGENT_SYNTHETIC_TYPE,
+)
from opentelemetry.semconv._incubating.metrics.http_metrics import (
create_http_server_active_requests,
create_http_server_request_body_size,
@@ -276,6 +279,7 @@
ExcludeList,
SanitizeValue,
_parse_url_query,
+ detect_synthetic_user_agent,
get_custom_headers,
normalise_request_header_name,
normalise_response_header_name,
@@ -397,7 +401,13 @@
)
http_user_agent = asgi_getter.get(scope, "user-agent")
if http_user_agent:
- _set_http_user_agent(result, http_user_agent[0], sem_conv_opt_in_mode)
+ user_agent_value = http_user_agent[0]
+ _set_http_user_agent(result, user_agent_value, sem_conv_opt_in_mode)
+
+ # Check for synthetic user agent type
+ synthetic_type = detect_synthetic_user_agent(user_agent_value)
+ if synthetic_type:
+ result[USER_AGENT_SYNTHETIC_TYPE] = synthetic_type
if "client" in scope and scope["client"] is not None:
_set_http_peer_ip_server(
@@ -422,8 +432,8 @@
"""
Returns custom HTTP request or response headers to be added into SERVER
span as span attributes.
- Refer specifications:
- -
https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md#http-request-and-response-headers
+ Refer to semantic conventions:
+ -
https://github.com/open-telemetry/semantic-conventions/blob/main/docs/http/http-spans.md#http-server-span
"""
headers: DefaultDict[str, list[str]] = defaultdict(list)
raw_headers = scope_or_response_message.get("headers")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_instrumentation_asgi-0.59b0/src/opentelemetry/instrumentation/asgi/version.py
new/opentelemetry_instrumentation_asgi-0.60b0/src/opentelemetry/instrumentation/asgi/version.py
---
old/opentelemetry_instrumentation_asgi-0.59b0/src/opentelemetry/instrumentation/asgi/version.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_instrumentation_asgi-0.60b0/src/opentelemetry/instrumentation/asgi/version.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__ = "0.59b0"
+__version__ = "0.60b0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_instrumentation_asgi-0.59b0/tests/test_asgi_middleware.py
new/opentelemetry_instrumentation_asgi-0.60b0/tests/test_asgi_middleware.py
--- old/opentelemetry_instrumentation_asgi-0.59b0/tests/test_asgi_middleware.py
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_instrumentation_asgi-0.60b0/tests/test_asgi_middleware.py
2020-02-02 01:00:00.000000000 +0100
@@ -42,6 +42,9 @@
HistogramDataPoint,
NumberDataPoint,
)
+from opentelemetry.semconv._incubating.attributes.user_agent_attributes import
(
+ USER_AGENT_SYNTHETIC_TYPE,
+)
from opentelemetry.semconv.attributes.client_attributes import (
CLIENT_ADDRESS,
CLIENT_PORT,
@@ -883,6 +886,145 @@
new_sem_conv=True,
)
+ async def test_user_agent_synthetic_bot_detection(self):
+ """Test that bot user agents are detected as synthetic with type
'bot'"""
+ test_cases = [
+ b"Mozilla/5.0 (compatible; Googlebot/2.1;
+http://www.google.com/bot.html)",
+ b"Mozilla/5.0 (compatible; bingbot/2.0;
+http://www.bing.com/bingbot.htm)",
+ b"googlebot/1.0",
+ b"bingbot/1.0",
+ ]
+
+ # Test each user agent case separately to avoid span accumulation
+ for user_agent in test_cases:
+ with self.subTest(user_agent=user_agent):
+ # Clear headers first
+ self.scope["headers"] = []
+
+ def update_expected_synthetic_bot(
+ expected, ua: bytes = user_agent
+ ):
+ expected[3]["attributes"].update(
+ {
+ SpanAttributes.HTTP_USER_AGENT: ua.decode("utf8"),
+ USER_AGENT_SYNTHETIC_TYPE: "bot",
+ }
+ )
+ return expected
+
+ self.scope["headers"].append([b"user-agent", user_agent])
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
+ self.seed_app(app)
+ await self.send_default_request()
+ outputs = await self.get_all_output()
+ self.validate_outputs(
+ outputs, modifiers=[update_expected_synthetic_bot]
+ )
+
+ # Clear spans after each test case to prevent accumulation
+ self.memory_exporter.clear()
+
+ async def test_user_agent_synthetic_test_detection(self):
+ """Test that test user agents are detected as synthetic with type
'test'"""
+ test_cases = [
+ b"alwayson/1.0",
+ b"AlwaysOn/2.0",
+ b"test-alwayson-client",
+ ]
+
+ # Test each user agent case separately to avoid span accumulation
+ for user_agent in test_cases:
+ with self.subTest(user_agent=user_agent):
+ # Clear headers first
+ self.scope["headers"] = []
+
+ def update_expected_synthetic_test(
+ expected, ua: bytes = user_agent
+ ):
+ expected[3]["attributes"].update(
+ {
+ SpanAttributes.HTTP_USER_AGENT: ua.decode("utf8"),
+ USER_AGENT_SYNTHETIC_TYPE: "test",
+ }
+ )
+ return expected
+
+ self.scope["headers"].append([b"user-agent", user_agent])
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
+ self.seed_app(app)
+ await self.send_default_request()
+ outputs = await self.get_all_output()
+ self.validate_outputs(
+ outputs, modifiers=[update_expected_synthetic_test]
+ )
+
+ # Clear spans after each test case to prevent accumulation
+ self.memory_exporter.clear()
+
+ async def test_user_agent_non_synthetic(self):
+ """Test that normal user agents are not marked as synthetic"""
+ test_cases = [
+ b"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
+ b"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15",
+ b"PostmanRuntime/7.28.4",
+ b"curl/7.68.0",
+ ]
+
+ # Test each user agent case separately to avoid span accumulation
+ for user_agent in test_cases:
+ with self.subTest(user_agent=user_agent):
+ # Clear headers first
+ self.scope["headers"] = []
+
+ def update_expected_non_synthetic(
+ expected, ua: bytes = user_agent
+ ):
+ # Should only have the user agent, not synthetic type
+ expected[3]["attributes"].update(
+ {
+ SpanAttributes.HTTP_USER_AGENT: ua.decode("utf8"),
+ }
+ )
+ return expected
+
+ self.scope["headers"].append([b"user-agent", user_agent])
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
+ self.seed_app(app)
+ await self.send_default_request()
+ outputs = await self.get_all_output()
+ self.validate_outputs(
+ outputs, modifiers=[update_expected_non_synthetic]
+ )
+
+ # Clear spans after each test case to prevent accumulation
+ self.memory_exporter.clear()
+
+ async def test_user_agent_synthetic_new_semconv(self):
+ """Test synthetic user agent detection with new semantic conventions"""
+ user_agent = b"Mozilla/5.0 (compatible; Googlebot/2.1)"
+
+ def update_expected_synthetic_new_semconv(expected):
+ expected[3]["attributes"].update(
+ {
+ USER_AGENT_ORIGINAL: user_agent.decode("utf8"),
+ USER_AGENT_SYNTHETIC_TYPE: "bot",
+ }
+ )
+ return expected
+
+ self.scope["headers"] = []
+ self.scope["headers"].append([b"user-agent", user_agent])
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
+ self.seed_app(app)
+ await self.send_default_request()
+ outputs = await self.get_all_output()
+ self.validate_outputs(
+ outputs,
+ modifiers=[update_expected_synthetic_new_semconv],
+ old_sem_conv=False,
+ new_sem_conv=True,
+ )
+
async def test_traceresponse_header(self):
"""Test a traceresponse header is sent when a global propagator is
set."""