diff --git a/prometheus_client/exposition.py b/prometheus_client/exposition.py index 80fa61e2..cb782a7a 100644 --- a/prometheus_client/exposition.py +++ b/prometheus_client/exposition.py @@ -154,8 +154,8 @@ def do_GET(self): def log_message(self, format, *args): """Log nothing.""" - @staticmethod - def factory(registry): + @classmethod + def factory(cls, registry): """Returns a dynamic MetricsHandler class tied to the passed registry. """ @@ -164,8 +164,8 @@ def factory(registry): # As we have unicode_literals, we need to create a str() # object for type(). - cls_name = str('MetricsHandler') - MyMetricsHandler = type(cls_name, (MetricsHandler, object), + cls_name = str(cls.__name__) + MyMetricsHandler = type(cls_name, (cls, object), {"registry": registry}) return MyMetricsHandler diff --git a/tests/test_exposition.py b/tests/test_exposition.py index 6bc095f2..844bd112 100644 --- a/tests/test_exposition.py +++ b/tests/test_exposition.py @@ -296,6 +296,12 @@ def test_metrics_handler(self): handler = MetricsHandler.factory(self.registry) self.assertEqual(handler.registry, self.registry) + def test_metrics_handler_subclassing(self): + subclass = type(str('MetricsHandlerSubclass'), (MetricsHandler, object), {}) + handler = subclass.factory(self.registry) + + self.assertTrue(issubclass(handler, (MetricsHandler, subclass))) + if __name__ == '__main__': unittest.main()