Created
June 15, 2016 13:12
-
-
Save fridim/4239a102e3d752c1b0c271d236305428 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import datetime | |
import os | |
import time | |
# Ansible 1.9 and 2.0 compatibility | |
try: | |
from ansible.plugins.callback import CallbackBase | |
parent_class = CallbackBase | |
except ImportError: | |
parent_class = object | |
class CallbackModule(parent_class): | |
""" | |
A plugin for timing tasks | |
""" | |
def __init__(self): | |
super(CallbackModule, self).__init__() | |
self.stats = {} | |
self.current = None | |
def playbook_on_task_start(self, name, is_conditional): | |
""" | |
Logs the start of each task | |
""" | |
if os.getenv("ANSIBLE_PROFILE_DISABLE") is not None: | |
return | |
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() | |
def playbook_on_stats(self, stats): | |
""" | |
Prints the timings | |
""" | |
if os.getenv("ANSIBLE_PROFILE_DISABLE") is not None: | |
return | |
# 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), | |
) | |
) | |
total_seconds = sum([x[1] for x in self.stats.items()]) | |
print("\nPlaybook finished: {0}, {1} total tasks. {2} elapsed. \n".format( | |
time.asctime(), | |
len(self.stats.items()), | |
datetime.timedelta(seconds=(int(total_seconds))) | |
) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment