目标:对生产环境的服务质量进行量化,

解决办法:把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的更多相关文章

  1. 用python抓取智联招聘信息并存入excel

    用python抓取智联招聘信息并存入excel tags:python 智联招聘导出excel 引言:前一阵子是人们俗称的金三银四,跳槽的小朋友很多,我觉得每个人都应该给自己做一下规划,根据自己的进步 ...

  2. Selenium模拟浏览器抓取淘宝美食信息

    前言: 无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到sel ...

  3. python抓取链家房源信息(二)

    试着用scrapy将之前写的抓取链家网信息的重新写了写 然后先是用了第一页的网页作为测试,调试代码,然后发现总是抓取的时候遇见了 类似于这样的问题,并且抓取不到信息 2017-03-28 17:52: ...

  4. C#利用phantomJS抓取AjAX动态页面

    在C#中,一般常用的请求方式,就是利用HttpWebRequest创建请求,返回报文.但是有时候遇到到动态加载的页面,却只能抓取部分内容,无法抓取到动态加载的内容. 如果遇到这种的话,推荐使用phan ...

  5. Python 抓取网页并提取信息(程序详解)

    最近因项目需要用到python处理网页,因此学习相关知识.下面程序使用python抓取网页并提取信息,具体内容如下: #---------------------------------------- ...

  6. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

  7. 使用node.js抓取有路网图书信息(原创)

    之前写过使用python抓取有路网图书信息,见http://www.cnblogs.com/dyf6372/p/3529703.html. 最近想学习一下Node.js,所以想试试手,比较一下http ...

  8. 使用python抓取58手机维修信息

    之前在ququ的博客上看到说 python 中的BeautifulSoup 挺好玩的,今天下午果断下载下来,看了下api,挺好用的,完了2把,不错. 晚上写了一个使用python抓取58手机维修信息的 ...

  9. 使用CURL抓取淘宝页面

    /** * 根据地址抓取淘宝页面html代码 * @param type $url 地址 * @return boolean */ public function getTaoBaoHtml($url ...

  10. scrapy实战4 GET方法抓取ajax动态页面(以糗事百科APP为例子):

    一般来说爬虫类框架抓取Ajax动态页面都是通过一些第三方的webkit库去手动执行html页面中的js代码, 最后将生产的html代码交给spider分析.本篇文章则是通过利用fiddler抓包获取j ...

随机推荐

  1. swiper列数 slidesPerView属性决定

    swiper轮播一行有几列如下决定 slidesPerView为3是三列,不写一列 // 初始化文章swiper var newsSwiper = new Swiper('#news-swiper', ...

  2. postgresql中条件表达式 coalesce、nullif 、greatest、least

    一.postgresql中条件表达式 1.1 GREATEST和LEASTGREATEST(value [, ...]) LEAST(value [, ...])# 注意比较值得类型一定要相同案例:比 ...

  3. Java Agent场景性能测试分析优化经验分享

    摘要:本文将以Sermant的SpringBoot 注册插件的性能测试及优化过程为例,分享在Java Agent场景如何进行更好的性能测试优化及在Java Agent下需要着重注意的性能陷阱. 作者: ...

  4. navigator跳转

    navigator跳转  open-tab="switchTab"/open-type="navigate" <navigator url="/ ...

  5. go语言初记2(备忘)

     看<Go入门指南>,这里讲得比较基础,针对go 1.0版,以下是一些我自己觉得特别和不容易理解的地方的摘抄!  上次有说到go里不同类型之间操作必须显示转换,int和uint不固定,所以 ...

  6. [Unity]关于Unity中的触摸类Input.Touch以及简单的虚拟摇杆实现

    InputTouch 使用Unity开发的游戏大多是移动端游戏,而一些移动端游戏完全使用触摸操作而不是点击Button Unity使用Input.Touch来管理触摸操作 Input.TouchCou ...

  7. vue框架4

    购物车案例 v-model进阶 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  8. vue 复制功能

    实现: let message = ` ${name} 电话:${item.phone} 部门:${item.department} 职务: ${item.post} 邮箱:${item.email} ...

  9. 肖sir__整理项目链接

    项目链接: https://www.cnblogs.com/xiaolehong/p/16460523.html 保险项目https://www.cnblogs.com/xiaolehong/p/16 ...

  10. 20200420关于mysql突然停止服务的记录

    期待评论ing... 前天开发商城项目的时候,没注意d盘满了,后来5.5的mysql就突然无法启动,而且提示2003错误,在cmd中启动也是没有任何报错信息. 然后就找5.5原因,在windows的, ...