Coverage for /pythoncovmergedfiles/medio/medio/src/aiohttp/aiohttp/tracing.py: 64%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from types import SimpleNamespace
2from typing import TYPE_CHECKING, Any, Awaitable, Generic, Protocol, TypeVar, overload
4from aiosignal import Signal
5from multidict import CIMultiDict
6from yarl import URL
8from .client_reqrep import ClientResponse
9from .helpers import frozen_dataclass_decorator
11if TYPE_CHECKING:
12 from .client import ClientSession
14 _ParamT_contra = TypeVar("_ParamT_contra", contravariant=True)
16 class _SignalCallback(Protocol[_ParamT_contra]):
17 def __call__(
18 self,
19 __client_session: ClientSession,
20 __trace_config_ctx: SimpleNamespace,
21 __params: _ParamT_contra,
22 ) -> Awaitable[None]: ...
25__all__ = (
26 "TraceConfig",
27 "TraceRequestStartParams",
28 "TraceRequestEndParams",
29 "TraceRequestExceptionParams",
30 "TraceConnectionQueuedStartParams",
31 "TraceConnectionQueuedEndParams",
32 "TraceConnectionCreateStartParams",
33 "TraceConnectionCreateEndParams",
34 "TraceConnectionReuseconnParams",
35 "TraceDnsResolveHostStartParams",
36 "TraceDnsResolveHostEndParams",
37 "TraceDnsCacheHitParams",
38 "TraceDnsCacheMissParams",
39 "TraceRequestRedirectParams",
40 "TraceRequestChunkSentParams",
41 "TraceResponseChunkReceivedParams",
42 "TraceRequestHeadersSentParams",
43)
45_T = TypeVar("_T", covariant=True)
48class _Factory(Protocol[_T]):
49 def __call__(self, **kwargs: Any) -> _T: ...
52class TraceConfig(Generic[_T]):
53 """First-class used to trace requests launched via ClientSession objects."""
55 @overload
56 def __init__(self: "TraceConfig[SimpleNamespace]") -> None: ...
57 @overload
58 def __init__(self, trace_config_ctx_factory: _Factory[_T]) -> None: ...
59 def __init__(
60 self, trace_config_ctx_factory: _Factory[Any] = SimpleNamespace
61 ) -> None:
62 self._on_request_start: Signal[_SignalCallback[TraceRequestStartParams]] = (
63 Signal(self)
64 )
65 self._on_request_chunk_sent: Signal[
66 _SignalCallback[TraceRequestChunkSentParams]
67 ] = Signal(self)
68 self._on_response_chunk_received: Signal[
69 _SignalCallback[TraceResponseChunkReceivedParams]
70 ] = Signal(self)
71 self._on_request_end: Signal[_SignalCallback[TraceRequestEndParams]] = Signal(
72 self
73 )
74 self._on_request_exception: Signal[
75 _SignalCallback[TraceRequestExceptionParams]
76 ] = Signal(self)
77 self._on_request_redirect: Signal[
78 _SignalCallback[TraceRequestRedirectParams]
79 ] = Signal(self)
80 self._on_connection_queued_start: Signal[
81 _SignalCallback[TraceConnectionQueuedStartParams]
82 ] = Signal(self)
83 self._on_connection_queued_end: Signal[
84 _SignalCallback[TraceConnectionQueuedEndParams]
85 ] = Signal(self)
86 self._on_connection_create_start: Signal[
87 _SignalCallback[TraceConnectionCreateStartParams]
88 ] = Signal(self)
89 self._on_connection_create_end: Signal[
90 _SignalCallback[TraceConnectionCreateEndParams]
91 ] = Signal(self)
92 self._on_connection_reuseconn: Signal[
93 _SignalCallback[TraceConnectionReuseconnParams]
94 ] = Signal(self)
95 self._on_dns_resolvehost_start: Signal[
96 _SignalCallback[TraceDnsResolveHostStartParams]
97 ] = Signal(self)
98 self._on_dns_resolvehost_end: Signal[
99 _SignalCallback[TraceDnsResolveHostEndParams]
100 ] = Signal(self)
101 self._on_dns_cache_hit: Signal[_SignalCallback[TraceDnsCacheHitParams]] = (
102 Signal(self)
103 )
104 self._on_dns_cache_miss: Signal[_SignalCallback[TraceDnsCacheMissParams]] = (
105 Signal(self)
106 )
107 self._on_request_headers_sent: Signal[
108 _SignalCallback[TraceRequestHeadersSentParams]
109 ] = Signal(self)
111 self._trace_config_ctx_factory: _Factory[_T] = trace_config_ctx_factory
113 def trace_config_ctx(self, trace_request_ctx: Any = None) -> _T:
114 """Return a new trace_config_ctx instance"""
115 return self._trace_config_ctx_factory(trace_request_ctx=trace_request_ctx)
117 def freeze(self) -> None:
118 self._on_request_start.freeze()
119 self._on_request_chunk_sent.freeze()
120 self._on_response_chunk_received.freeze()
121 self._on_request_end.freeze()
122 self._on_request_exception.freeze()
123 self._on_request_redirect.freeze()
124 self._on_connection_queued_start.freeze()
125 self._on_connection_queued_end.freeze()
126 self._on_connection_create_start.freeze()
127 self._on_connection_create_end.freeze()
128 self._on_connection_reuseconn.freeze()
129 self._on_dns_resolvehost_start.freeze()
130 self._on_dns_resolvehost_end.freeze()
131 self._on_dns_cache_hit.freeze()
132 self._on_dns_cache_miss.freeze()
133 self._on_request_headers_sent.freeze()
135 @property
136 def on_request_start(self) -> "Signal[_SignalCallback[TraceRequestStartParams]]":
137 return self._on_request_start
139 @property
140 def on_request_chunk_sent(
141 self,
142 ) -> "Signal[_SignalCallback[TraceRequestChunkSentParams]]":
143 return self._on_request_chunk_sent
145 @property
146 def on_response_chunk_received(
147 self,
148 ) -> "Signal[_SignalCallback[TraceResponseChunkReceivedParams]]":
149 return self._on_response_chunk_received
151 @property
152 def on_request_end(self) -> "Signal[_SignalCallback[TraceRequestEndParams]]":
153 return self._on_request_end
155 @property
156 def on_request_exception(
157 self,
158 ) -> "Signal[_SignalCallback[TraceRequestExceptionParams]]":
159 return self._on_request_exception
161 @property
162 def on_request_redirect(
163 self,
164 ) -> "Signal[_SignalCallback[TraceRequestRedirectParams]]":
165 return self._on_request_redirect
167 @property
168 def on_connection_queued_start(
169 self,
170 ) -> "Signal[_SignalCallback[TraceConnectionQueuedStartParams]]":
171 return self._on_connection_queued_start
173 @property
174 def on_connection_queued_end(
175 self,
176 ) -> "Signal[_SignalCallback[TraceConnectionQueuedEndParams]]":
177 return self._on_connection_queued_end
179 @property
180 def on_connection_create_start(
181 self,
182 ) -> "Signal[_SignalCallback[TraceConnectionCreateStartParams]]":
183 return self._on_connection_create_start
185 @property
186 def on_connection_create_end(
187 self,
188 ) -> "Signal[_SignalCallback[TraceConnectionCreateEndParams]]":
189 return self._on_connection_create_end
191 @property
192 def on_connection_reuseconn(
193 self,
194 ) -> "Signal[_SignalCallback[TraceConnectionReuseconnParams]]":
195 return self._on_connection_reuseconn
197 @property
198 def on_dns_resolvehost_start(
199 self,
200 ) -> "Signal[_SignalCallback[TraceDnsResolveHostStartParams]]":
201 return self._on_dns_resolvehost_start
203 @property
204 def on_dns_resolvehost_end(
205 self,
206 ) -> "Signal[_SignalCallback[TraceDnsResolveHostEndParams]]":
207 return self._on_dns_resolvehost_end
209 @property
210 def on_dns_cache_hit(self) -> "Signal[_SignalCallback[TraceDnsCacheHitParams]]":
211 return self._on_dns_cache_hit
213 @property
214 def on_dns_cache_miss(self) -> "Signal[_SignalCallback[TraceDnsCacheMissParams]]":
215 return self._on_dns_cache_miss
217 @property
218 def on_request_headers_sent(
219 self,
220 ) -> "Signal[_SignalCallback[TraceRequestHeadersSentParams]]":
221 return self._on_request_headers_sent
224@frozen_dataclass_decorator
225class TraceRequestStartParams:
226 """Parameters sent by the `on_request_start` signal"""
228 method: str
229 url: URL
230 headers: "CIMultiDict[str]"
233@frozen_dataclass_decorator
234class TraceRequestChunkSentParams:
235 """Parameters sent by the `on_request_chunk_sent` signal"""
237 method: str
238 url: URL
239 chunk: bytes
242@frozen_dataclass_decorator
243class TraceResponseChunkReceivedParams:
244 """Parameters sent by the `on_response_chunk_received` signal"""
246 method: str
247 url: URL
248 chunk: bytes
251@frozen_dataclass_decorator
252class TraceRequestEndParams:
253 """Parameters sent by the `on_request_end` signal"""
255 method: str
256 url: URL
257 headers: "CIMultiDict[str]"
258 response: ClientResponse
261@frozen_dataclass_decorator
262class TraceRequestExceptionParams:
263 """Parameters sent by the `on_request_exception` signal"""
265 method: str
266 url: URL
267 headers: "CIMultiDict[str]"
268 exception: BaseException
271@frozen_dataclass_decorator
272class TraceRequestRedirectParams:
273 """Parameters sent by the `on_request_redirect` signal"""
275 method: str
276 url: URL
277 headers: "CIMultiDict[str]"
278 response: ClientResponse
281@frozen_dataclass_decorator
282class TraceConnectionQueuedStartParams:
283 """Parameters sent by the `on_connection_queued_start` signal"""
286@frozen_dataclass_decorator
287class TraceConnectionQueuedEndParams:
288 """Parameters sent by the `on_connection_queued_end` signal"""
291@frozen_dataclass_decorator
292class TraceConnectionCreateStartParams:
293 """Parameters sent by the `on_connection_create_start` signal"""
296@frozen_dataclass_decorator
297class TraceConnectionCreateEndParams:
298 """Parameters sent by the `on_connection_create_end` signal"""
301@frozen_dataclass_decorator
302class TraceConnectionReuseconnParams:
303 """Parameters sent by the `on_connection_reuseconn` signal"""
306@frozen_dataclass_decorator
307class TraceDnsResolveHostStartParams:
308 """Parameters sent by the `on_dns_resolvehost_start` signal"""
310 host: str
313@frozen_dataclass_decorator
314class TraceDnsResolveHostEndParams:
315 """Parameters sent by the `on_dns_resolvehost_end` signal"""
317 host: str
320@frozen_dataclass_decorator
321class TraceDnsCacheHitParams:
322 """Parameters sent by the `on_dns_cache_hit` signal"""
324 host: str
327@frozen_dataclass_decorator
328class TraceDnsCacheMissParams:
329 """Parameters sent by the `on_dns_cache_miss` signal"""
331 host: str
334@frozen_dataclass_decorator
335class TraceRequestHeadersSentParams:
336 """Parameters sent by the `on_request_headers_sent` signal"""
338 method: str
339 url: URL
340 headers: "CIMultiDict[str]"
343class Trace:
344 """Internal dependency holder class.
346 Used to keep together the main dependencies used
347 at the moment of send a signal.
348 """
350 def __init__(
351 self,
352 session: "ClientSession",
353 trace_config: TraceConfig[object],
354 trace_config_ctx: Any,
355 ) -> None:
356 self._trace_config = trace_config
357 self._trace_config_ctx = trace_config_ctx
358 self._session = session
360 async def send_request_start(
361 self, method: str, url: URL, headers: "CIMultiDict[str]"
362 ) -> None:
363 return await self._trace_config.on_request_start.send(
364 self._session,
365 self._trace_config_ctx,
366 TraceRequestStartParams(method, url, headers),
367 )
369 async def send_request_chunk_sent(
370 self, method: str, url: URL, chunk: bytes
371 ) -> None:
372 return await self._trace_config.on_request_chunk_sent.send(
373 self._session,
374 self._trace_config_ctx,
375 TraceRequestChunkSentParams(method, url, chunk),
376 )
378 async def send_response_chunk_received(
379 self, method: str, url: URL, chunk: bytes
380 ) -> None:
381 return await self._trace_config.on_response_chunk_received.send(
382 self._session,
383 self._trace_config_ctx,
384 TraceResponseChunkReceivedParams(method, url, chunk),
385 )
387 async def send_request_end(
388 self,
389 method: str,
390 url: URL,
391 headers: "CIMultiDict[str]",
392 response: ClientResponse,
393 ) -> None:
394 return await self._trace_config.on_request_end.send(
395 self._session,
396 self._trace_config_ctx,
397 TraceRequestEndParams(method, url, headers, response),
398 )
400 async def send_request_exception(
401 self,
402 method: str,
403 url: URL,
404 headers: "CIMultiDict[str]",
405 exception: BaseException,
406 ) -> None:
407 return await self._trace_config.on_request_exception.send(
408 self._session,
409 self._trace_config_ctx,
410 TraceRequestExceptionParams(method, url, headers, exception),
411 )
413 async def send_request_redirect(
414 self,
415 method: str,
416 url: URL,
417 headers: "CIMultiDict[str]",
418 response: ClientResponse,
419 ) -> None:
420 return await self._trace_config._on_request_redirect.send(
421 self._session,
422 self._trace_config_ctx,
423 TraceRequestRedirectParams(method, url, headers, response),
424 )
426 async def send_connection_queued_start(self) -> None:
427 return await self._trace_config.on_connection_queued_start.send(
428 self._session, self._trace_config_ctx, TraceConnectionQueuedStartParams()
429 )
431 async def send_connection_queued_end(self) -> None:
432 return await self._trace_config.on_connection_queued_end.send(
433 self._session, self._trace_config_ctx, TraceConnectionQueuedEndParams()
434 )
436 async def send_connection_create_start(self) -> None:
437 return await self._trace_config.on_connection_create_start.send(
438 self._session, self._trace_config_ctx, TraceConnectionCreateStartParams()
439 )
441 async def send_connection_create_end(self) -> None:
442 return await self._trace_config.on_connection_create_end.send(
443 self._session, self._trace_config_ctx, TraceConnectionCreateEndParams()
444 )
446 async def send_connection_reuseconn(self) -> None:
447 return await self._trace_config.on_connection_reuseconn.send(
448 self._session, self._trace_config_ctx, TraceConnectionReuseconnParams()
449 )
451 async def send_dns_resolvehost_start(self, host: str) -> None:
452 return await self._trace_config.on_dns_resolvehost_start.send(
453 self._session, self._trace_config_ctx, TraceDnsResolveHostStartParams(host)
454 )
456 async def send_dns_resolvehost_end(self, host: str) -> None:
457 return await self._trace_config.on_dns_resolvehost_end.send(
458 self._session, self._trace_config_ctx, TraceDnsResolveHostEndParams(host)
459 )
461 async def send_dns_cache_hit(self, host: str) -> None:
462 return await self._trace_config.on_dns_cache_hit.send(
463 self._session, self._trace_config_ctx, TraceDnsCacheHitParams(host)
464 )
466 async def send_dns_cache_miss(self, host: str) -> None:
467 return await self._trace_config.on_dns_cache_miss.send(
468 self._session, self._trace_config_ctx, TraceDnsCacheMissParams(host)
469 )
471 async def send_request_headers(
472 self, method: str, url: URL, headers: "CIMultiDict[str]"
473 ) -> None:
474 return await self._trace_config._on_request_headers_sent.send(
475 self._session,
476 self._trace_config_ctx,
477 TraceRequestHeadersSentParams(method, url, headers),
478 )