the-superpirate 43be16e4bc - [nexus] Update schema
- [nexus] Remove outdated protos
  - [nexus] Development
  - [nexus] Development
  - [nexus] Development
  - [nexus] Development
  - [nexus] Development
  - [nexus] Refactor views
  - [nexus] Update aiosumma
  - [nexus] Add tags
  - [nexus] Development
  - [nexus] Update repository
  - [nexus] Update repository
  - [nexus] Update dependencies
  - [nexus] Update dependencies
  - [nexus] Fixes for MetaAPI
  - [nexus] Support for new queries
  - [nexus] Adopt new versions of search
  - [nexus] Improving Nexus
  - [nexus] Various fixes
  - [nexus] Add profile
  - [nexus] Fixes for ingestion
  - [nexus] Refactorings and bugfixes
  - [idm] Add profile methods
  - [nexus] Fix stalled nexus-meta bugs
  - [nexus] Various bugfixes
  - [nexus] Restore IDM API functionality

GitOrigin-RevId: a0842345a6dde5b321279ab5510a50c0def0e71a
2022-09-02 19:15:47 +03:00

86 lines
2.9 KiB
Python

import asyncio
import logging
from contextlib import asynccontextmanager
from aiochclient import ChClient
from aiohttp import ClientSession
from aiokit import AioThing
from library.logging import error_log
from recordclass import dataobject
class DocumentStat(dataobject):
downloads_count: int
class StatProvider(AioThing):
def __init__(self, stat_provider_config):
super().__init__()
self.stat_provider_config = stat_provider_config
self.clickhouse_session = None
self.clickhouse_client = None
self.download_stats = {}
self.current_task = None
if stat_provider_config['enabled']:
self.clickhouse_session = ClientSession()
self.clickhouse_client = ChClient(
self.clickhouse_session,
url=stat_provider_config['clickhouse']['host'],
user=stat_provider_config['clickhouse']['username'],
password=stat_provider_config['clickhouse']['password'],
)
@asynccontextmanager
async def _safe_execution(self):
try:
yield
except asyncio.CancelledError as e:
error_log(e, level=logging.WARNING)
except Exception as e:
error_log(e)
raise
async def load_download_stats(self):
async with self._safe_execution():
while True:
download_stats = {}
logging.getLogger('statbox').info({
'action': 'start_loading',
'stats': 'download_stats',
})
async for row in self.clickhouse_client.iterate('''
select id, count(distinct user_id) as c
from query_log where mode = 'get' and id != 0
group by id
'''):
download_stats[row['id']] = DocumentStat(downloads_count=row['c'])
self.download_stats = download_stats
logging.getLogger('statbox').info({
'action': 'loaded',
'stats': 'download_stats',
'items': len(download_stats),
})
await asyncio.sleep(self.stat_provider_config['download_stats']['refresh_time_secs'])
def get_download_stats(self, document_id, default=None):
return self.download_stats.get(document_id, default)
async def all_tasks(self):
return await asyncio.gather(
self.load_download_stats(),
)
async def start(self):
if self.clickhouse_session:
self.current_task = asyncio.create_task(self.all_tasks())
async def stop(self):
await self.cancel()
if self.clickhouse_session:
await self.clickhouse_session.close()
if self.current_task:
self.current_task.cancel()
await self.current_task
await super().stop()