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-09-30 16:23:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-opentelemetry-instrumentation-asgi
(Old)
and
/work/SRC/openSUSE:Factory/.python-opentelemetry-instrumentation-asgi.new.1465845
(New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-opentelemetry-instrumentation-asgi"
Wed Sep 30 16:23:45 2026 rev:13 rq:1381477 version:0.66b0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-opentelemetry-instrumentation-asgi/python-opentelemetry-instrumentation-asgi.changes
2026-07-21 22:58:05.520991963 +0200
+++
/work/SRC/openSUSE:Factory/.python-opentelemetry-instrumentation-asgi.new.1465845/python-opentelemetry-instrumentation-asgi.changes
2026-09-30 16:24:33.147103867 +0200
@@ -1,0 +2,110 @@
+Tue Sep 29 10:21:06 UTC 2026 - Nico Krapp <[email protected]>
+
+- Update to 0.66b0
+ * ### Added
+ * opentelemetry-instrumentation-psycopg2, opentelemetry-
+ instrumentation-psycopg: Add sqlcommenter support for
+ instrument_connection (#4267)
+ * opentelemetry-instrumentation-fastapi: Document
+ auto-instrumentation setup and HTTP/WebSocket trace propagation
+ opentelemetry-instrumentation: Include the instrumentation
+ README in API docs (#4555)
+ * opentelemetry-instrumentation-botocore: capture Bedrock prompt
+ cache token usage for converse and converse_stream API (#4615)
+ * opentelemetry-instrumentation-fastapi: advertise inline type
+ annotations (#4685)
+ * opentelemetry-instrumentation-kafka-python: Update kafka python
+ instrumentation to support kafka-python>=3 (#4786)
+ * opentelemetry-instrumentation-mysql: add semantic convention
+ stability opt-in mode tests (#4810)
+ * opentelemetry-instrumentation-aiopg: Add DB client operation
+ duration and returned rows metrics. (#4826)
+ * opentelemetry-instrumentation-httpx: support strict typing
+ * opentelemetry-instrumentation-mysqlclient: add semantic
+ convention stability opt-in mode tests (#4834)
+ * opentelemetry-instrumentation-pymysql: add semantic convention
+ stability opt-in mode tests (#4835)
+ * opentelemetry-instrumentation-sqlite3: add semantic convention
+ stability opt-in mode tests (#4836)
+ * opentelemetry-instrumentation-psycopg: add semantic convention
+ stability opt-in mode tests (#4838)
+ * infra: add validation for changelog file format (#4856)
+ * opentelemetry-instrumentation-aio-pika: bump maximum admissible
+ aio-pika version to 11.0.0 (#4998)
+ * ### Changed
+ * opentelemetry-instrumentation: clarify dependency conflict
+ messages, in logs and in DependencyConflictError, and promote
+ auto-instrumentation version conflict logs to error level
+ * ### Removed
+ * opentelemetry-instrumentation-kafka-python: drop support for
+ the deprecated kafka-python-ng fork now that kafka-python is
+ actively maintained again (#4839)
+ * opentelemetry-instrumentation-kafka-python: remove unused
+ KafkaPropertiesExtractor.extract_send_key and
+ KafkaPropertiesExtractor.extract_send_value helpers (#4858)
+ * opentelemetry-instrumentation-anthropic, opentelemetry-
+ instrumentation-claude-agent-sdk, opentelemetry-
+ instrumentation-langchain, opentelemetry-instrumentation-
+ weaviate: removed from this repository; these instrumentations
+ now live in and are maintained from the opentelemetry-python-
+ genai repository (#4903)
+ * ### Fixed
+ * opentelemetry-instrumentation-aws-lambda: support ALB
+ multiValueHeaders (#4605)
+ * opentelemetry-instrumentation-redis: extract ClusterPipeline
+ commands from _execution_strategy in redis-py 6+ so pipeline
+ span attributes include the queued commands instead of being
+ empty (#4728)
+ * opentelemetry-instrumentation-aiopg: fix connection metadata
+ for manual instrumentation (#4821)
+ * opentelemetry-instrumentation-redis: treat explicit db=None as
+ database index 0 (#4828)
+ * opentelemetry-instrumentation-aws-lambda: use the correct camel
+ case when accessing the SQS message attributes (#4831)
+ * opentelemetry-instrumentation-botocore: Restore PyPy test
+ coverage. (#4841)
+ * opentelemetry-instrumentation-botocore: don't emit error status
+ on 3xx ClientError responses (#4851)
+ * opentelemetry-instrumentation-kafka-python: record the actual
+ messaging.kafka.partition read back from the producer send()
+ future, instead of a pre-computed estimate that did not match
+ the delivered partition for randomly-partitioned messages
+ * opentelemetry-instrumentation-logging: Promote otel.event.name
+ to LogRecord.event_name in _translate (#4864)
+ * opentelemetry-instrumentation-grpc: respect suppressed
+ instrumentation in server interceptors (#4870)
+ * opentelemetry-instrumentation-logging: Import code_attributes
+ from stable semconv package (#4873)
+ * opentelemetry-instrumentation-asyncio: fix to_thread
+ instrumentation so spans and duration metrics measure the
+ actual function execution instead of ending immediately,
+ repeated calls of the same function are all recorded instead of
+ only the first one, and failures are recorded with the same
+ state values (exception, timeout, cancelled) as the coroutine
+ and future paths; the AsyncioInstrumentor.trace_to_thread
+ method is renamed to AsyncioInstrumentor.wrap_to_thread_func to
+ reflect that it now returns a wrapper (#4901)
+ * opentelemetry-instrumentation-logging: fix documented name of
+ the code attributes env var to OTEL_PYTHON_LOG_CODE_ATTRIBUTES
+ * opentelemetry-instrumentation-psycopg: avoid IndexError in
+ get_operation_name for comment-only or whitespace-only Composed
+ statements (#4936)
+ * opentelemetry-instrumentation-psycopg2: avoid IndexError in
+ get_operation_name for comment-only or whitespace-only
+ statements (#4942)
+ * opentelemetry-instrumentation-sqlalchemy: avoid IndexError in
+ _operation_name for comment-only or whitespace-only statements
+ * opentelemetry-instrumentation-mysql: support mysql-connector-
+ python 26.7.0 and later (#4951)
+ * opentelemetry-util-http: stop _parse_url_query raising on
+ unparsable urls (#4965)
+ * opentelemetry-instrumentation-asyncio: fix metric name and
+ future example in module docs (#5083)
+ * opentelemetry-instrumentation-pymemcache: honor instrumentation
+ suppression (#5086)
+ * opentelemetry-instrumentation-asyncpg: honor instrumentation
+ suppression (#5087)
+ * opentelemetry-propagator-ot-trace: cap ot-baggage-* entries on
+ extract and inject (#5098)
+
+-------------------------------------------------------------------
Old:
----
opentelemetry_instrumentation_asgi-0.64b0.tar.gz
New:
----
opentelemetry_instrumentation_asgi-0.66b0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-opentelemetry-instrumentation-asgi.spec ++++++
--- /var/tmp/diff_new_pack.z2aom5/_old 2026-09-30 16:24:33.714127477 +0200
+++ /var/tmp/diff_new_pack.z2aom5/_new 2026-09-30 16:24:33.715127519 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-opentelemetry-instrumentation-asgi%{?psuffix}
-Version: 0.64b0
+Version: 0.66b0
Release: 0
Summary: ASGI instrumentation for OpenTelemetry
License: Apache-2.0
++++++ opentelemetry_instrumentation_asgi-0.64b0.tar.gz ->
opentelemetry_instrumentation_asgi-0.66b0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/opentelemetry_instrumentation_asgi-0.64b0/PKG-INFO
new/opentelemetry_instrumentation_asgi-0.66b0/PKG-INFO
--- old/opentelemetry_instrumentation_asgi-0.64b0/PKG-INFO 2020-02-02
01:00:00.000000000 +0100
+++ new/opentelemetry_instrumentation_asgi-0.66b0/PKG-INFO 2020-02-02
01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 2.4
+Metadata-Version: 2.5
Name: opentelemetry-instrumentation-asgi
-Version: 0.64b0
+Version: 0.66b0
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.10
Requires-Dist: asgiref~=3.0
Requires-Dist: opentelemetry-api~=1.12
-Requires-Dist: opentelemetry-instrumentation==0.64b0
-Requires-Dist: opentelemetry-semantic-conventions==0.64b0
-Requires-Dist: opentelemetry-util-http==0.64b0
+Requires-Dist: opentelemetry-instrumentation==0.66b0
+Requires-Dist: opentelemetry-semantic-conventions==0.66b0
+Requires-Dist: opentelemetry-util-http==0.66b0
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.64b0/pyproject.toml
new/opentelemetry_instrumentation_asgi-0.66b0/pyproject.toml
--- old/opentelemetry_instrumentation_asgi-0.64b0/pyproject.toml
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_instrumentation_asgi-0.66b0/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.64b0",
- "opentelemetry-semantic-conventions == 0.64b0",
- "opentelemetry-util-http == 0.64b0",
+ "opentelemetry-instrumentation == 0.66b0",
+ "opentelemetry-semantic-conventions == 0.66b0",
+ "opentelemetry-util-http == 0.66b0",
]
[project.optional-dependencies]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_instrumentation_asgi-0.64b0/src/opentelemetry/instrumentation/asgi/__init__.py
new/opentelemetry_instrumentation_asgi-0.66b0/src/opentelemetry/instrumentation/asgi/__init__.py
---
old/opentelemetry_instrumentation_asgi-0.64b0/src/opentelemetry/instrumentation/asgi/__init__.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_instrumentation_asgi-0.66b0/src/opentelemetry/instrumentation/asgi/__init__.py
2020-02-02 01:00:00.000000000 +0100
@@ -17,10 +17,12 @@
app = Quart(__name__)
app.asgi_app = OpenTelemetryMiddleware(app.asgi_app)
+
@app.route("/")
async def hello():
return "Hello!"
+
if __name__ == "__main__":
app.run(debug=True)
@@ -36,7 +38,7 @@
from django.core.asgi import get_asgi_application
from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'asgi_example.settings')
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "asgi_example.settings")
application = get_asgi_application()
application = OpenTelemetryMiddleware(application)
@@ -75,33 +77,47 @@
from asgiref.typing import Scope, ASGIReceiveEvent, ASGISendEvent
from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware
+
async def application(scope: Scope, receive: ASGIReceiveEvent, send:
ASGISendEvent):
- await send({
- 'type': 'http.response.start',
- 'status': 200,
- 'headers': [
- [b'content-type', b'text/plain'],
- ],
- })
-
- await send({
- 'type': 'http.response.body',
- 'body': b'Hello, world!',
- })
+ await send(
+ {
+ "type": "http.response.start",
+ "status": 200,
+ "headers": [
+ [b"content-type", b"text/plain"],
+ ],
+ }
+ )
+
+ await send(
+ {
+ "type": "http.response.body",
+ "body": b"Hello, world!",
+ }
+ )
+
def server_request_hook(span: Span, scope: Scope):
if span and span.is_recording():
span.set_attribute("custom_user_attribute_from_request_hook",
"some-value")
+
def client_request_hook(span: Span, scope: Scope, message: dict[str, Any]):
if span and span.is_recording():
span.set_attribute("custom_user_attribute_from_client_request_hook",
"some-value")
+
def client_response_hook(span: Span, scope: Scope, message: dict[str,
Any]):
if span and span.is_recording():
span.set_attribute("custom_user_attribute_from_response_hook",
"some-value")
- OpenTelemetryMiddleware(application,
server_request_hook=server_request_hook,
client_request_hook=client_request_hook,
client_response_hook=client_response_hook)
+
+ OpenTelemetryMiddleware(
+ application,
+ server_request_hook=server_request_hook,
+ client_request_hook=client_request_hook,
+ client_response_hook=client_response_hook,
+ )
Capture HTTP request and response headers
*****************************************
@@ -202,9 +218,10 @@
import typing
import urllib
from collections import defaultdict
+from collections.abc import Awaitable, Callable
from functools import wraps
from timeit import default_timer
-from typing import Any, Awaitable, Callable, DefaultDict, Tuple
+from typing import Any
from asgiref.compatibility import guarantee_single_callable
@@ -240,7 +257,7 @@
ClientResponseHook,
ServerRequestHook,
)
-from opentelemetry.instrumentation.asgi.version import __version__ # noqa
+from opentelemetry.instrumentation.asgi.version import __version__
from opentelemetry.instrumentation.propagators import (
get_global_response_propagator,
)
@@ -286,9 +303,7 @@
class ASGIGetter(Getter[dict]):
- def get(
- self, carrier: dict, key: str
- ) -> typing.Optional[typing.List[str]]:
+ def get(self, carrier: dict, key: str) -> list[str] | None:
"""Getter implementation to retrieve a HTTP header value from the ASGI
scope.
@@ -306,15 +321,13 @@
# ASGI header keys are in lower case
key = key.lower()
decoded = [
- _decode_header_item(_value)
- for (_key, _value) in headers
- if _decode_header_item(_key).lower() == key
+ _decode_header_item(_value) for (_key, _value) in headers if
_decode_header_item(_key).lower() == key
]
if not decoded:
return None
return decoded
- def keys(self, carrier: dict) -> typing.List[str]:
+ def keys(self, carrier: dict) -> list[str]:
headers = carrier.get("headers") or []
return [_decode_header_item(_key) for (_key, _value) in headers]
@@ -345,9 +358,7 @@
# pylint: disable=too-many-branches
-def collect_request_attributes(
- scope, sem_conv_opt_in_mode=_StabilityMode.DEFAULT
-):
+def collect_request_attributes(scope,
sem_conv_opt_in_mode=_StabilityMode.DEFAULT):
"""Collects HTTP request attributes from the ASGI scope and returns a
dictionary to be used as span creation attributes."""
server_host, port, http_url = get_host_port_url_tuple(scope)
@@ -370,9 +381,7 @@
_set_http_flavor_version(result, flavor, sem_conv_opt_in_mode)
path = scope.get("path")
if path:
- _set_http_target(
- result, path, path, query_string, sem_conv_opt_in_mode
- )
+ _set_http_target(result, path, path, query_string,
sem_conv_opt_in_mode)
if http_url:
if _report_old(sem_conv_opt_in_mode):
_set_http_url(
@@ -398,9 +407,7 @@
user_agent_raw = http_user_agent[0]
user_agent_value = normalize_user_agent(user_agent_raw)
if user_agent_value:
- _set_http_user_agent(
- result, user_agent_value, sem_conv_opt_in_mode
- )
+ _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)
@@ -408,12 +415,8 @@
result[USER_AGENT_SYNTHETIC_TYPE] = synthetic_type
if "client" in scope and scope["client"] is not None:
- _set_http_peer_ip_server(
- result, scope.get("client")[0], sem_conv_opt_in_mode
- )
- _set_http_peer_port_server(
- result, scope.get("client")[1], sem_conv_opt_in_mode
- )
+ _set_http_peer_ip_server(result, scope.get("client")[0],
sem_conv_opt_in_mode)
+ _set_http_peer_port_server(result, scope.get("client")[1],
sem_conv_opt_in_mode)
# remove None values
result = {k: v for k, v in result.items() if v is not None}
@@ -433,14 +436,12 @@
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)
+ headers: defaultdict[str, list[str]] = defaultdict(list)
raw_headers = scope_or_response_message.get("headers")
if raw_headers:
for key, value in raw_headers:
# Decode headers before processing.
- headers[_decode_header_item(key)].append(
- _decode_header_item(value)
- )
+
headers[_decode_header_item(key)].append(_decode_header_item(value))
return sanitize.sanitize_header_values(
headers,
@@ -503,7 +504,7 @@
)
-def get_default_span_details(scope: dict) -> Tuple[str, dict]:
+def get_default_span_details(scope: dict) -> tuple[str, dict]:
"""
Default span name is the HTTP method and URL path, or just the method.
https://github.com/open-telemetry/opentelemetry-specification/pull/3165
@@ -526,8 +527,8 @@
def _collect_target_attribute(
- scope: typing.Dict[str, typing.Any],
-) -> typing.Optional[str]:
+ scope: dict[str, typing.Any],
+) -> str | None:
"""
Returns the target path as defined by the Semantic Conventions.
@@ -643,9 +644,7 @@
)
self.server_response_body_size_histogram = None
if _report_new(sem_conv_opt_in_mode):
- self.server_response_body_size_histogram = (
- create_http_server_response_body_size(self.meter)
- )
+ self.server_response_body_size_histogram =
create_http_server_response_body_size(self.meter)
self.server_request_size_histogram = None
if _report_old(sem_conv_opt_in_mode):
self.server_request_size_histogram = self.meter.create_histogram(
@@ -655,18 +654,12 @@
)
self.server_request_body_size_histogram = None
if _report_new(sem_conv_opt_in_mode):
- self.server_request_body_size_histogram = (
- create_http_server_request_body_size(self.meter)
- )
- self.active_requests_counter = create_http_server_active_requests(
- self.meter
- )
+ self.server_request_body_size_histogram =
create_http_server_request_body_size(self.meter)
+ self.active_requests_counter =
create_http_server_active_requests(self.meter)
if isinstance(excluded_urls, str):
excluded_urls = parse_excluded_urls(excluded_urls)
self.excluded_urls = excluded_urls
- self.default_span_details = (
- default_span_details or get_default_span_details
- )
+ self.default_span_details = default_span_details or
get_default_span_details
def failsafe(func):
if func is None:
@@ -690,37 +683,21 @@
# Environment variables as constructor parameters
self.http_capture_headers_server_request = (
http_capture_headers_server_request
- or (
- get_custom_headers(
- OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST
- )
- )
+ or
(get_custom_headers(OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST))
or None
)
self.http_capture_headers_server_response = (
http_capture_headers_server_response
- or (
- get_custom_headers(
- OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE
- )
- )
+ or
(get_custom_headers(OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE))
or None
)
self.http_capture_headers_sanitize_fields = SanitizeValue(
http_capture_headers_sanitize_fields
- or (
- get_custom_headers(
- OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS
- )
- )
+ or
(get_custom_headers(OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS))
or []
)
- self.exclude_receive_span = (
- "receive" in exclude_spans if exclude_spans else False
- )
- self.exclude_send_span = (
- "send" in exclude_spans if exclude_spans else False
- )
+ self.exclude_receive_span = "receive" in exclude_spans if
exclude_spans else False
+ self.exclude_send_span = "send" in exclude_spans if exclude_spans else
False
# pylint: disable=too-many-statements
async def __call__(
@@ -749,9 +726,7 @@
span_name, additional_attributes = self.default_span_details(scope)
- attributes = collect_request_attributes(
- scope, self._sem_conv_opt_in_mode
- )
+ attributes = collect_request_attributes(scope,
self._sem_conv_opt_in_mode)
attributes.update(additional_attributes)
span, token = _start_internal_or_server_span(
tracer=self.tracer,
@@ -791,9 +766,7 @@
if callable(self.server_request_hook):
self.server_request_hook(current_span, scope)
- otel_receive = self._get_otel_receive(
- span_name, scope, receive
- )
+ otel_receive = self._get_otel_receive(span_name, scope,
receive)
otel_send = self._get_otel_send(
current_span,
@@ -817,14 +790,10 @@
self._sem_conv_opt_in_mode,
)
duration_s = default_timer() - start
- duration_attrs_old = _parse_duration_attrs(
- attributes, _StabilityMode.DEFAULT
- )
+ duration_attrs_old = _parse_duration_attrs(attributes,
_StabilityMode.DEFAULT)
if target:
duration_attrs_old[HTTP_TARGET] = target
- duration_attrs_new = _parse_duration_attrs(
- attributes, _StabilityMode.HTTP
- )
+ duration_attrs_new = _parse_duration_attrs(attributes,
_StabilityMode.HTTP)
span_ctx = set_span_in_context(span)
if self.duration_histogram_old:
self.duration_histogram_old.record(
@@ -838,9 +807,7 @@
duration_attrs_new,
context=span_ctx,
)
- self.active_requests_counter.add(
- -1, active_requests_count_attrs
- )
+ self.active_requests_counter.add(-1,
active_requests_count_attrs)
if self.content_length_header:
if self.server_response_size_histogram:
self.server_response_size_histogram.record(
@@ -900,9 +867,7 @@
None,
self._sem_conv_opt_in_mode,
)
- receive_span.set_attribute(
- "asgi.event.type", message["type"]
- )
+ receive_span.set_attribute("asgi.event.type",
message["type"])
return message
return otel_receive
@@ -917,9 +882,7 @@
expecting_trailers,
):
"""Set send span attributes and status code."""
- with self.tracer.start_as_current_span(
- " ".join((server_span_name, scope["type"], "send"))
- ) as send_span:
+ with self.tracer.start_as_current_span(" ".join((server_span_name,
scope["type"], "send"))) as send_span:
if callable(self.client_response_hook):
self.client_response_hook(send_span, scope, message)
@@ -937,15 +900,9 @@
)
return expecting_trailers
- def _set_server_span(
- self, server_span, message, status_code, duration_attrs
- ):
+ def _set_server_span(self, server_span, message, status_code,
duration_attrs):
"""Set server span attributes and status code."""
- if (
- server_span.is_recording()
- and server_span.kind == trace.SpanKind.SERVER
- and "headers" in message
- ):
+ if server_span.is_recording() and server_span.kind ==
trace.SpanKind.SERVER and "headers" in message:
custom_response_attributes = (
collect_custom_headers_attributes(
message,
@@ -997,17 +954,13 @@
expecting_trailers,
)
- self._set_server_span(
- server_span, message, status_code, duration_attrs
- )
+ self._set_server_span(server_span, message, status_code,
duration_attrs)
propagator = get_global_response_propagator()
if propagator:
propagator.inject(
message,
- context=set_span_in_context(
- server_span, trace.context_api.Context()
- ),
+ context=set_span_in_context(server_span,
trace.context_api.Context()),
setter=asgi_setter,
)
@@ -1035,9 +988,7 @@
return otel_send
-def _parse_duration_attrs(
- req_attrs, sem_conv_opt_in_mode=_StabilityMode.DEFAULT
-):
+def _parse_duration_attrs(req_attrs,
sem_conv_opt_in_mode=_StabilityMode.DEFAULT):
return _filter_semconv_duration_attrs(
req_attrs,
_server_duration_attrs_old,
@@ -1046,9 +997,7 @@
)
-def _parse_active_request_count_attrs(
- req_attrs, sem_conv_opt_in_mode=_StabilityMode.DEFAULT
-):
+def _parse_active_request_count_attrs(req_attrs,
sem_conv_opt_in_mode=_StabilityMode.DEFAULT):
return _filter_semconv_active_request_count_attr(
req_attrs,
_server_active_requests_count_attrs_old,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_instrumentation_asgi-0.64b0/src/opentelemetry/instrumentation/asgi/types.py
new/opentelemetry_instrumentation_asgi-0.66b0/src/opentelemetry/instrumentation/asgi/types.py
---
old/opentelemetry_instrumentation_asgi-0.64b0/src/opentelemetry/instrumentation/asgi/types.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_instrumentation_asgi-0.66b0/src/opentelemetry/instrumentation/asgi/types.py
2020-02-02 01:00:00.000000000 +0100
@@ -1,14 +1,15 @@
# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0
-from typing import Any, Callable, Dict, Optional
+from collections.abc import Callable
+from typing import Any
from opentelemetry.trace import Span
-_Scope = Dict[str, Any]
-_Message = Dict[str, Any]
+_Scope = dict[str, Any]
+_Message = dict[str, Any]
-ServerRequestHook = Optional[Callable[[Span, _Scope], None]]
+ServerRequestHook = Callable[[Span, _Scope], None] | None
"""
Incoming request callback type.
@@ -17,7 +18,7 @@
- ASGI scope as a mapping
"""
-ClientRequestHook = Optional[Callable[[Span, _Scope, _Message], None]]
+ClientRequestHook = Callable[[Span, _Scope, _Message], None] | None
"""
Receive callback type.
@@ -27,7 +28,7 @@
- ASGI event as a mapping
"""
-ClientResponseHook = Optional[Callable[[Span, _Scope, _Message], None]]
+ClientResponseHook = Callable[[Span, _Scope, _Message], None] | None
"""
Send callback type.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_instrumentation_asgi-0.64b0/src/opentelemetry/instrumentation/asgi/version.py
new/opentelemetry_instrumentation_asgi-0.66b0/src/opentelemetry/instrumentation/asgi/version.py
---
old/opentelemetry_instrumentation_asgi-0.64b0/src/opentelemetry/instrumentation/asgi/version.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_instrumentation_asgi-0.66b0/src/opentelemetry/instrumentation/asgi/version.py
2020-02-02 01:00:00.000000000 +0100
@@ -1,4 +1,4 @@
# Copyright The OpenTelemetry Authors
# SPDX-License-Identifier: Apache-2.0
-__version__ = "0.64b0"
+__version__ = "0.66b0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_instrumentation_asgi-0.64b0/tests/test_asgi_custom_headers.py
new/opentelemetry_instrumentation_asgi-0.66b0/tests/test_asgi_custom_headers.py
---
old/opentelemetry_instrumentation_asgi-0.64b0/tests/test_asgi_custom_headers.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_instrumentation_asgi-0.66b0/tests/test_asgi_custom_headers.py
2020-02-02 01:00:00.000000000 +0100
@@ -142,16 +142,10 @@
await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
- "http.request.header.custom_test_header_1": (
- "test-header-value-1",
- ),
- "http.request.header.custom_test_header_2": (
- "test-header-value-2",
- ),
+ "http.request.header.custom_test_header_1":
("test-header-value-1",),
+ "http.request.header.custom_test_header_2":
("test-header-value-2",),
"http.request.header.regex_test_header_1": ("Regex Test Value 1",),
- "http.request.header.regex_test_header_2": (
- "RegexTestValue2,RegexTestValue3",
- ),
+ "http.request.header.regex_test_header_2":
("RegexTestValue2,RegexTestValue3",),
"http.request.header.non_utf8_header": ("Moto Z²",),
"http.request.header.moto_z²_non_utf8_header_key": ("Moto Z²",),
"http.request.header.my_secret_header": ("[REDACTED]",),
@@ -191,14 +185,10 @@
await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
- "http.request.header.custom_test_header_1": (
- "test-header-value-1",
- ),
+ "http.request.header.custom_test_header_1":
("test-header-value-1",),
}
not_expected = {
- "http.request.header.custom_test_header_2": (
- "test-header-value-2",
- ),
+ "http.request.header.custom_test_header_2":
("test-header-value-2",),
}
for span in span_list:
if span.kind == SpanKind.SERVER:
@@ -217,18 +207,10 @@
await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
- "http.response.header.custom_test_header_1": (
- "test-header-value-1",
- ),
- "http.response.header.custom_test_header_2": (
- "test-header-value-2",
- ),
- "http.response.header.my_custom_regex_header_1": (
- "my-custom-regex-value-1,my-custom-regex-value-2",
- ),
- "http.response.header.my_custom_regex_header_2": (
- "my-custom-regex-value-3,my-custom-regex-value-4",
- ),
+ "http.response.header.custom_test_header_1":
("test-header-value-1",),
+ "http.response.header.custom_test_header_2":
("test-header-value-2",),
+ "http.response.header.my_custom_regex_header_1":
("my-custom-regex-value-1,my-custom-regex-value-2",),
+ "http.response.header.my_custom_regex_header_2":
("my-custom-regex-value-3,my-custom-regex-value-4",),
"http.response.header.my_secret_header": ("[REDACTED]",),
"http.response.header.non_utf8_header": ("Moto Z²",),
"http.response.header.moto_z²_non_utf8_header_key": ("Moto Z²",),
@@ -267,9 +249,7 @@
await self.get_all_output()
span_list = self.exporter.get_finished_spans()
not_expected = {
- "http.response.header.custom_test_header_3": (
- "test-header-value-3",
- ),
+ "http.response.header.custom_test_header_3":
("test-header-value-3",),
}
for span in span_list:
if span.kind == SpanKind.SERVER:
@@ -301,16 +281,10 @@
await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
- "http.request.header.custom_test_header_1": (
- "test-header-value-1",
- ),
- "http.request.header.custom_test_header_2": (
- "test-header-value-2",
- ),
+ "http.request.header.custom_test_header_1":
("test-header-value-1",),
+ "http.request.header.custom_test_header_2":
("test-header-value-2",),
"http.request.header.regex_test_header_1": ("Regex Test Value 1",),
- "http.request.header.regex_test_header_2": (
- "RegexTestValue2,RegexTestValue3",
- ),
+ "http.request.header.regex_test_header_2":
("RegexTestValue2,RegexTestValue3",),
"http.request.header.my_secret_header": ("[REDACTED]",),
}
for span in span_list:
@@ -341,9 +315,7 @@
await self.get_all_output()
span_list = self.exporter.get_finished_spans()
not_expected = {
- "http.request.header.custom_test_header_3": (
- "test-header-value-3",
- ),
+ "http.request.header.custom_test_header_3":
("test-header-value-3",),
}
for span in span_list:
if span.kind == SpanKind.SERVER:
@@ -373,18 +345,10 @@
await self.get_all_output()
span_list = self.exporter.get_finished_spans()
expected = {
- "http.response.header.custom_test_header_1": (
- "test-header-value-1",
- ),
- "http.response.header.custom_test_header_2": (
- "test-header-value-2",
- ),
- "http.response.header.my_custom_regex_header_1": (
- "my-custom-regex-value-1,my-custom-regex-value-2",
- ),
- "http.response.header.my_custom_regex_header_2": (
- "my-custom-regex-value-3,my-custom-regex-value-4",
- ),
+ "http.response.header.custom_test_header_1":
("test-header-value-1",),
+ "http.response.header.custom_test_header_2":
("test-header-value-2",),
+ "http.response.header.my_custom_regex_header_1":
("my-custom-regex-value-1,my-custom-regex-value-2",),
+ "http.response.header.my_custom_regex_header_2":
("my-custom-regex-value-3,my-custom-regex-value-4",),
"http.response.header.my_secret_header": ("[REDACTED]",),
}
for span in span_list:
@@ -416,9 +380,7 @@
await self.get_all_output()
span_list = self.exporter.get_finished_spans()
not_expected = {
- "http.response.header.custom_test_header_3": (
- "test-header-value-3",
- ),
+ "http.response.header.custom_test_header_3":
("test-header-value-3",),
}
for span in span_list:
if span.kind == SpanKind.SERVER:
@@ -443,27 +405,15 @@
super().setUp()
def tearDown(self):
- os.environ.pop(
- OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS, None
- )
- os.environ.pop(
- OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST, None
- )
- os.environ.pop(
- OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE, None
- )
+
os.environ.pop(OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS, None)
+
os.environ.pop(OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST, None)
+
os.environ.pop(OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE, None)
super().tearDown()
class TestCustomHeadersConstructor(TestCustomHeaders):
constructor_params = {
- "http_capture_headers_sanitize_fields":
SANITIZE_FIELDS_TEST_VALUE.split(
- ","
- ),
- "http_capture_headers_server_request": SERVER_REQUEST_TEST_VALUE.split(
- ","
- ),
- "http_capture_headers_server_response":
SERVER_RESPONSE_TEST_VALUE.split(
- ","
- ),
+ "http_capture_headers_sanitize_fields":
SANITIZE_FIELDS_TEST_VALUE.split(","),
+ "http_capture_headers_server_request":
SERVER_REQUEST_TEST_VALUE.split(","),
+ "http_capture_headers_server_response":
SERVER_RESPONSE_TEST_VALUE.split(","),
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_instrumentation_asgi-0.64b0/tests/test_asgi_middleware.py
new/opentelemetry_instrumentation_asgi-0.66b0/tests/test_asgi_middleware.py
--- old/opentelemetry_instrumentation_asgi-0.64b0/tests/test_asgi_middleware.py
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_instrumentation_asgi-0.66b0/tests/test_asgi_middleware.py
2020-02-02 01:00:00.000000000 +0100
@@ -112,9 +112,7 @@
_recommended_attrs_both = _recommended_attrs_old.copy()
_recommended_attrs_both.update(_recommended_attrs_new)
-_recommended_attrs_both["http.server.active_requests"].extend(
- _server_active_requests_count_attrs_old
-)
+_recommended_attrs_both["http.server.active_requests"].extend(_server_active_requests_count_attrs_old)
_SIMULATED_BACKGROUND_TASK_EXECUTION_TIME_S = 0.01
@@ -177,18 +175,10 @@
],
}
)
- await send(
- {"type": "http.response.body", "body": b"*", "more_body": True}
- )
- await send(
- {"type": "http.response.body", "body": b"*", "more_body": True}
- )
- await send(
- {"type": "http.response.body", "body": b"*", "more_body": True}
- )
- await send(
- {"type": "http.response.body", "body": b"*", "more_body": False}
- )
+ await send({"type": "http.response.body", "body": b"*", "more_body":
True})
+ await send({"type": "http.response.body", "body": b"*", "more_body":
True})
+ await send({"type": "http.response.body", "body": b"*", "more_body":
True})
+ await send({"type": "http.response.body", "body": b"*", "more_body":
False})
async def background_execution_asgi(scope, receive, send):
@@ -214,6 +204,8 @@
"body": b"*",
}
)
+ # Record when the background task starts; the server span must already
be ended by now.
+ scope["background_task_start_ns"] = time.time_ns()
time.sleep(_SIMULATED_BACKGROUND_TASK_EXECUTION_TIME_S)
@@ -235,12 +227,8 @@
"trailers": True,
}
)
- await send(
- {"type": "http.response.body", "body": b"*", "more_body": True}
- )
- await send(
- {"type": "http.response.body", "body": b"*", "more_body": False}
- )
+ await send({"type": "http.response.body", "body": b"*", "more_body":
True})
+ await send({"type": "http.response.body", "body": b"*", "more_body":
False})
await send(
{
"type": "http.response.trailers",
@@ -259,6 +247,8 @@
"more_trailers": False,
}
)
+ # Record when the background task starts; the server span must already
be ended by now.
+ scope["background_task_start_ns"] = time.time_ns()
time.sleep(_SIMULATED_BACKGROUND_TASK_EXECUTION_TIME_S)
@@ -333,9 +323,7 @@
return sub
# Helper to assert exemplars presence across specified histogram metric
names.
- def _assert_exemplars_present(
- self, metric_names: set[str], context: str = ""
- ):
+ def _assert_exemplars_present(self, metric_names: set[str], context: str =
""):
metrics = self.get_sorted_metrics(SCOPE)
found = {name: 0 for name in metric_names}
@@ -378,12 +366,9 @@
# Ensure modifiers is a list
modifiers = modifiers or []
# Check for expected outputs
+ self.assertTrue(outputs, "ASGI application produced no response
messages")
response_start = outputs[0]
- response_final_body = [
- output
- for output in outputs
- if output["type"] == "http.response.body"
- ][-1]
+ response_final_body = [output for output in outputs if output["type"]
== "http.response.body"][-1]
self.assertEqual(response_start["type"], "http.response.start")
self.assertEqual(response_final_body["type"], "http.response.body")
@@ -409,6 +394,7 @@
# Check spans
span_list = self.get_finished_spans()
+
expected_old = [
{
"name": "GET / http receive",
@@ -582,9 +568,7 @@
mock_span = mock.Mock()
mock_span.is_recording.return_value = False
mock_tracer.start_as_current_span.return_value = mock_span
- mock_tracer.start_as_current_span.return_value.__enter__ = mock.Mock(
- return_value=mock_span
- )
+ mock_tracer.start_as_current_span.return_value.__enter__ =
mock.Mock(return_value=mock_span)
mock_tracer.start_as_current_span.return_value.__exit__ = mock_span
with mock.patch("opentelemetry.trace.get_tracer") as tracer:
tracer.return_value = mock_tracer
@@ -637,10 +621,9 @@
span_list = self.get_finished_spans()
server_span = span_list[-1]
assert server_span.kind == SpanKind.SERVER
- span_duration_nanos = server_span.end_time - server_span.start_time
self.assertLessEqual(
- span_duration_nanos,
- _SIMULATED_BACKGROUND_TASK_EXECUTION_TIME_S * 10**9,
+ server_span.end_time,
+ self.scope["background_task_start_ns"],
)
async def test_exclude_internal_spans(self):
@@ -655,9 +638,7 @@
]
for exclude_spans, excluded_spans in cases:
self.memory_exporter.clear()
- app = otel_asgi.OpenTelemetryMiddleware(
- simple_asgi, exclude_spans=exclude_spans
- )
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi,
exclude_spans=exclude_spans)
self.seed_app(app)
await self.send_default_request()
await self.get_all_output()
@@ -670,9 +651,7 @@
async def test_trailers(self):
"""Test that trailers are emitted as expected and that the server span
is ended
BEFORE the background task is finished."""
- app = otel_asgi.OpenTelemetryMiddleware(
- background_execution_trailers_asgi
- )
+ app =
otel_asgi.OpenTelemetryMiddleware(background_execution_trailers_asgi)
self.seed_app(app)
await self.send_default_request()
outputs = await self.get_all_output()
@@ -696,10 +675,9 @@
span_list = self.get_finished_spans()
server_span = span_list[-1]
assert server_span.kind == SpanKind.SERVER
- span_duration_nanos = server_span.end_time - server_span.start_time
self.assertLessEqual(
- span_duration_nanos,
- _SIMULATED_BACKGROUND_TASK_EXECUTION_TIME_S * 10**9,
+ server_span.end_time,
+ self.scope["background_task_start_ns"],
)
async def test_override_span_name(self):
@@ -714,14 +692,10 @@
if entry["kind"] == trace_api.SpanKind.SERVER:
entry["name"] = span_name
else:
- entry["name"] = " ".join(
- [span_name] + entry["name"].split(" ")[2:]
- )
+ entry["name"] = " ".join([span_name] +
entry["name"].split(" ")[2:])
return expected
- app = otel_asgi.OpenTelemetryMiddleware(
- simple_asgi, default_span_details=get_predefined_span_details
- )
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi,
default_span_details=get_predefined_span_details)
self.seed_app(app)
await self.send_default_request()
outputs = await self.get_all_output()
@@ -732,21 +706,15 @@
result = TestBase.create_tracer_provider(resource=resource)
tracer_provider, exporter = result
- app = otel_asgi.OpenTelemetryMiddleware(
- simple_asgi, tracer_provider=tracer_provider
- )
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi,
tracer_provider=tracer_provider)
self.seed_app(app)
await self.send_default_request()
span_list = exporter.get_finished_spans()
for span in span_list:
- self.assertEqual(
- span.resource.attributes["service-test-key"], "value"
- )
+ self.assertEqual(span.resource.attributes["service-test-key"],
"value")
async def test_no_op_tracer_provider_otel_asgi(self):
- app = otel_asgi.OpenTelemetryMiddleware(
- simple_asgi, tracer_provider=trace_api.NoOpTracerProvider()
- )
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi,
tracer_provider=trace_api.NoOpTracerProvider())
self.seed_app(app)
await self.send_default_request()
@@ -878,9 +846,7 @@
user_agent = b"test-agent"
def update_expected_user_agent(expected):
- expected[3]["attributes"].update(
- {HTTP_USER_AGENT: user_agent.decode("utf8")}
- )
+ expected[3]["attributes"].update({HTTP_USER_AGENT:
user_agent.decode("utf8")})
return expected
self.scope["headers"].append([b"user-agent", user_agent])
@@ -895,9 +861,7 @@
user_agent = b"test-agent"
def update_expected_user_agent(expected):
- expected[3]["attributes"].update(
- {USER_AGENT_ORIGINAL: user_agent.decode("utf8")}
- )
+ expected[3]["attributes"].update({USER_AGENT_ORIGINAL:
user_agent.decode("utf8")})
return expected
self.scope["headers"].append([b"user-agent", user_agent])
@@ -929,6 +893,7 @@
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
self.seed_app(app)
await self.send_default_request()
+ await self.communicator.wait()
outputs = await self.get_all_output()
self.validate_outputs(
outputs,
@@ -952,9 +917,7 @@
# Clear headers first
self.scope["headers"] = []
- def update_expected_synthetic_bot(
- expected, ua: bytes = user_agent
- ):
+ def update_expected_synthetic_bot(expected, ua: bytes =
user_agent):
expected[3]["attributes"].update(
{
HTTP_USER_AGENT: ua.decode("utf8"),
@@ -968,9 +931,7 @@
self.seed_app(app)
await self.send_default_request()
outputs = await self.get_all_output()
- self.validate_outputs(
- outputs, modifiers=[update_expected_synthetic_bot]
- )
+ self.validate_outputs(outputs,
modifiers=[update_expected_synthetic_bot])
async def test_user_agent_synthetic_test_detection(self):
"""Test that test user agents are detected as synthetic with type
'test'"""
@@ -986,9 +947,7 @@
# Clear headers first
self.scope["headers"] = []
- def update_expected_synthetic_test(
- expected, ua: bytes = user_agent
- ):
+ def update_expected_synthetic_test(expected, ua: bytes =
user_agent):
expected[3]["attributes"].update(
{
HTTP_USER_AGENT: ua.decode("utf8"),
@@ -1002,9 +961,7 @@
self.seed_app(app)
await self.send_default_request()
outputs = await self.get_all_output()
- self.validate_outputs(
- outputs, modifiers=[update_expected_synthetic_test]
- )
+ self.validate_outputs(outputs,
modifiers=[update_expected_synthetic_test])
async def test_user_agent_non_synthetic(self):
"""Test that normal user agents are not marked as synthetic"""
@@ -1021,9 +978,7 @@
# Clear headers first
self.scope["headers"] = []
- def update_expected_non_synthetic(
- expected, ua: bytes = user_agent
- ):
+ def update_expected_non_synthetic(expected, ua: bytes =
user_agent):
# Should only have the user agent, not synthetic type
expected[3]["attributes"].update(
{
@@ -1037,9 +992,7 @@
self.seed_app(app)
await self.send_default_request()
outputs = await self.get_all_output()
- self.validate_outputs(
- outputs, modifiers=[update_expected_non_synthetic]
- )
+ self.validate_outputs(outputs,
modifiers=[update_expected_non_synthetic])
async def test_user_agent_synthetic_new_semconv(self):
"""Test synthetic user agent detection with new semantic conventions"""
@@ -1411,9 +1364,7 @@
self.seed_app(app)
await self.send_default_request()
outputs = await self.get_all_output()
- self.validate_outputs(
- outputs, modifiers=[update_expected_hook_results]
- )
+ self.validate_outputs(outputs,
modifiers=[update_expected_hook_results])
async def test_hook_exceptions(self):
def exception_event(msg):
@@ -1445,9 +1396,7 @@
self.seed_app(app)
await self.send_default_request()
outputs = await self.get_all_output()
- self.validate_outputs(
- outputs, modifiers=[update_expected_hook_results]
- )
+ self.validate_outputs(outputs,
modifiers=[update_expected_hook_results])
async def test_asgi_metrics(self):
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
@@ -1555,9 +1504,7 @@
self.seed_app(app)
await self.send_default_request()
await self.get_all_output()
- self._assert_exemplars_present(
- {"http.server.duration"}, context="old semconv"
- )
+ self._assert_exemplars_present({"http.server.duration"}, context="old
semconv")
async def test_asgi_metrics_exemplars_expected_new_semconv(self):
"""Failing test placeholder asserting exemplars should be present for
request duration histogram (new semconv)."""
@@ -1566,9 +1513,7 @@
self.seed_app(app)
await self.send_default_request()
await self.get_all_output()
- self._assert_exemplars_present(
- {"http.server.request.duration"}, context="new semconv"
- )
+ self._assert_exemplars_present({"http.server.request.duration"},
context="new semconv")
async def test_asgi_metrics_exemplars_expected_both_semconv(self):
"""Failing test placeholder asserting exemplars should be present for
both duration histograms when both semconv modes enabled."""
@@ -1631,9 +1576,7 @@
mock_span = mock.Mock()
mock_span.is_recording.return_value = False
mock_tracer.start_as_current_span.return_value = mock_span
- mock_tracer.start_as_current_span.return_value.__enter__ = mock.Mock(
- return_value=mock_span
- )
+ mock_tracer.start_as_current_span.return_value.__enter__ =
mock.Mock(return_value=mock_span)
mock_tracer.start_as_current_span.return_value.__exit__ = mock_span
with mock.patch("opentelemetry.trace.get_tracer") as tracer:
tracer.return_value = mock_tracer
@@ -1668,9 +1611,7 @@
)
self.assertEqual(point.count, 1)
if metric.name == "http.server.duration":
- self.assertAlmostEqual(
- duration, point.sum, delta=15
- )
+ self.assertAlmostEqual(duration, point.sum,
delta=15)
elif metric.name == "http.server.response.size":
self.assertEqual(1024, point.sum)
elif metric.name == "http.server.request.size":
@@ -1854,9 +1795,7 @@
async def test_excluded_urls(self):
self.scope["path"] = "/test_excluded_urls"
- app = otel_asgi.OpenTelemetryMiddleware(
- simple_asgi, excluded_urls="test_excluded_urls"
- )
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi,
excluded_urls="test_excluded_urls")
self.seed_app(app)
await self.send_default_request()
await self.get_all_output()
@@ -1865,9 +1804,7 @@
async def test_no_excluded_urls(self):
self.scope["path"] = "/test_excluded_urls"
- app = otel_asgi.OpenTelemetryMiddleware(
- simple_asgi, excluded_urls="test_excluded_urls"
- )
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi,
excluded_urls="test_excluded_urls")
self.seed_app(app)
self.scope["path"] = "/test_no_excluded_urls"
await self.send_default_request()
@@ -2104,15 +2041,11 @@
):
tracer_provider, exporter = TestBase.create_tracer_provider()
tracer = tracer_provider.get_tracer(__name__)
- app = otel_asgi.OpenTelemetryMiddleware(
- simple_asgi, tracer_provider=tracer_provider
- )
+ app = otel_asgi.OpenTelemetryMiddleware(simple_asgi,
tracer_provider=tracer_provider)
# Wrapping the otel intercepted app with server span
async def wrapped_app(scope, receive, send):
- with tracer.start_as_current_span(
- "test", kind=SpanKind.SERVER
- ) as _:
+ with tracer.start_as_current_span("test", kind=SpanKind.SERVER) as
_:
await app(scope, receive, send)
self.seed_app(wrapped_app)
@@ -2129,9 +2062,7 @@
self.assertEqual(SpanKind.SERVER, span_list[4].kind)
# internal span should be child of the test span we have provided
- self.assertEqual(
- span_list[4].context.span_id, span_list[3].parent.span_id
- )
+ self.assertEqual(span_list[4].context.span_id,
span_list[3].parent.span_id)
class TestAsgiApplicationRaisingError(AsyncAsgiTestBase):
@@ -2155,10 +2086,7 @@
except ValueError as exc_info:
self.assertEqual(exc_info.args[0], "whatever")
except Exception as exc_info: # pylint: disable=W0703
- self.fail(
- "expecting ValueError('whatever'), received instead: "
- + str(exc_info)
- )
+ self.fail("expecting ValueError('whatever'), received instead: " +
str(exc_info))
else:
self.fail("expecting ValueError('whatever')")