diff --git a/exporter.py b/exporter.py index d47e57aba9584c75cb30630ee94fd9c8200617a3..bc742d7a2be0488b76ed3930cca3d15f85f1915a 100755 --- a/exporter.py +++ b/exporter.py @@ -3,12 +3,14 @@ import requests from prometheus_client import start_http_server, Counter, Gauge from time import sleep import argparse +import json metric_members = Gauge('matrix_channel_members_total', 'Members joined in room', ['room_id', 'canonical_alias', 'name']) metric_channel_types = Gauge('matrix_channel_types_total', 'Channels per type', ['type']) metric_channel_version = Gauge('matrix_channel_version_total', 'Channels per version', ['version']) metric_channel_state_events = Gauge('matrix_channel_state_events_total', 'State events per room', ['room_id', 'canonical_alias', 'name']) +metric_channel_messages_absolute = Gauge('matrix_channel_messages_absolute', 'Messages per channel absolute', ['room_id', 'canonical_alias', 'name', 'type']) metric_channel_messages = Counter('matrix_channel_messages_total', 'Messages per channel', ['room_id', 'canonical_alias', 'name', 'type']) @@ -22,21 +24,35 @@ def fetch_metrics(synapse_url, access_token): update_room_metrics(rooms) for room in rooms: - statefile = f"state/{room['room_id']}.end" + statefile = f"state/{room['room_id']}.state" url = f"{synapse_url}/_synapse/admin/v1/rooms/{room['room_id']}/messages" - messages = [] - end = None + state = {} try: with open(statefile, 'r') as file: - end = file.read() + state = json.load(file) except OSError: print(f"No state file for room {room['room_id']} ({room.get('name', '')}) found. Fetching messages could take a while.") + state['messagecount'] = {} + + for type in state['messagecount']: + metric_channel_messages.labels( + room_id=room['room_id'], + canonical_alias=room['canonical_alias'] if room['canonical_alias'] else '', + name=room['name'] if room['name'] else '', + type=type) + + metric_channel_messages_absolute.labels( + room_id=room['room_id'], + canonical_alias=room['canonical_alias'] if room['canonical_alias'] else '', + name=room['name'] if room['name'] else '', + type=type).set(state['messagecount'][type]) + messages = [] while True: params = {} - if end is not None: - params['from'] = end + if 'end' in state: + params['from'] = state['end'] result = requests.get(url, params=params, headers=auth).json() @@ -44,7 +60,7 @@ def fetch_metrics(synapse_url, access_token): messages.extend(result['chunk']) if 'end' in result: - end = result['end'] + state['end'] = result['end'] else: break @@ -55,8 +71,19 @@ def fetch_metrics(synapse_url, access_token): name=room['name'] if room['name'] else '', type=message['type']).inc() + metric_channel_messages_absolute.labels( + room_id=room['room_id'], + canonical_alias=room['canonical_alias'] if room['canonical_alias'] else '', + name=room['name'] if room['name'] else '', + type=message['type']).inc() + + if message['type'] not in state['messagecount']: + state['messagecount'][message['type']] = 0 + + state['messagecount'][message['type']] += 1 + with open(statefile, 'w') as file: - file.write(end) + json.dump(state, file) def update_room_metrics(rooms):