diff --git a/synapse/metrics/__init__.py b/synapse/metrics/__init__.py
index 2e307a03ad8b4aa5fee44d21a94f3b87bbe125d7..d7bcad8a8ac5185249ea405f1c3f7d1a9baa1274 100644
--- a/synapse/metrics/__init__.py
+++ b/synapse/metrics/__init__.py
@@ -184,7 +184,14 @@ def runUntilCurrentTimer(func):
     return f
 
 
-if hasattr(reactor, "runUntilCurrent") and hasattr(reactor, "_newTimedCalls"):
+try:
+    # Ensure the reactor has all the attributes we expect
+    reactor.runUntilCurrent
+    reactor._newTimedCalls
+    reactor.threadCallQueue
+
     # runUntilCurrent is called when we have pending calls. It is called once
     # per iteratation after fd polling.
     reactor.runUntilCurrent = runUntilCurrentTimer(reactor.runUntilCurrent)
+except AttributeError:
+    pass