Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/aiohttp/tracing.py: 64%
191 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:40 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-08 06:40 +0000
1from types import SimpleNamespace
2from typing import TYPE_CHECKING, Awaitable, Optional, Protocol, Type, TypeVar
4import attr
5from aiosignal import Signal
6from multidict import CIMultiDict
7from yarl import URL
9from .client_reqrep import ClientResponse
11if TYPE_CHECKING: # pragma: no cover
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]:
23 ...
26__all__ = (
27 "TraceConfig",
28 "TraceRequestStartParams",
29 "TraceRequestEndParams",
30 "TraceRequestExceptionParams",
31 "TraceConnectionQueuedStartParams",
32 "TraceConnectionQueuedEndParams",
33 "TraceConnectionCreateStartParams",
34 "TraceConnectionCreateEndParams",
35 "TraceConnectionReuseconnParams",
36 "TraceDnsResolveHostStartParams",
37 "TraceDnsResolveHostEndParams",
38 "TraceDnsCacheHitParams",
39 "TraceDnsCacheMissParams",
40 "TraceRequestRedirectParams",
41 "TraceRequestChunkSentParams",
42 "TraceResponseChunkReceivedParams",
43 "TraceRequestHeadersSentParams",
44)
47class TraceConfig:
48 """First-class used to trace requests launched via ClientSession objects."""
50 def __init__(
51 self, trace_config_ctx_factory: Type[SimpleNamespace] = SimpleNamespace
52 ) -> None:
53 self._on_request_start: Signal[
54 _SignalCallback[TraceRequestStartParams]
55 ] = Signal(self)
56 self._on_request_chunk_sent: Signal[
57 _SignalCallback[TraceRequestChunkSentParams]
58 ] = Signal(self)
59 self._on_response_chunk_received: Signal[
60 _SignalCallback[TraceResponseChunkReceivedParams]
61 ] = Signal(self)
62 self._on_request_end: Signal[_SignalCallback[TraceRequestEndParams]] = Signal(
63 self
64 )
65 self._on_request_exception: Signal[
66 _SignalCallback[TraceRequestExceptionParams]
67 ] = Signal(self)
68 self._on_request_redirect: Signal[
69 _SignalCallback[TraceRequestRedirectParams]
70 ] = Signal(self)
71 self._on_connection_queued_start: Signal[
72 _SignalCallback[TraceConnectionQueuedStartParams]
73 ] = Signal(self)
74 self._on_connection_queued_end: Signal[
75 _SignalCallback[TraceConnectionQueuedEndParams]
76 ] = Signal(self)
77 self._on_connection_create_start: Signal[
78 _SignalCallback[TraceConnectionCreateStartParams]
79 ] = Signal(self)
80 self._on_connection_create_end: Signal[
81 _SignalCallback[TraceConnectionCreateEndParams]
82 ] = Signal(self)
83 self._on_connection_reuseconn: Signal[
84 _SignalCallback[TraceConnectionReuseconnParams]
85 ] = Signal(self)
86 self._on_dns_resolvehost_start: Signal[
87 _SignalCallback[TraceDnsResolveHostStartParams]
88 ] = Signal(self)
89 self._on_dns_resolvehost_end: Signal[
90 _SignalCallback[TraceDnsResolveHostEndParams]
91 ] = Signal(self)
92 self._on_dns_cache_hit: Signal[
93 _SignalCallback[TraceDnsCacheHitParams]
94 ] = Signal(self)
95 self._on_dns_cache_miss: Signal[
96 _SignalCallback[TraceDnsCacheMissParams]
97 ] = Signal(self)
98 self._on_request_headers_sent: Signal[
99 _SignalCallback[TraceRequestHeadersSentParams]
100 ] = Signal(self)
102 self._trace_config_ctx_factory = trace_config_ctx_factory
104 def trace_config_ctx(
105 self, trace_request_ctx: Optional[SimpleNamespace] = None
106 ) -> SimpleNamespace:
107 """Return a new trace_config_ctx instance"""
108 return self._trace_config_ctx_factory(trace_request_ctx=trace_request_ctx)
110 def freeze(self) -> None:
111 self._on_request_start.freeze()
112 self._on_request_chunk_sent.freeze()
113 self._on_response_chunk_received.freeze()
114 self._on_request_end.freeze()
115 self._on_request_exception.freeze()
116 self._on_request_redirect.freeze()
117 self._on_connection_queued_start.freeze()
118 self._on_connection_queued_end.freeze()
119 self._on_connection_create_start.freeze()
120 self._on_connection_create_end.freeze()
121 self._on_connection_reuseconn.freeze()
122 self._on_dns_resolvehost_start.freeze()
123 self._on_dns_resolvehost_end.freeze()
124 self._on_dns_cache_hit.freeze()
125 self._on_dns_cache_miss.freeze()
126 self._on_request_headers_sent.freeze()
128 @property
129 def on_request_start(self) -> "Signal[_SignalCallback[TraceRequestStartParams]]":
130 return self._on_request_start
132 @property
133 def on_request_chunk_sent(
134 self,
135 ) -> "Signal[_SignalCallback[TraceRequestChunkSentParams]]":
136 return self._on_request_chunk_sent
138 @property
139 def on_response_chunk_received(
140 self,
141 ) -> "Signal[_SignalCallback[TraceResponseChunkReceivedParams]]":
142 return self._on_response_chunk_received
144 @property
145 def on_request_end(self) -> "Signal[_SignalCallback[TraceRequestEndParams]]":
146 return self._on_request_end
148 @property
149 def on_request_exception(
150 self,
151 ) -> "Signal[_SignalCallback[TraceRequestExceptionParams]]":
152 return self._on_request_exception
154 @property
155 def on_request_redirect(
156 self,
157 ) -> "Signal[_SignalCallback[TraceRequestRedirectParams]]":
158 return self._on_request_redirect
160 @property
161 def on_connection_queued_start(
162 self,
163 ) -> "Signal[_SignalCallback[TraceConnectionQueuedStartParams]]":
164 return self._on_connection_queued_start
166 @property
167 def on_connection_queued_end(
168 self,
169 ) -> "Signal[_SignalCallback[TraceConnectionQueuedEndParams]]":
170 return self._on_connection_queued_end
172 @property
173 def on_connection_create_start(
174 self,
175 ) -> "Signal[_SignalCallback[TraceConnectionCreateStartParams]]":
176 return self._on_connection_create_start
178 @property
179 def on_connection_create_end(
180 self,
181 ) -> "Signal[_SignalCallback[TraceConnectionCreateEndParams]]":
182 return self._on_connection_create_end
184 @property
185 def on_connection_reuseconn(
186 self,
187 ) -> "Signal[_SignalCallback[TraceConnectionReuseconnParams]]":
188 return self._on_connection_reuseconn
190 @property
191 def on_dns_resolvehost_start(
192 self,
193 ) -> "Signal[_SignalCallback[TraceDnsResolveHostStartParams]]":
194 return self._on_dns_resolvehost_start
196 @property
197 def on_dns_resolvehost_end(
198 self,
199 ) -> "Signal[_SignalCallback[TraceDnsResolveHostEndParams]]":
200 return self._on_dns_resolvehost_end
202 @property
203 def on_dns_cache_hit(self) -> "Signal[_SignalCallback[TraceDnsCacheHitParams]]":
204 return self._on_dns_cache_hit
206 @property
207 def on_dns_cache_miss(self) -> "Signal[_SignalCallback[TraceDnsCacheMissParams]]":
208 return self._on_dns_cache_miss
210 @property
211 def on_request_headers_sent(
212 self,
213 ) -> "Signal[_SignalCallback[TraceRequestHeadersSentParams]]":
214 return self._on_request_headers_sent
217@attr.s(auto_attribs=True, frozen=True, slots=True)
218class TraceRequestStartParams:
219 """Parameters sent by the `on_request_start` signal"""
221 method: str
222 url: URL
223 headers: "CIMultiDict[str]"
226@attr.s(auto_attribs=True, frozen=True, slots=True)
227class TraceRequestChunkSentParams:
228 """Parameters sent by the `on_request_chunk_sent` signal"""
230 method: str
231 url: URL
232 chunk: bytes
235@attr.s(auto_attribs=True, frozen=True, slots=True)
236class TraceResponseChunkReceivedParams:
237 """Parameters sent by the `on_response_chunk_received` signal"""
239 method: str
240 url: URL
241 chunk: bytes
244@attr.s(auto_attribs=True, frozen=True, slots=True)
245class TraceRequestEndParams:
246 """Parameters sent by the `on_request_end` signal"""
248 method: str
249 url: URL
250 headers: "CIMultiDict[str]"
251 response: ClientResponse
254@attr.s(auto_attribs=True, frozen=True, slots=True)
255class TraceRequestExceptionParams:
256 """Parameters sent by the `on_request_exception` signal"""
258 method: str
259 url: URL
260 headers: "CIMultiDict[str]"
261 exception: BaseException
264@attr.s(auto_attribs=True, frozen=True, slots=True)
265class TraceRequestRedirectParams:
266 """Parameters sent by the `on_request_redirect` signal"""
268 method: str
269 url: URL
270 headers: "CIMultiDict[str]"
271 response: ClientResponse
274@attr.s(auto_attribs=True, frozen=True, slots=True)
275class TraceConnectionQueuedStartParams:
276 """Parameters sent by the `on_connection_queued_start` signal"""
279@attr.s(auto_attribs=True, frozen=True, slots=True)
280class TraceConnectionQueuedEndParams:
281 """Parameters sent by the `on_connection_queued_end` signal"""
284@attr.s(auto_attribs=True, frozen=True, slots=True)
285class TraceConnectionCreateStartParams:
286 """Parameters sent by the `on_connection_create_start` signal"""
289@attr.s(auto_attribs=True, frozen=True, slots=True)
290class TraceConnectionCreateEndParams:
291 """Parameters sent by the `on_connection_create_end` signal"""
294@attr.s(auto_attribs=True, frozen=True, slots=True)
295class TraceConnectionReuseconnParams:
296 """Parameters sent by the `on_connection_reuseconn` signal"""
299@attr.s(auto_attribs=True, frozen=True, slots=True)
300class TraceDnsResolveHostStartParams:
301 """Parameters sent by the `on_dns_resolvehost_start` signal"""
303 host: str
306@attr.s(auto_attribs=True, frozen=True, slots=True)
307class TraceDnsResolveHostEndParams:
308 """Parameters sent by the `on_dns_resolvehost_end` signal"""
310 host: str
313@attr.s(auto_attribs=True, frozen=True, slots=True)
314class TraceDnsCacheHitParams:
315 """Parameters sent by the `on_dns_cache_hit` signal"""
317 host: str
320@attr.s(auto_attribs=True, frozen=True, slots=True)
321class TraceDnsCacheMissParams:
322 """Parameters sent by the `on_dns_cache_miss` signal"""
324 host: str
327@attr.s(auto_attribs=True, frozen=True, slots=True)
328class TraceRequestHeadersSentParams:
329 """Parameters sent by the `on_request_headers_sent` signal"""
331 method: str
332 url: URL
333 headers: "CIMultiDict[str]"
336class Trace:
337 """Internal dependency holder class.
339 Used to keep together the main dependencies used
340 at the moment of send a signal.
341 """
343 def __init__(
344 self,
345 session: "ClientSession",
346 trace_config: TraceConfig,
347 trace_config_ctx: SimpleNamespace,
348 ) -> None:
349 self._trace_config = trace_config
350 self._trace_config_ctx = trace_config_ctx
351 self._session = session
353 async def send_request_start(
354 self, method: str, url: URL, headers: "CIMultiDict[str]"
355 ) -> None:
356 return await self._trace_config.on_request_start.send(
357 self._session,
358 self._trace_config_ctx,
359 TraceRequestStartParams(method, url, headers),
360 )
362 async def send_request_chunk_sent(
363 self, method: str, url: URL, chunk: bytes
364 ) -> None:
365 return await self._trace_config.on_request_chunk_sent.send(
366 self._session,
367 self._trace_config_ctx,
368 TraceRequestChunkSentParams(method, url, chunk),
369 )
371 async def send_response_chunk_received(
372 self, method: str, url: URL, chunk: bytes
373 ) -> None:
374 return await self._trace_config.on_response_chunk_received.send(
375 self._session,
376 self._trace_config_ctx,
377 TraceResponseChunkReceivedParams(method, url, chunk),
378 )
380 async def send_request_end(
381 self,
382 method: str,
383 url: URL,
384 headers: "CIMultiDict[str]",
385 response: ClientResponse,
386 ) -> None:
387 return await self._trace_config.on_request_end.send(
388 self._session,
389 self._trace_config_ctx,
390 TraceRequestEndParams(method, url, headers, response),
391 )
393 async def send_request_exception(
394 self,
395 method: str,
396 url: URL,
397 headers: "CIMultiDict[str]",
398 exception: BaseException,
399 ) -> None:
400 return await self._trace_config.on_request_exception.send(
401 self._session,
402 self._trace_config_ctx,
403 TraceRequestExceptionParams(method, url, headers, exception),
404 )
406 async def send_request_redirect(
407 self,
408 method: str,
409 url: URL,
410 headers: "CIMultiDict[str]",
411 response: ClientResponse,
412 ) -> None:
413 return await self._trace_config._on_request_redirect.send(
414 self._session,
415 self._trace_config_ctx,
416 TraceRequestRedirectParams(method, url, headers, response),
417 )
419 async def send_connection_queued_start(self) -> None:
420 return await self._trace_config.on_connection_queued_start.send(
421 self._session, self._trace_config_ctx, TraceConnectionQueuedStartParams()
422 )
424 async def send_connection_queued_end(self) -> None:
425 return await self._trace_config.on_connection_queued_end.send(
426 self._session, self._trace_config_ctx, TraceConnectionQueuedEndParams()
427 )
429 async def send_connection_create_start(self) -> None:
430 return await self._trace_config.on_connection_create_start.send(
431 self._session, self._trace_config_ctx, TraceConnectionCreateStartParams()
432 )
434 async def send_connection_create_end(self) -> None:
435 return await self._trace_config.on_connection_create_end.send(
436 self._session, self._trace_config_ctx, TraceConnectionCreateEndParams()
437 )
439 async def send_connection_reuseconn(self) -> None:
440 return await self._trace_config.on_connection_reuseconn.send(
441 self._session, self._trace_config_ctx, TraceConnectionReuseconnParams()
442 )
444 async def send_dns_resolvehost_start(self, host: str) -> None:
445 return await self._trace_config.on_dns_resolvehost_start.send(
446 self._session, self._trace_config_ctx, TraceDnsResolveHostStartParams(host)
447 )
449 async def send_dns_resolvehost_end(self, host: str) -> None:
450 return await self._trace_config.on_dns_resolvehost_end.send(
451 self._session, self._trace_config_ctx, TraceDnsResolveHostEndParams(host)
452 )
454 async def send_dns_cache_hit(self, host: str) -> None:
455 return await self._trace_config.on_dns_cache_hit.send(
456 self._session, self._trace_config_ctx, TraceDnsCacheHitParams(host)
457 )
459 async def send_dns_cache_miss(self, host: str) -> None:
460 return await self._trace_config.on_dns_cache_miss.send(
461 self._session, self._trace_config_ctx, TraceDnsCacheMissParams(host)
462 )
464 async def send_request_headers(
465 self, method: str, url: URL, headers: "CIMultiDict[str]"
466 ) -> None:
467 return await self._trace_config._on_request_headers_sent.send(
468 self._session,
469 self._trace_config_ctx,
470 TraceRequestHeadersSentParams(method, url, headers),
471 )