这个 Go 程序分析工具太帅了

Posted Go语言中文网

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这个 Go 程序分析工具太帅了相关的知识,希望对你有一定的参考价值。

中有三个路径endpoint(这里endpoint翻译参考 写的:调用 OrderBike(searchRadius) 函数来订购一辆自行车
  • /car :调用 OrderCar(searchRadius) 函数订购一辆汽车
  • /scooter :调用 OrderScooter(searchRadius) 函数来订购一辆踏板车
  • 我还模拟在3个不同的区域运行3个不同的服务器(通过函数的初始化代码中完成:

    来动态地标记一些东西。

    函数
  • 在块结束之前,它(在幕后)从应用程序中移除了pyroscope.Labels("vehicle", vehicle),因为该块已经执行完成。
  • 函数。

    使用Pyroscope包的好处是,现在我们可以进一步研究为什么OrderCar()函数会有问题。标记regionvehicle使我们可以对两个很好的假设进行测试:

  • /car 路径的代码有问题
  • 我们的某个地区region有问题
  • 要对此进行分析,我们可以从"Select Tag"下拉列表中选择一个或多个标签:

    img
    函数存在问题后,我们会自动选择该标签。然后,在检查多个region标签后,通过查看时间线可以清楚地看出 us-west-1 区域存在问题,它在高 CPU 时间和低 CPU 时间之间交替。

    我们还可以看到,mutexLock() 函数消耗了近 70% 的 CPU 资源。

    img
    函数中存在不同的行为 ,其中它在低 CPU 时间占用 33% 的 CPU,在高 CPU 时间占用 71% 的 CPU。

    img
    可视化两个火焰图之间约有 112% 的性能差异

    虽然在这种情况下,差异是很显而易见的,但有时两个火焰图之间的差异最好通过相互叠加才能更好地可视化。无需更改任何参数,我们只需选择**(Diff View)差异视图选项卡**,即可查看颜色编码的差异火焰图中表示的差异。

    img
    更多用例

    无论你是从事副业的开发人员,还是一个想知道"如何加快我的Go应用程序"的DevOps工程师,Pyroscope都有许多用例,可以轻松了解如何分析您的应用程序。下面是一些示例:

  • 标记 Kubernetes 属性
  • 标记控制器
  • 标记区域
  • 标记队列中的任务
  • 标记提交
  • 标记生产环境
  • 标记测试套件的不同部分
  • 未来路线图

    如果你想尝试此示例,并查看如何将其调整到您的Go应用程序,请单击github上此示例[6]的链接。持续分析已成为监视和调试性能问题(可以说是可观察性的第四个支柱)的日益流行的工具。

    如果您对Pyroscope[7]如何改进有想法,请随时在GitHub页面上提交你的问题!感谢您的阅读。

    参考资料
    [1]

    Continuous Profiling for Go Applications: https://betterprogramming.pub/continuous-profiling-go-applications-8cdbdfdfc5ab

    [2]

    Pyroscope: https://github.com/pyroscope-io/pyroscope

    [3]

    阮一峰: https://www.ruanyifeng.com/

    [4]

    RESTful API 设计指南: https://www.ruanyifeng.com/blog/2014/05/restful_api.html

    [5]

    docker-compose.yml: https://github.com/pyroscope-io/pyroscope/blob/main/examples/golang-push/rideshare/docker-compose.yml

    [6]

    github上此示例: https://github.com/pyroscope-io/pyroscope/blob/main/examples/golang-push/README.md

    [7]

    Pyroscope: https://pyroscope.io/



    推荐阅读

  • 通过例子学 Go pprof

  • 福利

    我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。

    太帅了!我用炫酷大屏展示爬虫数据!

    作者 | 派森酱

    来源 | Python技术

    大屏有时纯粹是为了好看,领导的说法是“花花绿绿的效果不错”。尤其放到展厅里,整面墙壁都是大屏那种,色彩十分艳丽。

    我尝试了一下。不是专业的前端,所以用vue模板修改,前后端分离。

    后端使用fastapi,爬取的数据存入数据库。效果图如下,点击看全屏效果

    下面这张是网上下载的vue大屏,我根据它来修改的

    修改内容包括:

    1. 更换背景大图,形成"暗黑"星空风格

    2. Apache ECharts官网找适合的效果图,并修改

    3. 删除词云和中间的飞行地图等,把自己的内容排版进去

    数据来源

    说明

    1. 这里只介绍右边的“降水量预报”。值越大,气球🎈越大

    1. 采用scrapy爬取数据

    2. 数据爬自weather.cma.cn

    3. 定义要爬的url,降水量相加得到某地未来一天的降雨量


    运行过程


    爬虫脚本

    参考 ssw的小型文档网站

    后端接口

    数据库的爬虫数据

    fastapi

    from fastapi import FastAPI
    from fastapi.responses import JSONResponse
    import pymysql
    app = FastAPI()
    
    def conn_mysql(sql):
        dbparam = 
            'host': '127.0.0.1',
            'port': 3306,
            'user': 'root',
            'password': '1024',
            'database': 'alerts',
            'charset': 'utf8'
        
        conn = pymysql.connect(**dbparam)
        cursor = conn.cursor()
    
        try:
            cursor.execute(sql)
            res = cursor.fetchall()
        except Exception as e:
            print('入库失败', e)
            conn.rollback()
        finally:
            cursor.close()
            conn.close()
            return res
    
    def get_rains_from_db():
        sql = 'SELECT city,rain from rains'
        res = conn_mysql(sql)
        return res
    
    @app.get('/rain')
    def rain():
        res = get_rains_from_db()
        for i in res:
            city = i[0].strip()
            if (city == '益阳'):
                yys = i
            elif (city == '永顺'):
                xxz = i
            elif (city == '长沙'):
                css = i
            elif (city == '张家界'):
                zjjs = i
            elif (city == '邵阳市'):
                sys = i
            elif (city == '株洲'):
                zzs = i
            elif (city == '常德'):
                cds = i
            elif (city == '娄底'):
                ld = i
        return JSONResponse('data': 'ld': ld, 'css': css, 'sys': sys, 'yys': yys, 'zjjs': zjjs,
                                      'xxz': xxz, 'cds': cds, 'zzs': zzs)

    前端展示

    vue部分目录结构

    文件已上传,下载地址

    .
    ├── public
    │   └── json
    │       └── 430000.json
    └── src
        ├── api
        │   ├── http.js
        │   ├── index.js
        │   └── options.js
        ├── components
        │   ├── companySummary
        │   │   └── rain.vue
        │   └── index.js
        ├── main.js
        ├── router
        │   └── index.js
        └── views
            └── alerts.vue

    文件说明

    router/index.js

    编写路由

    const routes = [
      
        path: '/alerts',
        name: 'alerts',
        component: () => import('@/views/alerts.vue'),
        meta: 
          title: '告警'
        
      ,
    ]

    main.js

    1. 导入router/index.js中的路由

    2. 导入components/index.js中定义的组件,方便其它文件引用。如 在alerts.vue中写上<rain />即可引用

    import Vue from 'vue'
    import router from './router'
    import Vcomp from './components/index' //
    Vue.use(Vcomp)

    components/index.js

    组件在这个文件进行汇总

    import rain from './companySummary/rain' //区域雨量
    const components = 
        rain, //指components/companySummary/rain.vue
    
    
    const Vcomp = 
      ...components,
      install
    ;
    
    
    export default Vcomp

    components/companySummary/rain.vue

    import mapOptions from '@/api/options.js'
    export default 
      name: 'rain',
    

    views/alerts.vue

    这里引用rain.vue组件

    ...省略
        <div class="panel">
          <h2>20小时降水量预报</h2>
          <rain />
          <div class="panel-footer"></div>
        </div>  
    ...省略

    api/index.js

    export const rainInfo = (params) => 
        return axios.get('http://localhost:5000/rain/')
    

    api/options.js

    $.ajax(
        type: "GET",
        url: "http://localhost:5000/rain/",
        dataType: 'json',
        async:false,
        success: function (res) 
            var xxx = [    
                name: '娄底市', value: parseFloat(res.data.ld[1]),
                name: '长沙市', value: parseFloat(res.data.css[1]),
                name: '邵阳市', value: parseFloat(res.data.sys[1]),
                name: '益阳市', value: parseFloat(res.data.yys[1]),
                name: '张家界市', value:  parseFloat(res.data.zjjs[1]),
                name: '湘西土家族苗族自治州', value:  parseFloat(res.data.xxz[1]),
                name: '常德市', value:  parseFloat(res.data.cds[1]),
                name: '株洲市', value:  parseFloat(res.data.zzs[1]),
            ];
        )
    export function mapOptions(mapType) 
        var geoCoordMap =  //坐标数据
            '娄底市':[112.008497,27.728136],
            '长沙市':[112.982279,28.19409],
            '邵阳市':[111.46923,27.237842],
            '益阳市':[112.355042,28.570066],
            '张家界市':[110.479921,29.127401],
            '湘西土家族苗族自治州':[109.739735,28.314296],
            '常德市':[111.691347,29.040225],
            '株洲市':[113.151737,27.835806],
        ;
        ...省略
    

    总结

    
     

    往期回顾

    “如今,99%以上的代码都是垃圾!”

    Deepfake 技术换脸真假难辨!

    当你不再是程序员,很多事会脱离掌控

    7岁男童因下棋太快,被机器人夹断手指?

    分享
    点收藏
    点点赞
    点在看

    以上是关于这个 Go 程序分析工具太帅了的主要内容,如果未能解决你的问题,请参考以下文章

    GO!校运会在等你

    GO语言礼包|简洁快速的编程语言

    NEO DAPP开发直通车 第零篇

    CS:GO多玩独家定制礼包

    只有程序员才能看懂的30张图,绝配!

    纪中游记.