sim16/matteo_env/Lib/site-packages/aiohttp/tracing.py

473 lines
15 KiB
Python
Raw Normal View History

2020-12-20 00:08:09 +00:00
from types import SimpleNamespace
2022-09-18 13:17:20 +00:00
from typing import TYPE_CHECKING, Awaitable, Optional, Type, TypeVar
2020-12-20 00:08:09 +00:00
import attr
2022-09-18 13:17:20 +00:00
from aiosignal import Signal
from multidict import CIMultiDict
2020-12-20 00:08:09 +00:00
from yarl import URL
from .client_reqrep import ClientResponse
if TYPE_CHECKING: # pragma: no cover
2022-09-18 13:17:20 +00:00
from .client import ClientSession
from .typedefs import Protocol
_ParamT_contra = TypeVar("_ParamT_contra", contravariant=True)
class _SignalCallback(Protocol[_ParamT_contra]):
def __call__(
self,
__client_session: ClientSession,
__trace_config_ctx: SimpleNamespace,
__params: _ParamT_contra,
) -> Awaitable[None]:
...
2020-12-20 00:08:09 +00:00
__all__ = (
2022-09-18 13:17:20 +00:00
"TraceConfig",
"TraceRequestStartParams",
"TraceRequestEndParams",
"TraceRequestExceptionParams",
"TraceConnectionQueuedStartParams",
"TraceConnectionQueuedEndParams",
"TraceConnectionCreateStartParams",
"TraceConnectionCreateEndParams",
"TraceConnectionReuseconnParams",
"TraceDnsResolveHostStartParams",
"TraceDnsResolveHostEndParams",
"TraceDnsCacheHitParams",
"TraceDnsCacheMissParams",
"TraceRequestRedirectParams",
"TraceRequestChunkSentParams",
"TraceResponseChunkReceivedParams",
"TraceRequestHeadersSentParams",
2020-12-20 00:08:09 +00:00
)
class TraceConfig:
2022-09-18 13:17:20 +00:00
"""First-class used to trace requests launched via ClientSession objects."""
2020-12-20 00:08:09 +00:00
def __init__(
2022-09-18 13:17:20 +00:00
self, trace_config_ctx_factory: Type[SimpleNamespace] = SimpleNamespace
2020-12-20 00:08:09 +00:00
) -> None:
2022-09-18 13:17:20 +00:00
self._on_request_start = Signal(
self
) # type: Signal[_SignalCallback[TraceRequestStartParams]]
self._on_request_chunk_sent = Signal(
self
) # type: Signal[_SignalCallback[TraceRequestChunkSentParams]]
self._on_response_chunk_received = Signal(
self
) # type: Signal[_SignalCallback[TraceResponseChunkReceivedParams]]
self._on_request_end = Signal(
self
) # type: Signal[_SignalCallback[TraceRequestEndParams]]
self._on_request_exception = Signal(
self
) # type: Signal[_SignalCallback[TraceRequestExceptionParams]]
self._on_request_redirect = Signal(
self
) # type: Signal[_SignalCallback[TraceRequestRedirectParams]]
self._on_connection_queued_start = Signal(
self
) # type: Signal[_SignalCallback[TraceConnectionQueuedStartParams]]
self._on_connection_queued_end = Signal(
self
) # type: Signal[_SignalCallback[TraceConnectionQueuedEndParams]]
self._on_connection_create_start = Signal(
self
) # type: Signal[_SignalCallback[TraceConnectionCreateStartParams]]
self._on_connection_create_end = Signal(
self
) # type: Signal[_SignalCallback[TraceConnectionCreateEndParams]]
self._on_connection_reuseconn = Signal(
self
) # type: Signal[_SignalCallback[TraceConnectionReuseconnParams]]
self._on_dns_resolvehost_start = Signal(
self
) # type: Signal[_SignalCallback[TraceDnsResolveHostStartParams]]
self._on_dns_resolvehost_end = Signal(
self
) # type: Signal[_SignalCallback[TraceDnsResolveHostEndParams]]
self._on_dns_cache_hit = Signal(
self
) # type: Signal[_SignalCallback[TraceDnsCacheHitParams]]
self._on_dns_cache_miss = Signal(
self
) # type: Signal[_SignalCallback[TraceDnsCacheMissParams]]
self._on_request_headers_sent = Signal(
self
) # type: Signal[_SignalCallback[TraceRequestHeadersSentParams]]
self._trace_config_ctx_factory = trace_config_ctx_factory
2020-12-20 00:08:09 +00:00
def trace_config_ctx(
2022-09-18 13:17:20 +00:00
self, trace_request_ctx: Optional[SimpleNamespace] = None
) -> SimpleNamespace:
"""Return a new trace_config_ctx instance"""
return self._trace_config_ctx_factory(trace_request_ctx=trace_request_ctx)
2020-12-20 00:08:09 +00:00
def freeze(self) -> None:
self._on_request_start.freeze()
self._on_request_chunk_sent.freeze()
self._on_response_chunk_received.freeze()
self._on_request_end.freeze()
self._on_request_exception.freeze()
self._on_request_redirect.freeze()
self._on_connection_queued_start.freeze()
self._on_connection_queued_end.freeze()
self._on_connection_create_start.freeze()
self._on_connection_create_end.freeze()
self._on_connection_reuseconn.freeze()
self._on_dns_resolvehost_start.freeze()
self._on_dns_resolvehost_end.freeze()
self._on_dns_cache_hit.freeze()
self._on_dns_cache_miss.freeze()
2022-09-18 13:17:20 +00:00
self._on_request_headers_sent.freeze()
2020-12-20 00:08:09 +00:00
@property
2022-09-18 13:17:20 +00:00
def on_request_start(self) -> "Signal[_SignalCallback[TraceRequestStartParams]]":
2020-12-20 00:08:09 +00:00
return self._on_request_start
@property
2022-09-18 13:17:20 +00:00
def on_request_chunk_sent(
self,
) -> "Signal[_SignalCallback[TraceRequestChunkSentParams]]":
2020-12-20 00:08:09 +00:00
return self._on_request_chunk_sent
@property
2022-09-18 13:17:20 +00:00
def on_response_chunk_received(
self,
) -> "Signal[_SignalCallback[TraceResponseChunkReceivedParams]]":
2020-12-20 00:08:09 +00:00
return self._on_response_chunk_received
@property
2022-09-18 13:17:20 +00:00
def on_request_end(self) -> "Signal[_SignalCallback[TraceRequestEndParams]]":
2020-12-20 00:08:09 +00:00
return self._on_request_end
@property
2022-09-18 13:17:20 +00:00
def on_request_exception(
self,
) -> "Signal[_SignalCallback[TraceRequestExceptionParams]]":
2020-12-20 00:08:09 +00:00
return self._on_request_exception
@property
2022-09-18 13:17:20 +00:00
def on_request_redirect(
self,
) -> "Signal[_SignalCallback[TraceRequestRedirectParams]]":
2020-12-20 00:08:09 +00:00
return self._on_request_redirect
@property
2022-09-18 13:17:20 +00:00
def on_connection_queued_start(
self,
) -> "Signal[_SignalCallback[TraceConnectionQueuedStartParams]]":
2020-12-20 00:08:09 +00:00
return self._on_connection_queued_start
@property
2022-09-18 13:17:20 +00:00
def on_connection_queued_end(
self,
) -> "Signal[_SignalCallback[TraceConnectionQueuedEndParams]]":
2020-12-20 00:08:09 +00:00
return self._on_connection_queued_end
@property
2022-09-18 13:17:20 +00:00
def on_connection_create_start(
self,
) -> "Signal[_SignalCallback[TraceConnectionCreateStartParams]]":
2020-12-20 00:08:09 +00:00
return self._on_connection_create_start
@property
2022-09-18 13:17:20 +00:00
def on_connection_create_end(
self,
) -> "Signal[_SignalCallback[TraceConnectionCreateEndParams]]":
2020-12-20 00:08:09 +00:00
return self._on_connection_create_end
@property
2022-09-18 13:17:20 +00:00
def on_connection_reuseconn(
self,
) -> "Signal[_SignalCallback[TraceConnectionReuseconnParams]]":
2020-12-20 00:08:09 +00:00
return self._on_connection_reuseconn
@property
2022-09-18 13:17:20 +00:00
def on_dns_resolvehost_start(
self,
) -> "Signal[_SignalCallback[TraceDnsResolveHostStartParams]]":
2020-12-20 00:08:09 +00:00
return self._on_dns_resolvehost_start
@property
2022-09-18 13:17:20 +00:00
def on_dns_resolvehost_end(
self,
) -> "Signal[_SignalCallback[TraceDnsResolveHostEndParams]]":
2020-12-20 00:08:09 +00:00
return self._on_dns_resolvehost_end
@property
2022-09-18 13:17:20 +00:00
def on_dns_cache_hit(self) -> "Signal[_SignalCallback[TraceDnsCacheHitParams]]":
2020-12-20 00:08:09 +00:00
return self._on_dns_cache_hit
@property
2022-09-18 13:17:20 +00:00
def on_dns_cache_miss(self) -> "Signal[_SignalCallback[TraceDnsCacheMissParams]]":
2020-12-20 00:08:09 +00:00
return self._on_dns_cache_miss
2022-09-18 13:17:20 +00:00
@property
def on_request_headers_sent(
self,
) -> "Signal[_SignalCallback[TraceRequestHeadersSentParams]]":
return self._on_request_headers_sent
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceRequestStartParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_request_start` signal"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
method: str
url: URL
headers: "CIMultiDict[str]"
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceRequestChunkSentParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_request_chunk_sent` signal"""
method: str
url: URL
chunk: bytes
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceResponseChunkReceivedParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_response_chunk_received` signal"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
method: str
url: URL
chunk: bytes
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceRequestEndParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_request_end` signal"""
method: str
url: URL
headers: "CIMultiDict[str]"
response: ClientResponse
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceRequestExceptionParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_request_exception` signal"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
method: str
url: URL
headers: "CIMultiDict[str]"
exception: BaseException
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceRequestRedirectParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_request_redirect` signal"""
method: str
url: URL
headers: "CIMultiDict[str]"
response: ClientResponse
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceConnectionQueuedStartParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_connection_queued_start` signal"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceConnectionQueuedEndParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_connection_queued_end` signal"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceConnectionCreateStartParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_connection_create_start` signal"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceConnectionCreateEndParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_connection_create_end` signal"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceConnectionReuseconnParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_connection_reuseconn` signal"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceDnsResolveHostStartParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_dns_resolvehost_start` signal"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
host: str
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceDnsResolveHostEndParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_dns_resolvehost_end` signal"""
host: str
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceDnsCacheHitParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_dns_cache_hit` signal"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
host: str
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
@attr.s(auto_attribs=True, frozen=True, slots=True)
2020-12-20 00:08:09 +00:00
class TraceDnsCacheMissParams:
2022-09-18 13:17:20 +00:00
"""Parameters sent by the `on_dns_cache_miss` signal"""
host: str
@attr.s(auto_attribs=True, frozen=True, slots=True)
class TraceRequestHeadersSentParams:
"""Parameters sent by the `on_request_headers_sent` signal"""
method: str
url: URL
headers: "CIMultiDict[str]"
2020-12-20 00:08:09 +00:00
class Trace:
2022-09-18 13:17:20 +00:00
"""Internal dependency holder class.
Used to keep together the main dependencies used
at the moment of send a signal.
"""
2020-12-20 00:08:09 +00:00
2022-09-18 13:17:20 +00:00
def __init__(
self,
session: "ClientSession",
trace_config: TraceConfig,
trace_config_ctx: SimpleNamespace,
) -> None:
2020-12-20 00:08:09 +00:00
self._trace_config = trace_config
self._trace_config_ctx = trace_config_ctx
self._session = session
2022-09-18 13:17:20 +00:00
async def send_request_start(
self, method: str, url: URL, headers: "CIMultiDict[str]"
) -> None:
2020-12-20 00:08:09 +00:00
return await self._trace_config.on_request_start.send(
self._session,
self._trace_config_ctx,
2022-09-18 13:17:20 +00:00
TraceRequestStartParams(method, url, headers),
2020-12-20 00:08:09 +00:00
)
2022-09-18 13:17:20 +00:00
async def send_request_chunk_sent(
self, method: str, url: URL, chunk: bytes
) -> None:
2020-12-20 00:08:09 +00:00
return await self._trace_config.on_request_chunk_sent.send(
self._session,
self._trace_config_ctx,
2022-09-18 13:17:20 +00:00
TraceRequestChunkSentParams(method, url, chunk),
2020-12-20 00:08:09 +00:00
)
2022-09-18 13:17:20 +00:00
async def send_response_chunk_received(
self, method: str, url: URL, chunk: bytes
) -> None:
2020-12-20 00:08:09 +00:00
return await self._trace_config.on_response_chunk_received.send(
self._session,
self._trace_config_ctx,
2022-09-18 13:17:20 +00:00
TraceResponseChunkReceivedParams(method, url, chunk),
2020-12-20 00:08:09 +00:00
)
2022-09-18 13:17:20 +00:00
async def send_request_end(
self,
method: str,
url: URL,
headers: "CIMultiDict[str]",
response: ClientResponse,
) -> None:
2020-12-20 00:08:09 +00:00
return await self._trace_config.on_request_end.send(
self._session,
self._trace_config_ctx,
2022-09-18 13:17:20 +00:00
TraceRequestEndParams(method, url, headers, response),
2020-12-20 00:08:09 +00:00
)
2022-09-18 13:17:20 +00:00
async def send_request_exception(
self,
method: str,
url: URL,
headers: "CIMultiDict[str]",
exception: BaseException,
) -> None:
2020-12-20 00:08:09 +00:00
return await self._trace_config.on_request_exception.send(
self._session,
self._trace_config_ctx,
2022-09-18 13:17:20 +00:00
TraceRequestExceptionParams(method, url, headers, exception),
2020-12-20 00:08:09 +00:00
)
2022-09-18 13:17:20 +00:00
async def send_request_redirect(
self,
method: str,
url: URL,
headers: "CIMultiDict[str]",
response: ClientResponse,
) -> None:
2020-12-20 00:08:09 +00:00
return await self._trace_config._on_request_redirect.send(
self._session,
self._trace_config_ctx,
2022-09-18 13:17:20 +00:00
TraceRequestRedirectParams(method, url, headers, response),
2020-12-20 00:08:09 +00:00
)
async def send_connection_queued_start(self) -> None:
return await self._trace_config.on_connection_queued_start.send(
2022-09-18 13:17:20 +00:00
self._session, self._trace_config_ctx, TraceConnectionQueuedStartParams()
2020-12-20 00:08:09 +00:00
)
async def send_connection_queued_end(self) -> None:
return await self._trace_config.on_connection_queued_end.send(
2022-09-18 13:17:20 +00:00
self._session, self._trace_config_ctx, TraceConnectionQueuedEndParams()
2020-12-20 00:08:09 +00:00
)
async def send_connection_create_start(self) -> None:
return await self._trace_config.on_connection_create_start.send(
2022-09-18 13:17:20 +00:00
self._session, self._trace_config_ctx, TraceConnectionCreateStartParams()
2020-12-20 00:08:09 +00:00
)
async def send_connection_create_end(self) -> None:
return await self._trace_config.on_connection_create_end.send(
2022-09-18 13:17:20 +00:00
self._session, self._trace_config_ctx, TraceConnectionCreateEndParams()
2020-12-20 00:08:09 +00:00
)
async def send_connection_reuseconn(self) -> None:
return await self._trace_config.on_connection_reuseconn.send(
2022-09-18 13:17:20 +00:00
self._session, self._trace_config_ctx, TraceConnectionReuseconnParams()
2020-12-20 00:08:09 +00:00
)
async def send_dns_resolvehost_start(self, host: str) -> None:
return await self._trace_config.on_dns_resolvehost_start.send(
2022-09-18 13:17:20 +00:00
self._session, self._trace_config_ctx, TraceDnsResolveHostStartParams(host)
2020-12-20 00:08:09 +00:00
)
async def send_dns_resolvehost_end(self, host: str) -> None:
return await self._trace_config.on_dns_resolvehost_end.send(
2022-09-18 13:17:20 +00:00
self._session, self._trace_config_ctx, TraceDnsResolveHostEndParams(host)
2020-12-20 00:08:09 +00:00
)
async def send_dns_cache_hit(self, host: str) -> None:
return await self._trace_config.on_dns_cache_hit.send(
2022-09-18 13:17:20 +00:00
self._session, self._trace_config_ctx, TraceDnsCacheHitParams(host)
2020-12-20 00:08:09 +00:00
)
async def send_dns_cache_miss(self, host: str) -> None:
return await self._trace_config.on_dns_cache_miss.send(
2022-09-18 13:17:20 +00:00
self._session, self._trace_config_ctx, TraceDnsCacheMissParams(host)
)
async def send_request_headers(
self, method: str, url: URL, headers: "CIMultiDict[str]"
) -> None:
return await self._trace_config._on_request_headers_sent.send(
2020-12-20 00:08:09 +00:00
self._session,
self._trace_config_ctx,
2022-09-18 13:17:20 +00:00
TraceRequestHeadersSentParams(method, url, headers),
2020-12-20 00:08:09 +00:00
)