mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Update the profile task callback plugin to include a fix for duplicate named tasks. Added additional features to adjust the number of tasks output and the sort order.
This commit is contained in:
parent
064cdec6ff
commit
b3aa373932
2 changed files with 47 additions and 29 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
# (C) 2016, Joel, http://github.com/jjshoe
|
||||||
# (C) 2015, Tom Paine, <github@aioue.net>
|
# (C) 2015, Tom Paine, <github@aioue.net>
|
||||||
# (C) 2014, Jharrod LaFon, @JharrodLaFon
|
# (C) 2014, Jharrod LaFon, @JharrodLaFon
|
||||||
# (C) 2012-2013, Michael DeHaan, <michael.dehaan@gmail.com>
|
# (C) 2012-2013, Michael DeHaan, <michael.dehaan@gmail.com>
|
||||||
|
@ -22,6 +23,8 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import collections
|
||||||
|
import os
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from ansible.plugins.callback import CallbackBase
|
from ansible.plugins.callback import CallbackBase
|
||||||
|
@ -49,7 +52,7 @@ def filled(msg, fchar="*"):
|
||||||
|
|
||||||
def timestamp(self):
|
def timestamp(self):
|
||||||
if self.current is not None:
|
if self.current is not None:
|
||||||
self.stats[self.current] = time.time() - self.stats[self.current]
|
self.stats[self.current]['time'] = time.time() - self.stats[self.current]['time']
|
||||||
|
|
||||||
|
|
||||||
def tasktime():
|
def tasktime():
|
||||||
|
@ -72,12 +75,22 @@ class CallbackModule(CallbackBase):
|
||||||
CALLBACK_NEEDS_WHITELIST = True
|
CALLBACK_NEEDS_WHITELIST = True
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.stats = {}
|
self.stats = collections.OrderedDict()
|
||||||
self.current = None
|
self.current = None
|
||||||
|
self.sort_order = os.getenv('PROFILE_TASKS_SORT_ORDER', True)
|
||||||
|
self.task_output_limit = os.getenv('PROFILE_TASKS_TASK_OUTPUT_LIMIT', 20)
|
||||||
|
|
||||||
|
if self.sort_order == 'ascending':
|
||||||
|
self.sort_order = False;
|
||||||
|
|
||||||
|
if self.task_output_limit == 'all':
|
||||||
|
self.task_output_limit = None
|
||||||
|
else:
|
||||||
|
self.task_output_limit = int(self.task_output_limit)
|
||||||
|
|
||||||
super(CallbackModule, self).__init__()
|
super(CallbackModule, self).__init__()
|
||||||
|
|
||||||
def _record_task(self, name):
|
def _record_task(self, task):
|
||||||
"""
|
"""
|
||||||
Logs the start of each task
|
Logs the start of each task
|
||||||
"""
|
"""
|
||||||
|
@ -85,14 +98,14 @@ class CallbackModule(CallbackBase):
|
||||||
timestamp(self)
|
timestamp(self)
|
||||||
|
|
||||||
# Record the start time of the current task
|
# Record the start time of the current task
|
||||||
self.current = name
|
self.current = task._uuid
|
||||||
self.stats[self.current] = time.time()
|
self.stats[self.current] = {'time': time.time(), 'name': task.get_name(), 'path': task.get_path()}
|
||||||
|
|
||||||
def playbook_on_task_start(self, name, is_conditional):
|
def v2_playbook_on_task_start(self, task, is_conditional):
|
||||||
self._record_task(name)
|
self._record_task(task)
|
||||||
|
|
||||||
def v2_playbook_on_handler_task_start(self, task):
|
def v2_playbook_on_handler_task_start(self, task):
|
||||||
self._record_task('HANDLER: ' + task.name)
|
self._record_task(task)
|
||||||
|
|
||||||
def playbook_on_setup(self):
|
def playbook_on_setup(self):
|
||||||
self._display.display(tasktime())
|
self._display.display(tasktime())
|
||||||
|
@ -103,21 +116,25 @@ class CallbackModule(CallbackBase):
|
||||||
|
|
||||||
timestamp(self)
|
timestamp(self)
|
||||||
|
|
||||||
# Sort the tasks by their running time
|
results = self.stats.items()
|
||||||
|
|
||||||
|
# Sort the tasks by the specified sort
|
||||||
|
if self.sort_order != 'none':
|
||||||
results = sorted(
|
results = sorted(
|
||||||
self.stats.items(),
|
self.stats.iteritems(),
|
||||||
key=lambda value: value[1],
|
key=lambda x:x[1]['time'],
|
||||||
reverse=True,
|
reverse=self.sort_order,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Just keep the top 20
|
# Display the number of tasks specified or the default of 20
|
||||||
results = results[:20]
|
results = results[:self.task_output_limit]
|
||||||
|
|
||||||
# Print the timings
|
# Print the timings
|
||||||
for name, elapsed in results:
|
for uuid, result in results:
|
||||||
self._display.display(
|
self._display.display(
|
||||||
"{0:-<70}{1:->9}".format(
|
"{0:-<70}{1:-<70}{2:->9}".format(
|
||||||
'{0} '.format(name),
|
'{0} '.format(result['path']),
|
||||||
' {0:.02f}s'.format(elapsed),
|
'{0} '.format(result['name']),
|
||||||
|
' {0:.02f}s'.format(result['time']),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
@ -15,6 +15,11 @@ Add ``profile_tasks`` to the ``callback_whitelist`` in ``ansible.cfg``.
|
||||||
|
|
||||||
Run playbooks as normal.
|
Run playbooks as normal.
|
||||||
|
|
||||||
|
Certain options are configurable using environment variables. You can specify ``ascending`` or ``none`` for
|
||||||
|
the environment variable ``PROFILE_TASKS_SORT_ORDER`` to adjust sorting output. If you want to see more than
|
||||||
|
20 tasks in the output you can set ``PROFILE_TASKS_TASK_OUTPUT_LIMIT`` to any number, or the special value
|
||||||
|
``all`` to get a list of all tasks.
|
||||||
|
|
||||||
Features
|
Features
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
@ -53,15 +58,11 @@ No more wondering how old the results in a terminal window are.
|
||||||
PLAY RECAP ********************************************************************
|
PLAY RECAP ********************************************************************
|
||||||
Thursday 11 June 2016 22:51:00 +0100 (0:00:01.011) 0:00:43.247 *********
|
Thursday 11 June 2016 22:51:00 +0100 (0:00:01.011) 0:00:43.247 *********
|
||||||
===============================================================================
|
===============================================================================
|
||||||
really slow task | Download project packages----------------------------11.61s
|
/home/bob/ansible/roles/old_and_slow/tasks/main.yml:4 ----------------old_and_slow : install tons of packages -------------------------------- 20.03s
|
||||||
security | Really slow security policies----------------------------------7.03s
|
/home/bob/ansible/roles/db/tasks/main.yml:4 --------------------------db : second task to run ------------------------------------------------- 2.03s
|
||||||
common-base | Install core system dependencies----------------------------3.62s
|
None -----------------------------------------------------------------setup ------------------------------------------------------------------- 0.42s
|
||||||
common | Install pip------------------------------------------------------3.60s
|
/home/bob/ansible/roles/www/tasks/main.yml:1 -------------------------www : first task to run ------------------------------------------------- 0.03s
|
||||||
common | Install boto-----------------------------------------------------3.57s
|
/home/bob/ansible/roles/fast_task.yml:1 ------------------------------fast_task : first task to run ------------------------------------------- 0.01s
|
||||||
nginx | Install nginx-----------------------------------------------------3.41s
|
|
||||||
serf | Install system dependencies----------------------------------------3.38s
|
|
||||||
duo_security | Install Duo Unix SSH Integration---------------------------3.37s
|
|
||||||
loggly | Install TLS version----------------------------------------------3.36s
|
|
||||||
|
|
||||||
Compatibility
|
Compatibility
|
||||||
-------------
|
-------------
|
||||||
|
|
Loading…
Reference in a new issue