您的位置:首页 > 编程语言 > Python开发

利用python调用elasticsearch-api来分析数据并作图进行日报邮件发送

2017-06-25 11:28 411 查看



公司最近上线了日志分析系统,每天都要给一些同事提供接口请求数据。方法比较笨,登录到kibana网站,找到画好的模板图,截图,发送给同事。
我觉得这种方式,我是要崩溃的。所以我下定决心,周末在家把这个事情给自动化了。
以下是自己的一个思路:
1. 抓取api调用的一整天公有云上的数据
2. 分析数据,得到count值,各个url上请求的count值
3. 画出一张饼形图
4. 发送邮件
5. 利用crontab来进行定时发送
一. api数据抓取
elasticsearch-api
http://www.jianshu.com/p/f437b893502a
介绍elasticsearch的DSL的查询语句
tags:"api"
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search

def get_url_count():
#连接elasticsearch
client = Elasticsearch([{'host':'127.0.0.1','port':9200}])
#便签为api的url,同时对url进行分类统计
doc = {
"query":{
"bool":{
"must":{"match":{"tags":"api"}}}
},
"aggs" : {
"urls":{
"terms" : {
"field" : "url.keyword"
}
}
}
}
# 调用elasticsearch的接口,返回数据
response = client.search(
index="logs-2017.05.17",doc_type="log",
body=doc
)
#对数据进行分析得到过最终结果
for value in response["aggregations"].items():
postdata = value[1]['buckets']
for v in value[1]['buckets']:
print v
return postdata

二. 分析数据
数据比较简单,在上一步就完成了。没有单独写一个方法

三. 利用matplotlib中的pylab来生成图片
http://matplotlib.org/api/pyplot_api.html?highlight=pie#matplotlib.pyplot.pie

def Pie_Char(postdata):
labels = []
sizes = []
for url in postdata:
labels.append(url['key'])
sizes.append(url['doc_count'])
#给出标签
#labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
#图形比例大小
#sizes = [15, 30, 45, 10]
#分割线
#explode = (0, 0.1, 0, 0)
# 生成一个实例,方便以后复用
fig1, ax1 = plt.subplots()

'''pie(x, explode=None, labels=None, colors=None, autopct=None,
pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None,
radius=None, counterclock=True, wedgeprops=None, textprops=None,
center=(0, 0), frame=False, hold=None, data=None)
'''
#画出一个饼形图
ax1.pie(sizes,labels=labels,autopct='%1.1f%%',shadow=True,startangle=90)
# 平等长宽,确保画出一个园
ax1.axis('equal')

#展示说明
#plt.legend()

# 保存文件
plt.savefig('E:/pie_char03.png')
# 展示图形
plt.show()

四. 发送邮件
邮件的发送代码可以参考:
http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html

# -*- coding: utf-8 -*-
'''
发送html文本邮件
'''
import smtplib
from email.mime.text import MIMEText
mailto_list=["XX@XXX.com"]
mail_host="smtp.XXXX.com" #设置服务器
mail_user="XXX@XXXX.com" #用户名
mail_pass="XXXXX" #口令
mail_postfix="XXXX.com" #发件箱的后缀

def send_mail(to_list,sub,content):
me = "hello" + "<" + mail_user + "@" + mail_postfix + ">" # 这里的hello可以任意设置,收到信后,将按照设置显示
msg = MIMEText(content, _subtype='html', _charset='utf8') # 创建一个实例,这里设置为html格式邮件
msg['Subject'] = sub # 设置主题
msg['From'] = me
msg['To'] = ";".join(to_list)
try:
s = smtplib.SMTP()
s.connect(mail_host) # 连接smtp服务器
s.login(mail_user, mail_pass) # 登陆服务器
s.sendmail(me, to_list, msg.as_string()) # 发送邮件
s.close()
return True
except Exception, e:
print str(e)
return False

if __name__ == '__main__':
postdata = get_url_count()
Pie_Char(postdata)
with open("E:/pie_char03.png","rb") as f:
# b64encode是编码,b64decode是解码
base64_data = base64.b64encode(f.read())
# base64.b64decode(base64data)
#print(base64_data)
content = "<a href='http://www.kibana.com'>techOpenapi请求饼形图</a>" \
"\n" \
"<img src=\"data:image/jpg;base64,%s\">"%base64_data

if send_mail(mailto_list,"hello",content):
print "发送成功"
else:
print "发送失败"

五.定时发送
利用linux系统的crontab功能进行发送即可,简单说下吧
crontab -e
#每天早上7点运行python脚本进行日报发送
0 9 * * * /usr/bin/python /tmp/report.py

到第四步的时候,你就可以在你的邮件里收到如下图的日报了。还是有点炫酷的!但是很多细节还是需要调整的(有些问题还没弄明白)。
以下是我觉得可以优化的地方
1. matplotlib的图形如何调整字体大小
2. 是否对分类后的结果进行排序,只选取前十的数据
3. 发送的html文件是否太过丑陋
4. 讲配置文件单独放置,可以利用ConfigParse这个类去完成
5. 查询语句是否可以优化

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐