通过抓取pintpoint2的页面信息把数据存入数据库python3
目标:对生产环境的服务质量进行量化,
解决办法:把pintpoint2里的数据转存入mysql数据库,作成报表,目前支持总请求数,错误请求数,中位数,平均数,95值(每分钟一次定时任务),其它指标可以根据要求进行增加。
数据库建库语句:
CREATE TABLE `time_analysis` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`datetime` datetime DEFAULT NULL COMMENT '时间',
`application_name` varchar(32) DEFAULT NULL COMMENT '应用名',
`totalcount` int(8) DEFAULT NULL COMMENT '总请求数',
`errorcount` int(8) DEFAULT NULL COMMENT '错误请求数',
`median` int(5) DEFAULT NULL COMMENT '中位数',
`average` int(5) DEFAULT NULL COMMENT '平均数',
`distribution95` int(5) DEFAULT NULL COMMENT '95值',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=358 DEFAULT CHARSET=utf8mb4 COMMENT='数据分析结果存署表';
CREATE TABLE `application_list` (
`application_name` varchar(32) NOT NULL,
`service_type` varchar(32) DEFAULT NULL COMMENT '服务类型',
`code` int(11) DEFAULT NULL COMMENT '服务类型代码',
`agents` int(11) DEFAULT NULL COMMENT 'agent个数',
`agentlists` varchar(256) DEFAULT NULL COMMENT 'agent list',
`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`application_name`),
UNIQUE KEY `Unique_App` (`application_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='pinpoint app list';
代码:getscatterdata.py 数据分析程序
# -*- coding: utf-8 -*-
# noinspection PyInterpreter,PyInterpreter
import sys
import requests
import time
import datetime
import json
import numpy as np
sys.path.append('../Golf')
import db #db.py
PPURL = "http://*****/"
From_Time = datetime.datetime.now() + datetime.timedelta(seconds=-60)
To_Time = datetime.datetime.now()
From_TimeStamp = int(time.mktime(From_Time.timetuple()))*1000
To_TimeStamp = int(time.mktime(datetime.datetime.now().timetuple()))*1000
class PinPoint(object):
"""docstring for PinPoint"""
def __init__(self, db):
self.db = db
super(PinPoint, self).__init__()
"""获取pinpoint中应用"""
def get_applications(self):
'''return application dict
'''
applicationListUrl = PPURL + "/applications.pinpoint"
res = requests.get(applicationListUrl)
if res.status_code != 200:
print("请求异常,请检查")
return
applicationLists = []
for app in res.json():
applicationLists.append(app)
applicationListDict={}
applicationListDict["applicationList"] = applicationLists
return applicationListDict
def getAgentList(self, appname):
AgentListUrl = PPURL + "/getAgentList.pinpoint"
param = {
'application':appname
}
res = requests.get(AgentListUrl, params=param)
if res.status_code != 200:
print("请求异常,请检查")
return
return len(res.json().keys()),json.dumps(list(res.json().keys()))
def update_servermap(self, appname, from_time=From_TimeStamp,
to_time=To_TimeStamp):
'''更新app上下游关系
:param appname: 应用名称
:param from_time: 起始时间
:param to_time: 终止时间
:
'''
#https://pinpoint.*****.com/getServerMapData.pinpoint?applicationName=test-app&from=1547721493000&to=1547721553000&callerRange=1&calleeRange=1&serviceTypeName=TOMCAT&_=1547720614229
#http://pinpoint.weixing-tech.com/getScatterData.pinpoint?application=daimler-manage-admin-pro&from=1618992044000&to=1618992104000&limit=5000&filter=&xGroupUnit=130&yGroupUnit=0&backwardDirection=true
param = {
'application':appname,
'from':from_time,
'to':to_time,
'limit':5000,
'filter':'',
'xGroupUnit':130,
'yGroupUnit':0,
'backwardDirection':'true'
}
# serverMapUrl = PPURL + "/getScatterData.pinpoint"
serverMapUrl = "{}{}".format(PPURL, "/getScatterData.pinpoint")
res = requests.get(serverMapUrl, params=param)
if res.status_code != 200:
print("请求异常,请检查")
return
timetemp = float(from_time/1000)
time_local = time.localtime(timetemp)
update_time = time.strftime('%Y-%m-%d %H:%M:%S',time_local)
time_analysis_list = []
time_analysis_error = []
links = res.json()["scatter"]["dotList"]
for link in links :
#时间戳,应用名,总请求数,错误请求数,中位数,平均数,95值(每分钟一次定时任务)
time_analysis_list.append(link[1])
time_analysis_error.append(link[4])
if len(time_analysis_list) != 0:
totalcount = int(len(time_analysis_list))
errorcount = time_analysis_error.count(0)
median = round(np.percentile(time_analysis_list,50))
average = round(sum(time_analysis_list)/len(time_analysis_list))
distribution95 = round(np.percentile(time_analysis_list,95))
else:
totalcount = 0
errorcount = 0
median = 0
average = 0
distribution95 = 0
sql = """
REPLACE into time_analysis( datetime, application_name, totalcount,errorcount, median, average, distribution95)
VALUES ("{}", "{}", {}, {}, {}, {}, {});""".format(update_time,appname,totalcount,errorcount,median,average,distribution95)
self.db.db_execute(sql)
def update_app(self):
"""更新application
"""
appdict = self.get_applications()
apps = appdict.get("applicationList")
update_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
for app in apps:
if app['applicationName'].startswith('test'):
continue
agents, agentlists = self.getAgentList(app['applicationName'])
sql = """
REPLACE into application_list( application_name,
service_type, code, agents, agentlists, update_time)
VALUES ("{}", "{}", {}, {}, '{}', "{}");""".format(
app['applicationName'], app['serviceType'],
app['code'], agents, agentlists, update_time)
self.db.db_execute(sql)
return True
def update_all_servermaps(self):
"""更新所有应用数
"""
appdict = self.get_applications()
apps = appdict.get("applicationList")
for app in apps:
self.update_servermap(app['applicationName'])
###删除3600天前数据
Del_Time = datetime.datetime.now() + datetime.timedelta(days=-3600)
sql = """delete from application_server_map where update_time <= "{}"
""".format(Del_Time)
self.db.db_execute(sql)
return True
def connect_db():
""" 建立SQL连接
"""
mydb = db.MyDB(
host="********",
user="******",
passwd="******",
db="******"
)
mydb.db_connect()
mydb.db_cursor()
return mydb
def main():
db = connect_db()
pp = PinPoint(db)
pp.update_app()
pp.update_all_servermaps()
db.db_close()
if __name__ == '__main__':
main()
db.py
import mysql.connector
class MyDB(object):
"""docstring for MyDB"""
def __init__(self, host, user, passwd , db):
self.host = host
self.user = user
self.passwd = passwd
self.db = db
self.connect = None
self.cursor = None
def db_connect(self):
"""数据库连接
"""
self.connect = mysql.connector.connect(host=self.host, user=self.user, passwd=self.passwd, database=self.db)
return self
def db_cursor(self):
if self.connect is None:
self.connect = self.db_connect()
if not self.connect.is_connected():
self.connect = self.db_connect()
self.cursor = self.connect.cursor()
return self
def get_rows(self , sql):
""" 查询数据库结果
:param sql: SQL语句
:param cursor: 数据库游标
"""
self.cursor.execute(sql)
return self.cursor.fetchall()
def db_execute(self, sql):
self.cursor.execute(sql)
self.connect.commit()
def db_close(self):
"""关闭数据库连接和游标
:param connect: 数据库连接实例
:param cursor: 数据库游标
"""
if self.connect:
self.connect.close()
if self.cursor:
self.cursor.close()

通过抓取pintpoint2的页面信息把数据存入数据库python3的更多相关文章
- 用python抓取智联招聘信息并存入excel
用python抓取智联招聘信息并存入excel tags:python 智联招聘导出excel 引言:前一阵子是人们俗称的金三银四,跳槽的小朋友很多,我觉得每个人都应该给自己做一下规划,根据自己的进步 ...
- Selenium模拟浏览器抓取淘宝美食信息
前言: 无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到sel ...
- python抓取链家房源信息(二)
试着用scrapy将之前写的抓取链家网信息的重新写了写 然后先是用了第一页的网页作为测试,调试代码,然后发现总是抓取的时候遇见了 类似于这样的问题,并且抓取不到信息 2017-03-28 17:52: ...
- C#利用phantomJS抓取AjAX动态页面
在C#中,一般常用的请求方式,就是利用HttpWebRequest创建请求,返回报文.但是有时候遇到到动态加载的页面,却只能抓取部分内容,无法抓取到动态加载的内容. 如果遇到这种的话,推荐使用phan ...
- Python 抓取网页并提取信息(程序详解)
最近因项目需要用到python处理网页,因此学习相关知识.下面程序使用python抓取网页并提取信息,具体内容如下: #---------------------------------------- ...
- 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)
Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...
- 使用node.js抓取有路网图书信息(原创)
之前写过使用python抓取有路网图书信息,见http://www.cnblogs.com/dyf6372/p/3529703.html. 最近想学习一下Node.js,所以想试试手,比较一下http ...
- 使用python抓取58手机维修信息
之前在ququ的博客上看到说 python 中的BeautifulSoup 挺好玩的,今天下午果断下载下来,看了下api,挺好用的,完了2把,不错. 晚上写了一个使用python抓取58手机维修信息的 ...
- 使用CURL抓取淘宝页面
/** * 根据地址抓取淘宝页面html代码 * @param type $url 地址 * @return boolean */ public function getTaoBaoHtml($url ...
- scrapy实战4 GET方法抓取ajax动态页面(以糗事百科APP为例子):
一般来说爬虫类框架抓取Ajax动态页面都是通过一些第三方的webkit库去手动执行html页面中的js代码, 最后将生产的html代码交给spider分析.本篇文章则是通过利用fiddler抓包获取j ...
随机推荐
- js获取时间戳的方法
js获取时间戳的方法 转载脚本之家: https://www.jb51.net/article/77066.htm 转载博客园八英里: https://www.cnblogs.com/deepalle ...
- 免杀之:Python加载shellcode免杀
免杀之:Python加载shellcode免杀 目录 免杀之:Python加载shellcode免杀 1 Python 加载Shellcode免杀 使用Python可以做一些加密.混淆,但使用Pyth ...
- .net 移动mas短信接口开发
接口文档下载 1.移动后台接入用户新增(选择HTTP协议) 2.后台代码 /// <summary> /// 用户名 /// </summary> priva ...
- postgresql 常用的删除重复数据方法
一. 最高效方法 测试环境验证,6600万行大表,删除2200万重复数据仅需3分钟 delete from deltest a where a.ctid = any(array (select cti ...
- PostgreSQL 谁堵塞了谁(锁等待检测)- pg_blocking_pids
一.背景 当一个进程处于等待(被堵塞)状态时,是谁干的?可以使用如下函数,快速得到捣蛋(堵塞别人)的PID. 二.案例 1.会话1 postgres=# begin; BEGIN postgres=# ...
- js手动触发页面元素点击事件,自定义点击事件模拟点击
// initEvent事件已经弃用1. 创建MouseEvents事件const clickEvent = document.createEvent('MouseEvents')2. 初始化点击事件 ...
- 苹果手机第一次fixed没有达到预期效果,滚动下页面就正常了
我们用ul li实现了一个视频列表,一共两列,点击其中一个播放时,会将该li设置为position: fixed;width:90%;也就是变成了一个弹窗的样式.安卓手机一切正常,然而当看到苹果,我- ...
- DataTransfer.setDragImage()自定义拖拽图像遇到的坑
发生拖动时,从拖动目标(dragstart事件触发的元素)生成半透明图像,并在拖动过程中跟随鼠标指针.这个图片是自动创建的,你不需要自己去创建它.然而,如果想要设置为自定义图像,那么 DataTran ...
- java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘ (using password: YES)问题
此报错大多数存在的问题为mysql密码错误,需要去JDBC文件中寻找url查看是否密码错误.
- Windows 从头搭建c++ Eigen 库
虽然目前还在用python实现自己的算法,但是还是有点略微不满足,算法迟早有一天全从python搬到c++上,先给自己立个flag. 前言 由于本人做一些模型的搭建和计算,矩阵运算必然是少不了的,本人 ...