diff --git a/src/_zkapauthorizer/_plugin.py b/src/_zkapauthorizer/_plugin.py index 88998b03866830c04060ba3aba696ed802e4e4fa..e0c3f541f59a5754a63b89179328e9a8a2a7353d 100644 --- a/src/_zkapauthorizer/_plugin.py +++ b/src/_zkapauthorizer/_plugin.py @@ -27,7 +27,9 @@ from allmydata.client import _Client from allmydata.interfaces import IAnnounceableStorageServer, IFoolscapStoragePlugin from allmydata.node import MissingConfigEntry from challenge_bypass_ristretto import SigningKey -from prometheus_client import CollectorRegistry +from isodate import parse_duration +from prometheus_client import CollectorRegistry, write_to_textfile +from twisted.internet import task from twisted.internet.defer import succeed from twisted.logger import Logger from twisted.python.filepath import FilePath @@ -101,11 +103,16 @@ class ZKAPAuthorizer(object): if reactor is None: from twisted.internet import reactor registry = CollectorRegistry() - # schedule_writing(registry) kwargs = configuration.copy() - kwargs.pop(u"prometheus-metrics-path", None) - kwargs.pop(u"prometheus-metrics-interval", None) + # If metrics are desired, schedule their writing to disk. + metrics_interval = kwargs.pop(u"prometheus-metrics-interval", None) + metrics_path = kwargs.pop(u"prometheus-metrics-path", None) + if metrics_interval is not None and metrics_path is not None: + t = task.LoopingCall(lambda: write_to_textfile(metrics_path, registry)) + t.clock = reactor + t.start(parse_duration(metrics_interval).total_seconds()) + root_url = kwargs.pop(u"ristretto-issuer-root-url") pass_value = int(kwargs.pop(u"pass-value", BYTES_PER_PASS)) signing_key = load_signing_key( diff --git a/src/_zkapauthorizer/tests/test_plugin.py b/src/_zkapauthorizer/tests/test_plugin.py index 306007536e7c83dff8d7879e7f21b82860f24c56..f5fd113168f118c415ee9124f707698c33a212a9 100644 --- a/src/_zkapauthorizer/tests/test_plugin.py +++ b/src/_zkapauthorizer/tests/test_plugin.py @@ -290,10 +290,15 @@ class ServerPluginTests(TestCase): ) ) registry = announceable.storage_server._registry - Gauge("foo", "bar", registry=registry).set(1) - clock.advance(metrics_interval.total_seconds()) - self.assertThat(metrics_path, FileContains("foo 1")) + g = Gauge("foo", "bar", registry=registry) + for i in range(2): + g.set(i) + + clock.advance(metrics_interval.total_seconds()) + self.assertThat( + metrics_path, FileContains(matcher=Contains("foo {}".format(i))) + ) tahoe_configs_with_dummy_redeemer = tahoe_configs(client_dummyredeemer_configurations())