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."""
 

Reply via email to