基于python3抓取pinpoint应用信息入库


Posted in Python onJanuary 08, 2020

这篇文章主要介绍了基于python3抓取pinpoint应用信息入库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Pinpoint是用Java编写的大型分布式系统的APM(应用程序性能管理)工具。 受Dapper的启发,Pinpoint提供了一种解决方案,通过在分布式应用程序中跟踪事务来帮助分析系统的整体结构以及它们中的组件之间的相互关系.

pinpoint api:

  • /applications.pinpoint 获取applications基本信息
  • /getAgentList.pinpoint 获取对应application agent信息
  • /getServerMapData.pinpoint 获取对应app 基本数据流信息

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()

pinpoint.py:

# -*- coding: utf-8 -*-

'''
Copyright (c) 2018, mersap
All rights reserved.

摘 要: pinpoint.py
创 建 者: mersap
创建日期: 2019-01-17
'''

import sys
import requests
import time
import datetime
import json

sys.path.append('../Golf')
import db #db.py

PPURL = "https://pinpoint.*******.com"


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, serviceType='SPRING_BOOT'):
  '''更新app上下游关系
  :param appname: 应用名称
  :param serviceType: 应用类型
  :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
  param = {
   'applicationName':appname,
   'from':from_time,
   'to':to_time,
   'callerRange':1,
   'calleeRange':1,
   'serviceTypeName':serviceType
  }

  # serverMapUrl = PPURL + "/getServerMapData.pinpoint"
  serverMapUrl = "{}{}".format(PPURL, "/getServerMapData.pinpoint")
  res = requests.get(serverMapUrl, params=param)
  if res.status_code != 200:
   print("请求异常,请检查")
   return
  update_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
  links = res.json()["applicationMapData"]["linkDataArray"]
  for link in links :
   ###排除test的应用
   if link['sourceInfo']['applicationName'].startswith('test'):
    continue
   #应用名称、应用类型、下游应用名称、下游应用类型、应用节点数、下游应用节点数、总请求数、 错误请求数、慢请求数(本应用到下一个应用的数量)
   application = link['sourceInfo']['applicationName']
   serviceType = link['sourceInfo']['serviceType']
   to_application = link['targetInfo']['applicationName']
   to_serviceType = link['targetInfo']['serviceType']
   agents = len(link.get('fromAgent',' '))
   to_agents = len(link.get('toAgent',' '))
   totalCount = link['totalCount']
   errorCount = link['errorCount']
   slowCount = link['slowCount']

   sql = """
    REPLACE into application_server_map (application, serviceType, 
    agents, to_application, to_serviceType, to_agents, totalCount, 
    errorCount,slowCount, update_time, from_time, to_time) 
    VALUES ("{}", "{}", {}, "{}", "{}", {}, {}, {}, {},"{}","{}",
    "{}")""".format(
     application, serviceType, agents, to_application, 
     to_serviceType, to_agents, totalCount, errorCount,
      slowCount, update_time, From_Time, To_Time)
   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'], serviceType=app['serviceType'])
  ###删除7天前数据
  Del_Time = datetime.datetime.now() + datetime.timedelta(days=-7)

  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="rm-*****.mysql.rds.aliyuncs.com",
   user="user",
   passwd="passwd",
   db="pinpoint"
   )
 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()

附sql语句

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'

CREATE TABLE `application_server_map` (
 `application` varchar(32) NOT NULL COMMENT '应用名称',
 `serviceType` varchar(8) NOT NULL,
 `agents` int(2) NOT NULL COMMENT 'agent个数',
 `to_application` varchar(32) NOT NULL COMMENT '下游服务名称',
 `to_serviceType` varchar(32) DEFAULT NULL COMMENT '下游服务类型',
 `to_agents` int(2) DEFAULT NULL COMMENT '下游服务agent数量',
 `totalCount` int(8) DEFAULT NULL COMMENT '总请求数',
 `errorCount` int(8) DEFAULT NULL,
 `slowCount` int(8) DEFAULT NULL,
 `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
 `from_time` datetime DEFAULT NULL,
 `to_time` datetime DEFAULT NULL,
 PRIMARY KEY (`application`,`to_application`),
 UNIQUE KEY `Unique_AppMap` (`application`,`to_application`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='应用链路数据'

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python调用java的Webservice示例
Mar 10 Python
Python程序设计入门(5)类的使用简介
Jun 16 Python
简洁的十分钟Python入门教程
Apr 03 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
python实现统计文本中单词出现的频率详解
May 20 Python
关于Python作用域自学总结
Jun 10 Python
python实现画出e指数函数的图像
Nov 21 Python
python_array[0][0]与array[0,0]的区别详解
Feb 18 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
Jun 18 Python
Python实现七个基本算法的实例代码
Oct 08 Python
python全栈开发语法总结
Nov 22 Python
Python PyInstaller安装和使用教程详解
Jan 08 #Python
关于Pytorch的MLP模块实现方式
Jan 07 #Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 #Python
Pytorch中膨胀卷积的用法详解
Jan 07 #Python
Python urlopen()和urlretrieve()用法解析
Jan 07 #Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 #Python
解决torch.autograd.backward中的参数问题
Jan 07 #Python
You might like
玩转虚拟域名◎+ .
2006/10/09 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
2013/06/25 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
python编写爬虫小程序
2015/05/14 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
Django自定义manage命令实例代码
2018/02/11 Python
Python 通配符删除文件的实例
2018/04/24 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
机械专业应届生求职信
2013/12/12 职场文书
幼师自我鉴定
2014/02/01 职场文书
批评与自我批评材料
2014/02/15 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
法制演讲稿
2014/09/10 职场文书
教师四风问题整改措施
2014/09/25 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书