forked from LBRYCommunity/lbry-sdk
include connection failure count in ttfb analytics
This commit is contained in:
parent
e2b3141536
commit
4261b50d9d
4 changed files with 19 additions and 9 deletions
|
@ -26,6 +26,7 @@ class BlobDownloader:
|
||||||
self.ignored: typing.Dict['KademliaPeer', int] = {}
|
self.ignored: typing.Dict['KademliaPeer', int] = {}
|
||||||
self.scores: typing.Dict['KademliaPeer', int] = {}
|
self.scores: typing.Dict['KademliaPeer', int] = {}
|
||||||
self.failures: typing.Dict['KademliaPeer', int] = {}
|
self.failures: typing.Dict['KademliaPeer', int] = {}
|
||||||
|
self.connection_failures: typing.List['KademliaPeer'] = []
|
||||||
self.connections: typing.Dict['KademliaPeer', asyncio.Transport] = {}
|
self.connections: typing.Dict['KademliaPeer', asyncio.Transport] = {}
|
||||||
self.is_running = asyncio.Event(loop=self.loop)
|
self.is_running = asyncio.Event(loop=self.loop)
|
||||||
|
|
||||||
|
@ -47,6 +48,8 @@ class BlobDownloader:
|
||||||
connection_manager=self.blob_manager.connection_manager
|
connection_manager=self.blob_manager.connection_manager
|
||||||
|
|
||||||
)
|
)
|
||||||
|
if not bytes_received and not transport and peer not in self.connection_failures:
|
||||||
|
self.connection_failures.append(peer)
|
||||||
if not transport and peer not in self.ignored:
|
if not transport and peer not in self.ignored:
|
||||||
self.ignored[peer] = self.loop.time()
|
self.ignored[peer] = self.loop.time()
|
||||||
log.debug("drop peer %s:%i", peer.address, peer.tcp_port)
|
log.debug("drop peer %s:%i", peer.address, peer.tcp_port)
|
||||||
|
@ -113,6 +116,7 @@ class BlobDownloader:
|
||||||
blob.close()
|
blob.close()
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
|
self.connection_failures.clear()
|
||||||
self.scores.clear()
|
self.scores.clear()
|
||||||
self.ignored.clear()
|
self.ignored.clear()
|
||||||
self.is_running.clear()
|
self.is_running.clear()
|
||||||
|
|
|
@ -44,7 +44,8 @@ def _event_properties(installation_id: str, session_id: str,
|
||||||
|
|
||||||
def _download_properties(conf: Config, external_ip: str, resolve_duration: float,
|
def _download_properties(conf: Config, external_ip: str, resolve_duration: float,
|
||||||
total_duration: typing.Optional[float], download_id: str, name: str,
|
total_duration: typing.Optional[float], download_id: str, name: str,
|
||||||
outpoint: str, active_peer_count: int, tried_peers_count: int,
|
outpoint: str, active_peer_count: typing.Optional[int],
|
||||||
|
tried_peers_count: typing.Optional[int], connection_failures_count: typing.Optional[int],
|
||||||
added_fixed_peers: bool, fixed_peer_delay: float, sd_hash: str,
|
added_fixed_peers: bool, fixed_peer_delay: float, sd_hash: str,
|
||||||
sd_download_duration: typing.Optional[float] = None,
|
sd_download_duration: typing.Optional[float] = None,
|
||||||
head_blob_hash: typing.Optional[str] = None,
|
head_blob_hash: typing.Optional[str] = None,
|
||||||
|
@ -74,7 +75,9 @@ def _download_properties(conf: Config, external_ip: str, resolve_duration: float
|
||||||
|
|
||||||
"head_blob_hash": head_blob_hash,
|
"head_blob_hash": head_blob_hash,
|
||||||
"head_blob_length": head_blob_length,
|
"head_blob_length": head_blob_length,
|
||||||
"head_blob_duration": None if not head_blob_download_duration else round(head_blob_download_duration, 4)
|
"head_blob_duration": None if not head_blob_download_duration else round(head_blob_download_duration, 4),
|
||||||
|
|
||||||
|
"connection_failures_count": connection_failures_count
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,7 +102,6 @@ def _make_context(platform):
|
||||||
|
|
||||||
|
|
||||||
class AnalyticsManager:
|
class AnalyticsManager:
|
||||||
|
|
||||||
def __init__(self, conf: Config, installation_id: str, session_id: str):
|
def __init__(self, conf: Config, installation_id: str, session_id: str):
|
||||||
self.conf = conf
|
self.conf = conf
|
||||||
self.cookies = {}
|
self.cookies = {}
|
||||||
|
@ -110,7 +112,7 @@ class AnalyticsManager:
|
||||||
self.context = _make_context(system_info.get_platform())
|
self.context = _make_context(system_info.get_platform())
|
||||||
self.installation_id = installation_id
|
self.installation_id = installation_id
|
||||||
self.session_id = session_id
|
self.session_id = session_id
|
||||||
self.task: asyncio.Task = None
|
self.task: typing.Optional[asyncio.Task] = None
|
||||||
self.external_ip: typing.Optional[str] = None
|
self.external_ip: typing.Optional[str] = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -172,8 +174,11 @@ class AnalyticsManager:
|
||||||
|
|
||||||
async def send_time_to_first_bytes(self, resolve_duration: typing.Optional[float],
|
async def send_time_to_first_bytes(self, resolve_duration: typing.Optional[float],
|
||||||
total_duration: typing.Optional[float], download_id: str,
|
total_duration: typing.Optional[float], download_id: str,
|
||||||
name: str, outpoint: str, found_peers_count: int,
|
name: str, outpoint: typing.Optional[str],
|
||||||
tried_peers_count: int, added_fixed_peers: bool,
|
found_peers_count: typing.Optional[int],
|
||||||
|
tried_peers_count: typing.Optional[int],
|
||||||
|
connection_failures_count: typing.Optional[int],
|
||||||
|
added_fixed_peers: bool,
|
||||||
fixed_peers_delay: float, sd_hash: str,
|
fixed_peers_delay: float, sd_hash: str,
|
||||||
sd_download_duration: typing.Optional[float] = None,
|
sd_download_duration: typing.Optional[float] = None,
|
||||||
head_blob_hash: typing.Optional[str] = None,
|
head_blob_hash: typing.Optional[str] = None,
|
||||||
|
@ -182,8 +187,8 @@ class AnalyticsManager:
|
||||||
error: typing.Optional[str] = None):
|
error: typing.Optional[str] = None):
|
||||||
await self.track(self._event(TIME_TO_FIRST_BYTES, _download_properties(
|
await self.track(self._event(TIME_TO_FIRST_BYTES, _download_properties(
|
||||||
self.conf, self.external_ip, resolve_duration, total_duration, download_id, name, outpoint,
|
self.conf, self.external_ip, resolve_duration, total_duration, download_id, name, outpoint,
|
||||||
found_peers_count, tried_peers_count, added_fixed_peers, fixed_peers_delay, sd_hash,
|
found_peers_count, tried_peers_count, connection_failures_count, added_fixed_peers, fixed_peers_delay,
|
||||||
sd_download_duration, head_blob_hash, head_blob_length, head_blob_duration, error
|
sd_hash, sd_download_duration, head_blob_hash, head_blob_length, head_blob_duration, error
|
||||||
)))
|
)))
|
||||||
|
|
||||||
async def send_download_finished(self, download_id, name, sd_hash):
|
async def send_download_finished(self, download_id, name, sd_hash):
|
||||||
|
|
|
@ -18,7 +18,7 @@ log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class StreamDownloader:
|
class StreamDownloader:
|
||||||
def __init__(self, loop: asyncio.BaseEventLoop, config: 'Config', blob_manager: 'BlobManager', sd_hash: str,
|
def __init__(self, loop: asyncio.AbstractEventLoop, config: 'Config', blob_manager: 'BlobManager', sd_hash: str,
|
||||||
descriptor: typing.Optional[StreamDescriptor] = None):
|
descriptor: typing.Optional[StreamDescriptor] = None):
|
||||||
self.loop = loop
|
self.loop = loop
|
||||||
self.config = config
|
self.config = config
|
||||||
|
|
|
@ -454,6 +454,7 @@ class StreamManager:
|
||||||
uri, outpoint,
|
uri, outpoint,
|
||||||
None if not stream else len(stream.downloader.blob_downloader.active_connections),
|
None if not stream else len(stream.downloader.blob_downloader.active_connections),
|
||||||
None if not stream else len(stream.downloader.blob_downloader.scores),
|
None if not stream else len(stream.downloader.blob_downloader.scores),
|
||||||
|
None if not stream else len(stream.downloader.blob_downloader.connection_failures),
|
||||||
False if not stream else stream.downloader.added_fixed_peers,
|
False if not stream else stream.downloader.added_fixed_peers,
|
||||||
self.config.fixed_peer_delay if not stream else stream.downloader.fixed_peers_delay,
|
self.config.fixed_peer_delay if not stream else stream.downloader.fixed_peers_delay,
|
||||||
None if not stream else stream.sd_hash,
|
None if not stream else stream.sd_hash,
|
||||||
|
|
Loading…
Add table
Reference in a new issue