美文网首页
nmon文件 转html报告

nmon文件 转html报告

作者: 染一世尘埃 | 来源:发表于2019-03-04 09:42 被阅读0次

使用的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)
2.png 3.png

相关文章

网友评论

      本文标题:nmon文件 转html报告

      本文链接:https://www.haomeiwen.com/subject/ebkbuqtx.html