Update prometheus stuff

This commit is contained in:
Tulir Asokan
2020-09-19 01:04:34 +03:00
parent a565853c5e
commit 0dc56aad1c
4 changed files with 26 additions and 24 deletions
+10 -11
View File
@@ -37,6 +37,7 @@ from mautrix.types import UserID, PresenceState
from mautrix.errors import MatrixError from mautrix.errors import MatrixError
from mautrix.appservice import AppService from mautrix.appservice import AppService
from mautrix.util.logging import TraceLogger from mautrix.util.logging import TraceLogger
from mautrix.util.opt_prometheus import Histogram, Counter
from alchemysession import AlchemySessionContainer from alchemysession import AlchemySessionContainer
from . import portal as po, puppet as pu, __version__ from . import portal as po, puppet as pu, __version__
@@ -57,14 +58,10 @@ UpdateMessage = Union[UpdateShortChatMessage, UpdateShortMessage, UpdateNewChann
UpdateNewMessage, UpdateEditMessage, UpdateEditChannelMessage] UpdateNewMessage, UpdateEditMessage, UpdateEditChannelMessage]
UpdateMessageContent = Union[UpdateShortMessage, UpdateShortChatMessage, Message, MessageService] UpdateMessageContent = Union[UpdateShortMessage, UpdateShortChatMessage, Message, MessageService]
try: UPDATE_TIME = Histogram("bridge_telegram_update", "Time spent processing Telegram updates",
from prometheus_client import Histogram ("update_type",))
UPDATE_ERRORS = Counter("bridge_telegram_update_error",
UPDATE_TIME = Histogram("telegram_update", "Time spent processing Telegram updates", "Number of fatal errors while handling Telegram updates", ("update_type",))
["update_type"])
except ImportError:
Histogram = None
UPDATE_TIME = None
class AbstractUser(ABC): class AbstractUser(ABC):
@@ -191,13 +188,14 @@ class AbstractUser(ABC):
async def _update_catch(self, update: TypeUpdate) -> None: async def _update_catch(self, update: TypeUpdate) -> None:
start_time = time.time() start_time = time.time()
update_type = type(update).__name__
try: try:
if not await self.update(update): if not await self.update(update):
await self._update(update) await self._update(update)
except Exception: except Exception:
self.log.exception(f"Failed to handle Telegram update {update}") self.log.exception(f"Failed to handle Telegram update {update}")
if UPDATE_TIME: UPDATE_ERRORS.labels(update_type=update_type).inc()
UPDATE_TIME.labels(update_type=type(update).__name__).observe(time.time() - start_time) UPDATE_TIME.labels(update_type=update_type).observe(time.time() - start_time)
@property @property
@abstractmethod @abstractmethod
@@ -396,7 +394,8 @@ class AbstractUser(ABC):
portal = po.Portal.get_by_entity(update.to_id, receiver_id=self.tgid) portal = po.Portal.get_by_entity(update.to_id, receiver_id=self.tgid)
sender = pu.Puppet.get(update.from_id) if update.from_id else None sender = pu.Puppet.get(update.from_id) if update.from_id else None
else: else:
self.log.warning(f"Unexpected message type in User#get_message_details: {type(update)}") self.log.warning("Unexpected message type in User#get_message_details: "
f"{type(update)}")
return update, None, None return update, None, None
return update, sender, portal return update, sender, portal
-12
View File
@@ -30,14 +30,6 @@ if TYPE_CHECKING:
from .context import Context from .context import Context
from .bot import Bot from .bot import Bot
try:
from prometheus_client import Histogram
EVENT_TIME = Histogram("matrix_event", "Time spent processing Matrix events", ["event_type"])
except ImportError:
Histogram = None
EVENT_TIME = None
RoomMetaStateEventContent = Union[RoomNameStateEventContent, RoomAvatarStateEventContent, RoomMetaStateEventContent = Union[RoomNameStateEventContent, RoomAvatarStateEventContent,
RoomTopicStateEventContent] RoomTopicStateEventContent]
@@ -410,7 +402,3 @@ class MatrixHandler(BaseMatrixHandler):
elif evt.type == EventType.ROOM_TOMBSTONE: elif evt.type == EventType.ROOM_TOMBSTONE:
await self.handle_room_upgrade(evt.room_id, evt.sender, evt.content.replacement_room, await self.handle_room_upgrade(evt.room_id, evt.sender, evt.content.replacement_room,
evt.event_id) evt.event_id)
async def log_event_handle_duration(self, evt: Event, duration: float) -> None:
if EVENT_TIME:
EVENT_TIME.labels(event_type=str(evt.type)).observe(duration)
+15
View File
@@ -31,6 +31,7 @@ from mautrix.errors import MatrixRequestError
from mautrix.types import UserID, RoomID from mautrix.types import UserID, RoomID
from mautrix.bridge import BaseUser from mautrix.bridge import BaseUser
from mautrix.util.logging import TraceLogger from mautrix.util.logging import TraceLogger
from mautrix.util.opt_prometheus import Enum
from .types import TelegramID from .types import TelegramID
from .db import User as DBUser, Portal as DBPortal from .db import User as DBUser, Portal as DBPortal
@@ -45,6 +46,11 @@ config: Optional['Config'] = None
SearchResult = NamedTuple('SearchResult', puppet='pu.Puppet', similarity=int) SearchResult = NamedTuple('SearchResult', puppet='pu.Puppet', similarity=int)
METRIC_LOGGED_IN = Enum('bridge_logged_in', 'Bridge Logged in', states=["true", "false"],
labelnames=("tgid",))
METRIC_CONNECTED = Enum('bridge_connected', 'Bridge Connected', states=["true", "false"],
labelnames=("tgid",))
class User(AbstractUser, BaseUser): class User(AbstractUser, BaseUser):
log: TraceLogger = logging.getLogger("mau.user") log: TraceLogger = logging.getLogger("mau.user")
@@ -193,15 +199,21 @@ class User(AbstractUser, BaseUser):
async def start(self, delete_unless_authenticated: bool = False) -> 'User': async def start(self, delete_unless_authenticated: bool = False) -> 'User':
await super().start() await super().start()
METRIC_CONNECTED.labels(tgid=self.tgid).state("true")
if await self.is_logged_in(): if await self.is_logged_in():
self.log.debug(f"Ensuring post_login() for {self.name}") self.log.debug(f"Ensuring post_login() for {self.name}")
asyncio.ensure_future(self.post_login(), loop=self.loop) asyncio.ensure_future(self.post_login(), loop=self.loop)
elif delete_unless_authenticated: elif delete_unless_authenticated:
self.log.debug(f"Unauthenticated user {self.name} start()ed, deleting session...") self.log.debug(f"Unauthenticated user {self.name} start()ed, deleting session...")
await self.client.disconnect() await self.client.disconnect()
METRIC_CONNECTED.labels(tgid=self.tgid).state("false")
self.client.session.delete() self.client.session.delete()
return self return self
async def stop(self) -> None:
await super().stop()
METRIC_CONNECTED.labels(tgid=self.tgid).state("true")
async def post_login(self, info: TLUser = None, first_login: bool = False) -> None: async def post_login(self, info: TLUser = None, first_login: bool = False) -> None:
try: try:
await self.update_info(info) await self.update_info(info)
@@ -209,6 +221,8 @@ class User(AbstractUser, BaseUser):
self.log.exception("Failed to update telegram account info") self.log.exception("Failed to update telegram account info")
return return
METRIC_LOGGED_IN.labels(tgid=self.tgid).state("true")
try: try:
puppet = pu.Puppet.get(self.tgid) puppet = pu.Puppet.get(self.tgid)
if puppet.custom_mxid != self.mxid and puppet.can_auto_login(self.mxid): if puppet.custom_mxid != self.mxid and puppet.can_auto_login(self.mxid):
@@ -300,6 +314,7 @@ class User(AbstractUser, BaseUser):
if not ok: if not ok:
return False return False
self.delete() self.delete()
METRIC_LOGGED_IN.labels(tgid=self.tgid).state("false")
return True return True
def _search_local(self, query: str, max_results: int = 5, min_similarity: int = 45 def _search_local(self, query: str, max_results: int = 5, min_similarity: int = 45
+1 -1
View File
@@ -4,6 +4,6 @@ ruamel.yaml>=0.15.35,<0.17
python-magic>=0.4,<0.5 python-magic>=0.4,<0.5
commonmark>=0.8,<0.10 commonmark>=0.8,<0.10
aiohttp>=3,<4 aiohttp>=3,<4
mautrix>=0.7.3,<0.8 mautrix>=0.7.4,<0.8
telethon>=1.16,<1.17 telethon>=1.16,<1.17
telethon-session-sqlalchemy>=0.2.14,<0.3 telethon-session-sqlalchemy>=0.2.14,<0.3