Viewing file: socket.py (2.88 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
from __future__ import absolute_import
import socket from sentry_sdk import Hub from sentry_sdk._types import MYPY from sentry_sdk.consts import OP from sentry_sdk.integrations import Integration
if MYPY: from socket import AddressFamily, SocketKind from typing import Tuple, Optional, Union, List
__all__ = ["SocketIntegration"]
class SocketIntegration(Integration): identifier = "socket"
@staticmethod def setup_once(): # type: () -> None """ patches two of the most used functions of socket: create_connection and getaddrinfo(dns resolver) """ _patch_create_connection() _patch_getaddrinfo()
def _get_span_description(host, port): # type: (Union[bytes, str, None], Union[str, int, None]) -> str
try: host = host.decode() # type: ignore except (UnicodeDecodeError, AttributeError): pass
description = "%s:%s" % (host, port) # type: ignore
return description
def _patch_create_connection(): # type: () -> None real_create_connection = socket.create_connection
def create_connection( address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, # type: ignore source_address=None, ): # type: (Tuple[Optional[str], int], Optional[float], Optional[Tuple[Union[bytearray, bytes, str], int]])-> socket.socket hub = Hub.current if hub.get_integration(SocketIntegration) is None: return real_create_connection( address=address, timeout=timeout, source_address=source_address )
with hub.start_span( op=OP.SOCKET_CONNECTION, description=_get_span_description(address[0], address[1]), ) as span: span.set_data("address", address) span.set_data("timeout", timeout) span.set_data("source_address", source_address)
return real_create_connection( address=address, timeout=timeout, source_address=source_address )
socket.create_connection = create_connection # type: ignore
def _patch_getaddrinfo(): # type: () -> None real_getaddrinfo = socket.getaddrinfo
def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): # type: (Union[bytes, str, None], Union[str, int, None], int, int, int, int) -> List[Tuple[AddressFamily, SocketKind, int, str, Union[Tuple[str, int], Tuple[str, int, int, int]]]] hub = Hub.current if hub.get_integration(SocketIntegration) is None: return real_getaddrinfo(host, port, family, type, proto, flags)
with hub.start_span( op=OP.SOCKET_DNS, description=_get_span_description(host, port) ) as span: span.set_data("host", host) span.set_data("port", port)
return real_getaddrinfo(host, port, family, type, proto, flags)
socket.getaddrinfo = getaddrinfo # type: ignore
|