1
0
Fork 0
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:
Joel 2016-02-25 09:52:56 -06:00
parent 064cdec6ff
commit b3aa373932
2 changed files with 47 additions and 29 deletions

View file

@ -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']),
) )
) )

View file

@ -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
------------- -------------