Selaa lähdekoodia

Bugreport now available as a command and broadcast command

- Get it from a Python repl:

    >>> import celery
    >>> print(celery.bugreport())

- Use celeryctl:

    $ celeryctl report

- Get it from remote workers:

    $ celeryctl inspect report
Ask Solem 13 vuotta sitten
vanhempi
commit
50a5bf27b9
4 muutettua tiedostoa jossa 52 lisäystä ja 3 poistoa
  1. 34 2
      celery/app/base.py
  2. 3 0
      celery/app/control.py
  3. 10 1
      celery/bin/celeryctl.py
  4. 5 0
      celery/worker/control.py

+ 34 - 2
celery/app/base.py

@@ -20,6 +20,7 @@ from collections import deque
 from contextlib import contextmanager
 from copy import deepcopy
 from functools import wraps
+from pprint import pformat
 
 from kombu.clocks import LamportClock
 
@@ -27,7 +28,7 @@ from .. import datastructures
 from .. import platforms
 from ..exceptions import AlwaysEagerIgnored
 from ..local import maybe_evaluate
-from ..utils import cached_property, instantiate, lpmerge
+from ..utils import cached_property, instantiate, lpmerge, qualname
 
 from .defaults import DEFAULTS, find_deprecated_settings, find
 
@@ -35,10 +36,16 @@ import kombu
 if kombu.VERSION < (2, 0):
     raise ImportError("Celery requires Kombu version 1.1.0 or higher.")
 
+SETTINGS_INFO = """%s %s"""
+
 BUGREPORT_INFO = """
 platform -> system:%(system)s arch:%(arch)s imp:%(py_i)s
 software -> celery:%(celery_v)s kombu:%(kombu_v)s py:%(py_v)s
+loader   -> %(loader)s
 settings -> transport:%(transport)s results:%(results)s
+
+%(human_settings)s
+
 """
 
 
@@ -350,7 +357,32 @@ class BaseApp(object):
                                  "kombu_v": kombu.__version__,
                                  "py_v": _platform.python_version(),
                                  "transport": self.conf.BROKER_TRANSPORT,
-                                 "results": self.conf.CELERY_RESULT_BACKEND}
+                                 "results": self.conf.CELERY_RESULT_BACKEND,
+                                 "human_settings": self.human_settings(),
+                                 "loader": qualname(self.loader.__class__)}
+
+    def _pformat(self, value, width=80, nl_width=80, **kw):
+
+        if isinstance(value, dict):
+            return "{\n %s" % (
+                                pformat(value, width=nl_width, indent=4, **kw)[1:])
+        elif isinstance(value, tuple):
+            return "\n%s%s" % (' ' * 4,
+                                pformat(value, width=nl_width, **kw))
+        else:
+            return pformat(value, width=width, **kw)
+
+    def human_settings(self):
+        return "\n".join(SETTINGS_INFO % (key + ':',
+                                          self._pformat(value, width=50))
+                    for key, value in self.filter_user_settings().iteritems())
+
+    def filter_user_settings(self):
+        user_settings = {}
+        # the last stash is the default settings, so just skip that
+        for stash in self.conf._order[:-1]:
+            user_settings.update(stash)
+        return user_settings
 
     @property
     def pool(self):

+ 3 - 0
celery/app/control.py

@@ -49,6 +49,9 @@ class Inspect(object):
                                       callback=self.callback,
                                       timeout=self.timeout, reply=True))
 
+    def report(self):
+        return self._request("report")
+
     def active(self, safe=False):
         return self._request("dump_active", safe=safe)
 

+ 10 - 1
celery/bin/celeryctl.py

@@ -291,7 +291,8 @@ class inspect(Command):
                "disable_events": 1.0,
                "ping": 0.2,
                "add_consumer": 1.0,
-               "cancel_consumer": 1.0}
+               "cancel_consumer": 1.0,
+               "report": 1.0}
     option_list = Command.option_list + (
                 Option("--timeout", "-t", type="float", dest="timeout",
                     default=None,
@@ -497,6 +498,14 @@ class help(Command):
 help = command(help)
 
 
+class report(Command):
+
+    def run(self, *args, **kwargs):
+        print(self.app.bugreport())
+        return EX_OK
+report = command(report)
+
+
 class celeryctl(CeleryCommand):
     commands = commands
     enable_config_from_cmdline = True

+ 5 - 0
celery/worker/control.py

@@ -50,6 +50,11 @@ def revoke(panel, task_id, terminate=False, signal=None, **kwargs):
     return {"ok": "task %s %s" % (task_id, action)}
 
 
+@Panel.register
+def report(panel):
+    return {"ok": panel.app.bugreport()}
+
+
 @Panel.register
 def enable_events(panel):
     dispatcher = panel.consumer.event_dispatcher