使用的python库
-
pynmonanalyzer : pip install pynmonanalyzer
-
pyecharts: pip install pyecharts
# -*- coding: utf-8 -*-
# @File : nmonToHtml.py
import time
from pynmonanalyzer.pyNmonParser import pyNmonParser
from pyecharts import Line, Page
from pyecharts import configure
import numpy as np
def change_data(data):
_data = []
for one in data:
tmp = []
for x in one[1:]:
try:
tmp.append(float(x))
except Exception as e:
continue
_data.append(tmp)
return _data
def parse_disk_data(data):
#转换disk数据
DISKREAD = data.get('DISKREAD')
DISKWRITE = data.get('DISKWRITE')
if not DISKREAD and not DISKWRITE:
return None
if len(DISKREAD) < 2 or len(DISKWRITE) < 2:
return None
name1 = DISKREAD[0][0]
name2 = DISKWRITE[0][0]
DISKREAD_DATA = change_data(DISKREAD[1:])
DISKWRITE_DATA = change_data(DISKWRITE[1:])
DISK_READ_SUM = list(np.sum(DISKREAD_DATA, axis=0))
DISK_WRITE_SUM = list(np.sum(DISKWRITE_DATA, axis=0))
data['DISK_READ_SUM'] = [name1] + [round(float(i), 1) for i in DISK_READ_SUM]
data['DISK_WRITE_SUM'] = [name2] + [round(float(i), 1) for i in DISK_WRITE_SUM]
return data
def parse_net_data(data):
#转换网络数据
NET = data.get('NET')
read = []
write = []
for one in NET[1:]:
if 'read' in one[0]:
read.append(one)
continue
elif 'write' in one[0]:
write.append(one)
read = change_data(read)
write = change_data(write)
read_sum = list(np.sum(read, axis=0))
write_sum = list(np.sum(write, axis=0))
data['NET_READ'] = [round(float(i), 1) for i in read_sum]
data['NET_WRITE'] = [round(float(i), 1) for i in write_sum]
return data
def nmon_to_html(nmon_file):
parse = pyNmonParser(nmon_file)
data = parse.parse()
data = parse_disk_data(data)
data = parse_net_data(data)
CUP_ALL = data.get('CPU_ALL')
MEN = data.get('MEM')
DISK_READ_SUM = data.get('DISK_READ_SUM')
DISK_WRITE_SUM = data.get('DISK_WRITE_SUM')
NET_READ = data['NET_READ']
NET_WRITE = data['NET_WRITE']
configure(global_theme='wonderland')
page = Page('性能图表')
# cpu
attr = CUP_ALL[0][1:] # 横坐标
attr = [time.strftime("%m/%d %H:%M:%S", time.strptime(_, "%d-%b-%Y %H:%M:%S")) for _ in attr]
line = Line('CUP使用')
# label_color=['#eee', '#000']
line.add(CUP_ALL[1][0], attr, CUP_ALL[1][1:], mark_line=['average'], )
line.add(CUP_ALL[2][0], attr, CUP_ALL[2][1:], mark_line=['average'], )
line.add(CUP_ALL[4][0], attr, CUP_ALL[4][1:], mark_line=['average'], xaxis_rotate=30, )
# 内存
line2 = Line('内存使用')
line2.add(MEN[1][0], attr, MEN[1][1:], mark_line=['average'])
line2.add(MEN[5][0], attr, MEN[5][1:], mark_line=['average'])
line2.add(MEN[-1][0], attr, MEN[-1][1:], xaxis_rotate=30, )
# 磁盘
line3 = Line('磁盘读写')
line3.add(DISK_READ_SUM[0], attr, DISK_READ_SUM[1:], mark_line=['average'])
line3.add(DISK_WRITE_SUM[0], attr, DISK_WRITE_SUM[1:], xaxis_rotate=30, mark_line=['average'])
# 网络
line4 = Line('Network I/O localhost (KB/s)')
line4.add('totle-Read', attr, NET_READ, mark_line=['average'], is_fill=True,
line_opacity=0.2,
area_opacity=0.4, )
line4.add('totle-Write', attr, NET_WRITE, xaxis_rotate=30, mark_line=['average'], is_fill=True,
line_opacity=0.2,
area_opacity=0.4, )
# return {'cpu': line, 'men': line2, 'disk': line3, 'net': line4}
page.add_chart(line3)
page.add_chart(line)
page.add_chart(line2)
page.add_chart(line4)
return page, data['SYSINFO']
#tpl.html
#创建html模板 echarts版本不同 可能图有点不同
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{ page.page_title }}</title>
<!--{{ echarts_js_dependencies(page) }}-->
<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/3.6.2/echarts.min.js"></script>-->
<!--<script src="echarts.js"></script>-->
<script type="text/javascript">
</script>
</head>
<body>
<div>
<table>
<thread>
<th>项目</th>
<th>描述</th>
</thread>
{%for f in sys%}
<tr>
<td>{{f[0]}}</td>
<td>{{f[1]}}</td>
</tr>
{%endfor%}
</table>
</div>
{% for chart in page %}
{{ echarts_container(chart) }}
{% endfor %}
{{ echarts_js_content(*page) }}
</body>
</html>
from __future__ import unicode_literals
from pyecharts.conf import PyEchartsConfig
from pyecharts.engine import EchartsEnvironment
from pyecharts.utils import write_utf8_html_file
from pynmonanalyzer2.nmonToHtml import nmon_to_html
page, sys = nmon_to_html('a.nmon')
config = PyEchartsConfig(echarts_template_dir='defTmp')
env = EchartsEnvironment(pyecharts_config=config)
tpl = env.get_template('tpl.html')
html = tpl.render(page=page, sys=sys)
write_utf8_html_file('nmon.html', html)


网友评论