Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Gelencsér Szabolcs
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
A prog2-höz tartozó friss repo anyagok itt elérhetőek:
https://git.iit.bme.hu/
Commit
0dd53d40
authored
Feb 03, 2014
by
Gregory Nagy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
pep8 namingconvention + cpu_usage, ram_usage
parent
2b8a9a59
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
197 additions
and
170 deletions
+197
-170
circle/monitor/calvin/calvin/calvin.py
+163
-167
circle/vm/models/node.py
+34
-3
No files found.
circle/monitor/calvin/calvin/calvin.py
View file @
0dd53d40
...
...
@@ -3,174 +3,170 @@ import os
class
GraphiteHandler
:
def
__init__
(
self
):
if
os
.
getenv
(
"NODE_MONITOR_SERVER"
)
is
""
:
raise
RuntimeError
self
.
__server_name
=
os
.
getenv
(
"NODE_MONITOR_SERVER"
)
if
os
.
getenv
(
"NODE_MONITOR_PORT"
)
is
""
:
raise
RuntimeError
self
.
__server_port
=
os
.
getenv
(
"NODE_MONITOR_PORT"
)
self
.
__queries
=
[]
self
.
__responses
=
[]
def
put
(
self
,
query
):
self
.
__queries
.
append
(
query
)
def
cleanUpQueries
(
self
):
self
.
__queries
=
[]
def
cleanUpResponses
(
self
):
self
.
__responses
=
[]
def
isEmpty
(
self
):
return
len
(
self
.
__queries
)
is
0
def
generateAll
(
self
):
"""
Regenerate the queries before sending.
"""
for
query
in
self
.
__queries
:
query
.
generate
()
def
send
(
self
):
"""
Generates the corrent query for the Graphite webAPI and flush all the
queries in the fifo.
Important: After sending queries to the server the fifo will lost its
content.
"""
url_base
=
"http://
%
s:
%
s/render?"
%
(
self
.
__server_name
,
self
.
__server_port
)
for
query
in
self
.
__queries
:
response
=
requests
.
get
(
url_base
+
query
.
getGenerated
())
if
query
.
getFormat
()
is
"json"
:
self
.
__responses
.
append
(
response
.
json
())
# DICT
else
:
self
.
__responses
.
append
(
response
)
self
.
cleanUpQueries
()
def
pop
(
self
):
"""
Pop the first query has got from the server.
"""
try
:
return
self
.
__responses
.
pop
(
0
)
# Transform to dictionary
except
:
raise
RuntimeError
def
__init__
(
self
):
if
os
.
getenv
(
"NODE_MONITOR_SERVER"
)
is
""
:
raise
RuntimeError
self
.
__server_name
=
os
.
getenv
(
"NODE_MONITOR_SERVER"
)
if
os
.
getenv
(
"NODE_MONITOR_PORT"
)
is
""
:
raise
RuntimeError
self
.
__server_port
=
os
.
getenv
(
"NODE_MONITOR_PORT"
)
self
.
__queries
=
[]
self
.
__responses
=
[]
def
put
(
self
,
query
):
self
.
__queries
.
append
(
query
)
def
cleanUpQueries
(
self
):
self
.
__queries
=
[]
def
cleanUpResponses
(
self
):
self
.
__responses
=
[]
def
isEmpty
(
self
):
return
len
(
self
.
__queries
)
is
0
def
generateAll
(
self
):
"""
Regenerate the queries before sending.
"""
for
query
in
self
.
__queries
:
query
.
generate
()
def
send
(
self
):
"""
Generates the corrent query for the Graphite webAPI and flush all the
queries in the fifo.
Important: After sending queries to the server the fifo will lost its
content.
"""
url_base
=
"http://
%
s:
%
s/render?"
%
(
self
.
__server_name
,
self
.
__server_port
)
for
query
in
self
.
__queries
:
response
=
requests
.
get
(
url_base
+
query
.
getGenerated
())
if
query
.
getFormat
()
is
"json"
:
self
.
__responses
.
append
(
response
.
json
())
# DICT
else
:
self
.
__responses
.
append
(
response
)
self
.
cleanUpQueries
()
def
pop
(
self
):
"""
Pop the first query has got from the server.
"""
try
:
return
self
.
__responses
.
pop
(
0
)
# Transform to dictionary
except
:
raise
RuntimeError
class
Query
:
def
__init__
(
self
):
"""
Query initializaion:
default format is json dictionary
keys: ("target <string>","datapoints <list>")
"""
self
.
__target
=
""
self
.
__metric
=
""
self
.
__start
=
""
self
.
__end
=
""
self
.
__function
=
""
self
.
__response_format
=
"json"
self
.
__generated
=
""
def
setTarget
(
self
,
target
):
"""
Hostname of the target we should get the information from.
After the hostname you should use the domain the target is in.
Example: "foo.foodomain.domain.com.DOMAIN" where DOMAIN is
the root of the graphite server.
"""
self
.
__target
=
'.'
.
join
(
target
.
split
(
'.'
)[::
-
1
])
def
getTarget
(
self
):
return
self
.
__target
def
setMetric
(
self
,
metric
):
self
.
__metric
=
metric
def
getMetric
(
self
):
return
self
.
__metric
def
setAbsoluteStart
(
self
,
year
,
month
,
day
,
hour
,
minute
):
"""
Function for setting the time you want to get the reports from.
"""
if
(
len
(
year
)
>
4
or
len
(
year
)
<
2
):
raise
self
.
__start
=
hour
+
":"
+
minute
+
"_"
+
year
+
month
+
day
def
setRelativeStart
(
self
,
value
,
scale
):
"""
Function for setting the time you want to get the reports from.
"""
if
(
scale
not
in
[
"years"
,
"months"
,
"days"
,
"hours"
,
"minutes"
,
"seconds"
]):
raise
self
.
__start
=
"-"
+
str
(
value
)
+
scale
def
getStart
(
self
):
return
self
.
__start
def
setAbsoluteEnd
(
self
,
year
,
month
,
day
,
hour
,
minute
):
"""
Function for setting the time until you want to get the reports from.
"""
if
(
len
(
year
)
>
4
or
len
(
year
)
<
2
):
raise
self
.
__end
=
hour
+
":"
+
minute
+
"_"
+
year
+
month
+
day
def
setRelativeEnd
(
self
,
value
,
scale
):
"""
Function for setting the time until you want to get the reports from.
"""
if
(
scale
not
in
[
"years"
,
"months"
,
"days"
,
"hours"
,
"minutes"
,
"seconds"
]):
raise
self
.
__end
=
"-"
+
str
(
value
)
+
scale
def
getEnd
(
self
):
return
self
.
__end
def
setFormat
(
self
,
fmat
):
"""
Function for setting the format of the response from the server.
Valid values: ["csv", "raw", "json"]
"""
valid_formats
=
[
"csv"
,
"raw"
,
"json"
]
if
fmat
not
in
valid_formats
:
raise
self
.
__response_format
=
fmat
def
getFormat
(
self
):
return
self
.
__response_format
def
generate
(
self
):
"""
You must always call this function before sending the metric to the
server for it generates the valid format that the graphite API can
parse.
"""
tmp
=
"target="
+
self
.
__target
+
"."
+
self
.
__metric
if
len
(
self
.
__start
)
is
not
0
:
tmp
=
tmp
+
"&from="
+
self
.
__start
if
len
(
self
.
__end
)
is
not
0
:
tmp
=
tmp
+
"&until="
+
self
.
__end
tmp
=
tmp
+
"&format="
+
self
.
__response_format
self
.
__generated
=
tmp
return
self
.
__generated
def
getGenerated
(
self
):
"""
Returns the generated query string.
Throws exception if it haven't been done yet.
"""
if
len
(
self
.
__generated
)
is
0
:
raise
return
self
.
__generated
def
__init__
(
self
):
"""
Query initializaion:
default format is json dictionary
keys: ("target <string>","datapoints <list>")
"""
self
.
__target
=
""
self
.
__metric
=
""
self
.
__start
=
""
self
.
__end
=
""
self
.
__function
=
""
self
.
__response_format
=
"json"
self
.
__generated
=
""
def
setTarget
(
self
,
target
):
"""
Hostname of the target we should get the information from.
After the hostname you should use the domain the target is in.
Example: "foo.foodomain.domain.com.DOMAIN" where DOMAIN is
the root of the graphite server.
"""
self
.
__target
=
'.'
.
join
(
target
.
split
(
'.'
)[::
-
1
])
def
getTarget
(
self
):
return
self
.
__target
def
setMetric
(
self
,
metric
):
self
.
__metric
=
metric
def
getMetric
(
self
):
return
self
.
__metric
def
setAbsoluteStart
(
self
,
year
,
month
,
day
,
hour
,
minute
):
"""
Function for setting the time you want to get the reports from.
"""
if
(
len
(
year
)
>
4
or
len
(
year
)
<
2
):
raise
self
.
__start
=
hour
+
":"
+
minute
+
"_"
+
year
+
month
+
day
def
setRelativeStart
(
self
,
value
,
scale
):
"""
Function for setting the time you want to get the reports from.
"""
if
(
scale
not
in
[
"years"
,
"months"
,
"days"
,
"hours"
,
"minutes"
,
"seconds"
]):
raise
self
.
__start
=
"-"
+
str
(
value
)
+
scale
def
getStart
(
self
):
return
self
.
__start
def
setAbsoluteEnd
(
self
,
year
,
month
,
day
,
hour
,
minute
):
"""
Function for setting the time until you want to get the reports from.
"""
if
(
len
(
year
)
>
4
or
len
(
year
)
<
2
):
raise
self
.
__end
=
hour
+
":"
+
minute
+
"_"
+
year
+
month
+
day
def
setRelativeEnd
(
self
,
value
,
scale
):
"""
Function for setting the time until you want to get the reports from.
"""
if
(
scale
not
in
[
"years"
,
"months"
,
"days"
,
"hours"
,
"minutes"
,
"seconds"
]):
raise
self
.
__end
=
"-"
+
str
(
value
)
+
scale
def
getEnd
(
self
):
return
self
.
__end
def
setFormat
(
self
,
fmat
):
"""
Function for setting the format of the response from the server.
Valid values: ["csv", "raw", "json"]
"""
valid_formats
=
[
"csv"
,
"raw"
,
"json"
]
if
fmat
not
in
valid_formats
:
raise
self
.
__response_format
=
fmat
def
getFormat
(
self
):
return
self
.
__response_format
def
generate
(
self
):
"""
You must always call this function before sending the metric to the
server for it generates the valid format that the graphite API can
parse.
"""
tmp
=
"target="
+
self
.
__target
+
"."
+
self
.
__metric
if
len
(
self
.
__start
)
is
not
0
:
tmp
=
tmp
+
"&from="
+
self
.
__start
if
len
(
self
.
__end
)
is
not
0
:
tmp
=
tmp
+
"&until="
+
self
.
__end
tmp
=
tmp
+
"&format="
+
self
.
__response_format
self
.
__generated
=
tmp
return
self
.
__generated
def
getGenerated
(
self
):
"""
Returns the generated query string.
Throws exception if it haven't been done yet.
"""
if
len
(
self
.
__generated
)
is
0
:
raise
return
self
.
__generated
circle/vm/models/node.py
View file @
0dd53d40
...
...
@@ -16,6 +16,9 @@ from firewall.models import Host
from
..tasks
import
vm_tasks
from
.common
import
Trait
from
monitor.calvin
import
Query
from
monitor.calvin
import
GraphiteHandler
logger
=
getLogger
(
__name__
)
...
...
@@ -60,6 +63,7 @@ class Node(TimeStampedModel):
def
num_cores
(
self
):
"""Number of CPU threads available to the virtual machines.
"""
return
self
.
remote_query
(
vm_tasks
.
get_core_num
)
@property
...
...
@@ -93,13 +97,11 @@ class Node(TimeStampedModel):
def
get_remote_queue_name
(
self
,
queue_id
):
return
self
.
host
.
hostname
+
"."
+
queue_id
def
remote_query
(
self
,
task
,
timeout
=
1
,
raise_
=
False
,
default
=
None
):
def
remote_query
(
self
,
task
,
timeout
=
30
,
raise_
=
False
,
default
=
None
):
"""Query the given task, and get the result.
If the result is not ready in timeout secs, return default value or
raise a TimeoutError."""
if
task
!=
vm_tasks
.
ping
and
not
self
.
online
:
return
default
r
=
task
.
apply_async
(
queue
=
self
.
get_remote_queue_name
(
'vm'
),
expires
=
timeout
+
60
)
try
:
...
...
@@ -110,6 +112,35 @@ class Node(TimeStampedModel):
else
:
return
default
def
get_monitor_info
(
self
):
query
=
Query
()
handler
=
GraphiteHandler
()
query
.
setTarget
(
self
.
host
.
hostname
+
".circle"
)
query
.
setFormat
(
"json"
)
query
.
setRelativeStart
(
5
,
"minutes"
)
metrics
=
[
"cpu.usage"
,
"memory.usage"
,
"network.bytes_sent"
,
"network.bytes_received"
]
collected
=
{}
for
metric
in
metrics
:
query
.
setMetric
(
metric
)
query
.
generate
()
handler
.
put
(
query
)
handler
.
send
()
for
metric
in
metrics
:
response
=
query
.
pop
()
length
=
len
(
response
[
0
][
"datapoints"
])
cache
=
response
[
0
][
"datapoints"
][
length
-
1
][
0
]
if
cache
is
None
:
cache
=
0
collected
[
metric
]
=
cache
return
collected
def
cpu_usage
(
self
):
return
self
.
get_monitor_info
()[
"cpu.usage"
]
def
ram_usage
(
self
):
return
self
.
get_monitor_info
()[
"memory.usage"
]
def
update_vm_states
(
self
):
domains
=
{}
for
i
in
self
.
remote_query
(
vm_tasks
.
list_domains_info
,
timeout
=
5
):
...
...
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