Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
configuration
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
configuration
Commits
3ecd2364
Commit
3ecd2364
authored
9 years ago
by
Edward Zarecor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
changing naming/tagging
parent
d0026927
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
99 additions
and
0 deletions
+99
-0
playbooks/callback_plugins/datadog_tasks_timing.py
+99
-0
No files found.
playbooks/callback_plugins/datadog_tasks_timing.py
0 → 100644
View file @
3ecd2364
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
.
current_play
=
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_play_start
(
self
,
name
):
self
.
current_play
=
name
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.task_duration"
,
date_happened
=
[
0
],
points
=
points
[
1
],
tags
=
[
"task:{0}"
.
format
(
name
.
replace
(
" | "
,
"."
)
.
replace
(
" "
,
"-"
)
.
lower
())]
)
datadog
.
api
.
Metric
.
send
(
metric
=
"edx.ansible.play_duration"
,
date_happened
=
time
.
time
(),
points
=
total_seconds
,
tags
=
[
"play:{0}"
.
format
(
self
.
play_name
.
replace
(
" | "
,
"."
)
.
replace
(
" "
,
"-"
)
.
lower
())]
)
# 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
(
"
\n
Playbook finished: {0}, {1} total tasks. {2} elapsed.
\n
"
.
format
(
time
.
asctime
(),
len
(
self
.
stats
.
items
()),
datetime
.
timedelta
(
seconds
=
(
int
(
total_seconds
)))
)
)
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment