diff options
author | Thomas Wiest <twiest@users.noreply.github.com> | 2015-07-06 14:36:53 -0400 |
---|---|---|
committer | Thomas Wiest <twiest@users.noreply.github.com> | 2015-07-06 14:36:53 -0400 |
commit | d24c15acde4f061f174fecc1f3312da2dea5ba19 (patch) | |
tree | ee827fe08291881f0bc59bd2a7b424825bd6e434 | |
parent | a7f98a0b8c19d7d20c2e9761104ca24affbbb249 (diff) | |
parent | 1bab4edd3d8cd3201bf210312f18fc9841c339d3 (diff) | |
download | openshift-d24c15acde4f061f174fecc1f3312da2dea5ba19.tar.gz openshift-d24c15acde4f061f174fecc1f3312da2dea5ba19.tar.bz2 openshift-d24c15acde4f061f174fecc1f3312da2dea5ba19.tar.xz openshift-d24c15acde4f061f174fecc1f3312da2dea5ba19.zip |
Merge pull request #291 from lhuard1A/profile
Add a --profile option to spot which task takes more time
-rw-r--r-- | ansible-profile/README.md | 6 | ||||
-rw-r--r-- | ansible-profile/callback_plugins/profile_tasks.py | 83 | ||||
-rwxr-xr-x | bin/cluster | 6 |
3 files changed, 95 insertions, 0 deletions
diff --git a/ansible-profile/README.md b/ansible-profile/README.md new file mode 100644 index 000000000..4f10817d4 --- /dev/null +++ b/ansible-profile/README.md @@ -0,0 +1,6 @@ +# Ansible profile + +This is a callback plugin for timing tasks. + +The upstream project lies in: +https://github.com/jlafon/ansible-profile diff --git a/ansible-profile/callback_plugins/profile_tasks.py b/ansible-profile/callback_plugins/profile_tasks.py new file mode 100644 index 000000000..e9728a803 --- /dev/null +++ b/ansible-profile/callback_plugins/profile_tasks.py @@ -0,0 +1,83 @@ +# The MIT License (MIT) + +# Copyright (c) 2014 Jharrod LaFon + +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# the Software, and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +''' +A plugin for timing tasks + +This plugin records the time spent in each task. +At the end of the playbook, it displays the time spent in the 10 slowest tasks. +''' + +import time + + +class CallbackModule(object): + """ + A plugin for timing tasks + """ + def __init__(self): + self.stats = {} + self.current = None + + # Reason: The is_conditional parameter is part of the Ansible plugin API + # Status: permanently disabled + # pylint: disable=unused-argument + def playbook_on_task_start(self, name, is_conditional): + """ + Logs the start of each task + """ + if self.current is not None: + # Record the running time of the last executed task + self.stats[self.current] = time.time() - self.stats[self.current] + + # Record the start time of the current task + self.current = name + self.stats[self.current] = time.time() + + # Reason: The stats parameter is part of the Ansible plugin API + # Status: permanently disabled + # pylint: disable=unused-argument + def playbook_on_stats(self, stats): + """ + Prints the timings + """ + # Record the timing of the very last task + if self.current is not None: + self.stats[self.current] = time.time() - self.stats[self.current] + + # Sort the tasks by their running time + results = sorted( + self.stats.items(), + key=lambda value: value[1], + reverse=True, + ) + + # Just keep the top 10 + results = results[:10] + + # Print the timings + for name, elapsed in results: + print( + "{0:-<70}{1:->9}".format( + '{0} '.format(name), + ' {0:.02f}s'.format(elapsed), + ) + ) diff --git a/bin/cluster b/bin/cluster index 720dd230c..fbbffadc9 100755 --- a/bin/cluster +++ b/bin/cluster @@ -184,6 +184,9 @@ class Cluster(object): verbose, inventory, ansible_env, playbook ) + if args.profile: + command = 'ANSIBLE_CALLBACK_PLUGINS=ansible-profile/callback_plugins ' + command + if args.verbose > 1: command = 'time {}'.format(command) @@ -240,6 +243,9 @@ if __name__ == '__main__': meta_parser.add_argument('-o', '--option', action='append', help='options') + meta_parser.add_argument('-p', '--profile', action='store_true', + help='Enable playbook profiling') + action_parser = parser.add_subparsers(dest='action', title='actions', description='Choose from valid actions') |