"""aiohttp stats collector support."""
import aiohttp
from ..utils.stats import Collector
[docs]class StatsTracer(aiohttp.TraceConfig):
"""Attach hooks to client session events and report statistics."""
def __init__(self, collector: Collector, prefix: str):
"""Initialize the `StatsTracer` instance."""
super().__init__()
self.collector = collector
self.prefix = prefix
self.on_request_start.append(self.request_start)
self.on_connection_queued_start.append(self.connection_queued_start)
self.on_connection_queued_end.append(self.connection_queued_end)
self.on_dns_resolvehost_start.append(self.dns_resolvehost_start)
self.on_dns_resolvehost_end.append(self.dns_resolvehost_end)
self.on_connection_create_start.append(self.socket_connect_start)
self.on_dns_cache_hit.append(self.socket_connect_start) # restart timer
self.on_dns_cache_miss.append(self.socket_connect_start) # restart timer
self.on_connection_reuseconn.append(self.connection_ready)
self.on_connection_create_end.append(self.connection_ready)
self.on_request_end.append(self.request_end)
[docs] async def request_start(self, session, context, params):
"""Handle the start of a request."""
context.method, context.url = params.method, params.url
[docs] async def connection_queued_start(self, session, context, params):
"""Handle the start of a queued connection."""
context.queue_timer = self.collector.timer(self.prefix + "queued").start()
[docs] async def connection_queued_end(self, session, context, params):
"""Handle the end of a queued connection."""
context.queue_timer.stop()
[docs] async def dns_resolvehost_start(self, session, context, params):
"""Handle the start of a DNS resolution."""
context.dns_timer = self.collector.timer(self.prefix + "dns_resolve").start()
[docs] async def dns_resolvehost_end(self, session, context, params):
"""Handle the end of a DNS resolution."""
context.dns_timer.stop()
[docs] async def socket_connect_start(self, session, context, params):
"""Handle the start of a socket connection."""
context.socket_timer = self.collector.timer(self.prefix + "connect").start()
[docs] async def connection_ready(self, session, context, params):
"""Handle the end of connection acquisition."""
try:
context.socket_timer.stop()
except AttributeError:
pass
context.fetch_timer = self.collector.timer(self.prefix + context.method).start()
[docs] async def request_end(self, session, context, params):
"""Handle the end of request."""
context.fetch_timer.stop()