Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
蜕变的菜鸟
glances
提交
ea84db45
G
glances
项目概览
蜕变的菜鸟
/
glances
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
glances
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
ea84db45
编写于
9月 09, 2018
作者:
N
nicolargo
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Rename Glances logs to Glances events
上级
dce2f6a5
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
249 addition
and
17 deletion
+249
-17
docs/_static/events.png
docs/_static/events.png
+0
-0
docs/aoa/events.rst
docs/aoa/events.rst
+6
-7
docs/aoa/index.rst
docs/aoa/index.rst
+1
-1
glances/events.py
glances/events.py
+233
-0
glances/outputs/glances_curses.py
glances/outputs/glances_curses.py
+3
-3
glances/plugins/glances_alert.py
glances/plugins/glances_alert.py
+4
-4
glances/plugins/glances_plugin.py
glances/plugins/glances_plugin.py
+2
-2
未找到文件。
docs/_static/
log
s.png
→
docs/_static/
event
s.png
浏览文件 @
ea84db45
文件已移动
docs/aoa/
log
s.rst
→
docs/aoa/
event
s.rst
浏览文件 @
ea84db45
.. _
log
s:
.. _
event
s:
Log
s
====
event
s
====
==
.. image:: ../_static/
log
s.png
.. image:: ../_static/
event
s.png
A log messages list is displayed in the bottom of the screen if and only
if:
Events list is displayed in the bottom of the screen if and only if:
- at least one ``WARNING`` or ``CRITICAL`` alert was occurred
- space is available in the bottom of the console/terminal
Each
aler
t message displays the following information:
Each
even
t message displays the following information:
1. start datetime
2. duration if alert is terminated or `ongoing` if the alert is still in
...
...
docs/aoa/index.rst
浏览文件 @
ea84db45
...
...
@@ -37,6 +37,6 @@ Legend:
ps
monitor
amps
log
s
event
s
docker
actions
glances/
log
s.py
→
glances/
event
s.py
浏览文件 @
ea84db45
...
...
@@ -17,7 +17,7 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Manage
logs
."""
"""Manage
Glances events (previously Glances logs in Glances <3.1)
."""
import
time
from
datetime
import
datetime
...
...
@@ -26,16 +26,16 @@ from glances.compat import range
from
glances.processes
import
glances_processes
,
sort_stats
class
Glances
Log
s
(
object
):
class
Glances
Event
s
(
object
):
"""This class manages
log
s inside the Glances software.
"""This class manages
event
s inside the Glances software.
Logs is a list of list (stored in the self.log
s_list var)
item
_state = "OK|CAREFUL|WARNING|CRITICAL"
item
_type = "CPU*|LOAD|MEM|MON"
item
_value = value
Events is a list of event (stored in the self.event
s_list var)
event
_state = "OK|CAREFUL|WARNING|CRITICAL"
event
_type = "CPU*|LOAD|MEM|MON"
event
_value = value
Item is defined by:
Item
(or event)
is defined by:
["begin",
"end",
"WARNING|CRITICAL",
...
...
@@ -47,41 +47,41 @@ class GlancesLogs(object):
"""
def
__init__
(
self
):
"""Init the
log
s class."""
# Maximum size of the
log
s list
self
.
log
s_max
=
10
"""Init the
event
s class."""
# Maximum size of the
event
s list
self
.
event
s_max
=
10
# Init the logs list
self
.
log
s_list
=
[]
self
.
event
s_list
=
[]
def
get
(
self
):
"""Return the raw
log
s list."""
return
self
.
log
s_list
"""Return the raw
event
s list."""
return
self
.
event
s_list
def
len
(
self
):
"""Return the number of
item
in the logs list."""
return
self
.
log
s_list
.
__len__
()
"""Return the number of
events
in the logs list."""
return
self
.
event
s_list
.
__len__
()
def
__
itemexist__
(
self
,
item
_type
):
"""Return the
item
position, if it exists.
def
__
event_exist
(
self
,
event
_type
):
"""Return the
event
position, if it exists.
An
item exist in the l
ist if:
An
event ex
ist if:
* end is < 0
*
item
_type is matching
*
event
_type is matching
Return -1 if the item is not found.
"""
for
i
in
range
(
self
.
len
()):
if
self
.
logs_list
[
i
][
1
]
<
0
and
self
.
logs_list
[
i
][
3
]
==
item
_type
:
if
self
.
events_list
[
i
][
1
]
<
0
and
self
.
events_list
[
i
][
3
]
==
event
_type
:
return
i
return
-
1
def
get_process_sort_key
(
self
,
item
_type
):
def
get_process_sort_key
(
self
,
event
_type
):
"""Return the process sort key"""
# Process sort depending on alert type
if
item
_type
.
startswith
(
"MEM"
):
if
event
_type
.
startswith
(
"MEM"
):
# Sort TOP process by memory_percent
ret
=
'memory_percent'
elif
item
_type
.
startswith
(
"CPU_IOWAIT"
):
elif
event
_type
.
startswith
(
"CPU_IOWAIT"
):
# Sort TOP process by io_counters (only for Linux OS)
ret
=
'io_counters'
else
:
...
...
@@ -89,10 +89,10 @@ class GlancesLogs(object):
ret
=
'cpu_percent'
return
ret
def
set_process_sort
(
self
,
item
_type
):
def
set_process_sort
(
self
,
event
_type
):
"""Define the process auto sort key from the alert type."""
glances_processes
.
auto_sort
=
True
glances_processes
.
sort_key
=
self
.
get_process_sort_key
(
item
_type
)
glances_processes
.
sort_key
=
self
.
get_process_sort_key
(
event
_type
)
def
reset_process_sort
(
self
):
"""Reset the process auto sort key."""
...
...
@@ -100,36 +100,38 @@ class GlancesLogs(object):
glances_processes
.
auto_sort
=
True
glances_processes
.
sort_key
=
'cpu_percent'
def
add
(
self
,
item_state
,
item_type
,
item
_value
,
def
add
(
self
,
event_state
,
event_type
,
event
_value
,
proc_list
=
None
,
proc_desc
=
""
,
peak_time
=
6
):
"""Add a new item to the logs list.
If 'item' is a 'new one', add the new item at the beginning of
the logs list.
If 'item' is not a 'new one', update the existing item.
If event < peak_time the the alert is not setoff.
If 'event' is a 'new one', add it at the beginning of the list.
If 'event' is not a 'new one', update the list .
If event < peak_time then the alert is not set.
"""
proc_list
=
proc_list
or
glances_processes
.
getlist
()
# Add or update the log
item_index
=
self
.
__itemexist__
(
item
_type
)
if
item
_index
<
0
:
#
Item did not exist, add if WARNING or CRITICAL
self
.
_create_
item
(
item_state
,
item_type
,
item
_value
,
proc_list
,
proc_desc
,
peak_time
)
event_index
=
self
.
__event_exist
(
event
_type
)
if
event
_index
<
0
:
#
Event did not exist, add it
self
.
_create_
event
(
event_state
,
event_type
,
event
_value
,
proc_list
,
proc_desc
,
peak_time
)
else
:
#
Item exist, update
self
.
_update_
item
(
item_index
,
item_state
,
item_type
,
item
_value
,
proc_list
,
proc_desc
,
peak_time
)
#
Event exist, update it
self
.
_update_
event
(
event_index
,
event_state
,
event_type
,
event
_value
,
proc_list
,
proc_desc
,
peak_time
)
return
self
.
len
()
def
_create_item
(
self
,
item_state
,
item_type
,
item_value
,
proc_list
,
proc_desc
,
peak_time
):
"""Create a new item in the log list"""
if
item_state
==
"WARNING"
or
item_state
==
"CRITICAL"
:
def
_create_event
(
self
,
event_state
,
event_type
,
event_value
,
proc_list
,
proc_desc
,
peak_time
):
"""Add a new item in the log list.
Item is added only if the criticity (event_state) is WARNING or CRITICAL.
"""
if
event_state
==
"WARNING"
or
event_state
==
"CRITICAL"
:
# Define the automatic process sort key
self
.
set_process_sort
(
item
_type
)
self
.
set_process_sort
(
event
_type
)
# Create the new log item
# Time is stored in Epoch format
...
...
@@ -137,68 +139,77 @@ class GlancesLogs(object):
item
=
[
time
.
mktime
(
datetime
.
now
().
timetuple
()),
# START DATE
-
1
,
# END DATE
item
_state
,
# STATE: WARNING|CRITICAL
item
_type
,
# TYPE: CPU, LOAD, MEM...
item
_value
,
# MAX
item
_value
,
# AVG
item
_value
,
# MIN
item
_value
,
# SUM
event
_state
,
# STATE: WARNING|CRITICAL
event
_type
,
# TYPE: CPU, LOAD, MEM...
event
_value
,
# MAX
event
_value
,
# AVG
event
_value
,
# MIN
event
_value
,
# SUM
1
,
# COUNT
[],
# TOP 3 PROCESS LIST
proc_desc
,
# MONITORED PROCESSES DESC
glances_processes
.
sort_key
]
# TOP PROCESS SORTKEY
# Add the item to the list
self
.
logs_list
.
insert
(
0
,
item
)
if
self
.
len
()
>
self
.
logs_max
:
self
.
logs_list
.
pop
()
self
.
events_list
.
insert
(
0
,
item
)
# Limit the list to 'events_max' items
if
self
.
len
()
>
self
.
events_max
:
self
.
events_list
.
pop
()
return
True
else
:
return
False
def
_update_
item
(
self
,
item_index
,
item_state
,
item_type
,
item
_value
,
proc_list
,
proc_desc
,
peak_time
):
"""Update a
item in the log
list"""
if
item_state
==
"OK"
or
item
_state
==
"CAREFUL"
:
def
_update_
event
(
self
,
event_index
,
event_state
,
event_type
,
event
_value
,
proc_list
,
proc_desc
,
peak_time
):
"""Update a
n event in the
list"""
if
event_state
==
"OK"
or
event
_state
==
"CAREFUL"
:
# Reset the automatic process sort key
self
.
reset_process_sort
()
# Set the end of the events
endtime
=
time
.
mktime
(
datetime
.
now
().
timetuple
())
if
endtime
-
self
.
logs_list
[
item
_index
][
0
]
>
peak_time
:
if
endtime
-
self
.
events_list
[
event
_index
][
0
]
>
peak_time
:
# If event is > peak_time seconds
self
.
logs_list
[
item
_index
][
1
]
=
endtime
self
.
events_list
[
event
_index
][
1
]
=
endtime
else
:
# If event <= peak_time seconds, ignore
self
.
logs_list
.
remove
(
self
.
logs_list
[
item
_index
])
self
.
events_list
.
remove
(
self
.
events_list
[
event
_index
])
else
:
# Update the item
# State
if
item
_state
==
"CRITICAL"
:
self
.
logs_list
[
item_index
][
2
]
=
item
_state
if
event
_state
==
"CRITICAL"
:
self
.
events_list
[
event_index
][
2
]
=
event
_state
# Value
if
item_value
>
self
.
logs_list
[
item_index
][
4
]:
# MAX
self
.
logs_list
[
item_index
][
4
]
=
item_value
elif
item_value
<
self
.
logs_list
[
item_index
][
6
]:
# MIN
self
.
logs_list
[
item_index
][
6
]
=
item_value
# AVG (compute average value)
self
.
logs_list
[
item_index
][
7
]
+=
item_value
self
.
logs_list
[
item_index
][
8
]
+=
1
self
.
logs_list
[
item_index
][
5
]
=
(
self
.
logs_list
[
item_index
][
7
]
/
self
.
logs_list
[
item_index
][
8
])
# if event_value > self.events_list[event_index][4]:
# # MAX
# self.events_list[event_index][4] = event_value
# elif event_value < self.events_list[event_index][6]:
# # MIN
# self.events_list[event_index][6] = event_value
# Min value
self
.
events_list
[
event_index
][
6
]
=
min
(
self
.
events_list
[
event_index
][
6
],
event_value
)
# Max value
self
.
events_list
[
event_index
][
4
]
=
max
(
self
.
events_list
[
event_index
][
4
],
event_value
)
# Average value
self
.
events_list
[
event_index
][
7
]
+=
event_value
self
.
events_list
[
event_index
][
8
]
+=
1
self
.
events_list
[
event_index
][
5
]
=
(
self
.
events_list
[
event_index
][
7
]
/
self
.
events_list
[
event_index
][
8
])
# TOP PROCESS LIST (only for CRITICAL ALERT)
if
item
_state
==
"CRITICAL"
:
if
event
_state
==
"CRITICAL"
:
# Sort the current process list to retreive the TOP 3 processes
self
.
logs_list
[
item
_index
][
9
]
=
sort_stats
(
proc_list
,
glances_processes
.
sort_key
)[
0
:
3
]
self
.
logs_list
[
item
_index
][
11
]
=
glances_processes
.
sort_key
self
.
events_list
[
event
_index
][
9
]
=
sort_stats
(
proc_list
,
glances_processes
.
sort_key
)[
0
:
3
]
self
.
events_list
[
event
_index
][
11
]
=
glances_processes
.
sort_key
# MONITORED PROCESSES DESC
self
.
logs_list
[
item
_index
][
10
]
=
proc_desc
self
.
events_list
[
event
_index
][
10
]
=
proc_desc
return
True
...
...
@@ -209,14 +220,14 @@ class GlancesLogs(object):
If critical = True, also delete CRITICAL message.
"""
# Create a new clean list
clean_
log
s_list
=
[]
clean_
event
s_list
=
[]
while
self
.
len
()
>
0
:
item
=
self
.
log
s_list
.
pop
()
item
=
self
.
event
s_list
.
pop
()
if
item
[
1
]
<
0
or
(
not
critical
and
item
[
2
].
startswith
(
"CRITICAL"
)):
clean_
log
s_list
.
insert
(
0
,
item
)
clean_
event
s_list
.
insert
(
0
,
item
)
# The list is now the clean one
self
.
logs_list
=
clean_log
s_list
self
.
events_list
=
clean_event
s_list
return
self
.
len
()
glances_
logs
=
GlancesLog
s
()
glances_
events
=
GlancesEvent
s
()
glances/outputs/glances_curses.py
浏览文件 @
ea84db45
...
...
@@ -25,7 +25,7 @@ import sys
from
glances.compat
import
u
,
itervalues
from
glances.globals
import
MACOS
,
WINDOWS
from
glances.logger
import
logger
from
glances.
logs
import
glances_log
s
from
glances.
events
import
glances_event
s
from
glances.processes
import
glances_processes
from
glances.timer
import
Timer
...
...
@@ -375,10 +375,10 @@ class _GlancesCurses(object):
self
.
args
.
disable_folders
=
not
self
.
args
.
disable_folders
elif
self
.
pressedkey
==
ord
(
'w'
):
# 'w' > Delete finished warning logs
glances_
log
s
.
clean
()
glances_
event
s
.
clean
()
elif
self
.
pressedkey
==
ord
(
'x'
):
# 'x' > Delete finished warning and critical logs
glances_
log
s
.
clean
(
critical
=
True
)
glances_
event
s
.
clean
(
critical
=
True
)
elif
self
.
pressedkey
==
ord
(
'z'
):
# 'z' > Enable or disable processes
self
.
args
.
disable_process
=
not
self
.
args
.
disable_process
...
...
glances/plugins/glances_alert.py
浏览文件 @
ea84db45
...
...
@@ -21,7 +21,7 @@
from
datetime
import
datetime
from
glances.
logs
import
glances_log
s
from
glances.
events
import
glances_event
s
from
glances.thresholds
import
glances_thresholds
# from glances.logger import logger
from
glances.plugins.glances_plugin
import
GlancesPlugin
...
...
@@ -96,8 +96,8 @@ class Plugin(GlancesPlugin):
def
update
(
self
):
"""Nothing to do here. Just return the global glances_log."""
# Set the stats to the glances_
log
s
self
.
stats
=
glances_
log
s
.
get
()
# Set the stats to the glances_
event
s
self
.
stats
=
glances_
event
s
.
get
()
# Define the global message thanks to the current thresholds
# and the decision tree
# !!! Call directly in the msg_curse function
...
...
@@ -119,7 +119,7 @@ class Plugin(GlancesPlugin):
# Header
# msg = 'Warning or critical alerts'
# ret.append(self.curse_add_line(msg, "TITLE"))
# logs_len = glances_
log
s.len()
# logs_len = glances_
event
s.len()
# if logs_len > 1:
# msg = ' (last {} entries)'.format(logs_len)
# else:
...
...
glances/plugins/glances_plugin.py
浏览文件 @
ea84db45
...
...
@@ -32,7 +32,7 @@ from glances.compat import iterkeys, itervalues, listkeys, map, mean
from
glances.actions
import
GlancesActions
from
glances.history
import
GlancesHistory
from
glances.logger
import
logger
from
glances.
logs
import
glances_log
s
from
glances.
events
import
glances_event
s
from
glances.thresholds
import
glances_thresholds
...
...
@@ -600,7 +600,7 @@ class GlancesPlugin(object):
# So stats will be highlited with a specific color
log_str
=
"_LOG"
# Add the log to the list
glances_
log
s
.
add
(
ret
,
stat_name
.
upper
(),
value
)
glances_
event
s
.
add
(
ret
,
stat_name
.
upper
(),
value
)
# Manage threshold
self
.
manage_threshold
(
stat_name
,
ret
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录