Commit f274c1ad by Edward Zarecor

Merge pull request #2553 from edx/e0d/ops-680a

E0d/ops 680a
parents 16a96681 478c1299
import os
import datetime
import time
import logging
import datadog
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
"""
Originally written by 'Jharrod LaFon'
#https://github.com/jlafon/ansible-profile/blob/master/callback_plugins/profile_tasks.py
"""
class CallbackModule(object):
"""
Ansible plugin get the time of each task and total time to run the complete playbook
"""
def __init__(self):
self.stats = {}
self.current_task = None
self.datadog_api_key = os.getenv('DATADOG_API_KEY')
self.datadog_app_key = os.getenv('DATADOG_APP_KEY')
self.datadog_api_initialized = False
if self.datadog_api_key and self.datadog_app_key:
datadog.initialize(api_key=self.datadog_api_key,
app_key=self.datadog_app_key)
self.datadog_api_initialized = True
def playbook_on_task_start(self, name, is_conditional):
"""
Logs the start of each task
"""
if self.current_task is not None:
# Record the running time of the last executed task
self.stats[self.current_task] = (time.time(), time.time() - self.stats[self.current_task])
# Record the start time of the current task
self.current_task = name
self.stats[self.current_task] = time.time()
def playbook_on_stats(self, stats):
"""
Prints the timing of each task and total time to run the complete playbook
"""
# Record the timing of the very last task, we use it here, because we don't have stop task function by default
if self.current_task is not None:
self.stats[self.current_task] = (time.time(), time.time() - self.stats[self.current_task])
# Sort the tasks by their running time
results = sorted(self.stats.items(), key=lambda value: value[1][1], reverse=True)
# Total time to run the complete playbook
total_seconds = sum([x[1][1] for x in self.stats.items()])
# send the metric to datadog
if self.datadog_api_initialized:
for name, points in results:
datadog.api.Metric.send(
metric="edx.ansible.{0}.task_duration".format(name.replace(" | ", ".").replace(" ", "-").lower()),
date_happened=[0],
points=points[1],
)
datadog.api.Metric.send(
metric="edx.ansible.play_duration",
date_happened=time.time(),
points=total_seconds,
)
# Log the time of each task
for name, elapsed in results:
logger.info(
"{0:-<80}{1:->8}".format(
'{0} '.format(name),
' {0:.02f}s'.format(elapsed[1]),
)
)
logger.info("\nPlaybook finished: {0}, {1} total tasks. {2} elapsed. \n".format(
time.asctime(),
len(self.stats.items()),
datetime.timedelta(seconds=(int(total_seconds)))
)
)
......@@ -17,3 +17,4 @@ pymongo==3.1
# Needed for the mysql_db module
MySQL-python==1.2.5
datadog==0.8.0
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment