Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-opentelemetry-test-utils for
openSUSE:Factory checked in at 2026-09-30 16:22:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-opentelemetry-test-utils (Old)
and
/work/SRC/openSUSE:Factory/.python-opentelemetry-test-utils.new.1465845 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-opentelemetry-test-utils"
Wed Sep 30 16:22:32 2026 rev:16 rq:1381454 version:0.66b0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-opentelemetry-test-utils/python-opentelemetry-test-utils.changes
2026-07-21 22:53:09.174856541 +0200
+++
/work/SRC/openSUSE:Factory/.python-opentelemetry-test-utils.new.1465845/python-opentelemetry-test-utils.changes
2026-09-30 16:23:22.392155933 +0200
@@ -1,0 +2,9 @@
+Sat Sep 26 14:15:35 UTC 2026 - ecsos <[email protected]>
+
+- Update to 0.66b0
+ * Added
+ - opentelemetry-test-utils: add CapturingSampler to record what samplers
receive in instrumentation tests (#5681)
+- Changes from 0.65b0
+ * no changes
+
+-------------------------------------------------------------------
Old:
----
opentelemetry_test_utils-0.64b0.tar.gz
New:
----
opentelemetry_test_utils-0.66b0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-opentelemetry-test-utils.spec ++++++
--- /var/tmp/diff_new_pack.KqtRYo/_old 2026-09-30 16:23:22.921178056 +0200
+++ /var/tmp/diff_new_pack.KqtRYo/_new 2026-09-30 16:23:22.923178139 +0200
@@ -18,22 +18,23 @@
%{?sle15_python_module_pythons}
Name: python-opentelemetry-test-utils
-Version: 0.64b0
+Version: 0.66b0
Release: 0
Summary: Test utilities for OpenTelemetry unit tests
License: Apache-2.0
URL: https://github.com/open-telemetry/opentelemetry-python/
Source:
https://files.pythonhosted.org/packages/source/o/opentelemetry-test-utils/opentelemetry_test_utils-%{version}.tar.gz
BuildRequires: %{python_module asgiref >= 3.0}
+BuildRequires: %{python_module base >= 3.10}
BuildRequires: %{python_module hatchling}
-BuildRequires: %{python_module opentelemetry-api = 1.43.0}
-BuildRequires: %{python_module opentelemetry-sdk = 1.43.0}
+BuildRequires: %{python_module opentelemetry-api = 1.45.0}
+BuildRequires: %{python_module opentelemetry-sdk = 1.45.0}
BuildRequires: %{python_module pip}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
Requires: python-asgiref >= 3.0
-Requires: python-opentelemetry-api = 1.43.0
-Requires: python-opentelemetry-sdk = 1.43.0
+Requires: python-opentelemetry-api = 1.45.0
+Requires: python-opentelemetry-sdk = 1.45.0
BuildArch: noarch
%python_subpackages
++++++ opentelemetry_test_utils-0.64b0.tar.gz ->
opentelemetry_test_utils-0.66b0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/opentelemetry_test_utils-0.64b0/.gitignore
new/opentelemetry_test_utils-0.66b0/.gitignore
--- old/opentelemetry_test_utils-0.64b0/.gitignore 2020-02-02
01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/.gitignore 2020-02-02
01:00:00.000000000 +0100
@@ -36,6 +36,8 @@
.cache
htmlcov
+.agent/
+
# Translations
*.mo
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/opentelemetry_test_utils-0.64b0/PKG-INFO
new/opentelemetry_test_utils-0.66b0/PKG-INFO
--- old/opentelemetry_test_utils-0.64b0/PKG-INFO 2020-02-02
01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-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-test-utils
-Version: 0.64b0
+Version: 0.66b0
Summary: Test utilities for OpenTelemetry unit tests
Project-URL: Homepage,
https://github.com/open-telemetry/opentelemetry-python/tests/opentelemetry-test-utils
Project-URL: Repository, https://github.com/open-telemetry/opentelemetry-python
@@ -18,8 +18,8 @@
Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.10
Requires-Dist: asgiref~=3.0
-Requires-Dist: opentelemetry-api==1.43.0
-Requires-Dist: opentelemetry-sdk==1.43.0
+Requires-Dist: opentelemetry-api==1.45.0
+Requires-Dist: opentelemetry-sdk==1.45.0
Requires-Dist: requests~=2.28
Description-Content-Type: text/x-rst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/opentelemetry_test_utils-0.64b0/pyproject.toml
new/opentelemetry_test_utils-0.66b0/pyproject.toml
--- old/opentelemetry_test_utils-0.64b0/pyproject.toml 2020-02-02
01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/pyproject.toml 2020-02-02
01:00:00.000000000 +0100
@@ -26,8 +26,8 @@
]
dependencies = [
"asgiref ~= 3.0",
- "opentelemetry-api == 1.43.0",
- "opentelemetry-sdk == 1.43.0",
+ "opentelemetry-api == 1.45.0",
+ "opentelemetry-sdk == 1.45.0",
"requests ~= 2.28",
]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/__init__.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/__init__.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/__init__.py
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/__init__.py
2020-02-02 01:00:00.000000000 +0100
@@ -17,11 +17,7 @@
def __exit__(self, type_, value, tb): # pylint: disable=invalid-name
if value is not None and type_ in self._exception_types:
- self._test_case.fail(
- "Unexpected exception was raised:\n{}".format(
- "\n".join(format_tb(tb))
- )
- )
+ self._test_case.fail("Unexpected exception was
raised:\n{}".format("\n".join(format_tb(tb))))
return True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/_otlp_test_server.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/_otlp_test_server.py
---
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/_otlp_test_server.py
1970-01-01 01:00:00.000000000 +0100
+++
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/_otlp_test_server.py
2020-02-02 01:00:00.000000000 +0100
@@ -0,0 +1,326 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+from __future__ import annotations
+
+import gzip
+import time
+import zlib
+from dataclasses import dataclass
+from http.server import BaseHTTPRequestHandler, HTTPServer
+from queue import Empty, Queue
+from threading import Thread
+from typing import TYPE_CHECKING
+from urllib.parse import urlparse
+
+if TYPE_CHECKING:
+ from opentelemetry.proto.common.v1.common_pb2 import InstrumentationScope
+ from opentelemetry.proto.logs.v1.logs_pb2 import LogRecord
+ from opentelemetry.proto.metrics.v1.metrics_pb2 import Metric
+ from opentelemetry.proto.resource.v1.resource_pb2 import Resource
+ from opentelemetry.proto.trace.v1.trace_pb2 import Span
+
+
+@dataclass
+class RecordedSpan:
+ span: Span
+ resource: Resource
+ scope: InstrumentationScope
+
+
+@dataclass
+class RecordedMetric:
+ metric: Metric
+ resource: Resource
+ scope: InstrumentationScope
+
+
+@dataclass
+class RecordedLogRecord:
+ log_record: LogRecord
+ resource: Resource
+ scope: InstrumentationScope
+
+
+def _make_handler(
+ spans_queue: Queue[RecordedSpan],
+ metrics_queue: Queue[RecordedMetric],
+ logs_queue: Queue[RecordedLogRecord],
+ traces_path: str,
+ metrics_path: str,
+ logs_path: str,
+) -> type[BaseHTTPRequestHandler]:
+ # pylint: disable=import-outside-toplevel,no-name-in-module
+ from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import ( #
noqa: PLC0415
+ ExportLogsServiceRequest,
+ ExportLogsServiceResponse,
+ )
+ from opentelemetry.proto.collector.metrics.v1.metrics_service_pb2 import (
# noqa: PLC0415
+ ExportMetricsServiceRequest,
+ ExportMetricsServiceResponse,
+ )
+ from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( #
noqa: PLC0415
+ ExportTraceServiceRequest,
+ ExportTraceServiceResponse,
+ )
+
+ class _Handler(BaseHTTPRequestHandler):
+ def do_POST(self): # pylint: disable=invalid-name
+ content_length = int(self.headers.get("Content-Length", 0))
+ body = self._decompress(self.rfile.read(content_length))
+ path = urlparse(self.path).path
+
+ if path == traces_path:
+ response_body = self._handle_traces(body)
+ elif path == metrics_path:
+ response_body = self._handle_metrics(body)
+ elif path == logs_path:
+ response_body = self._handle_logs(body)
+ else:
+ self.send_error(404)
+ return
+
+ self.send_response(200)
+ self.send_header("Content-Type", "application/x-protobuf")
+ self.send_header("Content-Length", str(len(response_body)))
+ self.end_headers()
+ self.wfile.write(response_body)
+
+ def _decompress(self, body: bytes) -> bytes:
+ encoding = self.headers.get("Content-Encoding", "")
+ if encoding == "gzip":
+ return gzip.decompress(body)
+ if encoding == "deflate":
+ return zlib.decompress(body)
+ return body
+
+ @staticmethod
+ def _handle_traces(body: bytes) -> bytes:
+ request = ExportTraceServiceRequest()
+ request.ParseFromString(body)
+ for rs in request.resource_spans:
+ for ss in rs.scope_spans:
+ for span in ss.spans:
+ spans_queue.put(RecordedSpan(span=span,
resource=rs.resource, scope=ss.scope))
+ return ExportTraceServiceResponse().SerializeToString()
+
+ @staticmethod
+ def _handle_metrics(body: bytes) -> bytes:
+ request = ExportMetricsServiceRequest()
+ request.ParseFromString(body)
+ for rm in request.resource_metrics:
+ for sm in rm.scope_metrics:
+ for metric in sm.metrics:
+ metrics_queue.put(
+ RecordedMetric(
+ metric=metric,
+ resource=rm.resource,
+ scope=sm.scope,
+ )
+ )
+ return ExportMetricsServiceResponse().SerializeToString()
+
+ @staticmethod
+ def _handle_logs(body: bytes) -> bytes:
+ request = ExportLogsServiceRequest()
+ request.ParseFromString(body)
+ for rl in request.resource_logs:
+ for sl in rl.scope_logs:
+ for log_record in sl.log_records:
+ logs_queue.put(
+ RecordedLogRecord(
+ log_record=log_record,
+ resource=rl.resource,
+ scope=sl.scope,
+ )
+ )
+ return ExportLogsServiceResponse().SerializeToString()
+
+ def log_message(self, format, *args): # pylint:
disable=redefined-builtin
+ pass
+
+ return _Handler
+
+
+class OtlpProtoTestServer:
+ def __init__(self, host: str = "127.0.0.1", port: int = 0, base_path: str
= "") -> None:
+ try:
+ # pylint: disable-next=import-outside-toplevel,unused-import
+ import opentelemetry.proto # noqa: PLC0415, F401
+ except ImportError:
+ raise ImportError(
+ "opentelemetry-proto is required to use OtlpProtoTestServer. "
+ "Install it with: pip install opentelemetry-proto"
+ ) from None
+ self._host = host
+ self._port = port
+ self._base_path = base_path.rstrip("/")
+ self._spans_queue: Queue[RecordedSpan] = Queue()
+ self._metrics_queue: Queue[RecordedMetric] = Queue()
+ self._logs_queue: Queue[RecordedLogRecord] = Queue()
+ self._server: HTTPServer | None = None
+ self._thread: Thread | None = None
+
+ def start(self) -> OtlpProtoTestServer:
+ handler = _make_handler(
+ self._spans_queue,
+ self._metrics_queue,
+ self._logs_queue,
+ f"{self._base_path}/v1/traces",
+ f"{self._base_path}/v1/metrics",
+ f"{self._base_path}/v1/logs",
+ )
+ self._server = HTTPServer((self._host, self._port), handler)
+ self._port = self._server.server_address[1]
+ self._thread = Thread(
+ target=self._server.serve_forever,
+ daemon=True,
+ name="OtlpProtoTestServer",
+ )
+ self._thread.start()
+ return self
+
+ def stop(self) -> None:
+ if self._server is not None:
+ self._server.shutdown()
+ if self._thread is not None:
+ self._thread.join()
+ self._server.server_close()
+
+ def __enter__(self) -> OtlpProtoTestServer:
+ return self.start()
+
+ def __exit__(self, *exc: object) -> None:
+ self.stop()
+
+ @property
+ def port(self) -> int:
+ return self._port
+
+ @property
+ def traces_endpoint(self) -> str:
+ return f"http://{self._host}:{self._port}{self._base_path}/v1/traces"
+
+ @property
+ def metrics_endpoint(self) -> str:
+ return f"http://{self._host}:{self._port}{self._base_path}/v1/metrics"
+
+ @property
+ def logs_endpoint(self) -> str:
+ return f"http://{self._host}:{self._port}{self._base_path}/v1/logs"
+
+ def get_span(self, timeout: float = 5.0) -> RecordedSpan:
+ try:
+ return self._spans_queue.get(timeout=timeout)
+ except Empty:
+ raise TimeoutError(f"No span received within {timeout}s") from None
+
+ def get_spans(self, count: int = 1, timeout: float = 5.0) ->
list[RecordedSpan]:
+ deadline = time.monotonic() + timeout
+ spans = []
+ for _ in range(count):
+ remaining = deadline - time.monotonic()
+ if remaining <= 0:
+ raise TimeoutError(f"Timed out after receiving
{len(spans)}/{count} spans")
+ spans.append(self.get_span(timeout=remaining))
+ return spans
+
+ def wait_for_span(self, *, name: str | None = None, timeout: float = 5.0)
-> RecordedSpan:
+ deadline = time.monotonic() + timeout
+ while True:
+ remaining = deadline - time.monotonic()
+ if remaining <= 0:
+ raise TimeoutError(f"No span with name={name!r} received
within {timeout}s")
+ try:
+ recorded = self._spans_queue.get(timeout=remaining)
+ except Empty:
+ raise TimeoutError(f"No span with name={name!r} received
within {timeout}s") from None
+ if name is None or recorded.span.name == name:
+ return recorded
+
+ def drain_spans(self) -> list[RecordedSpan]:
+ result = []
+ while True:
+ try:
+ result.append(self._spans_queue.get_nowait())
+ except Empty:
+ return result
+
+ def get_metric(self, timeout: float = 5.0) -> RecordedMetric:
+ try:
+ return self._metrics_queue.get(timeout=timeout)
+ except Empty:
+ raise TimeoutError(f"No metric received within {timeout}s") from
None
+
+ def get_metrics(self, count: int = 1, timeout: float = 5.0) ->
list[RecordedMetric]:
+ deadline = time.monotonic() + timeout
+ metrics = []
+ for _ in range(count):
+ remaining = deadline - time.monotonic()
+ if remaining <= 0:
+ raise TimeoutError(f"Timed out after receiving
{len(metrics)}/{count} metrics")
+ metrics.append(self.get_metric(timeout=remaining))
+ return metrics
+
+ def wait_for_metric(self, *, name: str | None = None, timeout: float =
5.0) -> RecordedMetric:
+ deadline = time.monotonic() + timeout
+ while True:
+ remaining = deadline - time.monotonic()
+ if remaining <= 0:
+ raise TimeoutError(f"No metric with name={name!r} received
within {timeout}s")
+ try:
+ recorded = self._metrics_queue.get(timeout=remaining)
+ except Empty:
+ raise TimeoutError(f"No metric with name={name!r} received
within {timeout}s") from None
+ if name is None or recorded.metric.name == name:
+ return recorded
+
+ def drain_metrics(self) -> list[RecordedMetric]:
+ result = []
+ while True:
+ try:
+ result.append(self._metrics_queue.get_nowait())
+ except Empty:
+ return result
+
+ def get_log_record(self, timeout: float = 5.0) -> RecordedLogRecord:
+ try:
+ return self._logs_queue.get(timeout=timeout)
+ except Empty:
+ raise TimeoutError(f"No log record received within {timeout}s")
from None
+
+ def get_log_records(self, count: int = 1, timeout: float = 5.0) ->
list[RecordedLogRecord]:
+ deadline = time.monotonic() + timeout
+ log_records = []
+ for _ in range(count):
+ remaining = deadline - time.monotonic()
+ if remaining <= 0:
+ raise TimeoutError(f"Timed out after receiving
{len(log_records)}/{count} log records")
+ log_records.append(self.get_log_record(timeout=remaining))
+ return log_records
+
+ def wait_for_log_record(self, *, timeout: float = 5.0) ->
RecordedLogRecord:
+ try:
+ return self._logs_queue.get(timeout=timeout)
+ except Empty:
+ raise TimeoutError(f"No log record received within {timeout}s")
from None
+
+ def drain_log_records(self) -> list[RecordedLogRecord]:
+ result = []
+ while True:
+ try:
+ result.append(self._logs_queue.get_nowait())
+ except Empty:
+ return result
+
+ def clear(self) -> None:
+ for queue in (
+ self._spans_queue,
+ self._metrics_queue,
+ self._logs_queue,
+ ):
+ while True:
+ try:
+ queue.get_nowait()
+ except Empty:
+ break
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/asgitestutil.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/asgitestutil.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/asgitestutil.py
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/asgitestutil.py
2020-02-02 01:00:00.000000000 +0100
@@ -35,25 +35,19 @@
def tearDown(self):
if self.communicator:
- asyncio.get_event_loop().run_until_complete(
- self.communicator.wait()
- )
+
asyncio.get_event_loop().run_until_complete(self.communicator.wait())
def seed_app(self, app):
self.communicator = ApplicationCommunicator(app, self.scope)
def send_input(self, message):
- asyncio.get_event_loop().run_until_complete(
- self.communicator.send_input(message)
- )
+
asyncio.get_event_loop().run_until_complete(self.communicator.send_input(message))
def send_default_request(self):
self.send_input({"type": "http.request", "body": b""})
def get_output(self):
- output = asyncio.get_event_loop().run_until_complete(
- self.communicator.receive_output(0)
- )
+ output =
asyncio.get_event_loop().run_until_complete(self.communicator.receive_output(0))
return output
def get_all_output(self):
@@ -76,9 +70,7 @@
def tearDown(self):
if self.communicator:
- asyncio.get_event_loop().run_until_complete(
- self.communicator.wait()
- )
+
asyncio.get_event_loop().run_until_complete(self.communicator.wait())
def seed_app(self, app):
self.communicator = ApplicationCommunicator(app, self.scope)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/concurrency_test.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/concurrency_test.py
---
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/concurrency_test.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/concurrency_test.py
2020-02-02 01:00:00.000000000 +0100
@@ -68,10 +68,7 @@
barrier.wait()
results[idx] = func_to_test()
- threads = [
- threading.Thread(target=partial(thread_start, i))
- for i in range(num_threads)
- ]
+ threads = [threading.Thread(target=partial(thread_start, i)) for i in
range(num_threads)]
for thread in threads:
thread.start()
for thread in threads:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/globals_test.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/globals_test.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/globals_test.py
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/globals_test.py
2020-02-02 01:00:00.000000000 +0100
@@ -36,16 +36,10 @@
# pylint: disable=protected-access
def reset_event_globals() -> None:
- """WARNING: only use this for tests."""
- from opentelemetry import ( # pylint: disable=import-outside-toplevel #
noqa: PLC0415
- _events as events_api,
- )
-
- events_api._EVENT_LOGGER_PROVIDER_SET_ONCE = Once() # type:
ignore[attr-defined]
- events_api._EVENT_LOGGER_PROVIDER = None # type: ignore[attr-defined]
- events_api._PROXY_EVENT_LOGGER_PROVIDER = (
- events_api.ProxyEventLoggerProvider()
- ) # type: ignore[attr-defined]
+ """Deprecated no-op kept for backward compatibility.
+
+ The Events API has been removed; this function does nothing.
+ """
class TraceGlobalsTest(unittest.TestCase):
@@ -94,15 +88,13 @@
class EventsGlobalsTest(unittest.TestCase):
- """Resets logging API globals in setUp/tearDown
+ """Deprecated no-op kept for backward compatibility.
- Use as a base class or mixin for your test that modifies logging API
globals.
+ The Events API has been removed; this class does nothing.
"""
- def setUp(self) -> None:
+ def setUp(self) -> None: # pylint: disable=useless-parent-delegation
super().setUp()
- reset_event_globals()
- def tearDown(self) -> None:
+ def tearDown(self) -> None: # pylint: disable=useless-parent-delegation
super().tearDown()
- reset_event_globals()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/httptest.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/httptest.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/httptest.py
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/httptest.py
2020-02-02 01:00:00.000000000 +0100
@@ -39,9 +39,7 @@
@classmethod
def run_server(cls):
httpd = cls.create_server()
- worker = Thread(
- target=httpd.serve_forever, daemon=True, name="Test server worker"
- )
+ worker = Thread(target=httpd.serve_forever, daemon=True, name="Test
server worker")
worker.start()
return worker, httpd
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/metrictestutil.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/metrictestutil.py
---
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/metrictestutil.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/metrictestutil.py
2020-02-02 01:00:00.000000000 +0100
@@ -15,9 +15,7 @@
from opentelemetry.util.types import Attributes
-def _generate_metric(
- name, data, attributes=None, description=None, unit=None
-) -> Metric:
+def _generate_metric(name, data, attributes=None, description=None, unit=None)
-> Metric:
if description is None:
description = "foo"
if unit is None:
@@ -59,9 +57,7 @@
)
-def _generate_gauge(
- name, value, attributes=None, description=None, unit=None
-) -> Metric:
+def _generate_gauge(name, value, attributes=None, description=None, unit=None)
-> Metric:
if attributes is None:
attributes = BoundedAttributes(attributes={"a": 1, "b": True})
return _generate_metric(
@@ -81,9 +77,7 @@
)
-def _generate_unsupported_metric(
- name, attributes=None, description=None, unit=None
-) -> Metric:
+def _generate_unsupported_metric(name, attributes=None, description=None,
unit=None) -> Metric:
return _generate_metric(
name,
None,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/mock_textmap.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/mock_textmap.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/mock_textmap.py
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/mock_textmap.py
2020-02-02 01:00:00.000000000 +0100
@@ -80,12 +80,8 @@
setter: Setter = default_setter,
) -> None:
span = trace.get_current_span(context)
- setter.set(
- carrier, self.TRACE_ID_KEY, str(span.get_span_context().trace_id)
- )
- setter.set(
- carrier, self.SPAN_ID_KEY, str(span.get_span_context().span_id)
- )
+ setter.set(carrier, self.TRACE_ID_KEY,
str(span.get_span_context().trace_id))
+ setter.set(carrier, self.SPAN_ID_KEY,
str(span.get_span_context().span_id))
@property
def fields(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/samplertestutil.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/samplertestutil.py
---
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/samplertestutil.py
1970-01-01 01:00:00.000000000 +0100
+++
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/samplertestutil.py
2020-02-02 01:00:00.000000000 +0100
@@ -0,0 +1,67 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+from __future__ import annotations
+
+from collections.abc import Sequence
+
+from opentelemetry.context import Context
+from opentelemetry.sdk.trace.sampling import Decision, Sampler, SamplingResult
+from opentelemetry.trace import Link, SpanKind, TraceState, get_current_span
+from opentelemetry.util.types import Attributes, AttributeValue
+
+
+class CapturingSampler(Sampler):
+ """Sampler that records what the SDK passes to ``should_sample``.
+
+ Instrumentation tests use it to assert which span kind and attributes a
+ sampler can see when a span starts, for example request headers that have
+ to be available for sampling decisions.
+
+ Every span is recorded and sampled unless ``required_attributes`` is given,
+ in which case a span is dropped when any of these attributes is missing or
+ has a different value.
+ """
+
+ name: str | None
+ kind: SpanKind | None
+ attributes: dict[str, AttributeValue]
+
+ def __init__(self, required_attributes: Attributes = None) -> None:
+ self.required_attributes = dict(required_attributes or {})
+ self.name = None
+ self.kind = None
+ self.attributes = {}
+
+ def should_sample(
+ self,
+ parent_context: Context | None,
+ trace_id: int,
+ name: str,
+ kind: SpanKind | None = None,
+ attributes: Attributes = None,
+ links: Sequence[Link] | None = None,
+ trace_state: TraceState | None = None,
+ ) -> SamplingResult:
+ self.name = name
+ self.kind = kind
+ # Snapshot now so attributes set after span creation cannot hide a
regression.
+ self.attributes = dict(attributes or {})
+
+ decision = Decision.RECORD_AND_SAMPLE
+ if any(
+ key not in self.attributes or self.attributes[key] != value
+ for key, value in self.required_attributes.items()
+ ):
+ decision = Decision.DROP
+ attributes = None
+
+ parent_span_context =
get_current_span(parent_context).get_span_context()
+ return SamplingResult(
+ decision,
+ attributes,
+ parent_span_context.trace_state if parent_span_context.is_valid
else None,
+ )
+
+ def get_description(self) -> str:
+ return "CapturingSampler"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/spantestutil.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/spantestutil.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/spantestutil.py
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/spantestutil.py
2020-02-02 01:00:00.000000000 +0100
@@ -36,9 +36,7 @@
span_limits=trace_sdk.SpanLimits(),
resource=Resource(attributes=attributes),
)
- with tracer.start_as_current_span(
- "span", links=links, attributes=attributes
- ) as span:
+ with tracer.start_as_current_span("span", links=links,
attributes=attributes) as span:
for index in range(131):
span.add_event(f"event{index}", attributes=attributes)
return span
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/test_base.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/test_base.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/test_base.py
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/test_base.py
2020-02-02 01:00:00.000000000 +0100
@@ -58,15 +58,11 @@
reset_metrics_globals()
def get_finished_spans(self):
- return FinishedTestSpans(
- self, self.memory_exporter.get_finished_spans()
- )
+ return FinishedTestSpans(self,
self.memory_exporter.get_finished_spans())
def assertEqualSpanInstrumentationScope(self, span, module):
self.assertEqual(span.instrumentation_scope.name, module.__name__)
- self.assertEqual(
- span.instrumentation_scope.version, module.__version__
- )
+ self.assertEqual(span.instrumentation_scope.version,
module.__version__)
def assertSpanHasAttributes(self, span, attributes):
for key, val in attributes.items():
@@ -139,9 +135,7 @@
all metrics are returned.
"""
metrics_data = self.memory_metrics_reader.get_metrics_data()
- resource_metrics = (
- metrics_data.resource_metrics if metrics_data else []
- )
+ resource_metrics = metrics_data.resource_metrics if metrics_data else
[]
all_metrics = []
for metrics in resource_metrics:
@@ -168,13 +162,9 @@
expected_data_points: Sequence[DataPointT],
est_value_delta: float | None = 0,
):
- self.assertEqual(
- len(expected_data_points), len(metric.data.data_points)
- )
+ self.assertEqual(len(expected_data_points),
len(metric.data.data_points))
for expected_data_point in expected_data_points:
- self.assert_data_point_expected(
- expected_data_point, metric.data.data_points, est_value_delta
- )
+ self.assert_data_point_expected(expected_data_point,
metric.data.data_points, est_value_delta)
# pylint: disable=unidiomatic-typecheck
@staticmethod
@@ -183,9 +173,7 @@
data_point: DataPointT,
est_value_delta: float | None = 0,
):
- if type(expected_data_point) != type( # noqa: E721
- data_point
- ) or not isinstance(
+ if type(expected_data_point) != type(data_point) or not isinstance( #
noqa: E721
expected_data_point, (HistogramDataPoint, NumberDataPoint)
):
return False
@@ -197,23 +185,14 @@
values_diff = abs(expected_data_point.sum - data_point.sum)
if expected_data_point.count != data_point.count or (
est_value_delta == 0
- and (
- expected_data_point.min != data_point.min
- or expected_data_point.max != data_point.max
- )
+ and (expected_data_point.min != data_point.min or
expected_data_point.max != data_point.max)
):
return False
- if (
- expected_data_point.explicit_bounds
- != data_point.explicit_bounds
- ):
+ if expected_data_point.explicit_bounds !=
data_point.explicit_bounds:
return False
- return (
- values_diff <= est_value_delta
- and expected_data_point.attributes == dict(data_point.attributes)
- )
+ return values_diff <= est_value_delta and
expected_data_point.attributes == dict(data_point.attributes)
def assert_data_point_expected(
self,
@@ -223,9 +202,7 @@
):
is_data_point_exist = False
for data_point in data_points:
- if self.is_data_points_equal(
- expected_data_point, data_point, est_value_delta
- ):
+ if self.is_data_points_equal(expected_data_point, data_point,
est_value_delta):
is_data_point_exist = True
break
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/version/__init__.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/version/__init__.py
---
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/version/__init__.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/version/__init__.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_test_utils-0.64b0/src/opentelemetry/test/weaver_live_check.py
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/weaver_live_check.py
---
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/weaver_live_check.py
2020-02-02 01:00:00.000000000 +0100
+++
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/weaver_live_check.py
2020-02-02 01:00:00.000000000 +0100
@@ -47,11 +47,9 @@
result: list[dict] = []
lcr = obj.get("live_check_result")
if isinstance(lcr, dict):
- advices = lcr.get("all_advice")
- if isinstance(advices, list):
- result.extend(
- a for a in advices if a.get("level") == "violation"
- )
+ advice_list = lcr.get("all_advice")
+ if isinstance(advice_list, list):
+ result.extend(a for a in advice_list if a.get("level") ==
"violation")
for value in obj.values():
result.extend(_collect(value))
return result
@@ -67,9 +65,7 @@
key = (
violation.get("id"),
violation.get("message"),
- json.dumps(ctx, sort_keys=True)
- if isinstance(ctx, (dict, list))
- else ctx,
+ json.dumps(ctx, sort_keys=True) if isinstance(ctx, (dict, list))
else ctx,
violation.get("signal_name"),
violation.get("signal_type"),
)
@@ -79,9 +75,7 @@
{
"id": k[0],
"message": k[1],
- "context": vs[0].get(
- "context"
- ), # preserve original dict, not JSON string
+ "context": vs[0].get("context"), # preserve original dict, not
JSON string
"signal_name": k[3],
"signal_type": k[4],
"count": len(vs),
@@ -122,8 +116,7 @@
err = exc_info.value
assert any(
- v["id"] == "my_policy_check"
- and v["context"]["attribute_name"] == "my.attribute"
+ v["id"] == "my_policy_check" and v["context"]["attribute_name"] ==
"my.attribute"
for v in err.report.violations
)
"""
@@ -151,9 +144,7 @@
report = weaver.end()
assert any(
- v["id"] == "my_policy_check"
- and v["context"]["attribute_name"] == "my.attribute"
- for v in report.violations
+ v["id"] == "my_policy_check" and v["context"]["attribute_name"] ==
"my.attribute" for v in report.violations
)
"""
@@ -200,9 +191,7 @@
def test_my_telemetry(self):
with WeaverLiveCheck() as weaver:
- exporter = OTLPSpanExporter(
- endpoint=weaver.otlp_endpoint, insecure=True
- )
+ exporter = OTLPSpanExporter(endpoint=weaver.otlp_endpoint,
insecure=True)
# ... configure provider, emit telemetry ...
provider.force_flush()
@@ -258,8 +247,7 @@
weaver_bin = shutil.which("weaver")
if not weaver_bin:
raise RuntimeError(
- "weaver binary not found on PATH. "
- "Install it from
https://github.com/open-telemetry/weaver/releases"
+ "weaver binary not found on PATH. Install it from
https://github.com/open-telemetry/weaver/releases"
)
self._otlp_port = otlp_port or _find_free_port()
@@ -302,7 +290,7 @@
def __enter__(self) -> "WeaverLiveCheck":
return self.start()
- def __exit__(self, exc_type: Any, *_: Any) -> None:
+ def __exit__(self, exc_type: Any, *_: object) -> None:
if exc_type is not None:
self._stopped = True
self.close()
@@ -310,12 +298,8 @@
def start(self) -> "WeaverLiveCheck":
logger.debug("Starting WeaverLiveCheck process...")
# Redirect weaver's stdout/stderr to tempfiles
- stdout_fd, self._stdout_path = tempfile.mkstemp(
- prefix="weaver-stdout-", suffix=".log"
- )
- stderr_fd, self._stderr_path = tempfile.mkstemp(
- prefix="weaver-stderr-", suffix=".log"
- )
+ stdout_fd, self._stdout_path =
tempfile.mkstemp(prefix="weaver-stdout-", suffix=".log")
+ stderr_fd, self._stderr_path =
tempfile.mkstemp(prefix="weaver-stderr-", suffix=".log")
try:
self._process = subprocess.Popen( # pylint:
disable=consider-using-with
self._command,
@@ -330,9 +314,7 @@
self._ready = True
except Exception as exc: # pylint: disable=broad-except
logs = self._read_weaver_logs()
- logger.error(
- "WeaverLiveCheck did not start: %s, logs: %s", exc, logs
- )
+ logger.error("WeaverLiveCheck did not start: %s, logs: %s", exc,
logs)
raise
return self
@@ -349,17 +331,13 @@
session = Session()
session.mount("http://", HTTPAdapter(max_retries=retry))
try:
- session.get(
- f"http://localhost:{self._admin_port}/health", timeout=5
- )
+ session.get(f"http://localhost:{self._admin_port}/health",
timeout=5)
except Exception as exc: # pylint: disable=broad-except
if self._process is not None and self._process.poll() is not None:
raise RuntimeError(
f"WeaverLiveCheck process exited unexpectedly (code
{self._process.returncode})"
) from exc
- raise TimeoutError(
- "WeaverLiveCheck did not become ready in time"
- ) from exc
+ raise TimeoutError("WeaverLiveCheck did not become ready in time")
from exc
@property
def otlp_endpoint(self) -> str:
@@ -372,22 +350,16 @@
Never raises for semconv violations.
"""
if not self._ready:
- raise RuntimeError(
- "WeaverLiveCheck process did not start successfully"
- )
+ raise RuntimeError("WeaverLiveCheck process did not start
successfully")
try:
- response = post(
- f"http://localhost:{self._admin_port}/stop", timeout=5
- )
+ response = post(f"http://localhost:{self._admin_port}/stop",
timeout=5)
response.raise_for_status()
report = LiveCheckReport(response.json())
assert self._process is not None
exit_code = self._process.wait(timeout=timeout)
except Exception as exc: # pylint: disable=broad-except
logs = self._read_weaver_logs()
- logger.error(
- "Error communicating with weaver: %s, logs: %s", exc, logs
- )
+ logger.error("Error communicating with weaver: %s, logs: %s", exc,
logs)
raise
return report, exit_code
@@ -405,9 +377,7 @@
for the report structure.
"""
if self._stopped:
- logger.warning(
- "end() called after weaver already stopped; returning empty
report"
- )
+ logger.warning("end() called after weaver already stopped;
returning empty report")
return LiveCheckReport({})
self._stopped = True
report, _ = self._do_stop(timeout)
@@ -429,9 +399,7 @@
to start, HTTP communication error, etc.).
"""
if self._stopped:
- logger.warning(
- "end_and_check() called after weaver already stopped;
returning empty report"
- )
+ logger.warning("end_and_check() called after weaver already
stopped; returning empty report")
return LiveCheckReport({})
self._stopped = True
report, exit_code = self._do_stop(timeout)