学习python自动化运维的第七天
经过之前一段时间的折腾,终于可以继续向下学习了,不过不是使用的前面的界面可视化第三方库,使用的是pycharts(数据可视化)。
接下来就是代码过程了,这个主要分为两个部分,数据收集,和数据可视化。
第一步,数据收集,我个人收集的是流量数据每秒的上传和下载速度。
通过对网卡的实时数据进行收集,获取一定量的数据(500条)。如果要做到实时监测,需要将for循环改为while循环。
代码如下:
"""第一步,获取流量数据,psutil()模块的运用"""
import psutil
import time
# key_info = psutil.net_io_counters(pernic=True).keys() # 获取网卡名称
# print(key_info)
def get_key():
recv = {}
sent = {}
key = "以太网 3" # 这个名字是从上面个的key_info中得到,连接互联网的网卡,有数据。
recv.setdefault(key, psutil.net_io_counters(pernic=True).get(key).bytes_recv) # 输入流量
sent.setdefault(key, psutil.net_io_counters(pernic=True).get(key).bytes_sent) # 输出流量
return key, recv, sent
def get_rate(func):
key, old_recv, old_sent = func() # 对返回的数据拆包
time.sleep(1)
key, now_recv, now_sent = func()
net_in = {}
net_out = {}
net_in.setdefault(key, (now_recv.get(key) - old_recv.get(key)) / 1024) # 获得一秒内的输入流量变化
net_out.setdefault(key, (now_sent.get(key) - old_sent.get(key)) / 1024) # 获得一秒内的输出流量变化
return key, net_in, net_out
for i in range(500): # 获取500条数据
key, net_in, net_out = get_rate(get_key) # 将get_key函数作为参数传递给get_rate函数,并将返回的结果拆包
with open("流量.txt","a+",encoding='utf-8') as f: # 文件写入
f.write('%s\nInput:\t %-5sKB/s\nOutput:\t %-5sKB/s\n' % (key, net_in.get(key), net_out.get(key)))
print('%s\nInput:\t %-5sKB/s\nOutput:\t %-5sKB/s\n' % (key, net_in.get(key), net_out.get(key)))
代码的总体框架是在网上抄的,做了适当的修改,以及添加了一些自己的理解,以上部分也是网卡流量实时监控的一种方式。有需要的朋友也可以借鉴一下。
获得以上数据,就可以进行第二步了,今天学习的是数据的静态分析。后面有没有动态分析的我也不知道,希望有相关的内容分享吧。
第二步,对数据进行可视化,其实可视化我个人的理解就是做成相关的图表,使得数据看起来更加的直观。
具体代码如下:
"""第二步,将获得的流量数据进行了数据可视化,pyecharts()模块的运用对数据进行可视化,最终以网页的形式展示"""
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.options.global_options import ThemeType
l_input = []
l_output = []
with open("流量.txt","r",encoding="utf-8") as f: # 读取流量数据
a = f.readlines()
for i in range(len(a)):
if "以太网 3" in a[i]:
l_input.append(a[i+1].split("\t")[1].split("KB")[0])
l_output.append(a[i+2].split("\t")[1].split("KB")[0])
line=( # 链式调用
Line(
init_opts=opts.InitOpts( # 对网页进行设置
bg_color='rgba(255,250,205,0.2)', # 设置背景颜色
width='1500x', # 设置图表宽度
height='400px', # 设置高度
page_title='网卡输入输出流量统计', # 设置网页标题
theme=ThemeType.MACARONS
))
.set_global_opts( # 图表全局通用设置
title_opts=opts.TitleOpts(title="网卡输入输出流量统计"), # 设置图表标题
tooltip_opts=opts.TooltipOpts(is_show=False),
xaxis_opts=opts.AxisOpts( # 设置X轴
name="时间(s)", # 设置X坐标轴名称
type_="category"), # 设置X轴坐标轴数据类型
yaxis_opts=opts.AxisOpts( # 设置Y轴
name="流量(KB/s)",
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True)))
.add_xaxis(xaxis_data=[i+1 for i in range(len(l_input))]) # 设置X轴的刻度名称
.add_yaxis( # 设置第一条折线
series_name="输入流量", #这条折线的名称
y_axis=l_input, # 数据值
symbol="emptyCircle",
is_symbol_show=True, # 设置断点连接
# is_smooth=True, # 设置平滑连接
label_opts=opts.LabelOpts(is_show=False) # 设置是否标记数值 当前状态为不标记,为True则标注
)
.add_yaxis( # 设置第二条折线
series_name="输出流量",
y_axis=l_output,
symbol="emptyCircle",
is_symbol_show=True,
# is_smooth=True,
label_opts=opts.LabelOpts(is_show=False)
)
)
line.render()
# # 不习惯链式调用的开发者依旧可以单独调用方法,下面是简单的举例
# bar = Line()
# bar.add_xaxis([i+1 for i in range(len(l_output))])
# bar.add_yaxis("Output", l_output)
# bar.set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
# bar.render()
以上代码运行完成后,会在通目录下生成一个render.html文件,通过浏览器打开即可看到相关的图表。
这里使用的是折线图。效果如下:
输入输出流量
输出流量
输入流量
总的代码如下,中间使用空格分开,需要的小伙伴需要先运行上面的代码,再运行下面的代码即可。或者同时解锁运行也没有太大的影响:
# coding: utf-8
"""学习python自动化运维的第七天"""
"""今天的学习主要分为两个步骤绘制流量图表"""
# """第一步,获取流量数据,psutil()模块的运用"""
# import psutil
# import time
# # key_info = psutil.net_io_counters(pernic=True).keys() # 获取网卡名称
# # print(key_info)
# def get_key():
# recv = {}
# sent = {}
# key = "以太网 3" # 这个名字是从上面个的key_info中得到,
# recv.setdefault(key, psutil.net_io_counters(pernic=True).get(key).bytes_recv) # 输入流量
# sent.setdefault(key, psutil.net_io_counters(pernic=True).get(key).bytes_sent) # 输出流量
# return key, recv, sent
# def get_rate(func):
# key, old_recv, old_sent = func() # 对返回的数据拆包
# time.sleep(1)
# key, now_recv, now_sent = func()
# net_in = {}
# net_out = {}
# net_in.setdefault(key, (now_recv.get(key) - old_recv.get(key)) / 1024) # 获得一秒内的输入流量变化
# net_out.setdefault(key, (now_sent.get(key) - old_sent.get(key)) / 1024) # 获得一秒内的输出流量变化
# return key, net_in, net_out
# for i in range(500): # 获取500条数据
# key, net_in, net_out = get_rate(get_key) # 将get_key函数作为参数传递给get_rate函数,并将返回的结果拆包
# with open("./txt/流量.txt","a+",encoding='utf-8') as f: # 文件写入
# f.write('%s\nInput:\t %-5sKB/s\nOutput:\t %-5sKB/s\n' % (key, net_in.get(key), net_out.get(key)))
# print('%s\nInput:\t %-5sKB/s\nOutput:\t %-5sKB/s\n' % (key, net_in.get(key), net_out.get(key)))
# """第二步,将获得的流量数据进行了数据可视化,pyecharts()模块的运用对数据进行可视化,最终以网页的形式展示"""
# import pyecharts.options as opts
# from pyecharts.charts import Line
# from pyecharts.options.global_options import ThemeType
# l_input = []
# l_output = []
# with open("./txt/流量.txt","r",encoding="utf-8") as f: # 读取流量数据
# a = f.readlines()
# for i in range(len(a)):
# if "以太网 3" in a[i]:
# l_input.append(a[i+1].split("\t")[1].split("KB")[0])
# l_output.append(a[i+2].split("\t")[1].split("KB")[0])
# line=( # 链式调用
# Line(
# init_opts=opts.InitOpts( # 对网页进行设置
# bg_color='rgba(255,250,205,0.2)', # 设置背景颜色
# width='1500x', # 设置图表宽度
# height='400px', # 设置高度
# page_title='网卡输入输出流量统计', # 设置网页标题
# theme=ThemeType.MACARONS
# ))
# .set_global_opts( # 图表全局通用设置
# title_opts=opts.TitleOpts(title="网卡输入输出流量统计"), # 设置图表标题
# tooltip_opts=opts.TooltipOpts(is_show=False),
# xaxis_opts=opts.AxisOpts( # 设置X轴
# name="时间(s)", # 设置X坐标轴名称
# type_="category"), # 设置X轴坐标轴数据类型
# yaxis_opts=opts.AxisOpts( # 设置Y轴
# name="流量(KB/s)",
# type_="value",
# axistick_opts=opts.AxisTickOpts(is_show=True),
# splitline_opts=opts.SplitLineOpts(is_show=True)))
# .add_xaxis(xaxis_data=[i+1 for i in range(len(l_input))]) # 设置X轴的刻度名称
# .add_yaxis( # 设置第一条折线
# series_name="输入流量", #这条折线的名称
# y_axis=l_input, # 数据值
# symbol="emptyCircle",
# is_symbol_show=True, # 设置断点连接
# # is_smooth=True, # 设置平滑连接
# label_opts=opts.LabelOpts(is_show=False) # 设置是否标记数值 当前状态为不标记,为True则标注
# )
# .add_yaxis( # 设置第二条折线
# series_name="输出流量",
# y_axis=l_output,
# symbol="emptyCircle",
# is_symbol_show=True,
# # is_smooth=True,
# label_opts=opts.LabelOpts(is_show=False)
# )
# )
# line.render()
# # # 不习惯链式调用的开发者依旧可以单独调用方法,下面是简单的举例
# # bar = Line()
# # bar.add_xaxis([i+1 for i in range(len(l_output))])
# # bar.add_yaxis("Output", l_output)
# # bar.set_global_opts(title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))
# # bar.render()
以上就是最近的学习内容了,还是想说,功夫不负有心人。只要肯坚持,就一定可以做到自己想要达到的效果。
注释:以上代码来自网络结合个人修改,外加一些个人理解。仅供个人学习使用