# pylint: disable=unused-variable
import os
from aiopollen.errors import ResponseError
from aiopollen.plugin import ClientPlugin
from caspia.toolbox import monitor
from .utils import patch
[docs]class Plugin(ClientPlugin):
def __init__(self, client):
super().__init__(client)
self.client = client
self.name = os.environ.get('CSP_METRICS_ACAN_NAME')
self.interval = float(os.environ.get('CSP_METRICS_ACAN_INTERVAL', '5.0'))
if not self.name:
return
labels = dict(pollen_name=self.name)
monitor.register_metric('pollen:request', 'integer', labels=labels)
monitor.register_metric('pollen:broadcast', 'integer', labels=labels, collect=True)
@patch(client)
async def request(original_method, addr, data, *args, **kwargs):
time = self.client.loop.time
start = time()
try:
response = await original_method(addr, data, *args, **kwargs)
except ResponseError as error:
monitor.record_metric('pollen:request',
dict(value=1,
duration=time() - start,
request_len=len(data),
response_len=len(error.data)),
labels=dict(error=repr(error)))
raise
except Exception as exc: # pylint: disable=broad-except
monitor.record_metric('pollen:request',
dict(value=1, duration=time() - start, request_len=len(data)),
labels=dict(error=repr(exc)))
raise
else:
monitor.record_metric(
'pollen:request',
dict(value=1,
duration=time() - start,
request_len=len(data),
response_len=(len(response))))
return response
@patch(client)
async def broadcast(original_method, group, data, *args, **kwargs):
await original_method(group, data, *args, **kwargs)
monitor.record_metric('pollen:broadcast', 1)
@client.listen_broadcast
def on_broadcast(*args, **kwargs):
monitor.record_metric('pollen:broadcast', 1)