123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- {% extends "base.html" %}
- {% block navbar %}
- {% module Template("navbar.html", active_tab="workers", absolute_url=absolute_url) %}
- {% end %}
- {% block container %}
- <div class="container-fluid">
- <div class="row-fluid">
- <div class="span12">
- <div class="page-header">
- <h1 id="workername">{{ worker.name }}</h1>
- </div>
- <div class="tabbable">
- <ul class="nav nav-tabs">
- <li class="active"><a href="#tab-pool" data-toggle="tab">Pool</a></li>
- <li><a href="#tab-broker" data-toggle="tab">Broker</a></li>
- <li><a href="#tab-queues" data-toggle="tab">Queues</a></li>
- <li><a href="#tab-tasks" data-toggle="tab">Tasks</a></li>
- <li><a href="#tab-limits" data-toggle="tab">Limits</a></li>
- <li><a href="#tab-config" data-toggle="tab">Config</a></li>
- </ul>
- <div class="tab-content">
- <div class="tab-pane active" id="tab-pool">
- <div class="row-fluid">
- <div class="span6">
- <table class="table table-bordered table-striped">
- <caption>Worker pool options</caption>
- <tbody>
- {% for name,value in worker.stats['pool'].items() %}
- <tr>
- <td>{{ humanize(name) }}</td>
- <td>{{ humanize(value) }}</td>
- </tr>
- {% end %}
- <tr>
- <td>Worker PID</td>
- <td>{{ worker.stats.get('pid', '')}}</td>
- </tr>
- </tbody>
- </table>
- </div>
- <div class="span6">
- <div class="form-horizontal">
- <fieldset>
- <legend>Pool size control</legend>
- <div class="control-group">
- <label class="control-label" for="pool-size">Pool size</label>
- <div class="controls">
- <div class="input-append">
- <select class="input-mini" id="pool-size">
- <option>1</option>
- <option>2</option>
- <option>3</option>
- <option>4</option>
- <option>5</option>
- </select>
- <button class="btn" type="button" onclick="flower.on_pool_grow(event)">Grow</button>
- <button class="btn" type="button" onclick="flower.on_pool_shrink(event)">Shrink</button>
- </div>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label" for="min-autoscale">Min/Max autoscale</label>
- <div class="controls">
- <div class="input-append">
- <input class="input-mini" id="min-autoscale" size="6" type="text">
- <input class="input-mini" id="max-autoscale" size="6" type="text">
- <button class="btn" type="button" onclick="flower.on_pool_autoscale(event)">Apply</button>
- </div>
- </div>
- </div>
- </fieldset>
- </div>
- </div>
- </div>
- {% if worker.stats.get('autoscaler', None) %}
- <div class="row-fluid">
- <div class="span6">
- <table class="table table-bordered table-striped">
- <caption>Autoscaler options</caption>
- <tbody>
- {% for name,value in worker.stats['autoscaler'].items() %}
- <tr>
- <td>{{ humanize(name) }}</td>
- <td>{{ humanize(value) }}</td>
- </tr>
- {% end %}
- </tbody>
- </table>
- </div>
- </div>
- {% end %}
- </div> <!-- end pool tab -->
-
- <div class="tab-pane" id="tab-broker">
- <div class="span6">
- <table class="table table-bordered table-striped">
- <caption>Broker options</caption>
- <tbody>
- {% for name,value in (worker.stats.get('consumer', None) or worker.stats)['broker'].items() %}
- <tr>
- <td>{{ humanize(name) }}</td>
- <td>{{ value }}</td>
- </tr>
- {% end %}
- </tbody>
- </table>
- </div>
- </div> <!-- end broker tab -->
-
- <div class="tab-pane" id="tab-queues">
- <h3>Active <small>queues being consumed from</small></h3>
- <div class="control-group">
- <div class="controls">
- <div class="input-append">
- <input class="span2" id="add-consumer-name" size="16" type="text">
- <button class="btn" type="button" onclick="flower.on_add_consumer(event)">Add Consumer</button>
- </div>
- </div>
- </div>
- <table class="table table-bordered table-striped">
- <thead>
- <tr>
- <th>Name</th>
- <th>Exclusive</th>
- <!-- <th>Exchange</th> -->
- <th>Durable</th>
- <th>Routing key</th>
- <th>No ACK</th>
- <th>Alias</th>
- <th>Queue arguments</th>
- <th>Binding arguments</th>
- <th>Auto delete</th>
- <th style="width: 125px;"></th>
- </tr>
- </thead>
- <tbody>
- {% for queue in worker.active_queues %}
- <tr>
- <td>{{ queue['name'] }}</td>
- <td>{{ queue['exclusive'] }}</td>
- <!-- <td>{{ queue['exchange'] }}</td> -->
- <td>{{ queue['durable'] }}</td>
- <td>{{ queue['routing_key'] }}</td>
- <td>{{ queue['no_ack'] }}</td>
- <td>{{ queue['alias'] }}</td>
- <td>{{ queue['queue_arguments'] }}</td>
- <td>{{ queue['binding_arguments'] }}</td>
- <td>{{ queue['auto_delete'] }}</td>
- <td><button class="btn btn-danger" onclick="flower.on_cancel_consumer(event)">Cancel Consumer</button></td>
- </tr>
- {% end %}
- </tbody>
- </table>
- </div> <!-- end queues tab -->
-
- <div class="tab-pane" id="tab-tasks">
- <h2>Processed <small>number of completed tasks</small></h2>
- <table class="table table-bordered table-striped">
- <tbody>
- {% for name,value in worker.stats['total'].items() %}
- <tr>
- <td>{{ name }}</td>
- <td>{{ value }}</td>
- </tr>
- {% end %}
- </tbody>
- </table>
- <h2>Active <small>currently executing tasks</small></h2>
- <table class="table table-bordered table-striped">
- <thead>
- <tr>
- <th>Name</th>
- <th>UUID</th>
- <th>Start time</th>
- <th>Ack</th>
- <th>PID</th>
- <th>args</th>
- <th>kwargs</th>
- </tr>
- </tr>
- </tr>
- </thead>
- <tbody>
- {% for task in worker.active_tasks %}
- <tr>
- <td>{{ task['name'] }}</td>
- <td><a href="{{ absolute_url('/task/' + task['id']) }}">{{ task['id'] }}</a></td>
- <td>{{ humanize(task['time_start'], type='time') }}</td>
- <td>{{ task['acknowledged'] }}</td>
- <td>{{ task['worker_pid'] }}</td>
- <td>{{ task['args'] }}</td>
- <td>{{ task['kwargs'] }}</td>
- </tr>
- {% end %}
- </tbody>
- </table>
- <h2>Scheduled <small>scheduled (eta/countdown/retry) tasks</small></h2>
- <table class="table table-bordered table-striped">
- <thead>
- <tr>
- <th>Name</th>
- <th>UUID</th>
- <th>args</th>
- <th>kwargs</th>
- </tr>
- </thead>
- <tbody>
- {% for task in worker.scheduled_tasks %}
- <tr>
- <td>{{ task['request']['name'] }}</td>
- <td><a href="{{ absolute_url('/task/' + task['request']['id']) }}">{{ task['request']['id'] }}</a></td>
- <td>{{ task['request']['args'] }}</td>
- <td>{{ task['request']['kwargs'] }}</td>
- </tr>
- {% end %}
- </tbody>
- </table>
- <h2>Reserved <small>tasks that have been received, but are still waiting to be executed</small></h2>
- <table class="table table-bordered table-striped">
- <thead>
- <tr>
- <th>Name</th>
- <th>UUID</th>
- <th>args</th>
- <th>kwargs</th>
- </tr>
- </thead>
- <tbody>
- {% for task in worker.reserved_tasks %}
- <tr>
- <td>{{ task['name'] }}</td>
- <td><a href="{{ absolute_url('/task/' + task['id']) }}">{{ task['id'] }}</a></td>
- <td>{{ task['args'] }}</td>
- <td>{{ task['kwargs'] }}</td>
- </tr>
- {% end %}
- </tbody>
- </table>
- <h2>Revoked <small>cancelled tasks</small></h2>
- <table class="table table-bordered table-striped">
- <thead>
- <tr>
- <th>Name</th>
- <th>ID</th>
- <th>args</th>
- <th>kwargs</th>
- </tr>
- </thead>
- <tbody>
- {% for task in worker.revoked_tasks %}
- <tr>
- <td></td>
- <td><a href="{{ absolute_url('/task/' + task) }}">{{ task }}</a></td>
- <td></td>
- <td></td>
- </tr>
- {% end %}
- </tbody>
- </table>
- </div> <!-- end tasks tab -->
-
- <div class="tab-pane" id="tab-limits">
- <h3>Task limits</h3>
- <table class="table table-bordered table-striped">
- <thead>
- <tr>
- <th>Task name</th>
- <th>Rate limit</th>
- <th>Timeouts</th>
- </tr>
- </thead>
- {% for taskname in worker.registered_tasks %}
- <tr>
- <td>{{ taskname }}</td>
- <td>
- <div class="control-group">
- <div class="controls">
- <div class="input-append">
- <input class="input-small" type="text">
- <button class="btn" type="button" onclick="flower.on_task_rate_limit(event)">Apply</button>
- </div>
- </div>
- </div>
- </td>
- <td>
- <div class="control-group">
- <div class="controls">
- <div class="input-append">
- <input class="input-small" type="text">
- <button class="btn" type="button" onclick="flower.on_task_timeout(event)">Soft</button>
- <button class="btn" type="button" onclick="flower.on_task_timeout(event)">Hard</button>
- </div>
- </div>
- </div>
- </td>
- </tr>
- {% end %}
- </table>
- </div> <!-- end limits tab -->
- <div class="tab-pane" id="tab-config">
- <div class="span8">
- <table class="table table-bordered table-striped">
- <caption>Configuration options</caption>
- <tbody>
- {% for name,value in sorted(worker.conf.items()) %}
- {% if value is not None %}
- <tr>
- <td><a href="http://docs.celeryproject.org/en/latest/configuration.html#{{ name.lower().replace('_', '-') }}" target="_blank">{{ name }}</a></td>
- <td>{{ value }}</td>
- </tr>
- {% end %}
- {% end %}
- </tbody>
- </table>
- </div>
- </div> <!-- end config tab -->
- </div>
- </div>
- </div>
- <div>
- {% end %}
|