events.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # -*- coding: utf-8 -*-
  2. """
  3. The :program:`celery events` command.
  4. .. program:: celery events
  5. .. seealso::
  6. See :ref:`preload-options` and :ref:`daemon-options`.
  7. .. cmdoption:: -d, --dump
  8. Dump events to stdout.
  9. .. cmdoption:: -c, --camera
  10. Take snapshots of events using this camera.
  11. .. cmdoption:: --detach
  12. Camera: Detach and run in the background as a daemon.
  13. .. cmdoption:: -F, --freq, --frequency
  14. Camera: Shutter frequency. Default is every 1.0 seconds.
  15. .. cmdoption:: -r, --maxrate
  16. Camera: Optional shutter rate limit (e.g. 10/m).
  17. .. cmdoption:: -l, --loglevel
  18. Logging level, choose between `DEBUG`, `INFO`, `WARNING`,
  19. `ERROR`, `CRITICAL`, or `FATAL`. Default is INFO.
  20. .. cmdoption:: -f, --logfile
  21. Path to log file. If no logfile is specified, `stderr` is used.
  22. .. cmdoption:: --pidfile
  23. Optional file used to store the process pid.
  24. The program will not start if this file already exists
  25. and the pid is still alive.
  26. .. cmdoption:: --uid
  27. User id, or user name of the user to run as after detaching.
  28. .. cmdoption:: --gid
  29. Group id, or group name of the main group to change to after
  30. detaching.
  31. .. cmdoption:: --umask
  32. Effective umask (in octal) of the process after detaching. Inherits
  33. the umask of the parent process by default.
  34. .. cmdoption:: --workdir
  35. Optional directory to change to after detaching.
  36. .. cmdoption:: --executable
  37. Executable to use for the detached process.
  38. """
  39. from __future__ import absolute_import, unicode_literals
  40. import sys
  41. from functools import partial
  42. from celery.platforms import detached, set_process_title, strargv
  43. from celery.bin.base import Command, daemon_options
  44. __all__ = ['events']
  45. class events(Command):
  46. """Event-stream utilities.
  47. Commands::
  48. celery events --app=proj
  49. start graphical monitor (requires curses)
  50. celery events -d --app=proj
  51. dump events to screen.
  52. celery events -b amqp://
  53. celery events -c <camera> [options]
  54. run snapshot camera.
  55. Examples::
  56. celery events
  57. celery events -d
  58. celery events -c mod.attr -F 1.0 --detach --maxrate=100/m -l info
  59. """
  60. doc = __doc__
  61. supports_args = False
  62. def run(self, dump=False, camera=None, frequency=1.0, maxrate=None,
  63. loglevel='INFO', logfile=None, prog_name='celery events',
  64. pidfile=None, uid=None, gid=None, umask=None,
  65. working_directory=None, detach=False, **kwargs):
  66. self.prog_name = prog_name
  67. if dump:
  68. return self.run_evdump()
  69. if camera:
  70. return self.run_evcam(camera, freq=frequency, maxrate=maxrate,
  71. loglevel=loglevel, logfile=logfile,
  72. pidfile=pidfile, uid=uid, gid=gid,
  73. umask=umask,
  74. working_directory=working_directory,
  75. detach=detach)
  76. return self.run_evtop()
  77. def run_evdump(self):
  78. from celery.events.dumper import evdump
  79. self.set_process_status('dump')
  80. return evdump(app=self.app)
  81. def run_evtop(self):
  82. from celery.events.cursesmon import evtop
  83. self.set_process_status('top')
  84. return evtop(app=self.app)
  85. def run_evcam(self, camera, logfile=None, pidfile=None, uid=None,
  86. gid=None, umask=None, working_directory=None,
  87. detach=False, **kwargs):
  88. from celery.events.snapshot import evcam
  89. workdir = working_directory
  90. self.set_process_status('cam')
  91. kwargs['app'] = self.app
  92. cam = partial(evcam, camera,
  93. logfile=logfile, pidfile=pidfile, **kwargs)
  94. if detach:
  95. with detached(logfile, pidfile, uid, gid, umask, workdir):
  96. return cam()
  97. else:
  98. return cam()
  99. def set_process_status(self, prog, info=''):
  100. prog = '{0}:{1}'.format(self.prog_name, prog)
  101. info = '{0} {1}'.format(info, strargv(sys.argv))
  102. return set_process_title(prog, info=info)
  103. def prepare_arguments(self, parser):
  104. parser.add_option('-d', '--dump', action='store_true')
  105. parser.add_option('-c', '--camera')
  106. parser.add_option('--detach', action='store_true')
  107. parser.add_option('-F', '--frequency', '--freq',
  108. type='float', default=1.0)
  109. parser.add_option('-r', '--maxrate')
  110. parser.add_option('-l', '--loglevel', default='INFO')
  111. daemon_options(parser, default_pidfile='celeryev.pid')
  112. parser.add_options(self.app.user_options['events'])
  113. def main():
  114. ev = events()
  115. ev.execute_from_commandline()
  116. if __name__ == '__main__': # pragma: no cover
  117. main()