standardize metric logs

This commit is contained in:
gmega 2024-12-11 13:47:15 -03:00
parent e6aa22dbbb
commit 86c2f8512a
No known key found for this signature in database
GPG Key ID: 6290D34EAD824B18
1 changed files with 29 additions and 28 deletions

View File

@ -1,13 +1,17 @@
import json
import logging import logging
import re import re
from csv import DictWriter import sys
from datetime import datetime, timezone from datetime import datetime, timezone
from io import StringIO
from typing import Optional from typing import Optional
from prometheus_client import Counter from prometheus_client import Counter
logger = logging.getLogger('M') logger = logging.getLogger(__name__)
for handler in logger.handlers:
logger.removeHandler(handler)
logger.addHandler(logging.StreamHandler(sys.stdout))
torrent_pieces_downloaded = Counter( torrent_pieces_downloaded = Counter(
name='deluge_torrent_pieces_downloaded', name='deluge_torrent_pieces_downloaded',
@ -17,17 +21,25 @@ torrent_pieces_downloaded = Counter(
NID = re.compile(r'\(([a-zA-Z0-9]+)\)') NID = re.compile(r'\(([a-zA-Z0-9]+)\)')
def metric_record(
node: str,
name: str,
torrent_name: str,
value: int,
):
record = json.dumps({
'entry_type': 'deluge_torrent_download',
'timestamp': datetime.now(timezone.utc).isoformat(),
'name': name,
'value': value,
'node': node if node is not None else '',
'torrent_name': torrent_name,
})
return f'>>{record}'
class Metrics: class Metrics:
def __init__(self, core: 'deluge.core.Core'): def __init__(self, core: 'deluge.core.Core'):
self.peer_id: Optional[str] = None self.peer_id: Optional[str] = None
self._buffer = StringIO()
self.log_writer = DictWriter(
f=self._buffer,
fieldnames=['metric', 'timestamp', 'labels', 'value'],
)
self.log_writer.writeheader()
self._flush_to_log()
core.session.post_dht_stats() core.session.post_dht_stats()
def handle_alert(self, alert): def handle_alert(self, alert):
@ -44,23 +56,12 @@ class Metrics:
self.peer_id = result.group(1) self.peer_id = result.group(1)
def _piece_finished(self, alert): def _piece_finished(self, alert):
labels = { logger.info(
'peer_id': self.peer_id if self.peer_id else '<unknown>', metric_record(
'torrent_name': alert.torrent_name, node=self.peer_id,
} name='deluge_piece_downloaded',
torrent_name=alert.torrent_name,
torrent_pieces_downloaded.labels(**labels).inc(1) value=alert.piece_index,
self.log_writer.writerow( )
dict({
'timestamp': datetime.now(timezone.utc).isoformat(),
'metric': 'deluge_torrent_pieces_downloaded',
'labels': ','.join(labels.values()),
'value': alert.piece_index,
})
) )
self._flush_to_log()
def _flush_to_log(self):
logger.info(self._buffer.getvalue())
self._buffer.truncate(0)
self._buffer.seek(0)