使用python3抓取pinpoint应用信息入库

使用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=‘应用链路数据‘

原文地址:https://www.cnblogs.com/yum777/p/12155632.html

时间: 2024-10-10 22:41:20

使用python3抓取pinpoint应用信息入库的相关文章

python3抓取异步百度瀑布流动态图片(二)get、json下载代码讲解

制作解析网址的get 1 def gethtml(url,postdata): 2 3 header = {'User-Agent': 4 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0', 5 'Referer': 6 'http://image.baidu.com', 7 'Host': 'image.baidu.com', 8 'Accept': 'text/plain, */*; q=0

Python爬虫实战---抓取图书馆借阅信息

原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约,影响日后借书,而自己又懒得总是登录到学校图书馆借阅系统查看,于是就打算写一个爬虫来抓取自己的借阅信息,把每本书的应还日期给爬下来,并写入txt文件,这样每次忘了就可以打开该txt文件查看,每次借阅信息改变了,只要再重新运行一遍该程序,原txt文件就会被新文件覆盖,里面的内容得到更新. 用到的技术: Python版本是 2.7 ,同时用到了ur

Java广度优先爬虫示例(抓取复旦新闻信息)

一.使用的技术 这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar包有HttpClient4.3.4,HtmlParser2.1,使用的开发工具(IDE)为intelij 13.1,Jar包管理工具为Maven,不习惯用intelij的同学,也可以使用eclipse新建一个项目. 二.爬虫基本知识 1.什么是网络爬虫?(爬虫的基本原理) 网络爬虫,拆开来讲,网络即指互联网,互联网就像一个蜘蛛网一样,爬虫就像是蜘蛛一样可以到处爬来爬去,把

python3 抓取网页资源的 N 种方法

python3 抓取网页资源的 N 种方法 1.最简单  urllib.request response = urllib.request.urlopen() html = response.read() 2.使用 Request  urllib.request   req = urllib.request.Request() response = urllib.request.urlopen(req) the_page = response.read() 3.发送数据    urllib.pa

教您使用java爬虫gecco抓取JD全部商品信息

gecco爬虫 如果对gecco还没有了解可以参看一下gecco的github首页.gecco爬虫十分的简单易用,JD全部商品信息的抓取9个类就能搞定. JD网站的分析 要抓取JD网站的全部商品信息,我们要先分析一下网站,京东网站可以大体分为三级,首页上通过分类跳转到商品列表页,商品列表页对每个商品有详情页.那么我们通过找到所有分类就能逐个分类抓取商品信息. 入口地址 http://www.jd.com/allSort.aspx,这个地址是JD全部商品的分类列表,我们以该页面作为开始页面,抓取J

python实现爬虫(一)--- Scrapy框架抓取豆瓣书籍信息

Scrapy是一个用python实现都爬虫框架,简单易用,功能强大,只需要在框架的基础上自定义自己的分析规则即可,具体如何新建工程等待都在官方文档上面讲解得非常清楚,官方文档tutorial(http://doc.scrapy.org/en/latest/intro/tutorial.html)请保证下载较新版本的Scrapy(我的是0.24.2,scrapy -v)旧版本会出现一些问题. 下面我使用Scrapy抓取豆瓣上面编程书籍的一些简单信息 一.准备爬取的页面如下,新建一个douban工程

scrapy抓取拉勾网职位信息(一)——scrapy初识及lagou爬虫项目建立

本次以scrapy抓取拉勾网职位信息作为scrapy学习的一个实战演练 python版本:3.7.1 框架:scrapy(pip直接安装可能会报错,如果是vc++环境不满足,建议直接安装一个visual studio一劳永逸,如果报错缺少前置依赖,就先安装依赖) 本篇主要对scrapy生成爬虫项目做一个基本的介绍 tips:在任意目录打开cmd的方式可以使用下面这两种方式 shift + 右键打开cmd(window10的powershell你可以简单理解为cmd升级版) 在路径框直接输入cmd

Python爬虫技术干货,教你如何实现抓取京东店铺信息及下载图片

什么是Python爬虫开发 Python爬虫开发,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止.世界上80%的爬虫是基于Python开发的,学好爬虫技能,可为后续的大数据分析.挖掘.机器学习等提供重要的数据源. Python爬虫实例参考 这是一个用Python爬虫实现抓取京东店铺信息以及下载图片的例子,仅供参考. 信息抓取: 图片下载的:注意: 1.在选择信息的时候用CS

c#实现从其他网站抓取imei码信息,手工输入验证码

阅读全文:http://www.yzswyl.cn/blread-1603.html 功能:从其他网站手工输入验证码并抓取手机IMEI信息 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.For